git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4079 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.7
| @@ -33,6 +33,10 @@ David Garcia Garzon | |||||
| Jackdmp changes log | Jackdmp changes log | ||||
| --------------------------- | --------------------------- | ||||
| 2010-11-03 Stephane Letz <letz@grame.fr> | |||||
| * Improve backend error handling: fatal error returned by Read/Write now cause a Process failure (so a thread exit for blocking backends). Recoverable ones (XRuns..) are now treated internally in ALSA, FreeBob and FFADO backends. | |||||
| 2010-10-30 Stephane Letz <letz@grame.fr> | 2010-10-30 Stephane Letz <letz@grame.fr> | ||||
| * Correct JackServer::Open to avoid a race when control API is used on OSX. | * Correct JackServer::Open to avoid a race when control API is used on OSX. | ||||
| @@ -215,14 +215,14 @@ 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, skip cycle"); | |||||
| return 0; // Skip cycle, but continue processing... | |||||
| jack_error("JackAudioDriver::ProcessAsync: read error, stopping..."); | |||||
| 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, skip cycle"); | |||||
| return 0; // Skip cycle, but continue processing... | |||||
| jack_error("JackAudioDriver::ProcessAsync: write error, stopping..."); | |||||
| return -1; | |||||
| } | } | ||||
| if (fIsMaster) { | if (fIsMaster) { | ||||
| @@ -244,9 +244,9 @@ 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) { | |||||
| jack_error("JackAudioDriver::ProcessSync: read error, skip cycle"); | |||||
| return 0; // Skip cycle, but continue processing... | |||||
| if (Read() < 0) { | |||||
| jack_error("JackAudioDriver::ProcessSync: read error, stopping..."); | |||||
| return -1; | |||||
| } | } | ||||
| if (fIsMaster) { | if (fIsMaster) { | ||||
| @@ -255,10 +255,10 @@ int JackAudioDriver::ProcessSync() | |||||
| fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable); | fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable); | ||||
| } | } | ||||
| // Write output buffers for the current cycle | |||||
| if (Write() < 0) { | |||||
| jack_error("JackAudioDriver::ProcessSync: write error, skip cycle"); | |||||
| return 0; // Skip cycle, but continue processing... | |||||
| // Write output buffers from the previous cycle | |||||
| if (Write() < 0) { | |||||
| jack_error("JackAudioDriver::ProcessSync: write error, stopping..."); | |||||
| return -1; | |||||
| } | } | ||||
| // Keep end cycle time | // Keep end cycle time | ||||
| @@ -2316,6 +2316,8 @@ int JackAlsaDriver::Read() | |||||
| jack_nframes_t nframes; | jack_nframes_t nframes; | ||||
| fDelayedUsecs = 0.f; | fDelayedUsecs = 0.f; | ||||
| 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) | ||||
| @@ -2327,7 +2329,7 @@ int JackAlsaDriver::Read() | |||||
| */ | */ | ||||
| jack_log("ALSA XRun wait_status = %d", wait_status); | jack_log("ALSA XRun wait_status = %d", wait_status); | ||||
| NotifyXRun(fBeginDateUst, fDelayedUsecs); | NotifyXRun(fBeginDateUst, fDelayedUsecs); | ||||
| return -1; | |||||
| goto retry; /* recoverable error*/ | |||||
| } | } | ||||
| if (nframes != fEngineControl->fBufferSize) | if (nframes != fEngineControl->fBufferSize) | ||||
| @@ -664,6 +664,8 @@ int JackFFADODriver::Read() | |||||
| int wait_status = 0; | int wait_status = 0; | ||||
| fDelayedUsecs = 0.f; | fDelayedUsecs = 0.f; | ||||
| retry: | |||||
| jack_nframes_t nframes = ffado_driver_wait(driver, -1, &wait_status, | jack_nframes_t nframes = ffado_driver_wait(driver, -1, &wait_status, | ||||
| &fDelayedUsecs); | &fDelayedUsecs); | ||||
| @@ -678,7 +680,7 @@ int JackFFADODriver::Read() | |||||
| */ | */ | ||||
| jack_log("FFADO XRun"); | jack_log("FFADO XRun"); | ||||
| NotifyXRun(fBeginDateUst, fDelayedUsecs); | NotifyXRun(fBeginDateUst, fDelayedUsecs); | ||||
| return -1; | |||||
| goto retry; /* recoverable error*/ | |||||
| } | } | ||||
| if (nframes != fEngineControl->fBufferSize) | if (nframes != fEngineControl->fBufferSize) | ||||
| @@ -854,6 +854,8 @@ int JackFreebobDriver::Read() | |||||
| int wait_status = 0; | int wait_status = 0; | ||||
| fDelayedUsecs = 0.f; | fDelayedUsecs = 0.f; | ||||
| retry: | |||||
| jack_nframes_t nframes = freebob_driver_wait (driver, -1, &wait_status, | jack_nframes_t nframes = freebob_driver_wait (driver, -1, &wait_status, | ||||
| &fDelayedUsecs); | &fDelayedUsecs); | ||||
| @@ -868,7 +870,7 @@ int JackFreebobDriver::Read() | |||||
| */ | */ | ||||
| jack_log("FreeBoB XRun"); | jack_log("FreeBoB XRun"); | ||||
| NotifyXRun(fBeginDateUst, fDelayedUsecs); | NotifyXRun(fBeginDateUst, fDelayedUsecs); | ||||
| return -1; | |||||
| goto retry; /* recoverable error*/ | |||||
| } | } | ||||
| if (nframes != fEngineControl->fBufferSize) | if (nframes != fEngineControl->fBufferSize) | ||||