| @@ -313,6 +313,26 @@ int JackAudioDriver::ProcessGraphSync() | |||
| return res; | |||
| } | |||
| int JackAudioDriver::Start() | |||
| { | |||
| int res = JackDriver::Start(); | |||
| if ((res >= 0) && fIsMaster) { | |||
| res = StartSlaves(); | |||
| } | |||
| return res; | |||
| } | |||
| int JackAudioDriver::Stop() | |||
| { | |||
| int res = JackDriver::Stop(); | |||
| if (fIsMaster) { | |||
| if (StopSlaves() < 0) { | |||
| res = -1; | |||
| } | |||
| } | |||
| return res; | |||
| } | |||
| void JackAudioDriver::WaitUntilNextCycle() | |||
| { | |||
| int wait_time_usec = (int((float(fEngineControl->fBufferSize) / (float(fEngineControl->fSampleRate))) * 1000000.0f)); | |||
| @@ -92,6 +92,9 @@ class SERVER_EXPORT JackAudioDriver : public JackDriver | |||
| virtual int Attach(); | |||
| virtual int Detach(); | |||
| virtual int Start(); | |||
| virtual int Stop(); | |||
| virtual int Write(); | |||
| virtual int SetBufferSize(jack_nframes_t buffer_size); | |||
| @@ -826,6 +826,11 @@ EXPORT const JSList * jackctl_server_get_drivers_list(jackctl_server *server_ptr | |||
| EXPORT bool jackctl_server_stop(jackctl_server *server_ptr) | |||
| { | |||
| server_ptr->engine->Stop(); | |||
| return true; | |||
| } | |||
| EXPORT bool jackctl_server_close(jackctl_server *server_ptr) | |||
| { | |||
| server_ptr->engine->Close(); | |||
| delete server_ptr->engine; | |||
| @@ -853,7 +858,7 @@ EXPORT const JSList * jackctl_server_get_parameters(jackctl_server *server_ptr) | |||
| } | |||
| EXPORT bool | |||
| jackctl_server_start( | |||
| jackctl_server_open( | |||
| jackctl_server *server_ptr, | |||
| jackctl_driver *driver_ptr) | |||
| { | |||
| @@ -913,18 +918,8 @@ jackctl_server_start( | |||
| goto fail_delete; | |||
| } | |||
| rc = server_ptr->engine->Start(); | |||
| if (rc < 0) | |||
| { | |||
| jack_error("JackServer::Start() failed with %d", rc); | |||
| goto fail_close; | |||
| } | |||
| return true; | |||
| fail_close: | |||
| server_ptr->engine->Close(); | |||
| fail_delete: | |||
| delete server_ptr->engine; | |||
| server_ptr->engine = NULL; | |||
| @@ -946,6 +941,19 @@ fail: | |||
| return false; | |||
| } | |||
| EXPORT bool | |||
| jackctl_server_start( | |||
| jackctl_server *server_ptr) | |||
| { | |||
| int rc = server_ptr->engine->Start(); | |||
| bool result = rc >= 0; | |||
| if (! result) | |||
| { | |||
| jack_error("JackServer::Start() failed with %d", rc); | |||
| } | |||
| return result; | |||
| } | |||
| EXPORT const char * jackctl_driver_get_name(jackctl_driver *driver_ptr) | |||
| { | |||
| return driver_ptr->desc_ptr->name; | |||
| @@ -101,13 +101,21 @@ jackctl_server_get_drivers_list( | |||
| jackctl_server_t * server); | |||
| EXPORT bool | |||
| jackctl_server_start( | |||
| jackctl_server_open( | |||
| jackctl_server_t * server, | |||
| jackctl_driver_t * driver); | |||
| EXPORT bool | |||
| jackctl_server_start( | |||
| jackctl_server_t * server); | |||
| EXPORT bool | |||
| jackctl_server_stop( | |||
| jackctl_server_t * server); | |||
| jackctl_server_t * server); | |||
| EXPORT bool | |||
| jackctl_server_close( | |||
| jackctl_server_t * server); | |||
| EXPORT const JSList * | |||
| jackctl_server_get_parameters( | |||
| @@ -328,11 +328,41 @@ int JackDriver::Start() | |||
| return 0; | |||
| } | |||
| int JackDriver::StartSlaves() | |||
| { | |||
| int res = 0; | |||
| list<JackDriverInterface*>::const_iterator it; | |||
| for (it = fSlaveList.begin(); it != fSlaveList.end(); it++) { | |||
| JackDriverInterface* slave = *it; | |||
| if (slave->Start() < 0) { | |||
| res = -1; | |||
| // XXX: We should attempt to stop all of the slaves that we've | |||
| // started here. | |||
| break; | |||
| } | |||
| } | |||
| return res; | |||
| } | |||
| int JackDriver::Stop() | |||
| { | |||
| return 0; | |||
| } | |||
| int JackDriver::StopSlaves() | |||
| { | |||
| int res = 0; | |||
| list<JackDriverInterface*>::const_iterator it; | |||
| for (it = fSlaveList.begin(); it != fSlaveList.end(); it++) { | |||
| JackDriverInterface* slave = *it; | |||
| if (slave->Stop() < 0) | |||
| res = -1; | |||
| } | |||
| return res; | |||
| } | |||
| bool JackDriver::IsFixedBufferSize() | |||
| { | |||
| return true; | |||
| @@ -198,7 +198,9 @@ class SERVER_EXPORT JackDriver : public JackDriverClientInterface | |||
| virtual int Write(); | |||
| virtual int Start(); | |||
| virtual int StartSlaves(); | |||
| virtual int Stop(); | |||
| virtual int StopSlaves(); | |||
| virtual bool IsFixedBufferSize(); | |||
| virtual int SetBufferSize(jack_nframes_t buffer_size); | |||
| @@ -87,26 +87,18 @@ int JackServer::Open(jack_driver_desc_t* driver_desc, JSList* driver_params) | |||
| goto fail_close3; | |||
| } | |||
| if (fFreewheelDriver->Open() < 0) { // before engine open | |||
| jack_error("Cannot open driver"); | |||
| goto fail_close4; | |||
| } | |||
| if (fAudioDriver->Attach() < 0) { | |||
| jack_error("Cannot attach audio driver"); | |||
| goto fail_close5; | |||
| goto fail_close4; | |||
| } | |||
| fFreewheelDriver->SetMaster(false); | |||
| fAudioDriver->SetMaster(true); | |||
| fAudioDriver->AddSlave(fFreewheelDriver); // After ??? | |||
| //fAudioDriver->AddSlave(fFreewheelDriver); | |||
| InitTime(); | |||
| SetClockSource(fEngineControl->fClockSource); | |||
| return 0; | |||
| fail_close5: | |||
| fFreewheelDriver->Close(); | |||
| fail_close4: | |||
| fEngine->Close(); | |||
| @@ -128,7 +120,9 @@ int JackServer::Close() | |||
| fChannel.Close(); | |||
| fAudioDriver->Detach(); | |||
| fAudioDriver->Close(); | |||
| fFreewheelDriver->Close(); | |||
| if (fFreewheel) { | |||
| fFreewheelDriver->Close(); | |||
| } | |||
| fEngine->Close(); | |||
| // TODO: move that in reworked JackServerGlobals::Destroy() | |||
| JackMessageBuffer::Destroy(); | |||
| @@ -238,6 +232,7 @@ int JackServer::SetFreewheel(bool onoff) | |||
| } else { | |||
| fFreewheel = false; | |||
| fFreewheelDriver->Stop(); | |||
| fFreewheelDriver->Close(); | |||
| fGraphManager->Restore(&fConnectionState); // Restore previous connection state | |||
| fEngine->NotifyFreewheel(onoff); | |||
| fFreewheelDriver->SetMaster(false); | |||
| @@ -250,6 +245,10 @@ int JackServer::SetFreewheel(bool onoff) | |||
| fGraphManager->Save(&fConnectionState); // Save connection state | |||
| fGraphManager->DisconnectAllPorts(fAudioDriver->GetClientControl()->fRefNum); | |||
| fEngine->NotifyFreewheel(onoff); | |||
| if (fFreewheelDriver->Open() < 0) { | |||
| jack_error("Cannot open freewheel driver"); | |||
| return -1; | |||
| } | |||
| fFreewheelDriver->SetMaster(true); | |||
| return fFreewheelDriver->Start(); | |||
| } else { | |||
| @@ -296,11 +295,11 @@ JackDriverInfo* JackServer::AddSlave(jack_driver_desc_t* driver_desc, JSList* dr | |||
| if (slave == NULL) { | |||
| delete info; | |||
| return NULL; | |||
| } else { | |||
| slave->Attach(); | |||
| fAudioDriver->AddSlave(slave); | |||
| return info; | |||
| } | |||
| slave->Attach(); | |||
| slave->SetMaster(false); | |||
| fAudioDriver->AddSlave(slave); | |||
| return info; | |||
| } | |||
| void JackServer::RemoveSlave(JackDriverInfo* info) | |||
| @@ -322,32 +321,30 @@ int JackServer::SwitchMaster(jack_driver_desc_t* driver_desc, JSList* driver_par | |||
| JackDriverInfo* info = new JackDriverInfo(); | |||
| JackDriverClientInterface* master = info->Open(driver_desc, fEngine, GetSynchroTable(), driver_params); | |||
| if (master == NULL || info == NULL) { | |||
| if (master == NULL) { | |||
| delete info; | |||
| delete master; | |||
| return -1; | |||
| } else { | |||
| } | |||
| // Get slaves list | |||
| std::list<JackDriverInterface*> slave_list = fAudioDriver->GetSlaves(); | |||
| std::list<JackDriverInterface*>::const_iterator it; | |||
| // Get slaves list | |||
| std::list<JackDriverInterface*> slave_list = fAudioDriver->GetSlaves(); | |||
| std::list<JackDriverInterface*>::const_iterator it; | |||
| // Move slaves in new master | |||
| for (it = slave_list.begin(); it != slave_list.end(); it++) { | |||
| JackDriverInterface* slave = *it; | |||
| master->AddSlave(slave); | |||
| } | |||
| // Move slaves in new master | |||
| for (it = slave_list.begin(); it != slave_list.end(); it++) { | |||
| JackDriverInterface* slave = *it; | |||
| master->AddSlave(slave); | |||
| } | |||
| // Delete old master | |||
| delete fDriverInfo; | |||
| // Delete old master | |||
| delete fDriverInfo; | |||
| // Activate master | |||
| fAudioDriver = master; | |||
| fDriverInfo = info; | |||
| fAudioDriver->Attach(); | |||
| fAudioDriver->SetMaster(true); | |||
| return fAudioDriver->Start(); | |||
| } | |||
| // Activate master | |||
| fAudioDriver = master; | |||
| fDriverInfo = info; | |||
| fAudioDriver->Attach(); | |||
| fAudioDriver->SetMaster(true); | |||
| return fAudioDriver->Start(); | |||
| } | |||
| //---------------------- | |||
| @@ -244,6 +244,10 @@ int main(int argc, char* argv[]) | |||
| std::list<char*> slaves_list; | |||
| std::list<char*>::iterator it; | |||
| // Assume that we fail. | |||
| int return_value = -1; | |||
| bool notify_sent = false; | |||
| copyright(stdout); | |||
| #if defined(JACK_DBUS) && defined(__linux__) | |||
| server_ctl = jackctl_server_create(audio_acquire, audio_release); | |||
| @@ -285,7 +289,7 @@ int main(int argc, char* argv[]) | |||
| jackctl_parameter_set_value(param, &value); | |||
| } else { | |||
| usage(stdout); | |||
| goto fail_free1; | |||
| goto destroy_server; | |||
| } | |||
| } | |||
| break; | |||
| @@ -402,7 +406,7 @@ int main(int argc, char* argv[]) | |||
| case 'h': | |||
| usage(stdout); | |||
| goto fail_free1; | |||
| goto destroy_server; | |||
| } | |||
| } | |||
| @@ -423,14 +427,14 @@ int main(int argc, char* argv[]) | |||
| if (!master_driver_name) { | |||
| usage(stderr); | |||
| goto fail_free1; | |||
| goto destroy_server; | |||
| } | |||
| // Master driver | |||
| master_driver_ctl = jackctl_server_get_driver(server_ctl, master_driver_name); | |||
| if (master_driver_ctl == NULL) { | |||
| fprintf(stderr, "Unknown driver \"%s\"\n", master_driver_name); | |||
| goto fail_free1; | |||
| goto destroy_server; | |||
| } | |||
| if (optind < argc) { | |||
| @@ -442,7 +446,7 @@ int main(int argc, char* argv[]) | |||
| if (master_driver_nargs == 0) { | |||
| fprintf(stderr, "No driver specified ... hmm. JACK won't do" | |||
| " anything when run like this.\n"); | |||
| goto fail_free1; | |||
| goto destroy_server; | |||
| } | |||
| master_driver_args = (char **) malloc(sizeof(char *) * master_driver_nargs); | |||
| @@ -453,15 +457,16 @@ int main(int argc, char* argv[]) | |||
| } | |||
| if (jackctl_parse_driver_params(master_driver_ctl, master_driver_nargs, master_driver_args)) { | |||
| goto fail_free1; | |||
| goto destroy_server; | |||
| } | |||
| // Setup signals then start server | |||
| // Setup signals | |||
| signals = jackctl_setup_signals(0); | |||
| if (!jackctl_server_start(server_ctl, master_driver_ctl)) { | |||
| fprintf(stderr, "Failed to start server\n"); | |||
| goto fail_free1; | |||
| // Open server | |||
| if (! jackctl_server_open(server_ctl, master_driver_ctl)) { | |||
| fprintf(stderr, "Failed to open server\n"); | |||
| goto destroy_server; | |||
| } | |||
| // Slave drivers | |||
| @@ -469,7 +474,7 @@ int main(int argc, char* argv[]) | |||
| jackctl_driver_t * slave_driver_ctl = jackctl_server_get_driver(server_ctl, *it); | |||
| if (slave_driver_ctl == NULL) { | |||
| fprintf(stderr, "Unknown driver \"%s\"\n", *it); | |||
| goto fail_free2; | |||
| goto close_server; | |||
| } | |||
| jackctl_server_add_slave(server_ctl, slave_driver_ctl); | |||
| } | |||
| @@ -477,6 +482,8 @@ int main(int argc, char* argv[]) | |||
| // Loopback driver | |||
| if (loopback > 0) { | |||
| loopback_driver_ctl = jackctl_server_get_driver(server_ctl, "loopback"); | |||
| // XX: What if this fails? | |||
| if (loopback_driver_ctl != NULL) { | |||
| const JSList * loopback_parameters = jackctl_driver_get_parameters(loopback_driver_ctl); | |||
| param = jackctl_get_parameter(loopback_parameters, "channels"); | |||
| @@ -486,6 +493,13 @@ int main(int argc, char* argv[]) | |||
| } | |||
| jackctl_server_add_slave(server_ctl, loopback_driver_ctl); | |||
| } | |||
| } | |||
| // Start the server | |||
| if (!jackctl_server_start(server_ctl)) { | |||
| fprintf(stderr, "Failed to start server\n"); | |||
| goto close_server; | |||
| } | |||
| // Internal clients | |||
| @@ -493,30 +507,28 @@ int main(int argc, char* argv[]) | |||
| jackctl_internal_t * internal_driver_ctl = jackctl_server_get_internal(server_ctl, *it); | |||
| if (internal_driver_ctl == NULL) { | |||
| fprintf(stderr, "Unknown internal \"%s\"\n", *it); | |||
| goto fail_free2; | |||
| goto stop_server; | |||
| } | |||
| jackctl_server_load_internal(server_ctl, internal_driver_ctl); | |||
| } | |||
| notify_server_start(server_name); | |||
| notify_sent = true; | |||
| return_value = 0; | |||
| // Waits for signal | |||
| jackctl_wait_signals(signals); | |||
| if (!jackctl_server_stop(server_ctl)) | |||
| stop_server: | |||
| if (! jackctl_server_stop(server_ctl)) { | |||
| fprintf(stderr, "Cannot stop server...\n"); | |||
| jackctl_server_destroy(server_ctl); | |||
| notify_server_stop(server_name); | |||
| return 0; | |||
| fail_free1: | |||
| jackctl_server_destroy(server_ctl); | |||
| return -1; | |||
| fail_free2: | |||
| jackctl_server_stop(server_ctl); | |||
| } | |||
| if (notify_sent) { | |||
| notify_server_stop(server_name); | |||
| } | |||
| close_server: | |||
| jackctl_server_close(server_ctl); | |||
| destroy_server: | |||
| jackctl_server_destroy(server_ctl); | |||
| notify_server_stop(server_name); | |||
| return -1; | |||
| return return_value; | |||
| } | |||
| @@ -133,7 +133,7 @@ jackctl_server_destroy( | |||
| jackctl_server_t * server); | |||
| /** | |||
| * Call this function to start JACK server | |||
| * Call this function to open JACK server | |||
| * | |||
| * @param server server object handle | |||
| * @param driver driver to use | |||
| @@ -141,10 +141,21 @@ jackctl_server_destroy( | |||
| * @return success status: true - success, false - fail | |||
| */ | |||
| bool | |||
| jackctl_server_start( | |||
| jackctl_server_open( | |||
| jackctl_server_t * server, | |||
| jackctl_driver_t * driver); | |||
| /** | |||
| * Call this function to start JACK server | |||
| * | |||
| * @param server server object handle | |||
| * | |||
| * @return success status: true - success, false - fail | |||
| */ | |||
| bool | |||
| jackctl_server_start( | |||
| jackctl_server_t * server); | |||
| /** | |||
| * Call this function to stop JACK server | |||
| * | |||
| @@ -156,6 +167,17 @@ bool | |||
| jackctl_server_stop( | |||
| jackctl_server_t * server); | |||
| /** | |||
| * Call this function to close JACK server | |||
| * | |||
| * @param server server object handle | |||
| * | |||
| * @return success status: true - success, false - fail | |||
| */ | |||
| bool | |||
| jackctl_server_close( | |||
| jackctl_server_t * server); | |||
| /** | |||
| * Call this function to get list of available drivers. List node data | |||
| * pointers is a driver object handle (::jackctl_driver_t). | |||
| @@ -153,14 +153,21 @@ jack_controller_start_server( | |||
| controller_ptr->xruns = 0; | |||
| if (!jackctl_server_start( | |||
| if (!jackctl_server_open( | |||
| controller_ptr->server, | |||
| controller_ptr->driver)) | |||
| { | |||
| jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to start server"); | |||
| jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to open server"); | |||
| goto fail; | |||
| } | |||
| if (!jackctl_server_start( | |||
| controller_ptr->server)) | |||
| { | |||
| jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to start server"); | |||
| goto fail_close_server; | |||
| } | |||
| controller_ptr->client = jack_client_open( | |||
| "dbusapi", | |||
| JackNoStartServer, | |||
| @@ -213,6 +220,12 @@ fail_stop_server: | |||
| jack_error("failed to stop jack server"); | |||
| } | |||
| fail_close_server: | |||
| if (!jackctl_server_close(controller_ptr->server)) | |||
| { | |||
| jack_error("failed to close jack server"); | |||
| } | |||
| fail: | |||
| return FALSE; | |||
| } | |||
| @@ -250,6 +263,12 @@ jack_controller_stop_server( | |||
| return FALSE; | |||
| } | |||
| if (!jackctl_server_close(controller_ptr->server)) | |||
| { | |||
| jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to close server"); | |||
| return FALSE; | |||
| } | |||
| controller_ptr->started = false; | |||
| return TRUE; | |||
| @@ -207,8 +207,9 @@ int main(int argc, char *argv[]) | |||
| print_internal((jackctl_internal_t *)node_ptr->data); | |||
| node_ptr = jack_slist_next(node_ptr); | |||
| } | |||
| jackctl_server_start(server, jackctl_server_get_driver(server, driver_name)); | |||
| jackctl_server_open(server, jackctl_server_get_driver(server, driver_name)); | |||
| jackctl_server_start(server); | |||
| jackctl_server_load_internal(server, jackctl_server_get_internal(server, client_name)); | |||
| /* | |||
| @@ -340,13 +340,23 @@ int JackAlsaDriver::Close() | |||
| int JackAlsaDriver::Start() | |||
| { | |||
| JackAudioDriver::Start(); | |||
| return alsa_driver_start((alsa_driver_t *)fDriver); | |||
| int res = JackAudioDriver::Start(); | |||
| if (res >= 0) { | |||
| res = alsa_driver_start((alsa_driver_t *)fDriver); | |||
| if (res < 0) { | |||
| JackAudioDriver::Stop(); | |||
| } | |||
| } | |||
| return res; | |||
| } | |||
| int JackAlsaDriver::Stop() | |||
| { | |||
| return alsa_driver_stop((alsa_driver_t *)fDriver); | |||
| int res = alsa_driver_stop((alsa_driver_t *)fDriver); | |||
| if (JackAudioDriver::Stop() < 0) { | |||
| res = -1; | |||
| } | |||
| return res; | |||
| } | |||
| int JackAlsaDriver::Read() | |||
| @@ -526,7 +526,7 @@ int JackFFADODriver::Attach() | |||
| port = fGraphManager->GetPort(port_index); | |||
| // Add one buffer more latency if "async" mode is used... | |||
| range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1)) + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency | |||
| range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1)) + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency; | |||
| port->SetLatencyRange(JackPlaybackLatency, &range); | |||
| // playback port aliases (jackd1 style port names) | |||
| snprintf(buf, sizeof(buf) - 1, "%s:playback_%i", fClientControl.fName, (int) chn + 1); | |||
| @@ -653,13 +653,23 @@ int JackFFADODriver::Close() | |||
| int JackFFADODriver::Start() | |||
| { | |||
| JackAudioDriver::Start(); | |||
| return ffado_driver_start((ffado_driver_t *)fDriver); | |||
| int res = JackAudioDriver::Start(); | |||
| if (res >= 0) { | |||
| res = ffado_driver_start((ffado_driver_t *)fDriver); | |||
| if (res < 0) { | |||
| JackAudioDriver::Stop(); | |||
| } | |||
| } | |||
| return res; | |||
| } | |||
| int JackFFADODriver::Stop() | |||
| { | |||
| return ffado_driver_stop((ffado_driver_t *)fDriver); | |||
| int res = ffado_driver_stop((ffado_driver_t *)fDriver); | |||
| if (JackAudioDriver::Stop() < 0) { | |||
| res = -1; | |||
| } | |||
| return res; | |||
| } | |||
| int JackFFADODriver::Read() | |||
| @@ -841,13 +841,23 @@ int JackFreebobDriver::Close() | |||
| int JackFreebobDriver::Start() | |||
| { | |||
| JackAudioDriver::Start(); | |||
| return freebob_driver_start((freebob_driver_t *)fDriver); | |||
| int res = JackAudioDriver::Start(); | |||
| if (res >= 0) { | |||
| res = freebob_driver_start((freebob_driver_t *)fDriver); | |||
| if (res < 0) { | |||
| JackAudioDriver::Stop(); | |||
| } | |||
| } | |||
| return res; | |||
| } | |||
| int JackFreebobDriver::Stop() | |||
| { | |||
| return freebob_driver_stop((freebob_driver_t *)fDriver); | |||
| int res = freebob_driver_stop((freebob_driver_t *)fDriver); | |||
| if (JackAudioDriver::Stop() < 0) { | |||
| res = -1; | |||
| } | |||
| return res; | |||
| } | |||
| int JackFreebobDriver::Read() | |||
| @@ -1680,33 +1680,38 @@ int JackCoreAudioDriver::Attach() | |||
| int JackCoreAudioDriver::Start() | |||
| { | |||
| jack_log("JackCoreAudioDriver::Start"); | |||
| JackAudioDriver::Start(); | |||
| if (JackAudioDriver::Start() >= 0) { | |||
| OSStatus err = AudioOutputUnitStart(fAUHAL); | |||
| if (err == noErr) { | |||
| OSStatus err = AudioOutputUnitStart(fAUHAL); | |||
| if (err != noErr) | |||
| return -1; | |||
| // Waiting for Measure callback to be called (= driver has started) | |||
| fState = false; | |||
| int count = 0; | |||
| while (!fState && count++ < WAIT_COUNTER) { | |||
| usleep(100000); | |||
| jack_log("JackCoreAudioDriver::Start wait count = %d", count); | |||
| } | |||
| // Waiting for Measure callback to be called (= driver has started) | |||
| fState = false; | |||
| int count = 0; | |||
| while (!fState && count++ < WAIT_COUNTER) { | |||
| usleep(100000); | |||
| jack_log("JackCoreAudioDriver::Start wait count = %d", count); | |||
| } | |||
| if (count < WAIT_COUNTER) { | |||
| jack_info("CoreAudio driver is running..."); | |||
| return 0; | |||
| } | |||
| if (count < WAIT_COUNTER) { | |||
| jack_info("CoreAudio driver is running..."); | |||
| return 0; | |||
| } else { | |||
| jack_error("CoreAudio driver cannot start..."); | |||
| return -1; | |||
| jack_error("CoreAudio driver cannot start..."); | |||
| } | |||
| JackAudioDriver::Stop(); | |||
| } | |||
| return -1; | |||
| } | |||
| int JackCoreAudioDriver::Stop() | |||
| { | |||
| jack_log("JackCoreAudioDriver::Stop"); | |||
| return (AudioOutputUnitStop(fAUHAL) == noErr) ? 0 : -1; | |||
| int res = (AudioOutputUnitStop(fAUHAL) == noErr) ? 0 : -1; | |||
| if (JackAudioDriver::Stop() < 0) { | |||
| res = -1; | |||
| } | |||
| return res; | |||
| } | |||
| int JackCoreAudioDriver::SetBufferSize(jack_nframes_t buffer_size) | |||
| @@ -191,16 +191,25 @@ error: | |||
| int JackPortAudioDriver::Start() | |||
| { | |||
| jack_log("JackPortAudioDriver::Start"); | |||
| JackAudioDriver::Start(); | |||
| PaError err = Pa_StartStream(fStream); | |||
| return (err == paNoError) ? 0 : -1; | |||
| if (JackAudioDriver::Start() >= 0) { | |||
| PaError err = Pa_StartStream(fStream); | |||
| if (err == paNoError) { | |||
| return 0; | |||
| } | |||
| JackAudioDriver::Stop(); | |||
| } | |||
| return -1; | |||
| } | |||
| int JackPortAudioDriver::Stop() | |||
| { | |||
| jack_log("JackPortAudioDriver::Stop"); | |||
| PaError err = Pa_StopStream(fStream); | |||
| return (err == paNoError) ? 0 : -1; | |||
| int res = (err == paNoError) ? 0 : -1; | |||
| if (JackAudioDriver::Stop() < 0) { | |||
| res = -1; | |||
| } | |||
| return res; | |||
| } | |||
| int JackPortAudioDriver::SetBufferSize(jack_nframes_t buffer_size) | |||