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 10 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
---------------------------

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.


+ 38
- 19
common/JackAudioDriver.cpp View File

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


+ 5
- 5
common/JackAudioDriver.h View File

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


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

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


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

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


+ 8
- 8
common/JackEngine.cpp View File

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


+ 6
- 4
common/JackServerGlobals.cpp View File

@@ -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':


+ 2
- 1
common/JackServerGlobals.h View File

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



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

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


+ 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

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



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

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;


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

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



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

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.

*/


Loading…
Cancel
Save