git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4143 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.7
| @@ -34,6 +34,11 @@ Valerio Pilo | |||
| Jackdmp changes log | |||
| --------------------------- | |||
| 2011-03-04 Stephane Letz <letz@grame.fr> | |||
| * Revert r4119 (RT notification in the server). JackAudioDriver::ProcessSync now skip backend write in case of graph process failure. | |||
| * Fix incorrect error codes in alsa/usx2y.c and alsa/JackAlsaDriver.cpp. | |||
| 2011-02-09 Stephane Letz <letz@grame.fr> | |||
| * Remove JackPortIsActive flag. | |||
| @@ -188,13 +188,13 @@ int JackAudioDriver::ProcessNull() | |||
| { | |||
| // Keep begin cycle time | |||
| JackDriver::CycleTakeBeginTime(); | |||
| if (fEngineControl->fSyncMode) { | |||
| ProcessGraphSync(); | |||
| } else { | |||
| ProcessGraphAsync(); | |||
| } | |||
| // Keep end cycle time | |||
| JackDriver::CycleTakeEndTime(); | |||
| WaitUntilNextCycle(); | |||
| @@ -214,23 +214,24 @@ synchronize to the end of client graph execution. | |||
| int JackAudioDriver::ProcessAsync() | |||
| { | |||
| // Read input buffers for the current cycle | |||
| if (Read() < 0) { | |||
| if (Read() < 0) { | |||
| jack_error("JackAudioDriver::ProcessAsync: read error, stopping..."); | |||
| return -1; | |||
| return -1; | |||
| } | |||
| // Write output buffers from the previous cycle | |||
| if (Write() < 0) { | |||
| jack_error("JackAudioDriver::ProcessAsync: write error, stopping..."); | |||
| return -1; | |||
| return -1; | |||
| } | |||
| // Process graph | |||
| if (fIsMaster) { | |||
| ProcessGraphAsync(); | |||
| } else { | |||
| fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable); | |||
| } | |||
| // Keep end cycle time | |||
| JackDriver::CycleTakeEndTime(); | |||
| return 0; | |||
| @@ -238,29 +239,38 @@ int JackAudioDriver::ProcessAsync() | |||
| /* | |||
| The driver SYNC mode: the server does synchronize to the end of client graph execution, | |||
| output buffers computed at the *current cycle* are used. | |||
| if graph process succeed, output buffers computed at the *current cycle* are used. | |||
| */ | |||
| int JackAudioDriver::ProcessSync() | |||
| { | |||
| // Read input buffers for the current cycle | |||
| if (Read() < 0) { | |||
| if (Read() < 0) { | |||
| jack_error("JackAudioDriver::ProcessSync: read error, stopping..."); | |||
| return -1; | |||
| return -1; | |||
| } | |||
| // Process graph | |||
| if (fIsMaster) { | |||
| ProcessGraphSync(); | |||
| if (ProcessGraphSync() < 0) { | |||
| jack_error("JackAudioDriver::ProcessSync: process error, skip cycle..."); | |||
| goto end; | |||
| } | |||
| } else { | |||
| fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable); | |||
| if (fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable) < 0) { | |||
| jack_error("JackAudioDriver::ProcessSync: process error, skip cycle..."); | |||
| goto end; | |||
| } | |||
| } | |||
| // Write output buffers from the current cycle | |||
| if (Write() < 0) { | |||
| jack_error("JackAudioDriver::ProcessSync: write error, stopping..."); | |||
| return -1; | |||
| return -1; | |||
| } | |||
| end: | |||
| // Keep end cycle time | |||
| JackDriver::CycleTakeEndTime(); | |||
| return 0; | |||
| @@ -269,25 +279,34 @@ int JackAudioDriver::ProcessSync() | |||
| void JackAudioDriver::ProcessGraphAsync() | |||
| { | |||
| // fBeginDateUst is set in the "low level" layer, fEndDateUst is from previous cycle | |||
| if (!fEngine->Process(fBeginDateUst, fEndDateUst)) | |||
| if (!fEngine->Process(fBeginDateUst, fEndDateUst)) | |||
| jack_error("JackAudioDriver::ProcessGraphAsync: Process error"); | |||
| fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable); | |||
| if (ProcessSlaves() < 0) | |||
| jack_error("JackAudioDriver::ProcessGraphAsync: ProcessSlaves error"); | |||
| } | |||
| void JackAudioDriver::ProcessGraphSync() | |||
| int JackAudioDriver::ProcessGraphSync() | |||
| { | |||
| int res = 0; | |||
| // fBeginDateUst is set in the "low level" layer, fEndDateUst is from previous cycle | |||
| if (fEngine->Process(fBeginDateUst, fEndDateUst)) { | |||
| if (fEngine->Process(fBeginDateUst, fEndDateUst)) { | |||
| fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable); | |||
| if (ProcessSlaves() < 0) | |||
| if (ProcessSlaves() < 0) { | |||
| jack_error("JackAudioDriver::ProcessGraphSync: ProcessSlaves error, engine may now behave abnormally!!"); | |||
| if (fGraphManager->SuspendRefNum(&fClientControl, fSynchroTable, DRIVER_TIMEOUT_FACTOR * fEngineControl->fTimeOutUsecs) < 0) | |||
| res = -1; | |||
| } | |||
| if (fGraphManager->SuspendRefNum(&fClientControl, fSynchroTable, DRIVER_TIMEOUT_FACTOR * fEngineControl->fTimeOutUsecs) < 0) { | |||
| jack_error("JackAudioDriver::ProcessGraphSync: SuspendRefNum error, engine may now behave abnormally!!"); | |||
| res = -1; | |||
| } | |||
| } else { // Graph not finished: do not activate it | |||
| jack_error("JackAudioDriver::ProcessGraphSync: Process error"); | |||
| res = -1; | |||
| } | |||
| return res; | |||
| } | |||
| void JackAudioDriver::WaitUntilNextCycle() | |||
| @@ -36,12 +36,12 @@ class SERVER_EXPORT JackAudioDriver : public JackDriver | |||
| protected: | |||
| void ProcessGraphAsync(); | |||
| void ProcessGraphSync(); | |||
| int ProcessGraphSync(); | |||
| void WaitUntilNextCycle(); | |||
| virtual int ProcessAsync(); | |||
| virtual int ProcessSync(); | |||
| int fCaptureChannels; | |||
| int fPlaybackChannels; | |||
| @@ -73,7 +73,7 @@ class SERVER_EXPORT JackAudioDriver : public JackDriver | |||
| const char* playback_driver_name, | |||
| jack_nframes_t capture_latency, | |||
| jack_nframes_t playback_latency); | |||
| virtual int Open(bool capturing, | |||
| bool playing, | |||
| int inchannels, | |||
| @@ -83,13 +83,13 @@ class SERVER_EXPORT JackAudioDriver : public JackDriver | |||
| const char* playback_driver_name, | |||
| jack_nframes_t capture_latency, | |||
| jack_nframes_t playback_latency); | |||
| virtual int Process(); | |||
| virtual int ProcessNull(); | |||
| virtual int Attach(); | |||
| virtual int Detach(); | |||
| virtual int Write(); | |||
| virtual int SetBufferSize(jack_nframes_t buffer_size); | |||
| @@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| GNU Lesser General Public License for more details. | |||
| You should have received a copy of the GNU Lesser General Public License | |||
| along with this program; if not, write to the Free Software | |||
| along with this program; if not, write to the Free Software | |||
| Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| @@ -84,17 +84,17 @@ int JackClient::Close() | |||
| { | |||
| jack_log("JackClient::Close ref = %ld", GetClientControl()->fRefNum); | |||
| int result = 0; | |||
| Deactivate(); | |||
| fChannel->Stop(); // Channels is stopped first to avoid receiving notifications while closing | |||
| // Request close only if server is still running | |||
| if (JackGlobals::fServerRunning) { | |||
| fChannel->ClientClose(GetClientControl()->fRefNum, &result); | |||
| } else { | |||
| jack_log("JackClient::Close server is shutdown"); | |||
| jack_log("JackClient::Close server is shutdown"); | |||
| } | |||
| fChannel->Close(); | |||
| fSynchroTable[GetClientControl()->fRefNum].Disconnect(); | |||
| JackGlobals::fClientTable[GetClientControl()->fRefNum] = NULL; | |||
| @@ -188,7 +188,7 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, | |||
| res = fBufferSize(value1, fBufferSizeArg); | |||
| } | |||
| break; | |||
| case kSampleRateCallback: | |||
| jack_log("JackClient::kSampleRateCallback sample_rate = %ld", value1); | |||
| if (fSampleRate) { | |||
| @@ -250,7 +250,7 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, | |||
| fPortConnect(value1, value2, 0, fPortConnectArg); | |||
| } | |||
| break; | |||
| case kPortRenameCallback: | |||
| jack_log("JackClient::kPortRenameCallback port = %ld", value1); | |||
| if (fPortRename) { | |||
| @@ -264,7 +264,7 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, | |||
| res = fXrun(fXrunArg); | |||
| } | |||
| break; | |||
| case kShutDownCallback: | |||
| jack_log("JackClient::kShutDownCallback"); | |||
| if (fInfoShutdown) { | |||
| @@ -297,7 +297,7 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, | |||
| /*! | |||
| \brief We need to start thread before activating in the server, otherwise the FW driver | |||
| connected to the client may not be activated. | |||
| connected to the client may not be activated. | |||
| */ | |||
| int JackClient::Activate() | |||
| { | |||
| @@ -310,13 +310,13 @@ int JackClient::Activate() | |||
| if (StartThread() < 0) | |||
| return -1; | |||
| } | |||
| /* | |||
| Insertion of client in the graph will cause a kGraphOrderCallback notification | |||
| Insertion of client in the graph will cause a kGraphOrderCallback notification | |||
| to be delivered by the server, the client wants to receive it. | |||
| */ | |||
| GetClientControl()->fActive = true; | |||
| // Transport related callback become "active" | |||
| GetClientControl()->fTransportSync = true; | |||
| GetClientControl()->fTransportTimebase = true; | |||
| @@ -337,18 +337,18 @@ int JackClient::Deactivate() | |||
| return 0; | |||
| GetClientControl()->fActive = false; | |||
| // Transport related callback become "unactive" | |||
| GetClientControl()->fTransportSync = false; | |||
| GetClientControl()->fTransportTimebase = false; | |||
| // We need to wait for the new engine cycle before stopping the RT thread, but this is done by ClientDeactivate | |||
| int result = -1; | |||
| fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result); | |||
| jack_log("JackClient::Deactivate res = %ld", result); | |||
| // RT thread is stopped only when needed... | |||
| if (IsRealTime()) | |||
| if (IsRealTime()) | |||
| fThread.Kill(); | |||
| return result; | |||
| } | |||
| @@ -399,21 +399,21 @@ int JackClient::StartThread() | |||
| bool JackClient::Execute() | |||
| { | |||
| if (!jack_tls_set(JackGlobals::fRealTime, this)) | |||
| if (!jack_tls_set(JackGlobals::fRealTime, this)) | |||
| jack_error("failed to set thread realtime key"); | |||
| if (GetEngineControl()->fRealTime) | |||
| set_threaded_log_function(); | |||
| if (GetEngineControl()->fRealTime) | |||
| set_threaded_log_function(); | |||
| // Execute a dummy cycle to be sure thread has the correct properties | |||
| DummyCycle(); | |||
| if (fThreadFun) { | |||
| fThreadFun(fThreadFunArg); | |||
| } else { | |||
| ExecuteThread(); | |||
| } | |||
| return false; | |||
| return false; | |||
| } | |||
| void JackClient::DummyCycle() | |||
| @@ -424,15 +424,15 @@ void JackClient::DummyCycle() | |||
| inline void JackClient::ExecuteThread() | |||
| { | |||
| while (true) { | |||
| while (true) { | |||
| CycleWaitAux(); | |||
| CycleSignalAux(CallProcessCallback()); | |||
| } | |||
| CycleSignalAux(CallProcessCallback()); | |||
| } | |||
| } | |||
| inline jack_nframes_t JackClient::CycleWaitAux() | |||
| { | |||
| if (!WaitSync()) | |||
| if (!WaitSync()) | |||
| Error(); // Terminates the thread | |||
| CallSyncCallbackAux(); | |||
| return GetEngineControl()->fBufferSize; | |||
| @@ -443,7 +443,7 @@ inline void JackClient::CycleSignalAux(int status) | |||
| if (status == 0) | |||
| CallTimebaseCallbackAux(); | |||
| SignalSync(); | |||
| if (status != 0) | |||
| if (status != 0) | |||
| End(); // Terminates the thread | |||
| } | |||
| @@ -531,7 +531,7 @@ int JackClient::PortRegister(const char* port_name, const char* port_type, unsig | |||
| int result = -1; | |||
| jack_port_id_t port_index = NO_PORT; | |||
| fChannel->PortRegister(GetClientControl()->fRefNum, name.c_str(), port_type, flags, buffer_size, &port_index, &result); | |||
| if (result == 0) { | |||
| jack_log("JackClient::PortRegister ref = %ld name = %s type = %s port_index = %ld", GetClientControl()->fRefNum, name.c_str(), port_type, port_index); | |||
| fPortList.push_back(port_index); | |||
| @@ -623,7 +623,7 @@ void JackClient::ShutDown() | |||
| { | |||
| jack_log("ShutDown"); | |||
| JackGlobals::fServerRunning = false; | |||
| if (fInfoShutdown) { | |||
| fInfoShutdown(JackFailure, "JACK server has been closed", fInfoShutdownArg); | |||
| fInfoShutdown = NULL; | |||
| @@ -641,18 +641,18 @@ inline int JackClient::ActivateAux() | |||
| { | |||
| // If activated without RT thread... | |||
| if (IsActive() && fThread.GetStatus() != JackThread::kRunning) { | |||
| jack_log("ActivateAux"); | |||
| // RT thread is started | |||
| if (StartThread() < 0) | |||
| return -1; | |||
| int result = -1; | |||
| GetClientControl()->fCallback[kRealTimeCallback] = IsRealTime(); | |||
| fChannel->ClientActivate(GetClientControl()->fRefNum, IsRealTime(), &result); | |||
| return result; | |||
| } else { | |||
| return 0; | |||
| } | |||
| @@ -683,7 +683,7 @@ int JackClient::SetTimebaseCallback(int conditional, JackTimebaseCallback timeba | |||
| { | |||
| int result = -1; | |||
| fChannel->SetTimebaseCallback(GetClientControl()->fRefNum, conditional, &result); | |||
| if (result == 0) { | |||
| GetClientControl()->fTransportTimebase = true; | |||
| fTimebase = timebase_callback; | |||
| @@ -758,11 +758,11 @@ void JackClient::CallSyncCallback() | |||
| inline void JackClient::CallSyncCallbackAux() | |||
| { | |||
| if (GetClientControl()->fTransportSync) { | |||
| JackTransportEngine& transport = GetEngineControl()->fTransport; | |||
| jack_position_t* cur_pos = transport.ReadCurrentState(); | |||
| jack_transport_state_t transport_state = transport.GetState(); | |||
| if (fSync != NULL) { | |||
| if (fSync(transport_state, cur_pos, fSyncArg)) { | |||
| GetClientControl()->fTransportState = JackTransportRolling; | |||
| @@ -785,21 +785,21 @@ inline void JackClient::CallTimebaseCallbackAux() | |||
| JackTransportEngine& transport = GetEngineControl()->fTransport; | |||
| int master; | |||
| bool unused; | |||
| transport.GetTimebaseMaster(master, unused); | |||
| if (GetClientControl()->fRefNum == master && fTimebase) { // Client *is* timebase... | |||
| jack_transport_state_t transport_state = transport.GetState(); | |||
| jack_position_t* cur_pos = transport.WriteNextStateStart(1); | |||
| if (GetClientControl()->fTransportTimebase) { | |||
| fTimebase(transport_state, GetEngineControl()->fBufferSize, cur_pos, true, fTimebaseArg); | |||
| GetClientControl()->fTransportTimebase = false; // Callback is called only once with "new_pos" = true | |||
| fTimebase(transport_state, GetEngineControl()->fBufferSize, cur_pos, true, fTimebaseArg); | |||
| GetClientControl()->fTransportTimebase = false; // Callback is called only once with "new_pos" = true | |||
| } else if (transport_state == JackTransportRolling) { | |||
| fTimebase(transport_state, GetEngineControl()->fBufferSize, cur_pos, false, fTimebaseArg); | |||
| } | |||
| } | |||
| transport.WriteNextStateStop(1); | |||
| } | |||
| } | |||
| @@ -817,7 +817,7 @@ void JackClient::OnShutdown(JackShutdownCallback callback, void *arg) | |||
| fShutdown = callback; | |||
| } | |||
| } | |||
| void JackClient::OnInfoShutdown(JackInfoShutdownCallback callback, void *arg) | |||
| { | |||
| if (IsActive()) { | |||
| @@ -908,8 +908,8 @@ int JackClient::SetSampleRateCallback(JackSampleRateCallback callback, void *arg | |||
| GetClientControl()->fCallback[kSampleRateCallback] = (callback != NULL); | |||
| fSampleRateArg = arg; | |||
| fSampleRate = callback; | |||
| // Now invoke it | |||
| if (callback) | |||
| // Now invoke it | |||
| if (callback) | |||
| callback(GetEngineControl()->fSampleRate, arg); | |||
| return 0; | |||
| } | |||
| @@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| GNU Lesser General Public License for more details. | |||
| You should have received a copy of the GNU Lesser General Public License | |||
| along with this program; if not, write to the Free Software | |||
| along with this program; if not, write to the Free Software | |||
| Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| @@ -94,14 +94,14 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||
| std::list<jack_port_id_t> fPortList; | |||
| bool fImmediateSessionReply; | |||
| int StartThread(); | |||
| void SetupDriverSync(bool freewheel); | |||
| bool IsActive(); | |||
| void CallSyncCallback(); | |||
| void CallTimebaseCallback(); | |||
| virtual int ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value); | |||
| inline void DummyCycle(); | |||
| @@ -116,7 +116,7 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||
| inline void CallSyncCallbackAux(); | |||
| inline void CallTimebaseCallbackAux(); | |||
| inline int ActivateAux(); | |||
| public: | |||
| JackClient(); | |||
| @@ -193,9 +193,9 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||
| // Session api | |||
| virtual jack_session_command_t *SessionNotify(const char *target, jack_session_event_type_t type, const char *path); | |||
| virtual int SessionReply(jack_session_event_t *ev); | |||
| char* GetUUIDForClientName(const char* client_name); | |||
| char* GetClientNameForUUID(const char* uuid); | |||
| int ReserveClientName(const char *name, const char* uuid); | |||
| char* GetUUIDForClientName(const char* client_name); | |||
| char* GetClientNameForUUID(const char* uuid); | |||
| int ReserveClientName(const char *name, const char* uuid); | |||
| // JackRunnableInterface interface | |||
| bool Init(); | |||
| @@ -138,8 +138,8 @@ void JackEngine::ProcessNext(jack_time_t cur_cycle_begin) | |||
| { | |||
| fLastSwitchUsecs = cur_cycle_begin; | |||
| if (fGraphManager->RunNextGraph()) { // True if the graph actually switched to a new state | |||
| //fChannel.Notify(ALL_CLIENTS, kGraphOrderCallback, 0); | |||
| NotifyGraphReorder(); | |||
| fChannel.Notify(ALL_CLIENTS, kGraphOrderCallback, 0); | |||
| //NotifyGraphReorder(); | |||
| } | |||
| fSignal.Signal(); // Signal for threads waiting for next cycle | |||
| } | |||
| @@ -196,14 +196,14 @@ void JackEngine::CheckXRun(jack_time_t callback_usecs) // REVOIR les conditions | |||
| if (status != NotTriggered && status != Finished) { | |||
| jack_error("JackEngine::XRun: client = %s was not run: state = %ld", client->GetClientControl()->fName, status); | |||
| //fChannel.Notify(ALL_CLIENTS, kXRunCallback, 0); // Notify all clients | |||
| NotifyXRun(ALL_CLIENTS); | |||
| fChannel.Notify(ALL_CLIENTS, kXRunCallback, 0); // Notify all clients | |||
| //NotifyXRun(ALL_CLIENTS); | |||
| } | |||
| if (status == Finished && (long)(finished_date - callback_usecs) > 0) { | |||
| jack_error("JackEngine::XRun: client %s finished after current callback", client->GetClientControl()->fName); | |||
| //fChannel.Notify(ALL_CLIENTS, kXRunCallback, 0); // Notify all clients | |||
| NotifyXRun(ALL_CLIENTS); | |||
| fChannel.Notify(ALL_CLIENTS, kXRunCallback, 0); // Notify all clients | |||
| //NotifyXRun(ALL_CLIENTS); | |||
| } | |||
| } | |||
| } | |||
| @@ -280,8 +280,8 @@ void JackEngine::NotifyXRun(jack_time_t callback_usecs, float delayed_usecs) | |||
| { | |||
| // Use the audio thread => request thread communication channel | |||
| fEngineControl->NotifyXRun(callback_usecs, delayed_usecs); | |||
| //fChannel.Notify(ALL_CLIENTS, kXRunCallback, 0); | |||
| NotifyXRun(ALL_CLIENTS); | |||
| fChannel.Notify(ALL_CLIENTS, kXRunCallback, 0); | |||
| //NotifyXRun(ALL_CLIENTS); | |||
| } | |||
| void JackEngine::NotifyXRun(int refnum) | |||
| @@ -28,8 +28,10 @@ static char* server_name = NULL; | |||
| namespace Jack | |||
| { | |||
| JackServer* JackServerGlobals::fInstance; | |||
| JackServer* JackServerGlobals::fInstance; | |||
| unsigned int JackServerGlobals::fUserCount; | |||
| int JackServerGlobals::fRTNotificationSocket; | |||
| bool (* JackServerGlobals::on_device_acquire)(const char * device_name) = NULL; | |||
| void (* JackServerGlobals::on_device_release)(const char * device_name) = NULL; | |||
| @@ -95,7 +97,7 @@ bool JackServerGlobals::Init() | |||
| int argc = 0; | |||
| char* argv[32]; | |||
| jack_timer_type_t clock_source = JACK_TIMER_SYSTEM_CLOCK; | |||
| // First user starts the server | |||
| if (fUserCount++ == 0) { | |||
| @@ -158,7 +160,7 @@ bool JackServerGlobals::Init() | |||
| (opt = getopt_long(argc, argv, options, long_options, &option_index)) != EOF) { | |||
| switch (opt) { | |||
| case 'c': | |||
| if (tolower (optarg[0]) == 'h') { | |||
| clock_source = JACK_TIMER_HPET; | |||
| @@ -168,7 +170,7 @@ bool JackServerGlobals::Init() | |||
| clock_source = JACK_TIMER_SYSTEM_CLOCK; | |||
| } else { | |||
| jack_error("unknown option character %c", optopt); | |||
| } | |||
| } | |||
| break; | |||
| case 'd': | |||
| @@ -38,9 +38,10 @@ struct SERVER_EXPORT JackServerGlobals | |||
| { | |||
| static JackServer* fInstance; | |||
| static unsigned int fUserCount; | |||
| static int fRTNotificationSocket; // For debugging purpose | |||
| static bool (* on_device_acquire)(const char * device_name); | |||
| static void (* on_device_release)(const char * device_name); | |||
| JackServerGlobals(); | |||
| ~JackServerGlobals(); | |||
| @@ -276,7 +276,7 @@ JackAlsaDriver::alsa_driver_setup_io_function_pointers (alsa_driver_t *driver) | |||
| } else { | |||
| driver->channel_copy = memcpy_fake; | |||
| } | |||
| switch (driver->dither) { | |||
| case Rectangular: | |||
| jack_info("Rectangular dithering at 16 bits"); | |||
| @@ -284,42 +284,42 @@ JackAlsaDriver::alsa_driver_setup_io_function_pointers (alsa_driver_t *driver) | |||
| sample_move_dither_rect_d16_sSs: | |||
| sample_move_dither_rect_d16_sS; | |||
| break; | |||
| case Triangular: | |||
| jack_info("Triangular dithering at 16 bits"); | |||
| driver->write_via_copy = driver->quirk_bswap? | |||
| sample_move_dither_tri_d16_sSs: | |||
| sample_move_dither_tri_d16_sS; | |||
| break; | |||
| case Shaped: | |||
| jack_info("Noise-shaped dithering at 16 bits"); | |||
| driver->write_via_copy = driver->quirk_bswap? | |||
| sample_move_dither_shaped_d16_sSs: | |||
| sample_move_dither_shaped_d16_sS; | |||
| break; | |||
| default: | |||
| driver->write_via_copy = driver->quirk_bswap? | |||
| sample_move_d16_sSs : | |||
| sample_move_d16_sSs : | |||
| sample_move_d16_sS; | |||
| break; | |||
| } | |||
| break; | |||
| case 3: /* NO DITHER */ | |||
| if (driver->playback_interleaved) { | |||
| driver->channel_copy = memcpy_interleave_d24_s24; | |||
| } else { | |||
| driver->channel_copy = memcpy_fake; | |||
| } | |||
| driver->write_via_copy = driver->quirk_bswap? | |||
| sample_move_d24_sSs: | |||
| sample_move_d24_sSs: | |||
| sample_move_d24_sS; | |||
| break; | |||
| case 4: /* NO DITHER */ | |||
| if (driver->playback_interleaved) { | |||
| driver->channel_copy = memcpy_interleave_d32_s32; | |||
| @@ -328,7 +328,7 @@ JackAlsaDriver::alsa_driver_setup_io_function_pointers (alsa_driver_t *driver) | |||
| } | |||
| driver->write_via_copy = driver->quirk_bswap? | |||
| sample_move_d32u24_sSs: | |||
| sample_move_d32u24_sSs: | |||
| sample_move_d32u24_sS; | |||
| break; | |||
| @@ -339,27 +339,27 @@ JackAlsaDriver::alsa_driver_setup_io_function_pointers (alsa_driver_t *driver) | |||
| } | |||
| } | |||
| } | |||
| if (driver->capture_handle) { | |||
| switch (driver->capture_sample_bytes) { | |||
| case 2: | |||
| driver->read_via_copy = driver->quirk_bswap? | |||
| sample_move_dS_s16s: | |||
| sample_move_dS_s16s: | |||
| sample_move_dS_s16; | |||
| break; | |||
| case 3: | |||
| driver->read_via_copy = driver->quirk_bswap? | |||
| sample_move_dS_s24s: | |||
| sample_move_dS_s24s: | |||
| sample_move_dS_s24; | |||
| break; | |||
| case 4: | |||
| driver->read_via_copy = driver->quirk_bswap? | |||
| sample_move_dS_s32u24s: | |||
| sample_move_dS_s32u24s: | |||
| sample_move_dS_s32u24; | |||
| break; | |||
| } | |||
| } | |||
| return 0; | |||
| } | |||
| @@ -418,7 +418,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic | |||
| } | |||
| } | |||
| } | |||
| format = (sample_width == 4) ? 0 : NUMFORMATS - 1; | |||
| while (1) { | |||
| @@ -444,7 +444,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic | |||
| jack_info ("ALSA: final selected sample format for %s: %s", stream_name, formats[format].Name); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| frame_rate = driver->frame_rate ; | |||
| err = snd_pcm_hw_params_set_rate_near (handle, hw_params, | |||
| @@ -464,7 +464,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic | |||
| &channels_max); | |||
| *nchns = channels_max ; | |||
| if (*nchns > 1024) { | |||
| if (*nchns > 1024) { | |||
| /* the hapless user is an unwitting victim of | |||
| the "default" ALSA PCM device, which can | |||
| @@ -481,9 +481,9 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic | |||
| "instead rather than using the plug layer. Usually the name of the\n" | |||
| "hardware device that corresponds to the first sound card is hw:0\n" | |||
| ); | |||
| *nchns = 2; | |||
| *nchns = 2; | |||
| } | |||
| } | |||
| } | |||
| if ((err = snd_pcm_hw_params_set_channels (handle, hw_params, | |||
| *nchns)) < 0) { | |||
| @@ -491,7 +491,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic | |||
| *nchns, stream_name); | |||
| return -1; | |||
| } | |||
| if ((err = snd_pcm_hw_params_set_period_size (handle, hw_params, | |||
| driver->frames_per_cycle, | |||
| 0)) | |||
| @@ -520,7 +520,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic | |||
| return -1; | |||
| } | |||
| jack_info ("ALSA: use %d periods for %s", *nperiodsp, stream_name); | |||
| #if 0 | |||
| #if 0 | |||
| if (!jack_power_of_two(driver->frames_per_cycle)) { | |||
| jack_error("JACK: frames must be a power of two " | |||
| "(64, 512, 1024, ...)\n"); | |||
| @@ -557,7 +557,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic | |||
| if (driver->soft_mode) { | |||
| stop_th = (snd_pcm_uframes_t)-1; | |||
| } | |||
| if ((err = snd_pcm_sw_params_set_stop_threshold ( | |||
| handle, sw_params, stop_th)) < 0) { | |||
| jack_error ("ALSA: cannot set stop mode for %s", | |||
| @@ -594,7 +594,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic | |||
| else | |||
| err = snd_pcm_sw_params_set_avail_min ( | |||
| handle, sw_params, driver->frames_per_cycle); | |||
| if (err < 0) { | |||
| jack_error ("ALSA: cannot set avail min for %s", stream_name); | |||
| return -1; | |||
| @@ -1158,7 +1158,7 @@ int | |||
| JackAlsaDriver::alsa_driver_restart (alsa_driver_t *driver) | |||
| { | |||
| int res; | |||
| driver->xrun_recovery = 1; | |||
| if ((res = Stop()) == 0) | |||
| res = Start(); | |||
| @@ -1188,25 +1188,25 @@ JackAlsaDriver::alsa_driver_xrun_recovery (alsa_driver_t *driver, float *delayed | |||
| jack_error("status error: %s", snd_strerror(res)); | |||
| } | |||
| } | |||
| if (snd_pcm_status_get_state(status) == SND_PCM_STATE_SUSPENDED) { | |||
| jack_error("**** alsa_pcm: pcm in suspended state, resuming it" ); | |||
| if (driver->capture_handle) { | |||
| if ((res = snd_pcm_prepare(driver->capture_handle)) < 0) { | |||
| jack_error("error preparing after suspend: %s", snd_strerror(res)); | |||
| } | |||
| } else { | |||
| if ((res = snd_pcm_prepare(driver->playback_handle)) < 0) { | |||
| jack_error("error preparing after suspend: %s", snd_strerror(res)); | |||
| } | |||
| } | |||
| } | |||
| if (snd_pcm_status_get_state(status) == SND_PCM_STATE_SUSPENDED) { | |||
| jack_error("**** alsa_pcm: pcm in suspended state, resuming it" ); | |||
| if (driver->capture_handle) { | |||
| if ((res = snd_pcm_prepare(driver->capture_handle)) < 0) { | |||
| jack_error("error preparing after suspend: %s", snd_strerror(res)); | |||
| } | |||
| } else { | |||
| if ((res = snd_pcm_prepare(driver->playback_handle)) < 0) { | |||
| jack_error("error preparing after suspend: %s", snd_strerror(res)); | |||
| } | |||
| } | |||
| } | |||
| if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN | |||
| && driver->process_count > XRUN_REPORT_DELAY) { | |||
| struct timeval now, diff, tstamp; | |||
| driver->xrun_count++; | |||
| snd_pcm_status_get_tstamp(status,&now); | |||
| snd_pcm_status_get_tstamp(status,&now); | |||
| snd_pcm_status_get_trigger_tstamp(status, &tstamp); | |||
| timersub(&now, &tstamp, &diff); | |||
| *delayed_usecs = diff.tv_sec * 1000000.0 + diff.tv_usec; | |||
| @@ -1266,7 +1266,7 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat | |||
| } | |||
| again: | |||
| while (need_playback || need_capture) { | |||
| int poll_result; | |||
| @@ -1282,7 +1282,7 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat | |||
| driver->playback_nfds); | |||
| nfds += driver->playback_nfds; | |||
| } | |||
| if (need_capture) { | |||
| snd_pcm_poll_descriptors (driver->capture_handle, | |||
| &driver->pfd[nfds], | |||
| @@ -1292,7 +1292,7 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat | |||
| } | |||
| /* ALSA doesn't set POLLERR in some versions of 0.9.X */ | |||
| for (i = 0; i < nfds; i++) { | |||
| driver->pfd[i].events |= POLLERR; | |||
| } | |||
| @@ -1329,12 +1329,12 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat | |||
| *status = -2; | |||
| return 0; | |||
| } | |||
| jack_error ("ALSA: poll call failed (%s)", | |||
| strerror (errno)); | |||
| *status = -3; | |||
| return 0; | |||
| } | |||
| poll_ret = jack_get_microseconds (); | |||
| @@ -1345,12 +1345,12 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat | |||
| if (extra_fd < 0) { | |||
| if (driver->poll_next && poll_ret > driver->poll_next) { | |||
| *delayed_usecs = poll_ret - driver->poll_next; | |||
| } | |||
| } | |||
| driver->poll_last = poll_ret; | |||
| driver->poll_next = poll_ret + driver->period_usecs; | |||
| // steph | |||
| /* | |||
| driver->engine->transport_cycle_start (driver->engine, | |||
| driver->engine->transport_cycle_start (driver->engine, | |||
| poll_ret); | |||
| */ | |||
| } | |||
| @@ -1371,7 +1371,7 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat | |||
| *status = -4; | |||
| return -1; | |||
| } | |||
| } | |||
| /* if POLLIN was the only bit set, we're OK */ | |||
| @@ -1427,14 +1427,14 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat | |||
| #endif | |||
| } | |||
| } | |||
| if (poll_result == 0) { | |||
| jack_error ("ALSA: poll time out, polled for %" PRIu64 | |||
| " usecs", | |||
| poll_ret - poll_enter); | |||
| *status = -5; | |||
| return 0; | |||
| } | |||
| } | |||
| } | |||
| @@ -1450,7 +1450,7 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat | |||
| } | |||
| } else { | |||
| /* odd, but see min() computation below */ | |||
| capture_avail = INT_MAX; | |||
| capture_avail = INT_MAX; | |||
| } | |||
| if (driver->playback_handle) { | |||
| @@ -1465,7 +1465,7 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat | |||
| } | |||
| } else { | |||
| /* odd, but see min() computation below */ | |||
| playback_avail = INT_MAX; | |||
| playback_avail = INT_MAX; | |||
| } | |||
| if (xrun_detected) { | |||
| @@ -1544,7 +1544,7 @@ JackAlsaDriver::alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes) | |||
| if (!driver->capture_handle) { | |||
| return 0; | |||
| } | |||
| nread = 0; | |||
| contiguous = 0; | |||
| orig_nframes = nframes; | |||
| @@ -1572,11 +1572,11 @@ JackAlsaDriver::alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes) | |||
| /* // steph | |||
| for (chn = 0, node = driver->capture_ports; node; | |||
| node = jack_slist_next (node), chn++) { | |||
| port = (jack_port_t *) node->data; | |||
| if (!jack_port_connected (port)) { | |||
| // no-copy optimization | |||
| // no-copy optimization | |||
| continue; | |||
| } | |||
| buf = jack_port_get_buffer (port, orig_nframes); | |||
| @@ -1587,7 +1587,7 @@ JackAlsaDriver::alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes) | |||
| if ((err = snd_pcm_mmap_commit (driver->capture_handle, | |||
| offset, contiguous)) < 0) { | |||
| jack_error ("ALSA: could not complete read of %" | |||
| PRIu32 " frames: error = %d\n", contiguous, err); | |||
| return -1; | |||
| @@ -1715,7 +1715,7 @@ JackAlsaDriver::alsa_driver_write (alsa_driver_t* driver, jack_nframes_t nframes | |||
| } | |||
| monbuf = jack_port_get_buffer (port, orig_nframes); | |||
| memcpy (monbuf + nwritten, buf + nwritten, contiguous * sizeof(jack_default_audio_sample_t)); | |||
| mon_node = jack_slist_next (mon_node); | |||
| mon_node = jack_slist_next (mon_node); | |||
| } | |||
| } | |||
| */ | |||
| @@ -1729,7 +1729,7 @@ JackAlsaDriver::alsa_driver_write (alsa_driver_t* driver, jack_nframes_t nframes | |||
| offset, contiguous)) < 0) { | |||
| jack_error ("ALSA: could not complete playback of %" | |||
| PRIu32 " frames: error = %d", contiguous, err); | |||
| if (err != EPIPE && err != ESTRPIPE) | |||
| if (err != -EPIPE && err != -ESTRPIPE) | |||
| return -1; | |||
| } | |||
| @@ -1752,11 +1752,11 @@ JackAlsaDriver::alsa_driver_delete (alsa_driver_t *driver) | |||
| free (node->data); | |||
| } | |||
| jack_slist_free (driver->clock_sync_listeners); | |||
| if (driver->ctl_handle) { | |||
| snd_ctl_close (driver->ctl_handle); | |||
| driver->ctl_handle = 0; | |||
| } | |||
| } | |||
| if (driver->capture_handle) { | |||
| snd_pcm_close (driver->capture_handle); | |||
| @@ -1834,14 +1834,14 @@ JackAlsaDriver::alsa_driver_new (const char *name, char *playback_alsa_device, | |||
| jack_info ("creating alsa driver ... %s|%s|%" PRIu32 "|%" PRIu32 | |||
| "|%" PRIu32"|%" PRIu32"|%" PRIu32 "|%s|%s|%s|%s", | |||
| playing ? playback_alsa_device : "-", | |||
| capturing ? capture_alsa_device : "-", | |||
| capturing ? capture_alsa_device : "-", | |||
| frames_per_cycle, user_nperiods, rate, | |||
| user_capture_nchnls,user_playback_nchnls, | |||
| hw_monitoring ? "hwmon": "nomon", | |||
| hw_metering ? "hwmeter":"swmeter", | |||
| soft_mode ? "soft-mode":"-", | |||
| shorts_first ? "16bit":"32bit"); | |||
| driver = (alsa_driver_t *) calloc (1, sizeof (alsa_driver_t)); | |||
| jack_driver_nt_init ((jack_driver_nt_t *) driver); | |||
| @@ -1875,8 +1875,8 @@ JackAlsaDriver::alsa_driver_new (const char *name, char *playback_alsa_device, | |||
| driver->playback_addr = 0; | |||
| driver->capture_addr = 0; | |||
| driver->playback_interleave_skip = NULL; | |||
| driver->capture_interleave_skip = NULL; | |||
| driver->playback_interleave_skip = NULL; | |||
| driver->capture_interleave_skip = NULL; | |||
| driver->silent = 0; | |||
| driver->all_monitor_in = FALSE; | |||
| @@ -2164,7 +2164,7 @@ int JackAlsaDriver::Detach() | |||
| return JackAudioDriver::Detach(); | |||
| } | |||
| static int card_to_num(const char* device) | |||
| static int card_to_num(const char* device) | |||
| { | |||
| int err; | |||
| char* ctl_name; | |||
| @@ -2329,13 +2329,13 @@ int JackAlsaDriver::Read() | |||
| retry: | |||
| nframes = alsa_driver_wait((alsa_driver_t *)fDriver, -1, &wait_status, &fDelayedUsecs); | |||
| if (wait_status < 0) | |||
| return -1; /* driver failed */ | |||
| if (nframes == 0) { | |||
| /* we detected an xrun and restarted: notify | |||
| * clients about the delay. | |||
| * clients about the delay. | |||
| */ | |||
| jack_log("ALSA XRun wait_status = %d", wait_status); | |||
| NotifyXRun(fBeginDateUst, fDelayedUsecs); | |||
| @@ -2344,7 +2344,7 @@ retry: | |||
| if (nframes != fEngineControl->fBufferSize) | |||
| jack_log("JackAlsaDriver::Read warning nframes = %ld", nframes); | |||
| // Has to be done before read | |||
| JackDriver::CycleIncTime(); | |||
| @@ -2632,7 +2632,7 @@ get_dither_constraint() | |||
| } | |||
| static int | |||
| dither_opt (char c, DitherAlgorithm* dither) | |||
| dither_opt (char c, DitherAlgorithm* dither) | |||
| { | |||
| switch (c) { | |||
| case '-': | |||
| @@ -2659,17 +2659,17 @@ dither_opt (char c, DitherAlgorithm* dither) | |||
| return 0; | |||
| } | |||
| SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () | |||
| SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () | |||
| { | |||
| jack_driver_desc_t * desc; | |||
| jack_driver_param_desc_t * params; | |||
| unsigned int i; | |||
| desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t)); | |||
| strcpy(desc->name, "alsa"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | |||
| strcpy(desc->desc, "Linux ALSA API based audio backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | |||
| desc->nparams = 18; | |||
| params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); | |||
| @@ -2838,7 +2838,7 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () | |||
| return desc; | |||
| } | |||
| SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) | |||
| SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) | |||
| { | |||
| jack_nframes_t srate = 48000; | |||
| jack_nframes_t frames_per_interrupt = 1024; | |||
| @@ -1,5 +1,5 @@ | |||
| /* | |||
| Copyright (C) 2001 Paul Davis | |||
| Copyright (C) 2001 Paul Davis | |||
| Copyright (C) 2005 Karsten Wiese, Rui Nuno Capela | |||
| This program is free software; you can redistribute it and/or modify | |||
| @@ -33,14 +33,14 @@ | |||
| int dbg_offset; | |||
| char dbg_buffer[8096]; | |||
| #endif | |||
| static | |||
| static | |||
| int usx2y_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask) | |||
| { | |||
| return -1; | |||
| } | |||
| static | |||
| int usx2y_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode) | |||
| int usx2y_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode) | |||
| { | |||
| return -1; | |||
| } | |||
| @@ -52,7 +52,7 @@ usx2y_release (jack_hardware_t *hw) | |||
| if (h == 0) | |||
| return; | |||
| if (h->hwdep_handle) | |||
| snd_hwdep_close(h->hwdep_handle); | |||
| @@ -622,7 +622,7 @@ usx2y_driver_write (alsa_driver_t* driver, jack_nframes_t nframes) | |||
| offset, nframes_)) < 0) { | |||
| jack_error ("ALSA/USX2Y: could not complete playback of %" | |||
| PRIu32 " frames: error = %d", nframes_, err); | |||
| if (err != EPIPE && err != ESTRPIPE) | |||
| if (err != -EPIPE && err != -ESTRPIPE) | |||
| return -1; | |||
| } | |||
| @@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| GNU Lesser General Public License for more details. | |||
| You should have received a copy of the GNU Lesser General Public License | |||
| along with this program; if not, write to the Free Software | |||
| along with this program; if not, write to the Free Software | |||
| Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| @@ -51,7 +51,7 @@ JackSocketServerChannel::~JackSocketServerChannel() | |||
| int JackSocketServerChannel::Open(const char* server_name, JackServer* server) | |||
| { | |||
| jack_log("JackSocketServerChannel::Open"); | |||
| // Prepare request socket | |||
| if (fRequestListenSocket.Bind(jack_server_dir, server_name, 0) < 0) { | |||
| jack_log("JackSocketServerChannel::Open : cannot create result listen socket"); | |||
| @@ -79,14 +79,14 @@ void JackSocketServerChannel::Close() | |||
| delete socket; | |||
| } | |||
| } | |||
| int JackSocketServerChannel::Start() | |||
| { | |||
| if (fThread.Start() != 0) { | |||
| jack_error("Cannot start Jack server listener"); | |||
| return -1; | |||
| } | |||
| } | |||
| return 0; | |||
| } | |||
| @@ -168,6 +168,12 @@ bool JackSocketServerChannel::HandleRequest(int fd) | |||
| return false; | |||
| } | |||
| if (fd == JackServerGlobals::fRTNotificationSocket && header.fType != JackRequest::kNotification) { | |||
| jack_error("fRTNotificationSocket = %d", JackServerGlobals::fRTNotificationSocket); | |||
| jack_error("JackSocketServerChannel::HandleRequest : incorrect notification !!"); | |||
| return true; | |||
| } | |||
| // Read data | |||
| switch (header.fType) { | |||
| @@ -292,7 +298,7 @@ bool JackSocketServerChannel::HandleRequest(int fd) | |||
| jack_error("JackRequest::DisconnectPorts write error ref = %d", req.fRefNum); | |||
| break; | |||
| } | |||
| case JackRequest::kPortRename: { | |||
| jack_log("JackRequest::PortRename"); | |||
| JackPortRenameRequest req; | |||
| @@ -470,7 +476,7 @@ bool JackSocketServerChannel::HandleRequest(int fd) | |||
| jack_error("Unknown request %ld", header.fType); | |||
| break; | |||
| } | |||
| return true; | |||
| } | |||
| @@ -511,7 +517,7 @@ bool JackSocketServerChannel::Init() | |||
| bool JackSocketServerChannel::Execute() | |||
| { | |||
| try { | |||
| // Global poll | |||
| if ((poll(fPollTable, fSocketTable.size() + 1, 10000) < 0) && (errno != EINTR)) { | |||
| jack_error("Engine poll failed err = %s request thread quits...", strerror(errno)); | |||
| @@ -526,22 +532,22 @@ bool JackSocketServerChannel::Execute() | |||
| jack_log("Poll client error err = %s", strerror(errno)); | |||
| ClientKill(fd); | |||
| } else if (fPollTable[i].revents & POLLIN) { | |||
| if (!HandleRequest(fd)) | |||
| if (!HandleRequest(fd)) | |||
| jack_log("Could not handle external client request"); | |||
| } | |||
| } | |||
| // Check the server request socket */ | |||
| if (fPollTable[0].revents & POLLERR) | |||
| if (fPollTable[0].revents & POLLERR) | |||
| jack_error("Error on server request socket err = %s", strerror(errno)); | |||
| if (fPollTable[0].revents & POLLIN) | |||
| if (fPollTable[0].revents & POLLIN) | |||
| ClientCreate(); | |||
| } | |||
| BuildPoolTable(); | |||
| return true; | |||
| } catch (JackQuitException& e) { | |||
| jack_log("JackMachServerChannel::Execute JackQuitException"); | |||
| return false; | |||
| @@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| GNU Lesser General Public License for more details. | |||
| You should have received a copy of the GNU Lesser General Public License | |||
| along with this program; if not, write to the Free Software | |||
| along with this program; if not, write to the Free Software | |||
| Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| @@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| #include "JackRequest.h" | |||
| #include "JackConstants.h" | |||
| #include "JackNotification.h" | |||
| #include "JackServerGlobals.h" | |||
| namespace Jack | |||
| { | |||
| @@ -33,6 +34,7 @@ int JackSocketServerNotifyChannel::Open(const char* server_name) | |||
| return -1; | |||
| } else { | |||
| fRequestSocket.SetNonBlocking(true); | |||
| JackServerGlobals::fRTNotificationSocket = fRequestSocket.GetFd(); | |||
| return 0; | |||
| } | |||
| } | |||
| @@ -63,7 +65,7 @@ void JackSocketServerNotifyChannel::NotifyQuit() | |||
| jack_error("Could not write request ref = %d notify = %d", -1, kQUIT); | |||
| } | |||
| } | |||
| } // end of namespace | |||
| @@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| GNU Lesser General Public License for more details. | |||
| You should have received a copy of the GNU Lesser General Public License | |||
| along with this program; if not, write to the Free Software | |||
| along with this program; if not, write to the Free Software | |||
| Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||