Browse Source

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.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4143 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.9.7
sletz 14 years ago
parent
commit
92c5da66da
13 changed files with 221 additions and 186 deletions
  1. +5
    -0
      ChangeLog
  2. +38
    -19
      common/JackAudioDriver.cpp
  3. +5
    -5
      common/JackAudioDriver.h
  4. +48
    -48
      common/JackClient.cpp
  5. +7
    -7
      common/JackClient.h
  6. +8
    -8
      common/JackEngine.cpp
  7. +6
    -4
      common/JackServerGlobals.cpp
  8. +2
    -1
      common/JackServerGlobals.h
  9. +73
    -73
      linux/alsa/JackAlsaDriver.cpp
  10. +5
    -5
      linux/alsa/usx2y.c
  11. +19
    -13
      posix/JackSocketServerChannel.cpp
  12. +4
    -2
      posix/JackSocketServerNotifyChannel.cpp
  13. +1
    -1
      posix/JackSocketServerNotifyChannel.h

+ 5
- 0
ChangeLog View File

@@ -34,6 +34,11 @@ Valerio Pilo
Jackdmp changes log 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> 2011-02-09 Stephane Letz <letz@grame.fr>


* Remove JackPortIsActive flag. * Remove JackPortIsActive flag.


+ 38
- 19
common/JackAudioDriver.cpp View File

@@ -188,13 +188,13 @@ int JackAudioDriver::ProcessNull()
{ {
// Keep begin cycle time // Keep begin cycle time
JackDriver::CycleTakeBeginTime(); JackDriver::CycleTakeBeginTime();
if (fEngineControl->fSyncMode) { if (fEngineControl->fSyncMode) {
ProcessGraphSync(); ProcessGraphSync();
} else { } else {
ProcessGraphAsync(); ProcessGraphAsync();
} }
// Keep end cycle time // Keep end cycle time
JackDriver::CycleTakeEndTime(); JackDriver::CycleTakeEndTime();
WaitUntilNextCycle(); WaitUntilNextCycle();
@@ -214,23 +214,24 @@ synchronize to the end of client graph execution.
int JackAudioDriver::ProcessAsync() int JackAudioDriver::ProcessAsync()
{ {
// Read input buffers for the current cycle // Read input buffers for the current cycle
if (Read() < 0) {
if (Read() < 0) {
jack_error("JackAudioDriver::ProcessAsync: read error, stopping..."); jack_error("JackAudioDriver::ProcessAsync: read error, stopping...");
return -1;
return -1;
} }


// Write output buffers from the previous cycle // Write output buffers from the previous cycle
if (Write() < 0) { if (Write() < 0) {
jack_error("JackAudioDriver::ProcessAsync: write error, stopping..."); jack_error("JackAudioDriver::ProcessAsync: write error, stopping...");
return -1;
return -1;
} }


// Process graph
if (fIsMaster) { if (fIsMaster) {
ProcessGraphAsync(); ProcessGraphAsync();
} else { } else {
fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable); fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable);
} }
// Keep end cycle time // Keep end cycle time
JackDriver::CycleTakeEndTime(); JackDriver::CycleTakeEndTime();
return 0; return 0;
@@ -238,29 +239,38 @@ int JackAudioDriver::ProcessAsync()


/* /*
The driver SYNC mode: the server does synchronize to the end of client graph execution, 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() int JackAudioDriver::ProcessSync()
{ {
// Read input buffers for the current cycle // Read input buffers for the current cycle
if (Read() < 0) {
if (Read() < 0) {
jack_error("JackAudioDriver::ProcessSync: read error, stopping..."); jack_error("JackAudioDriver::ProcessSync: read error, stopping...");
return -1;
return -1;
} }


// Process graph
if (fIsMaster) { if (fIsMaster) {
ProcessGraphSync();
if (ProcessGraphSync() < 0) {
jack_error("JackAudioDriver::ProcessSync: process error, skip cycle...");
goto end;
}
} else { } 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 // Write output buffers from the current cycle
if (Write() < 0) { if (Write() < 0) {
jack_error("JackAudioDriver::ProcessSync: write error, stopping..."); jack_error("JackAudioDriver::ProcessSync: write error, stopping...");
return -1;
return -1;
} }

end:

// Keep end cycle time // Keep end cycle time
JackDriver::CycleTakeEndTime(); JackDriver::CycleTakeEndTime();
return 0; return 0;
@@ -269,25 +279,34 @@ int JackAudioDriver::ProcessSync()
void JackAudioDriver::ProcessGraphAsync() void JackAudioDriver::ProcessGraphAsync()
{ {
// fBeginDateUst is set in the "low level" layer, fEndDateUst is from previous cycle // 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"); jack_error("JackAudioDriver::ProcessGraphAsync: Process error");
fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable); fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable);
if (ProcessSlaves() < 0) if (ProcessSlaves() < 0)
jack_error("JackAudioDriver::ProcessGraphAsync: ProcessSlaves error"); 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 // 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); fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable);
if (ProcessSlaves() < 0)
if (ProcessSlaves() < 0) {
jack_error("JackAudioDriver::ProcessGraphSync: ProcessSlaves error, engine may now behave abnormally!!"); 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!!"); jack_error("JackAudioDriver::ProcessGraphSync: SuspendRefNum error, engine may now behave abnormally!!");
res = -1;
}
} else { // Graph not finished: do not activate it } else { // Graph not finished: do not activate it
jack_error("JackAudioDriver::ProcessGraphSync: Process error"); jack_error("JackAudioDriver::ProcessGraphSync: Process error");
res = -1;
} }

return res;
} }


void JackAudioDriver::WaitUntilNextCycle() void JackAudioDriver::WaitUntilNextCycle()


+ 5
- 5
common/JackAudioDriver.h View File

@@ -36,12 +36,12 @@ class SERVER_EXPORT JackAudioDriver : public JackDriver
protected: protected:


void ProcessGraphAsync(); void ProcessGraphAsync();
void ProcessGraphSync();
int ProcessGraphSync();
void WaitUntilNextCycle(); void WaitUntilNextCycle();


virtual int ProcessAsync(); virtual int ProcessAsync();
virtual int ProcessSync(); virtual int ProcessSync();
int fCaptureChannels; int fCaptureChannels;
int fPlaybackChannels; int fPlaybackChannels;


@@ -73,7 +73,7 @@ class SERVER_EXPORT JackAudioDriver : public JackDriver
const char* playback_driver_name, const char* playback_driver_name,
jack_nframes_t capture_latency, jack_nframes_t capture_latency,
jack_nframes_t playback_latency); jack_nframes_t playback_latency);
virtual int Open(bool capturing, virtual int Open(bool capturing,
bool playing, bool playing,
int inchannels, int inchannels,
@@ -83,13 +83,13 @@ class SERVER_EXPORT JackAudioDriver : public JackDriver
const char* playback_driver_name, const char* playback_driver_name,
jack_nframes_t capture_latency, jack_nframes_t capture_latency,
jack_nframes_t playback_latency); jack_nframes_t playback_latency);
virtual int Process(); virtual int Process();
virtual int ProcessNull(); virtual int ProcessNull();


virtual int Attach(); virtual int Attach();
virtual int Detach(); virtual int Detach();
virtual int Write(); virtual int Write();


virtual int SetBufferSize(jack_nframes_t buffer_size); virtual int SetBufferSize(jack_nframes_t buffer_size);


+ 48
- 48
common/JackClient.cpp View File

@@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details. GNU Lesser General Public License for more details.


You should have received a copy of the GNU Lesser General Public License 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. 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); jack_log("JackClient::Close ref = %ld", GetClientControl()->fRefNum);
int result = 0; int result = 0;
Deactivate(); Deactivate();
fChannel->Stop(); // Channels is stopped first to avoid receiving notifications while closing fChannel->Stop(); // Channels is stopped first to avoid receiving notifications while closing
// Request close only if server is still running // Request close only if server is still running
if (JackGlobals::fServerRunning) { if (JackGlobals::fServerRunning) {
fChannel->ClientClose(GetClientControl()->fRefNum, &result); fChannel->ClientClose(GetClientControl()->fRefNum, &result);
} else { } else {
jack_log("JackClient::Close server is shutdown");
jack_log("JackClient::Close server is shutdown");
} }
fChannel->Close(); fChannel->Close();
fSynchroTable[GetClientControl()->fRefNum].Disconnect(); fSynchroTable[GetClientControl()->fRefNum].Disconnect();
JackGlobals::fClientTable[GetClientControl()->fRefNum] = NULL; 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); res = fBufferSize(value1, fBufferSizeArg);
} }
break; break;
case kSampleRateCallback: case kSampleRateCallback:
jack_log("JackClient::kSampleRateCallback sample_rate = %ld", value1); jack_log("JackClient::kSampleRateCallback sample_rate = %ld", value1);
if (fSampleRate) { if (fSampleRate) {
@@ -250,7 +250,7 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync,
fPortConnect(value1, value2, 0, fPortConnectArg); fPortConnect(value1, value2, 0, fPortConnectArg);
} }
break; break;
case kPortRenameCallback: case kPortRenameCallback:
jack_log("JackClient::kPortRenameCallback port = %ld", value1); jack_log("JackClient::kPortRenameCallback port = %ld", value1);
if (fPortRename) { if (fPortRename) {
@@ -264,7 +264,7 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync,
res = fXrun(fXrunArg); res = fXrun(fXrunArg);
} }
break; break;
case kShutDownCallback: case kShutDownCallback:
jack_log("JackClient::kShutDownCallback"); jack_log("JackClient::kShutDownCallback");
if (fInfoShutdown) { 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 \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() int JackClient::Activate()
{ {
@@ -310,13 +310,13 @@ int JackClient::Activate()
if (StartThread() < 0) if (StartThread() < 0)
return -1; 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. to be delivered by the server, the client wants to receive it.
*/ */
GetClientControl()->fActive = true; GetClientControl()->fActive = true;
// Transport related callback become "active" // Transport related callback become "active"
GetClientControl()->fTransportSync = true; GetClientControl()->fTransportSync = true;
GetClientControl()->fTransportTimebase = true; GetClientControl()->fTransportTimebase = true;
@@ -337,18 +337,18 @@ int JackClient::Deactivate()
return 0; return 0;


GetClientControl()->fActive = false; GetClientControl()->fActive = false;
// Transport related callback become "unactive" // Transport related callback become "unactive"
GetClientControl()->fTransportSync = false; GetClientControl()->fTransportSync = false;
GetClientControl()->fTransportTimebase = false; GetClientControl()->fTransportTimebase = false;
// We need to wait for the new engine cycle before stopping the RT thread, but this is done by ClientDeactivate // We need to wait for the new engine cycle before stopping the RT thread, but this is done by ClientDeactivate
int result = -1; int result = -1;
fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result); fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result);
jack_log("JackClient::Deactivate res = %ld", result); jack_log("JackClient::Deactivate res = %ld", result);
// RT thread is stopped only when needed... // RT thread is stopped only when needed...
if (IsRealTime())
if (IsRealTime())
fThread.Kill(); fThread.Kill();
return result; return result;
} }
@@ -399,21 +399,21 @@ int JackClient::StartThread()


bool JackClient::Execute() 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"); 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 // Execute a dummy cycle to be sure thread has the correct properties
DummyCycle(); DummyCycle();
if (fThreadFun) { if (fThreadFun) {
fThreadFun(fThreadFunArg); fThreadFun(fThreadFunArg);
} else { } else {
ExecuteThread(); ExecuteThread();
} }
return false;
return false;
} }


void JackClient::DummyCycle() void JackClient::DummyCycle()
@@ -424,15 +424,15 @@ void JackClient::DummyCycle()


inline void JackClient::ExecuteThread() inline void JackClient::ExecuteThread()
{ {
while (true) {
while (true) {
CycleWaitAux(); CycleWaitAux();
CycleSignalAux(CallProcessCallback());
}
CycleSignalAux(CallProcessCallback());
}
} }


inline jack_nframes_t JackClient::CycleWaitAux() inline jack_nframes_t JackClient::CycleWaitAux()
{ {
if (!WaitSync())
if (!WaitSync())
Error(); // Terminates the thread Error(); // Terminates the thread
CallSyncCallbackAux(); CallSyncCallbackAux();
return GetEngineControl()->fBufferSize; return GetEngineControl()->fBufferSize;
@@ -443,7 +443,7 @@ inline void JackClient::CycleSignalAux(int status)
if (status == 0) if (status == 0)
CallTimebaseCallbackAux(); CallTimebaseCallbackAux();
SignalSync(); SignalSync();
if (status != 0)
if (status != 0)
End(); // Terminates the thread End(); // Terminates the thread
} }


@@ -531,7 +531,7 @@ int JackClient::PortRegister(const char* port_name, const char* port_type, unsig
int result = -1; int result = -1;
jack_port_id_t port_index = NO_PORT; jack_port_id_t port_index = NO_PORT;
fChannel->PortRegister(GetClientControl()->fRefNum, name.c_str(), port_type, flags, buffer_size, &port_index, &result); fChannel->PortRegister(GetClientControl()->fRefNum, name.c_str(), port_type, flags, buffer_size, &port_index, &result);
if (result == 0) { 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); 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); fPortList.push_back(port_index);
@@ -623,7 +623,7 @@ void JackClient::ShutDown()
{ {
jack_log("ShutDown"); jack_log("ShutDown");
JackGlobals::fServerRunning = false; JackGlobals::fServerRunning = false;
if (fInfoShutdown) { if (fInfoShutdown) {
fInfoShutdown(JackFailure, "JACK server has been closed", fInfoShutdownArg); fInfoShutdown(JackFailure, "JACK server has been closed", fInfoShutdownArg);
fInfoShutdown = NULL; fInfoShutdown = NULL;
@@ -641,18 +641,18 @@ inline int JackClient::ActivateAux()
{ {
// If activated without RT thread... // If activated without RT thread...
if (IsActive() && fThread.GetStatus() != JackThread::kRunning) { if (IsActive() && fThread.GetStatus() != JackThread::kRunning) {
jack_log("ActivateAux"); jack_log("ActivateAux");
// RT thread is started // RT thread is started
if (StartThread() < 0) if (StartThread() < 0)
return -1; return -1;
int result = -1; int result = -1;
GetClientControl()->fCallback[kRealTimeCallback] = IsRealTime(); GetClientControl()->fCallback[kRealTimeCallback] = IsRealTime();
fChannel->ClientActivate(GetClientControl()->fRefNum, IsRealTime(), &result); fChannel->ClientActivate(GetClientControl()->fRefNum, IsRealTime(), &result);
return result; return result;
} else { } else {
return 0; return 0;
} }
@@ -683,7 +683,7 @@ int JackClient::SetTimebaseCallback(int conditional, JackTimebaseCallback timeba
{ {
int result = -1; int result = -1;
fChannel->SetTimebaseCallback(GetClientControl()->fRefNum, conditional, &result); fChannel->SetTimebaseCallback(GetClientControl()->fRefNum, conditional, &result);
if (result == 0) { if (result == 0) {
GetClientControl()->fTransportTimebase = true; GetClientControl()->fTransportTimebase = true;
fTimebase = timebase_callback; fTimebase = timebase_callback;
@@ -758,11 +758,11 @@ void JackClient::CallSyncCallback()
inline void JackClient::CallSyncCallbackAux() inline void JackClient::CallSyncCallbackAux()
{ {
if (GetClientControl()->fTransportSync) { if (GetClientControl()->fTransportSync) {
JackTransportEngine& transport = GetEngineControl()->fTransport; JackTransportEngine& transport = GetEngineControl()->fTransport;
jack_position_t* cur_pos = transport.ReadCurrentState(); jack_position_t* cur_pos = transport.ReadCurrentState();
jack_transport_state_t transport_state = transport.GetState(); jack_transport_state_t transport_state = transport.GetState();
if (fSync != NULL) { if (fSync != NULL) {
if (fSync(transport_state, cur_pos, fSyncArg)) { if (fSync(transport_state, cur_pos, fSyncArg)) {
GetClientControl()->fTransportState = JackTransportRolling; GetClientControl()->fTransportState = JackTransportRolling;
@@ -785,21 +785,21 @@ inline void JackClient::CallTimebaseCallbackAux()
JackTransportEngine& transport = GetEngineControl()->fTransport; JackTransportEngine& transport = GetEngineControl()->fTransport;
int master; int master;
bool unused; bool unused;
transport.GetTimebaseMaster(master, unused); transport.GetTimebaseMaster(master, unused);
if (GetClientControl()->fRefNum == master && fTimebase) { // Client *is* timebase... if (GetClientControl()->fRefNum == master && fTimebase) { // Client *is* timebase...
jack_transport_state_t transport_state = transport.GetState(); jack_transport_state_t transport_state = transport.GetState();
jack_position_t* cur_pos = transport.WriteNextStateStart(1); jack_position_t* cur_pos = transport.WriteNextStateStart(1);
if (GetClientControl()->fTransportTimebase) { 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) { } else if (transport_state == JackTransportRolling) {
fTimebase(transport_state, GetEngineControl()->fBufferSize, cur_pos, false, fTimebaseArg); fTimebase(transport_state, GetEngineControl()->fBufferSize, cur_pos, false, fTimebaseArg);
}
}
transport.WriteNextStateStop(1); transport.WriteNextStateStop(1);
} }
} }
@@ -817,7 +817,7 @@ void JackClient::OnShutdown(JackShutdownCallback callback, void *arg)
fShutdown = callback; fShutdown = callback;
} }
} }
void JackClient::OnInfoShutdown(JackInfoShutdownCallback callback, void *arg) void JackClient::OnInfoShutdown(JackInfoShutdownCallback callback, void *arg)
{ {
if (IsActive()) { if (IsActive()) {
@@ -908,8 +908,8 @@ int JackClient::SetSampleRateCallback(JackSampleRateCallback callback, void *arg
GetClientControl()->fCallback[kSampleRateCallback] = (callback != NULL); GetClientControl()->fCallback[kSampleRateCallback] = (callback != NULL);
fSampleRateArg = arg; fSampleRateArg = arg;
fSampleRate = callback; fSampleRate = callback;
// Now invoke it
if (callback)
// Now invoke it
if (callback)
callback(GetEngineControl()->fSampleRate, arg); callback(GetEngineControl()->fSampleRate, arg);
return 0; return 0;
} }


+ 7
- 7
common/JackClient.h View File

@@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details. GNU Lesser General Public License for more details.


You should have received a copy of the GNU Lesser General Public License 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. 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; std::list<jack_port_id_t> fPortList;


bool fImmediateSessionReply; bool fImmediateSessionReply;
int StartThread(); int StartThread();
void SetupDriverSync(bool freewheel); void SetupDriverSync(bool freewheel);
bool IsActive(); bool IsActive();


void CallSyncCallback(); void CallSyncCallback();
void CallTimebaseCallback(); void CallTimebaseCallback();
virtual int ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value); virtual int ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value);


inline void DummyCycle(); inline void DummyCycle();
@@ -116,7 +116,7 @@ class JackClient : public JackClientInterface, public JackRunnableInterface
inline void CallSyncCallbackAux(); inline void CallSyncCallbackAux();
inline void CallTimebaseCallbackAux(); inline void CallTimebaseCallbackAux();
inline int ActivateAux(); inline int ActivateAux();
public: public:


JackClient(); JackClient();
@@ -193,9 +193,9 @@ class JackClient : public JackClientInterface, public JackRunnableInterface
// Session api // Session api
virtual jack_session_command_t *SessionNotify(const char *target, jack_session_event_type_t type, const char *path); 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); 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 // JackRunnableInterface interface
bool Init(); bool Init();


+ 8
- 8
common/JackEngine.cpp View File

@@ -138,8 +138,8 @@ void JackEngine::ProcessNext(jack_time_t cur_cycle_begin)
{ {
fLastSwitchUsecs = cur_cycle_begin; fLastSwitchUsecs = cur_cycle_begin;
if (fGraphManager->RunNextGraph()) { // True if the graph actually switched to a new state 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 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) { if (status != NotTriggered && status != Finished) {
jack_error("JackEngine::XRun: client = %s was not run: state = %ld", client->GetClientControl()->fName, status); 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) { if (status == Finished && (long)(finished_date - callback_usecs) > 0) {
jack_error("JackEngine::XRun: client %s finished after current callback", client->GetClientControl()->fName); 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 // Use the audio thread => request thread communication channel
fEngineControl->NotifyXRun(callback_usecs, delayed_usecs); 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) void JackEngine::NotifyXRun(int refnum)


+ 6
- 4
common/JackServerGlobals.cpp View File

@@ -28,8 +28,10 @@ static char* server_name = NULL;
namespace Jack namespace Jack
{ {


JackServer* JackServerGlobals::fInstance;
JackServer* JackServerGlobals::fInstance;
unsigned int JackServerGlobals::fUserCount; unsigned int JackServerGlobals::fUserCount;
int JackServerGlobals::fRTNotificationSocket;

bool (* JackServerGlobals::on_device_acquire)(const char * device_name) = NULL; bool (* JackServerGlobals::on_device_acquire)(const char * device_name) = NULL;
void (* JackServerGlobals::on_device_release)(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; int argc = 0;
char* argv[32]; char* argv[32];
jack_timer_type_t clock_source = JACK_TIMER_SYSTEM_CLOCK; jack_timer_type_t clock_source = JACK_TIMER_SYSTEM_CLOCK;
// First user starts the server // First user starts the server
if (fUserCount++ == 0) { if (fUserCount++ == 0) {


@@ -158,7 +160,7 @@ bool JackServerGlobals::Init()
(opt = getopt_long(argc, argv, options, long_options, &option_index)) != EOF) { (opt = getopt_long(argc, argv, options, long_options, &option_index)) != EOF) {


switch (opt) { switch (opt) {
case 'c': case 'c':
if (tolower (optarg[0]) == 'h') { if (tolower (optarg[0]) == 'h') {
clock_source = JACK_TIMER_HPET; clock_source = JACK_TIMER_HPET;
@@ -168,7 +170,7 @@ bool JackServerGlobals::Init()
clock_source = JACK_TIMER_SYSTEM_CLOCK; clock_source = JACK_TIMER_SYSTEM_CLOCK;
} else { } else {
jack_error("unknown option character %c", optopt); jack_error("unknown option character %c", optopt);
}
}
break; break;


case 'd': case 'd':


+ 2
- 1
common/JackServerGlobals.h View File

@@ -38,9 +38,10 @@ struct SERVER_EXPORT JackServerGlobals
{ {
static JackServer* fInstance; static JackServer* fInstance;
static unsigned int fUserCount; static unsigned int fUserCount;
static int fRTNotificationSocket; // For debugging purpose
static bool (* on_device_acquire)(const char * device_name); static bool (* on_device_acquire)(const char * device_name);
static void (* on_device_release)(const char * device_name); static void (* on_device_release)(const char * device_name);
JackServerGlobals(); JackServerGlobals();
~JackServerGlobals(); ~JackServerGlobals();




+ 73
- 73
linux/alsa/JackAlsaDriver.cpp View File

@@ -276,7 +276,7 @@ JackAlsaDriver::alsa_driver_setup_io_function_pointers (alsa_driver_t *driver)
} else { } else {
driver->channel_copy = memcpy_fake; driver->channel_copy = memcpy_fake;
} }
switch (driver->dither) { switch (driver->dither) {
case Rectangular: case Rectangular:
jack_info("Rectangular dithering at 16 bits"); 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_sSs:
sample_move_dither_rect_d16_sS; sample_move_dither_rect_d16_sS;
break; break;
case Triangular: case Triangular:
jack_info("Triangular dithering at 16 bits"); jack_info("Triangular dithering at 16 bits");
driver->write_via_copy = driver->quirk_bswap? driver->write_via_copy = driver->quirk_bswap?
sample_move_dither_tri_d16_sSs: sample_move_dither_tri_d16_sSs:
sample_move_dither_tri_d16_sS; sample_move_dither_tri_d16_sS;
break; break;
case Shaped: case Shaped:
jack_info("Noise-shaped dithering at 16 bits"); jack_info("Noise-shaped dithering at 16 bits");
driver->write_via_copy = driver->quirk_bswap? driver->write_via_copy = driver->quirk_bswap?
sample_move_dither_shaped_d16_sSs: sample_move_dither_shaped_d16_sSs:
sample_move_dither_shaped_d16_sS; sample_move_dither_shaped_d16_sS;
break; break;
default: default:
driver->write_via_copy = driver->quirk_bswap? driver->write_via_copy = driver->quirk_bswap?
sample_move_d16_sSs :
sample_move_d16_sSs :
sample_move_d16_sS; sample_move_d16_sS;
break; break;
} }
break; break;
case 3: /* NO DITHER */ case 3: /* NO DITHER */
if (driver->playback_interleaved) { if (driver->playback_interleaved) {
driver->channel_copy = memcpy_interleave_d24_s24; driver->channel_copy = memcpy_interleave_d24_s24;
} else { } else {
driver->channel_copy = memcpy_fake; driver->channel_copy = memcpy_fake;
} }
driver->write_via_copy = driver->quirk_bswap? driver->write_via_copy = driver->quirk_bswap?
sample_move_d24_sSs:
sample_move_d24_sSs:
sample_move_d24_sS; sample_move_d24_sS;


break; break;
case 4: /* NO DITHER */ case 4: /* NO DITHER */
if (driver->playback_interleaved) { if (driver->playback_interleaved) {
driver->channel_copy = memcpy_interleave_d32_s32; 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? driver->write_via_copy = driver->quirk_bswap?
sample_move_d32u24_sSs:
sample_move_d32u24_sSs:
sample_move_d32u24_sS; sample_move_d32u24_sS;
break; break;


@@ -339,27 +339,27 @@ JackAlsaDriver::alsa_driver_setup_io_function_pointers (alsa_driver_t *driver)
} }
} }
} }
if (driver->capture_handle) { if (driver->capture_handle) {
switch (driver->capture_sample_bytes) { switch (driver->capture_sample_bytes) {
case 2: case 2:
driver->read_via_copy = driver->quirk_bswap? driver->read_via_copy = driver->quirk_bswap?
sample_move_dS_s16s:
sample_move_dS_s16s:
sample_move_dS_s16; sample_move_dS_s16;
break; break;
case 3: case 3:
driver->read_via_copy = driver->quirk_bswap? driver->read_via_copy = driver->quirk_bswap?
sample_move_dS_s24s:
sample_move_dS_s24s:
sample_move_dS_s24; sample_move_dS_s24;
break; break;
case 4: case 4:
driver->read_via_copy = driver->quirk_bswap? driver->read_via_copy = driver->quirk_bswap?
sample_move_dS_s32u24s:
sample_move_dS_s32u24s:
sample_move_dS_s32u24; sample_move_dS_s32u24;
break; break;
} }
} }
return 0; return 0;
} }


@@ -418,7 +418,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic
} }
} }
} }
format = (sample_width == 4) ? 0 : NUMFORMATS - 1; format = (sample_width == 4) ? 0 : NUMFORMATS - 1;


while (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); jack_info ("ALSA: final selected sample format for %s: %s", stream_name, formats[format].Name);
break; break;
} }
}
}


frame_rate = driver->frame_rate ; frame_rate = driver->frame_rate ;
err = snd_pcm_hw_params_set_rate_near (handle, hw_params, 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); &channels_max);
*nchns = channels_max ; *nchns = channels_max ;


if (*nchns > 1024) {
if (*nchns > 1024) {


/* the hapless user is an unwitting victim of /* the hapless user is an unwitting victim of
the "default" ALSA PCM device, which can 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" "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" "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, if ((err = snd_pcm_hw_params_set_channels (handle, hw_params,
*nchns)) < 0) { *nchns)) < 0) {
@@ -491,7 +491,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic
*nchns, stream_name); *nchns, stream_name);
return -1; return -1;
} }
if ((err = snd_pcm_hw_params_set_period_size (handle, hw_params, if ((err = snd_pcm_hw_params_set_period_size (handle, hw_params,
driver->frames_per_cycle, driver->frames_per_cycle,
0)) 0))
@@ -520,7 +520,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic
return -1; return -1;
} }
jack_info ("ALSA: use %d periods for %s", *nperiodsp, stream_name); jack_info ("ALSA: use %d periods for %s", *nperiodsp, stream_name);
#if 0
#if 0
if (!jack_power_of_two(driver->frames_per_cycle)) { if (!jack_power_of_two(driver->frames_per_cycle)) {
jack_error("JACK: frames must be a power of two " jack_error("JACK: frames must be a power of two "
"(64, 512, 1024, ...)\n"); "(64, 512, 1024, ...)\n");
@@ -557,7 +557,7 @@ JackAlsaDriver::alsa_driver_configure_stream (alsa_driver_t *driver, char *devic
if (driver->soft_mode) { if (driver->soft_mode) {
stop_th = (snd_pcm_uframes_t)-1; stop_th = (snd_pcm_uframes_t)-1;
} }
if ((err = snd_pcm_sw_params_set_stop_threshold ( if ((err = snd_pcm_sw_params_set_stop_threshold (
handle, sw_params, stop_th)) < 0) { handle, sw_params, stop_th)) < 0) {
jack_error ("ALSA: cannot set stop mode for %s", 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 else
err = snd_pcm_sw_params_set_avail_min ( err = snd_pcm_sw_params_set_avail_min (
handle, sw_params, driver->frames_per_cycle); handle, sw_params, driver->frames_per_cycle);
if (err < 0) { if (err < 0) {
jack_error ("ALSA: cannot set avail min for %s", stream_name); jack_error ("ALSA: cannot set avail min for %s", stream_name);
return -1; return -1;
@@ -1158,7 +1158,7 @@ int
JackAlsaDriver::alsa_driver_restart (alsa_driver_t *driver) JackAlsaDriver::alsa_driver_restart (alsa_driver_t *driver)
{ {
int res; int res;
driver->xrun_recovery = 1; driver->xrun_recovery = 1;
if ((res = Stop()) == 0) if ((res = Stop()) == 0)
res = Start(); 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)); 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 if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN
&& driver->process_count > XRUN_REPORT_DELAY) { && driver->process_count > XRUN_REPORT_DELAY) {
struct timeval now, diff, tstamp; struct timeval now, diff, tstamp;
driver->xrun_count++; 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); snd_pcm_status_get_trigger_tstamp(status, &tstamp);
timersub(&now, &tstamp, &diff); timersub(&now, &tstamp, &diff);
*delayed_usecs = diff.tv_sec * 1000000.0 + diff.tv_usec; *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: again:
while (need_playback || need_capture) { while (need_playback || need_capture) {


int poll_result; int poll_result;
@@ -1282,7 +1282,7 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat
driver->playback_nfds); driver->playback_nfds);
nfds += driver->playback_nfds; nfds += driver->playback_nfds;
} }
if (need_capture) { if (need_capture) {
snd_pcm_poll_descriptors (driver->capture_handle, snd_pcm_poll_descriptors (driver->capture_handle,
&driver->pfd[nfds], &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 */ /* ALSA doesn't set POLLERR in some versions of 0.9.X */
for (i = 0; i < nfds; i++) { for (i = 0; i < nfds; i++) {
driver->pfd[i].events |= POLLERR; driver->pfd[i].events |= POLLERR;
} }
@@ -1329,12 +1329,12 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat
*status = -2; *status = -2;
return 0; return 0;
} }
jack_error ("ALSA: poll call failed (%s)", jack_error ("ALSA: poll call failed (%s)",
strerror (errno)); strerror (errno));
*status = -3; *status = -3;
return 0; return 0;
} }


poll_ret = jack_get_microseconds (); 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 (extra_fd < 0) {
if (driver->poll_next && poll_ret > driver->poll_next) { if (driver->poll_next && poll_ret > driver->poll_next) {
*delayed_usecs = poll_ret - driver->poll_next; *delayed_usecs = poll_ret - driver->poll_next;
}
}
driver->poll_last = poll_ret; driver->poll_last = poll_ret;
driver->poll_next = poll_ret + driver->period_usecs; driver->poll_next = poll_ret + driver->period_usecs;
// steph // steph
/* /*
driver->engine->transport_cycle_start (driver->engine,
driver->engine->transport_cycle_start (driver->engine,
poll_ret); poll_ret);
*/ */
} }
@@ -1371,7 +1371,7 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat


*status = -4; *status = -4;
return -1; return -1;
}
}


/* if POLLIN was the only bit set, we're OK */ /* 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 #endif
} }
} }
if (poll_result == 0) { if (poll_result == 0) {
jack_error ("ALSA: poll time out, polled for %" PRIu64 jack_error ("ALSA: poll time out, polled for %" PRIu64
" usecs", " usecs",
poll_ret - poll_enter); poll_ret - poll_enter);
*status = -5; *status = -5;
return 0; return 0;
}
}


} }


@@ -1450,7 +1450,7 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat
} }
} else { } else {
/* odd, but see min() computation below */ /* odd, but see min() computation below */
capture_avail = INT_MAX;
capture_avail = INT_MAX;
} }


if (driver->playback_handle) { if (driver->playback_handle) {
@@ -1465,7 +1465,7 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat
} }
} else { } else {
/* odd, but see min() computation below */ /* odd, but see min() computation below */
playback_avail = INT_MAX;
playback_avail = INT_MAX;
} }


if (xrun_detected) { if (xrun_detected) {
@@ -1544,7 +1544,7 @@ JackAlsaDriver::alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes)
if (!driver->capture_handle) { if (!driver->capture_handle) {
return 0; return 0;
} }
nread = 0; nread = 0;
contiguous = 0; contiguous = 0;
orig_nframes = nframes; orig_nframes = nframes;
@@ -1572,11 +1572,11 @@ JackAlsaDriver::alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes)
/* // steph /* // steph
for (chn = 0, node = driver->capture_ports; node; for (chn = 0, node = driver->capture_ports; node;
node = jack_slist_next (node), chn++) { node = jack_slist_next (node), chn++) {
port = (jack_port_t *) node->data; port = (jack_port_t *) node->data;
if (!jack_port_connected (port)) { if (!jack_port_connected (port)) {
// no-copy optimization
// no-copy optimization
continue; continue;
} }
buf = jack_port_get_buffer (port, orig_nframes); 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, if ((err = snd_pcm_mmap_commit (driver->capture_handle,
offset, contiguous)) < 0) { offset, contiguous)) < 0) {
jack_error ("ALSA: could not complete read of %" jack_error ("ALSA: could not complete read of %"
PRIu32 " frames: error = %d\n", contiguous, err); PRIu32 " frames: error = %d\n", contiguous, err);
return -1; 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); monbuf = jack_port_get_buffer (port, orig_nframes);
memcpy (monbuf + nwritten, buf + nwritten, contiguous * sizeof(jack_default_audio_sample_t)); 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) { offset, contiguous)) < 0) {
jack_error ("ALSA: could not complete playback of %" jack_error ("ALSA: could not complete playback of %"
PRIu32 " frames: error = %d", contiguous, err); PRIu32 " frames: error = %d", contiguous, err);
if (err != EPIPE && err != ESTRPIPE)
if (err != -EPIPE && err != -ESTRPIPE)
return -1; return -1;
} }


@@ -1752,11 +1752,11 @@ JackAlsaDriver::alsa_driver_delete (alsa_driver_t *driver)
free (node->data); free (node->data);
} }
jack_slist_free (driver->clock_sync_listeners); jack_slist_free (driver->clock_sync_listeners);
if (driver->ctl_handle) { if (driver->ctl_handle) {
snd_ctl_close (driver->ctl_handle); snd_ctl_close (driver->ctl_handle);
driver->ctl_handle = 0; driver->ctl_handle = 0;
}
}


if (driver->capture_handle) { if (driver->capture_handle) {
snd_pcm_close (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 jack_info ("creating alsa driver ... %s|%s|%" PRIu32 "|%" PRIu32
"|%" PRIu32"|%" PRIu32"|%" PRIu32 "|%s|%s|%s|%s", "|%" PRIu32"|%" PRIu32"|%" PRIu32 "|%s|%s|%s|%s",
playing ? playback_alsa_device : "-", playing ? playback_alsa_device : "-",
capturing ? capture_alsa_device : "-",
capturing ? capture_alsa_device : "-",
frames_per_cycle, user_nperiods, rate, frames_per_cycle, user_nperiods, rate,
user_capture_nchnls,user_playback_nchnls, user_capture_nchnls,user_playback_nchnls,
hw_monitoring ? "hwmon": "nomon", hw_monitoring ? "hwmon": "nomon",
hw_metering ? "hwmeter":"swmeter", hw_metering ? "hwmeter":"swmeter",
soft_mode ? "soft-mode":"-", soft_mode ? "soft-mode":"-",
shorts_first ? "16bit":"32bit"); shorts_first ? "16bit":"32bit");
driver = (alsa_driver_t *) calloc (1, sizeof (alsa_driver_t)); driver = (alsa_driver_t *) calloc (1, sizeof (alsa_driver_t));


jack_driver_nt_init ((jack_driver_nt_t *) driver); 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->playback_addr = 0;
driver->capture_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->silent = 0;
driver->all_monitor_in = FALSE; driver->all_monitor_in = FALSE;
@@ -2164,7 +2164,7 @@ int JackAlsaDriver::Detach()
return JackAudioDriver::Detach(); return JackAudioDriver::Detach();
} }


static int card_to_num(const char* device)
static int card_to_num(const char* device)
{ {
int err; int err;
char* ctl_name; char* ctl_name;
@@ -2329,13 +2329,13 @@ int JackAlsaDriver::Read()
retry: retry:


nframes = alsa_driver_wait((alsa_driver_t *)fDriver, -1, &wait_status, &fDelayedUsecs); nframes = alsa_driver_wait((alsa_driver_t *)fDriver, -1, &wait_status, &fDelayedUsecs);
if (wait_status < 0) if (wait_status < 0)
return -1; /* driver failed */ return -1; /* driver failed */


if (nframes == 0) { if (nframes == 0) {
/* we detected an xrun and restarted: notify /* we detected an xrun and restarted: notify
* clients about the delay.
* clients about the delay.
*/ */
jack_log("ALSA XRun wait_status = %d", wait_status); jack_log("ALSA XRun wait_status = %d", wait_status);
NotifyXRun(fBeginDateUst, fDelayedUsecs); NotifyXRun(fBeginDateUst, fDelayedUsecs);
@@ -2344,7 +2344,7 @@ retry:


if (nframes != fEngineControl->fBufferSize) if (nframes != fEngineControl->fBufferSize)
jack_log("JackAlsaDriver::Read warning nframes = %ld", nframes); jack_log("JackAlsaDriver::Read warning nframes = %ld", nframes);
// Has to be done before read // Has to be done before read
JackDriver::CycleIncTime(); JackDriver::CycleIncTime();


@@ -2632,7 +2632,7 @@ get_dither_constraint()
} }


static int static int
dither_opt (char c, DitherAlgorithm* dither)
dither_opt (char c, DitherAlgorithm* dither)
{ {
switch (c) { switch (c) {
case '-': case '-':
@@ -2659,17 +2659,17 @@ dither_opt (char c, DitherAlgorithm* dither)
return 0; 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_desc_t * desc;
jack_driver_param_desc_t * params; jack_driver_param_desc_t * params;
unsigned int i; unsigned int i;


desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t)); 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->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 strcpy(desc->desc, "Linux ALSA API based audio backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1
desc->nparams = 18; desc->nparams = 18;
params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); 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; 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 srate = 48000;
jack_nframes_t frames_per_interrupt = 1024; jack_nframes_t frames_per_interrupt = 1024;


+ 5
- 5
linux/alsa/usx2y.c View File

@@ -1,5 +1,5 @@
/* /*
Copyright (C) 2001 Paul Davis
Copyright (C) 2001 Paul Davis
Copyright (C) 2005 Karsten Wiese, Rui Nuno Capela Copyright (C) 2005 Karsten Wiese, Rui Nuno Capela


This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
@@ -33,14 +33,14 @@
int dbg_offset; int dbg_offset;
char dbg_buffer[8096]; char dbg_buffer[8096];
#endif #endif
static
static
int usx2y_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask) int usx2y_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask)
{ {
return -1; return -1;
} }


static 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; return -1;
} }
@@ -52,7 +52,7 @@ usx2y_release (jack_hardware_t *hw)


if (h == 0) if (h == 0)
return; return;
if (h->hwdep_handle) if (h->hwdep_handle)
snd_hwdep_close(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) { offset, nframes_)) < 0) {
jack_error ("ALSA/USX2Y: could not complete playback of %" jack_error ("ALSA/USX2Y: could not complete playback of %"
PRIu32 " frames: error = %d", nframes_, err); PRIu32 " frames: error = %d", nframes_, err);
if (err != EPIPE && err != ESTRPIPE)
if (err != -EPIPE && err != -ESTRPIPE)
return -1; return -1;
} }




+ 19
- 13
posix/JackSocketServerChannel.cpp View File

@@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details. GNU Lesser General Public License for more details.


You should have received a copy of the GNU Lesser General Public License 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. 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) int JackSocketServerChannel::Open(const char* server_name, JackServer* server)
{ {
jack_log("JackSocketServerChannel::Open"); jack_log("JackSocketServerChannel::Open");
// Prepare request socket // Prepare request socket
if (fRequestListenSocket.Bind(jack_server_dir, server_name, 0) < 0) { if (fRequestListenSocket.Bind(jack_server_dir, server_name, 0) < 0) {
jack_log("JackSocketServerChannel::Open : cannot create result listen socket"); jack_log("JackSocketServerChannel::Open : cannot create result listen socket");
@@ -79,14 +79,14 @@ void JackSocketServerChannel::Close()
delete socket; delete socket;
} }
} }
int JackSocketServerChannel::Start() int JackSocketServerChannel::Start()
{ {
if (fThread.Start() != 0) { if (fThread.Start() != 0) {
jack_error("Cannot start Jack server listener"); jack_error("Cannot start Jack server listener");
return -1; return -1;
}
}
return 0; return 0;
} }


@@ -168,6 +168,12 @@ bool JackSocketServerChannel::HandleRequest(int fd)
return false; 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 // Read data
switch (header.fType) { switch (header.fType) {


@@ -292,7 +298,7 @@ bool JackSocketServerChannel::HandleRequest(int fd)
jack_error("JackRequest::DisconnectPorts write error ref = %d", req.fRefNum); jack_error("JackRequest::DisconnectPorts write error ref = %d", req.fRefNum);
break; break;
} }
case JackRequest::kPortRename: { case JackRequest::kPortRename: {
jack_log("JackRequest::PortRename"); jack_log("JackRequest::PortRename");
JackPortRenameRequest req; JackPortRenameRequest req;
@@ -470,7 +476,7 @@ bool JackSocketServerChannel::HandleRequest(int fd)
jack_error("Unknown request %ld", header.fType); jack_error("Unknown request %ld", header.fType);
break; break;
} }
return true; return true;
} }


@@ -511,7 +517,7 @@ bool JackSocketServerChannel::Init()
bool JackSocketServerChannel::Execute() bool JackSocketServerChannel::Execute()
{ {
try { try {
// Global poll // Global poll
if ((poll(fPollTable, fSocketTable.size() + 1, 10000) < 0) && (errno != EINTR)) { if ((poll(fPollTable, fSocketTable.size() + 1, 10000) < 0) && (errno != EINTR)) {
jack_error("Engine poll failed err = %s request thread quits...", strerror(errno)); 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)); jack_log("Poll client error err = %s", strerror(errno));
ClientKill(fd); ClientKill(fd);
} else if (fPollTable[i].revents & POLLIN) { } else if (fPollTable[i].revents & POLLIN) {
if (!HandleRequest(fd))
if (!HandleRequest(fd))
jack_log("Could not handle external client request"); jack_log("Could not handle external client request");
} }
} }


// Check the server request socket */ // 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)); jack_error("Error on server request socket err = %s", strerror(errno));
if (fPollTable[0].revents & POLLIN)
if (fPollTable[0].revents & POLLIN)
ClientCreate(); ClientCreate();
} }


BuildPoolTable(); BuildPoolTable();
return true; return true;
} catch (JackQuitException& e) { } catch (JackQuitException& e) {
jack_log("JackMachServerChannel::Execute JackQuitException"); jack_log("JackMachServerChannel::Execute JackQuitException");
return false; return false;


+ 4
- 2
posix/JackSocketServerNotifyChannel.cpp View File

@@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details. GNU Lesser General Public License for more details.


You should have received a copy of the GNU Lesser General Public License 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. 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 "JackRequest.h"
#include "JackConstants.h" #include "JackConstants.h"
#include "JackNotification.h" #include "JackNotification.h"
#include "JackServerGlobals.h"


namespace Jack namespace Jack
{ {
@@ -33,6 +34,7 @@ int JackSocketServerNotifyChannel::Open(const char* server_name)
return -1; return -1;
} else { } else {
fRequestSocket.SetNonBlocking(true); fRequestSocket.SetNonBlocking(true);
JackServerGlobals::fRTNotificationSocket = fRequestSocket.GetFd();
return 0; return 0;
} }
} }
@@ -63,7 +65,7 @@ void JackSocketServerNotifyChannel::NotifyQuit()
jack_error("Could not write request ref = %d notify = %d", -1, kQUIT); jack_error("Could not write request ref = %d notify = %d", -1, kQUIT);
} }
} }


} // end of namespace } // end of namespace




+ 1
- 1
posix/JackSocketServerNotifyChannel.h View File

@@ -12,7 +12,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details. GNU Lesser General Public License for more details.


You should have received a copy of the GNU Lesser General Public License 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. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


*/ */


Loading…
Cancel
Save