| @@ -328,13 +328,20 @@ JackDriverInfo* JackServer::AddSlave(jack_driver_desc_t* driver_desc, JSList* dr | |||||
| JackDriverInfo* info = new JackDriverInfo(); | JackDriverInfo* info = new JackDriverInfo(); | ||||
| JackDriverClientInterface* slave = info->Open(driver_desc, fEngine, GetSynchroTable(), driver_params); | JackDriverClientInterface* slave = info->Open(driver_desc, fEngine, GetSynchroTable(), driver_params); | ||||
| if (slave == NULL) { | if (slave == NULL) { | ||||
| delete info; | |||||
| return NULL; | |||||
| goto error; | |||||
| } | } | ||||
| slave->Attach(); | |||||
| if (slave->Attach() < 0) { | |||||
| goto error; | |||||
| } | |||||
| slave->SetMaster(false); | slave->SetMaster(false); | ||||
| fAudioDriver->AddSlave(slave); | fAudioDriver->AddSlave(slave); | ||||
| return info; | return info; | ||||
| error: | |||||
| slave->Close(); | |||||
| delete info; | |||||
| return NULL; | |||||
| } | } | ||||
| void JackServer::RemoveSlave(JackDriverInfo* info) | void JackServer::RemoveSlave(JackDriverInfo* info) | ||||
| @@ -347,6 +354,9 @@ void JackServer::RemoveSlave(JackDriverInfo* info) | |||||
| int JackServer::SwitchMaster(jack_driver_desc_t* driver_desc, JSList* driver_params) | int JackServer::SwitchMaster(jack_driver_desc_t* driver_desc, JSList* driver_params) | ||||
| { | { | ||||
| std::list<JackDriverInterface*> slave_list; | |||||
| std::list<JackDriverInterface*>::const_iterator it; | |||||
| /// Remove current master | /// Remove current master | ||||
| fAudioDriver->Stop(); | fAudioDriver->Stop(); | ||||
| fAudioDriver->Detach(); | fAudioDriver->Detach(); | ||||
| @@ -357,14 +367,12 @@ int JackServer::SwitchMaster(jack_driver_desc_t* driver_desc, JSList* driver_par | |||||
| JackDriverClientInterface* master = info->Open(driver_desc, fEngine, GetSynchroTable(), driver_params); | JackDriverClientInterface* master = info->Open(driver_desc, fEngine, GetSynchroTable(), driver_params); | ||||
| if (master == NULL) { | if (master == NULL) { | ||||
| delete info; | |||||
| return -1; | |||||
| goto error; | |||||
| } | } | ||||
| // Get slaves list | // Get slaves list | ||||
| std::list<JackDriverInterface*> slave_list = fAudioDriver->GetSlaves(); | |||||
| std::list<JackDriverInterface*>::const_iterator it; | |||||
| slave_list = fAudioDriver->GetSlaves(); | |||||
| // Move slaves in new master | // Move slaves in new master | ||||
| for (it = slave_list.begin(); it != slave_list.end(); it++) { | for (it = slave_list.begin(); it != slave_list.end(); it++) { | ||||
| JackDriverInterface* slave = *it; | JackDriverInterface* slave = *it; | ||||
| @@ -377,9 +385,16 @@ int JackServer::SwitchMaster(jack_driver_desc_t* driver_desc, JSList* driver_par | |||||
| // Activate master | // Activate master | ||||
| fAudioDriver = master; | fAudioDriver = master; | ||||
| fDriverInfo = info; | fDriverInfo = info; | ||||
| fAudioDriver->Attach(); | |||||
| if (fAudioDriver->Attach() < 0) { | |||||
| goto error; | |||||
| } | |||||
| fAudioDriver->SetMaster(true); | fAudioDriver->SetMaster(true); | ||||
| return fAudioDriver->Start(); | return fAudioDriver->Start(); | ||||
| error: | |||||
| delete info; | |||||
| return -1; | |||||
| } | } | ||||
| //---------------------- | //---------------------- | ||||
| @@ -210,7 +210,7 @@ bool JackCoreMidiDriver::OpenAux() | |||||
| virtual_input_ports[vi_count] = | virtual_input_ports[vi_count] = | ||||
| new JackCoreMidiVirtualInputPort(fAliasName, client_name, | new JackCoreMidiVirtualInputPort(fAliasName, client_name, | ||||
| capture_driver_name, | capture_driver_name, | ||||
| vi_count + pi_count, client, | |||||
| vi_count, vi_count + pi_count, client, | |||||
| time_ratio); | time_ratio); | ||||
| } catch (std::exception e) { | } catch (std::exception e) { | ||||
| jack_error("JackCoreMidiDriver::Open - while creating virtual " | jack_error("JackCoreMidiDriver::Open - while creating virtual " | ||||
| @@ -235,7 +235,7 @@ bool JackCoreMidiDriver::OpenAux() | |||||
| virtual_output_ports[vo_count] = | virtual_output_ports[vo_count] = | ||||
| new JackCoreMidiVirtualOutputPort(fAliasName, client_name, | new JackCoreMidiVirtualOutputPort(fAliasName, client_name, | ||||
| playback_driver_name, | playback_driver_name, | ||||
| vo_count + po_count, client, | |||||
| vo_count, vo_count + po_count, client, | |||||
| time_ratio); | time_ratio); | ||||
| } catch (std::exception e) { | } catch (std::exception e) { | ||||
| jack_error("JackCoreMidiDriver::Open - while creating virtual " | jack_error("JackCoreMidiDriver::Open - while creating virtual " | ||||
| @@ -595,7 +595,7 @@ JackCoreMidiDriver::Open(bool capturing_aux, bool playing_aux, int in_channels_a | |||||
| return -1; | return -1; | ||||
| } else { | } else { | ||||
| JackSleep(10000); | JackSleep(10000); | ||||
| jack_info("CoreMIDI driver is running..."); | |||||
| jack_info("CoreMIDI driver is opened..."); | |||||
| } | } | ||||
| return 0; | return 0; | ||||
| @@ -819,8 +819,8 @@ extern "C" { | |||||
| { | { | ||||
| const JSList * node; | const JSList * node; | ||||
| const jack_driver_param_t * param; | const jack_driver_param_t * param; | ||||
| int virtual_in = 1; | |||||
| int virtual_out = 1; | |||||
| int virtual_in = 2; | |||||
| int virtual_out = 2; | |||||
| for (node = params; node; node = jack_slist_next (node)) { | for (node = params; node; node = jack_slist_next (node)) { | ||||
| param = (const jack_driver_param_t *) node->data; | param = (const jack_driver_param_t *) node->data; | ||||
| @@ -44,13 +44,15 @@ HandleInputEvent(const MIDIPacketList *packet_list, void *port, | |||||
| JackCoreMidiVirtualInputPort:: | JackCoreMidiVirtualInputPort:: | ||||
| JackCoreMidiVirtualInputPort(const char *alias_name, const char *client_name, | JackCoreMidiVirtualInputPort(const char *alias_name, const char *client_name, | ||||
| const char *driver_name, int index, | |||||
| const char *driver_name, int base_index, int index, | |||||
| MIDIClientRef client, double time_ratio, | MIDIClientRef client, double time_ratio, | ||||
| size_t max_bytes, size_t max_messages): | size_t max_bytes, size_t max_messages): | ||||
| JackCoreMidiInputPort(time_ratio, max_bytes, max_messages) | JackCoreMidiInputPort(time_ratio, max_bytes, max_messages) | ||||
| { | { | ||||
| CFStringRef name = CFStringCreateWithCString(0, "virtual", | |||||
| CFStringGetSystemEncoding()); | |||||
| std::stringstream stream; | |||||
| stream << "virtual" << (base_index + 1); | |||||
| CFStringRef name = CFStringCreateWithCString(0, stream.str().c_str(), | |||||
| CFStringGetSystemEncoding()); | |||||
| if (! name) { | if (! name) { | ||||
| throw std::bad_alloc(); | throw std::bad_alloc(); | ||||
| } | } | ||||
| @@ -36,7 +36,7 @@ namespace Jack { | |||||
| JackCoreMidiVirtualInputPort(const char *alias_name, | JackCoreMidiVirtualInputPort(const char *alias_name, | ||||
| const char *client_name, | const char *client_name, | ||||
| const char *driver_name, int index, | |||||
| const char *driver_name, int base_index, int index, | |||||
| MIDIClientRef client, double time_ratio, | MIDIClientRef client, double time_ratio, | ||||
| size_t max_bytes=4096, | size_t max_bytes=4096, | ||||
| size_t max_messages=1024); | size_t max_messages=1024); | ||||
| @@ -28,14 +28,16 @@ using Jack::JackCoreMidiVirtualOutputPort; | |||||
| JackCoreMidiVirtualOutputPort:: | JackCoreMidiVirtualOutputPort:: | ||||
| JackCoreMidiVirtualOutputPort(const char *alias_name, const char *client_name, | JackCoreMidiVirtualOutputPort(const char *alias_name, const char *client_name, | ||||
| const char *driver_name, int index, | |||||
| const char *driver_name, int base_index, int index, | |||||
| MIDIClientRef client, double time_ratio, | MIDIClientRef client, double time_ratio, | ||||
| size_t max_bytes, | size_t max_bytes, | ||||
| size_t max_messages): | size_t max_messages): | ||||
| JackCoreMidiOutputPort(time_ratio, max_bytes, | JackCoreMidiOutputPort(time_ratio, max_bytes, | ||||
| max_messages) | max_messages) | ||||
| { | { | ||||
| CFStringRef name = CFStringCreateWithCString(0, "virtual", | |||||
| std::stringstream stream; | |||||
| stream << "virtual" << (base_index + 1); | |||||
| CFStringRef name = CFStringCreateWithCString(0, stream.str().c_str(), | |||||
| CFStringGetSystemEncoding()); | CFStringGetSystemEncoding()); | ||||
| if (! name) { | if (! name) { | ||||
| throw std::bad_alloc(); | throw std::bad_alloc(); | ||||
| @@ -35,7 +35,7 @@ namespace Jack { | |||||
| JackCoreMidiVirtualOutputPort(const char *alias_name, | JackCoreMidiVirtualOutputPort(const char *alias_name, | ||||
| const char *client_name, | const char *client_name, | ||||
| const char *driver_name, int index, | |||||
| const char *driver_name, int base_index, int index, | |||||
| MIDIClientRef client, double time_ratio, | MIDIClientRef client, double time_ratio, | ||||
| size_t max_bytes=4096, | size_t max_bytes=4096, | ||||
| size_t max_messages=1024); | size_t max_messages=1024); | ||||