git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4266 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.8
| @@ -34,6 +34,10 @@ Valerio Pilo | |||||
| Jackdmp changes log | Jackdmp changes log | ||||
| --------------------------- | --------------------------- | ||||
| 2011-04-04 Stephane Letz <letz@grame.fr> | |||||
| * Correct driver lifetime management. | |||||
| 2011-04-03 Stephane Letz <letz@grame.fr> | 2011-04-03 Stephane Letz <letz@grame.fr> | ||||
| * Fix in JackCoreAudioDriver::Read when there is no inputs. | * Fix in JackCoreAudioDriver::Read when there is no inputs. | ||||
| @@ -101,7 +101,8 @@ struct jackctl_driver | |||||
| jack_driver_desc_t * desc_ptr; | jack_driver_desc_t * desc_ptr; | ||||
| JSList * parameters; | JSList * parameters; | ||||
| JSList * set_parameters; | JSList * set_parameters; | ||||
| JackDriverInfo* info; | |||||
| //JackDriverInfo* info; | |||||
| JSList * infos; | |||||
| }; | }; | ||||
| struct jackctl_internal | struct jackctl_internal | ||||
| @@ -308,6 +309,7 @@ jackctl_drivers_load( | |||||
| driver_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; | driver_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; | ||||
| driver_ptr->parameters = NULL; | driver_ptr->parameters = NULL; | ||||
| driver_ptr->set_parameters = NULL; | driver_ptr->set_parameters = NULL; | ||||
| driver_ptr->infos = NULL; | |||||
| if (!jackctl_add_driver_parameters(driver_ptr)) | if (!jackctl_add_driver_parameters(driver_ptr)) | ||||
| { | { | ||||
| @@ -377,6 +379,7 @@ jackctl_internals_load( | |||||
| internal_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; | internal_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; | ||||
| internal_ptr->parameters = NULL; | internal_ptr->parameters = NULL; | ||||
| internal_ptr->set_parameters = NULL; | internal_ptr->set_parameters = NULL; | ||||
| internal_ptr->refnum = -1; | |||||
| if (!jackctl_add_driver_parameters((struct jackctl_driver *)internal_ptr)) | if (!jackctl_add_driver_parameters((struct jackctl_driver *)internal_ptr)) | ||||
| { | { | ||||
| @@ -1214,8 +1217,13 @@ EXPORT bool jackctl_server_add_slave(jackctl_server * server_ptr, jackctl_driver | |||||
| jack_error("cannot add a slave in a running server"); | jack_error("cannot add a slave in a running server"); | ||||
| return false; | return false; | ||||
| } else { | } else { | ||||
| driver_ptr->info = server_ptr->engine->AddSlave(driver_ptr->desc_ptr, driver_ptr->set_parameters); | |||||
| return (driver_ptr->info != 0); | |||||
| JackDriverInfo* info = server_ptr->engine->AddSlave(driver_ptr->desc_ptr, driver_ptr->set_parameters); | |||||
| if (info) { | |||||
| driver_ptr->infos = jack_slist_append(driver_ptr->infos, info); | |||||
| return true; | |||||
| } else { | |||||
| return false; | |||||
| } | |||||
| } | } | ||||
| } else { | } else { | ||||
| return false; | return false; | ||||
| @@ -1229,8 +1237,10 @@ EXPORT bool jackctl_server_remove_slave(jackctl_server * server_ptr, jackctl_dri | |||||
| jack_error("cannot remove a slave from a running server"); | jack_error("cannot remove a slave from a running server"); | ||||
| return false; | return false; | ||||
| } else { | } else { | ||||
| server_ptr->engine->RemoveSlave(driver_ptr->info); | |||||
| delete driver_ptr->info; | |||||
| JackDriverInfo* info = (JackDriverInfo*)driver_ptr->infos->data; | |||||
| driver_ptr->infos = jack_slist_remove(driver_ptr->infos, info); | |||||
| server_ptr->engine->RemoveSlave(info); | |||||
| delete info; | |||||
| return true; | return true; | ||||
| } | } | ||||
| } else { | } else { | ||||
| @@ -376,6 +376,12 @@ int JackDriver::Start() | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int JackDriver::Stop() | |||||
| { | |||||
| fIsRunning = false; | |||||
| return 0; | |||||
| } | |||||
| int JackDriver::StartSlaves() | int JackDriver::StartSlaves() | ||||
| { | { | ||||
| int res = 0; | int res = 0; | ||||
| @@ -394,12 +400,6 @@ int JackDriver::StartSlaves() | |||||
| return res; | return res; | ||||
| } | } | ||||
| int JackDriver::Stop() | |||||
| { | |||||
| fIsRunning = false; | |||||
| return 0; | |||||
| } | |||||
| int JackDriver::StopSlaves() | int JackDriver::StopSlaves() | ||||
| { | { | ||||
| int res = 0; | int res = 0; | ||||
| @@ -137,7 +137,6 @@ int JackServer::Close() | |||||
| fChannel.Close(); | fChannel.Close(); | ||||
| fAudioDriver->Detach(); | fAudioDriver->Detach(); | ||||
| fAudioDriver->Close(); | fAudioDriver->Close(); | ||||
| fFreewheelDriver->Close(); | |||||
| fEngine->Close(); | fEngine->Close(); | ||||
| // TODO: move that in reworked JackServerGlobals::Destroy() | // TODO: move that in reworked JackServerGlobals::Destroy() | ||||
| JackMessageBuffer::Destroy(); | JackMessageBuffer::Destroy(); | ||||
| @@ -533,6 +533,19 @@ int main(int argc, char* argv[]) | |||||
| fprintf(stderr, "Cannot stop server...\n"); | fprintf(stderr, "Cannot stop server...\n"); | ||||
| } | } | ||||
| close_server: | close_server: | ||||
| if (loopback > 0) { | |||||
| jackctl_server_remove_slave(server_ctl, loopback_driver_ctl); | |||||
| } | |||||
| // Slave drivers | |||||
| for (it = slaves_list.begin(); it != slaves_list.end(); it++) { | |||||
| jackctl_driver_t * slave_driver_ctl = jackctl_server_get_driver(server_ctl, *it); | |||||
| jackctl_server_remove_slave(server_ctl, slave_driver_ctl); | |||||
| } | |||||
| // Internal clients | |||||
| for (it = internals_list.begin(); it != internals_list.end(); it++) { | |||||
| jackctl_internal_t * internal_driver_ctl = jackctl_server_get_internal(server_ctl, *it); | |||||
| jackctl_server_unload_internal(server_ctl, internal_driver_ctl); | |||||
| } | |||||
| jackctl_server_close(server_ctl); | jackctl_server_close(server_ctl); | ||||
| destroy_server: | destroy_server: | ||||
| jackctl_server_destroy(server_ctl); | jackctl_server_destroy(server_ctl); | ||||
| @@ -48,9 +48,7 @@ JackALSARawMidiDriver::JackALSARawMidiDriver(const char *name, | |||||
| JackALSARawMidiDriver::~JackALSARawMidiDriver() | JackALSARawMidiDriver::~JackALSARawMidiDriver() | ||||
| { | { | ||||
| Stop(); | |||||
| delete thread; | delete thread; | ||||
| Close(); | |||||
| } | } | ||||
| int | int | ||||
| @@ -109,6 +107,9 @@ JackALSARawMidiDriver::Attach() | |||||
| int | int | ||||
| JackALSARawMidiDriver::Close() | JackALSARawMidiDriver::Close() | ||||
| { | { | ||||
| // Generic MIDI driver close | |||||
| int result = JackMidiDriver::Close(); | |||||
| if (input_ports) { | if (input_ports) { | ||||
| for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
| delete input_ports[i]; | delete input_ports[i]; | ||||
| @@ -123,7 +124,7 @@ JackALSARawMidiDriver::Close() | |||||
| delete[] output_ports; | delete[] output_ports; | ||||
| output_ports = 0; | output_ports = 0; | ||||
| } | } | ||||
| return 0; | |||||
| return result; | |||||
| } | } | ||||
| bool | bool | ||||
| @@ -528,7 +529,6 @@ JackALSARawMidiDriver::Start() | |||||
| int | int | ||||
| JackALSARawMidiDriver::Stop() | JackALSARawMidiDriver::Stop() | ||||
| { | { | ||||
| jack_info("JackALSARawMidiDriver::Stop - stopping 'alsarawmidi' driver."); | jack_info("JackALSARawMidiDriver::Stop - stopping 'alsarawmidi' driver."); | ||||
| if (fds[1] != -1) { | if (fds[1] != -1) { | ||||
| @@ -75,10 +75,7 @@ JackCoreMidiDriver::JackCoreMidiDriver(const char *name, const char *alias, | |||||
| } | } | ||||
| JackCoreMidiDriver::~JackCoreMidiDriver() | JackCoreMidiDriver::~JackCoreMidiDriver() | ||||
| { | |||||
| Stop(); | |||||
| Close(); | |||||
| } | |||||
| {} | |||||
| int | int | ||||
| JackCoreMidiDriver::Attach() | JackCoreMidiDriver::Attach() | ||||
| @@ -181,7 +178,9 @@ JackCoreMidiDriver::Attach() | |||||
| int | int | ||||
| JackCoreMidiDriver::Close() | JackCoreMidiDriver::Close() | ||||
| { | { | ||||
| int result = 0; | |||||
| // Generic MIDI driver close | |||||
| int result = JackMidiDriver::Close(); | |||||
| OSStatus status; | OSStatus status; | ||||
| if (physical_input_ports) { | if (physical_input_ports) { | ||||
| for (int i = 0; i < num_physical_inputs; i++) { | for (int i = 0; i < num_physical_inputs; i++) { | ||||
| @@ -53,7 +53,6 @@ JackCoreMidiOutputPort::JackCoreMidiOutputPort(double time_ratio, | |||||
| JackCoreMidiOutputPort::~JackCoreMidiOutputPort() | JackCoreMidiOutputPort::~JackCoreMidiOutputPort() | ||||
| { | { | ||||
| Stop(); | |||||
| delete thread; | delete thread; | ||||
| sem_destroy(thread_queue_semaphore); | sem_destroy(thread_queue_semaphore); | ||||
| sem_unlink(semaphore_name); | sem_unlink(semaphore_name); | ||||
| @@ -35,10 +35,7 @@ JackWinMMEDriver::JackWinMMEDriver(const char *name, const char *alias, | |||||
| } | } | ||||
| JackWinMMEDriver::~JackWinMMEDriver() | JackWinMMEDriver::~JackWinMMEDriver() | ||||
| { | |||||
| Stop(); | |||||
| Close(); | |||||
| } | |||||
| {} | |||||
| int | int | ||||
| JackWinMMEDriver::Attach() | JackWinMMEDriver::Attach() | ||||
| @@ -105,7 +102,9 @@ JackWinMMEDriver::Attach() | |||||
| int | int | ||||
| JackWinMMEDriver::Close() | JackWinMMEDriver::Close() | ||||
| { | { | ||||
| // Generic MIDI driver close | |||||
| int result = JackMidiDriver::Close(); | int result = JackMidiDriver::Close(); | ||||
| if (input_ports) { | if (input_ports) { | ||||
| for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
| delete input_ports[i]; | delete input_ports[i]; | ||||
| @@ -111,13 +111,12 @@ JackWinMMEInputPort::JackWinMMEInputPort(const char *alias_name, | |||||
| WriteInError("JackWinMMEInputPort [constructor]", "midiInClose", result); | WriteInError("JackWinMMEInputPort [constructor]", "midiInClose", result); | ||||
| } | } | ||||
| delete_sysex_buffer: | delete_sysex_buffer: | ||||
| delete[] sysex_buffer; | |||||
| delete[] sysex_buffer; | |||||
| throw std::runtime_error(error_message); | throw std::runtime_error(error_message); | ||||
| } | } | ||||
| JackWinMMEInputPort::~JackWinMMEInputPort() | JackWinMMEInputPort::~JackWinMMEInputPort() | ||||
| { | { | ||||
| Stop(); | |||||
| MMRESULT result = midiInReset(handle); | MMRESULT result = midiInReset(handle); | ||||
| if (result != MMSYSERR_NOERROR) { | if (result != MMSYSERR_NOERROR) { | ||||
| WriteInError("JackWinMMEInputPort [destructor]", "midiInReset", result); | WriteInError("JackWinMMEInputPort [destructor]", "midiInReset", result); | ||||
| @@ -164,14 +163,14 @@ JackWinMMEInputPort::ProcessJack(JackMidiBuffer *port_buffer, | |||||
| if (! jack_event) { | if (! jack_event) { | ||||
| jack_event = thread_queue->DequeueEvent(); | jack_event = thread_queue->DequeueEvent(); | ||||
| } | } | ||||
| for (; jack_event; jack_event = thread_queue->DequeueEvent()) { | |||||
| for (; jack_event; jack_event = thread_queue->DequeueEvent()) { | |||||
| switch (write_queue->EnqueueEvent(jack_event)) { | switch (write_queue->EnqueueEvent(jack_event)) { | ||||
| case JackMidiWriteQueue::BUFFER_TOO_SMALL: | case JackMidiWriteQueue::BUFFER_TOO_SMALL: | ||||
| jack_error("JackWinMMEMidiInputPort::Process - The buffer write " | jack_error("JackWinMMEMidiInputPort::Process - The buffer write " | ||||
| "queue couldn't enqueue a %d-byte event. Dropping " | "queue couldn't enqueue a %d-byte event. Dropping " | ||||
| "event.", jack_event->size); | "event.", jack_event->size); | ||||
| // Fallthrough on purpose | // Fallthrough on purpose | ||||
| case JackMidiWriteQueue::OK: | |||||
| case JackMidiWriteQueue::OK: | |||||
| continue; | continue; | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -182,7 +181,7 @@ void | |||||
| JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) | JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) | ||||
| { | { | ||||
| set_threaded_log_function(); | set_threaded_log_function(); | ||||
| jack_nframes_t current_frame = GetCurrentFrame(); | |||||
| jack_nframes_t current_frame = GetCurrentFrame(); | |||||
| switch (message) { | switch (message) { | ||||
| case MIM_CLOSE: | case MIM_CLOSE: | ||||
| @@ -196,7 +195,7 @@ JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) | |||||
| case MIM_DATA: | case MIM_DATA: | ||||
| jack_midi_data_t message_buffer[3]; | jack_midi_data_t message_buffer[3]; | ||||
| jack_midi_data_t status = param1 & 0xff; | jack_midi_data_t status = param1 & 0xff; | ||||
| int length = GetMessageLength(status); | |||||
| int length = GetMessageLength(status); | |||||
| switch (length) { | switch (length) { | ||||
| case 3: | case 3: | ||||
| @@ -218,7 +217,7 @@ JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) | |||||
| "input driver sent an MIM_DATA message with an invalid " | "input driver sent an MIM_DATA message with an invalid " | ||||
| "status byte."); | "status byte."); | ||||
| return; | return; | ||||
| } | |||||
| } | |||||
| EnqueueMessage(current_frame, (size_t) length, message_buffer); | EnqueueMessage(current_frame, (size_t) length, message_buffer); | ||||
| break; | break; | ||||
| case MIM_LONGDATA: | case MIM_LONGDATA: | ||||
| @@ -294,3 +293,4 @@ JackWinMMEInputPort::WriteInError(const char *jack_func, const char *mm_func, | |||||
| jack_error("%s - %s: %s", jack_func, mm_func, error_message); | jack_error("%s - %s: %s", jack_func, mm_func, error_message); | ||||
| } | } | ||||
| @@ -85,7 +85,7 @@ JackWinMMEOutputPort::JackWinMMEOutputPort(const char *alias_name, | |||||
| index + 1); | index + 1); | ||||
| snprintf(name, sizeof(name) - 1, "%s:playback_%d", client_name, index + 1); | snprintf(name, sizeof(name) - 1, "%s:playback_%d", client_name, index + 1); | ||||
| read_queue_ptr.release(); | read_queue_ptr.release(); | ||||
| thread_queue_ptr.release(); | |||||
| thread_queue_ptr.release(); | |||||
| thread_ptr.release(); | thread_ptr.release(); | ||||
| return; | return; | ||||
| @@ -99,13 +99,12 @@ JackWinMMEOutputPort::JackWinMMEOutputPort(const char *alias_name, | |||||
| WriteOutError("JackWinMMEOutputPort [constructor]", "midiOutClose", | WriteOutError("JackWinMMEOutputPort [constructor]", "midiOutClose", | ||||
| result); | result); | ||||
| } | } | ||||
| raise_exception: | |||||
| raise_exception: | |||||
| throw std::runtime_error(error_message); | throw std::runtime_error(error_message); | ||||
| } | } | ||||
| JackWinMMEOutputPort::~JackWinMMEOutputPort() | JackWinMMEOutputPort::~JackWinMMEOutputPort() | ||||
| { | { | ||||
| Stop(); | |||||
| MMRESULT result = midiOutReset(handle); | MMRESULT result = midiOutReset(handle); | ||||
| if (result != MMSYSERR_NOERROR) { | if (result != MMSYSERR_NOERROR) { | ||||
| WriteOutError("JackWinMMEOutputPort [destructor]", "midiOutReset", | WriteOutError("JackWinMMEOutputPort [destructor]", "midiOutReset", | ||||
| @@ -123,7 +122,7 @@ JackWinMMEOutputPort::~JackWinMMEOutputPort() | |||||
| WriteOSError("JackWinMMEOutputPort [destructor]", "CloseHandle"); | WriteOSError("JackWinMMEOutputPort [destructor]", "CloseHandle"); | ||||
| } | } | ||||
| delete read_queue; | delete read_queue; | ||||
| delete thread_queue; | |||||
| delete thread_queue; | |||||
| delete thread; | delete thread; | ||||
| } | } | ||||
| @@ -135,7 +134,7 @@ JackWinMMEOutputPort::Execute() | |||||
| jack_log("JackWinMMEOutputPort::Execute BREAK"); | jack_log("JackWinMMEOutputPort::Execute BREAK"); | ||||
| break; | break; | ||||
| } | |||||
| } | |||||
| jack_midi_event_t *event = thread_queue->DequeueEvent(); | jack_midi_event_t *event = thread_queue->DequeueEvent(); | ||||
| if (! event) { | if (! event) { | ||||
| @@ -261,11 +260,11 @@ JackWinMMEOutputPort::Init() | |||||
| void | void | ||||
| JackWinMMEOutputPort::ProcessJack(JackMidiBuffer *port_buffer, | JackWinMMEOutputPort::ProcessJack(JackMidiBuffer *port_buffer, | ||||
| jack_nframes_t frames) | jack_nframes_t frames) | ||||
| { | |||||
| read_queue->ResetMidiBuffer(port_buffer); | |||||
| { | |||||
| read_queue->ResetMidiBuffer(port_buffer); | |||||
| for (jack_midi_event_t *event = read_queue->DequeueEvent(); event; | for (jack_midi_event_t *event = read_queue->DequeueEvent(); event; | ||||
| event = read_queue->DequeueEvent()) { | |||||
| event = read_queue->DequeueEvent()) { | |||||
| switch (thread_queue->EnqueueEvent(event, frames)) { | switch (thread_queue->EnqueueEvent(event, frames)) { | ||||
| case JackMidiWriteQueue::BUFFER_FULL: | case JackMidiWriteQueue::BUFFER_FULL: | ||||
| @@ -310,7 +309,6 @@ JackWinMMEOutputPort::Start() | |||||
| bool | bool | ||||
| JackWinMMEOutputPort::Stop() | JackWinMMEOutputPort::Stop() | ||||
| { | { | ||||
| jack_info("JackWinMMEOutputPort::Stop - stopping MIDI output port " | jack_info("JackWinMMEOutputPort::Stop - stopping MIDI output port " | ||||
| "processing thread."); | "processing thread."); | ||||
| @@ -371,3 +369,4 @@ JackWinMMEOutputPort::WriteOutError(const char *jack_func, const char *mm_func, | |||||
| GetOutErrorString(result, error_message); | GetOutErrorString(result, error_message); | ||||
| jack_error("%s - %s: %s", jack_func, mm_func, error_message); | jack_error("%s - %s: %s", jack_func, mm_func, error_message); | ||||
| } | } | ||||