From 458fc3ad75bd55fa27befbd29b22d63eecf9347a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 31 Mar 2015 17:08:21 -0400 Subject: [PATCH] manually merge current version of WavesMidiDevice::{open,close}() --- libs/backends/wavesaudio/waves_midi_device.cc | 182 ++++++++++++------ 1 file changed, 120 insertions(+), 62 deletions(-) diff --git a/libs/backends/wavesaudio/waves_midi_device.cc b/libs/backends/wavesaudio/waves_midi_device.cc index 342e1293a1..3819981327 100644 --- a/libs/backends/wavesaudio/waves_midi_device.cc +++ b/libs/backends/wavesaudio/waves_midi_device.cc @@ -68,74 +68,132 @@ WavesMidiDevice::~WavesMidiDevice () int WavesMidiDevice::open (PmTimeProcPtr time_proc, void* time_info) { - DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::open (): %1", name ())); - - if (is_input () ) { - std::cout << "WavesMidiDevice::open (): INPUT" << _pm_input_id << "-[" << name () << "]!" << std::endl; - if (!_input_queue) { - _input_queue = Pm_QueueCreate (QUEUE_LENGTH, sizeof (const WavesMidiEvent*)); - if (NULL == _input_queue) { - std::cerr << "WavesMidiDevice::open (): _input_queue = Pm_QueueCreate () failed for " << _pm_input_id << "-[" << name () << "]!" << std::endl; - return -1; - } - } - - if (!_input_pm_stream) { - if (pmNoError != Pm_OpenInput (&_input_pm_stream, - _pm_input_id, - NULL, - 1024, - time_proc, - time_info)) { - char* err_msg = new char[256]; - Pm_GetHostErrorText(err_msg, 256); - std::cerr << "WavesMidiDevice::open (): Pm_OpenInput () failed for " << _pm_input_id << "-[" << name () << "]!" << std::endl; - std::cerr << "Error: " << err_msg << std::endl; - _input_pm_stream = NULL; - _pm_input_id = pmNoDevice; - close (); - return -1; - } - } - } - - if (is_output () ) { - std::cout << "WavesMidiDevice::open (): OUTPUT" << _pm_output_id << "-[" << name () << "]!" << std::endl; + DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::open (): %1", name ())); - if (!_output_queue) { - _output_queue = Pm_QueueCreate (QUEUE_LENGTH, sizeof (const WavesMidiEvent*)); - if (NULL == _output_queue) { - std::cerr << "WavesMidiDevice::open (): _output_queue = Pm_QueueCreate () failed for " << _pm_output_id << "-[" << name () << "]!" << std::endl; - return -1; - } - } - - if (!_output_pm_stream) { - if (pmNoError != Pm_OpenOutput (&_output_pm_stream, - _pm_output_id, - NULL, - 1024, - time_proc, - time_info, - LATENCY)) { - char* err_msg = new char[256]; - Pm_GetHostErrorText(err_msg, 256); - std::cerr << "WavesMidiDevice::open (): Pm_OpenOutput () failed for " << _pm_output_id << "-[" << name () << "]!" << std::endl; - std::cerr << "Error: " << err_msg << std::endl; - _output_pm_stream = NULL; - _pm_output_id = pmNoDevice; - return -1; - } - } - } + if (is_input () ) { + // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::open (): INPUT" << _pm_input_id << "-[" << name () << "]" << std::endl; + + if (!_input_pm_stream) { + // create queue + if (!_input_queue) { + // COMMENTED DBG LOGS */ std::cout << " going to Pm_QueueCreate for INPUT: " << std::endl; + _input_queue = Pm_QueueCreate (QUEUE_LENGTH, sizeof (const WavesMidiEvent*)); + // COMMENTED DBG LOGS */ std::cout << " DONE : " << std::endl; + if (NULL == _input_queue) { + std::cerr << "WavesMidiDevice::open (): _input_queue = Pm_QueueCreate () failed for " << _pm_input_id << "-[" << name () << "]!" << std::endl; + return -1; + } + } + // create stream + // COMMENTED DBG LOGS */ std::cout << " going to Pm_OpenInput : " << std::endl; + if (pmNoError != Pm_OpenInput (&_input_pm_stream, + _pm_input_id, + NULL, + 1024, + time_proc, + time_info)) { + // COMMENTED DBG LOGS */ std::cout << " DONE : " << std::endl; + char* err_msg = new char[256]; + Pm_GetHostErrorText(err_msg, 256); + std::cerr << "WavesMidiDevice::open (): Pm_OpenInput () failed for " << _pm_input_id << "-[" << name () << "]!" << std::endl; + std::cerr << " Port Midi Host Error: " << err_msg << std::endl; + close (); + return -1; + } + // COMMENTED DBG LOGS */ std::cout << " DONE : " << std::endl; + } + } + + if (is_output () ) { + // COMMENTED DBG LOGS */ std::cout << "WavesMidiDevice::open (): OUTPUT" << _pm_output_id << "-[" << name () << "]" << std::endl; - return 0; + if (!_output_pm_stream) { + // create queue + if (!_output_queue) { + // COMMENTED DBG LOGS */ std::cout << " going to Pm_QueueCreate for OUTPUT : " << std::endl; + _output_queue = Pm_QueueCreate (QUEUE_LENGTH, sizeof (const WavesMidiEvent*)); + // COMMENTED DBG LOGS */ std::cout << " DONE : " << std::endl; + if (NULL == _output_queue) { + std::cerr << "WavesMidiDevice::open (): _output_queue = Pm_QueueCreate () failed for " << _pm_output_id << "-[" << name () << "]!" << std::endl; + return -1; + } + } + // create stream + // COMMENTED DBG LOGS */ std::cout << " going to Pm_OpenOutput : " << std::endl; + if (pmNoError != Pm_OpenOutput (&_output_pm_stream, + _pm_output_id, + NULL, + 1024, + time_proc, + time_info, + LATENCY)) { + // COMMENTED DBG LOGS */ std::cout << " DONE : " << std::endl; + char* err_msg = new char[256]; + Pm_GetHostErrorText(err_msg, 256); + std::cerr << "WavesMidiDevice::open (): Pm_OpenOutput () failed for " << _pm_output_id << "-[" << name () << "]!" << std::endl; + std::cerr << " Port Midi Host Error: " << err_msg << std::endl; + close (); + return -1; + } + // COMMENTED DBG LOGS */ std::cout << " DONE : " << std::endl; + } + } + return 0; } - -void WavesMidiDevice::close () { + DEBUG_TRACE (DEBUG::WavesMIDI, string_compose ("WavesMidiDevice::close (): %1\n", name ())); + WavesMidiEvent *waves_midi_event; + + // save _input_pm_stream and _output_pm_stream to local buf + PmStream* input_pm_stream = _input_pm_stream; + PmStream* output_pm_stream = _output_pm_stream; + _input_pm_stream = _output_pm_stream = NULL; + +//input + if (input_pm_stream) { + // close stream + PmError err = Pm_Close (input_pm_stream); + if (err != pmNoError) { + char* err_msg = new char[256]; + Pm_GetHostErrorText(err_msg, 256); + std::cerr << "WavesMidiDevice::close (): Pm_Close (input_pm_stream) failed (" << err << ") for " << input_pm_stream << "-[" << name () << "]!" << std::endl; + std::cerr << " Port Midi Host Error: " << err_msg << std::endl; + } + _pm_input_id = pmNoDevice; + } + + // close queue + if (_input_queue) { + while (1 == Pm_Dequeue (_input_queue, &waves_midi_event)) { + delete waves_midi_event; // XXX possible dup free in ~WavesMidiBuffer() (?) + } + Pm_QueueDestroy (_input_queue); + _input_queue = NULL; + } + +//output + if ( output_pm_stream ) { + // close stream + PmError err = Pm_Close (output_pm_stream); + if (err != pmNoError) { + char* err_msg = new char[256]; + Pm_GetHostErrorText(err_msg, 256); + std::cerr << "WavesMidiDevice::close (): Pm_Close (output_pm_stream) failed (" << err << ") for " << output_pm_stream << "-[" << name () << "]!" << std::endl; + std::cerr << " Port Midi Host Error: " << err_msg << std::endl; + } + _pm_output_id = pmNoDevice; + } + + // close queue + if (_output_queue) { + while (1 == Pm_Dequeue (_output_queue, &waves_midi_event)) { + delete waves_midi_event; // XXX possible dup free in ~WavesMidiBuffer() (?) + } + Pm_QueueDestroy (_output_queue); + _output_queue = NULL; + } } void