Browse Source

Correct driver lifetime management.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4266 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.9.8
sletz 14 years ago
parent
commit
4f5e3ecd37
11 changed files with 64 additions and 42 deletions
  1. +4
    -0
      ChangeLog
  2. +15
    -5
      common/JackControlAPI.cpp
  3. +6
    -6
      common/JackDriver.cpp
  4. +0
    -1
      common/JackServer.cpp
  5. +13
    -0
      common/Jackdmp.cpp
  6. +4
    -4
      linux/alsarawmidi/JackALSARawMidiDriver.cpp
  7. +4
    -5
      macosx/coremidi/JackCoreMidiDriver.cpp
  8. +0
    -1
      macosx/coremidi/JackCoreMidiOutputPort.cpp
  9. +3
    -4
      windows/winmme/JackWinMMEDriver.cpp
  10. +7
    -7
      windows/winmme/JackWinMMEInputPort.cpp
  11. +8
    -9
      windows/winmme/JackWinMMEOutputPort.cpp

+ 4
- 0
ChangeLog View File

@@ -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.


+ 15
- 5
common/JackControlAPI.cpp View File

@@ -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 {


+ 6
- 6
common/JackDriver.cpp View File

@@ -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;


+ 0
- 1
common/JackServer.cpp View File

@@ -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();


+ 13
- 0
common/Jackdmp.cpp View File

@@ -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);


+ 4
- 4
linux/alsarawmidi/JackALSARawMidiDriver.cpp View File

@@ -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) {


+ 4
- 5
macosx/coremidi/JackCoreMidiDriver.cpp View File

@@ -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++) {


+ 0
- 1
macosx/coremidi/JackCoreMidiOutputPort.cpp View File

@@ -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);


+ 3
- 4
windows/winmme/JackWinMMEDriver.cpp View File

@@ -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];


+ 7
- 7
windows/winmme/JackWinMMEInputPort.cpp View File

@@ -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);
} }




+ 8
- 9
windows/winmme/JackWinMMEOutputPort.cpp View File

@@ -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);
} }


Loading…
Cancel
Save