diff options
author | Kurt Korbatits <kurt.korbatits@nokia.com> | 2010-03-12 09:31:57 +1000 |
---|---|---|
committer | Kurt Korbatits <kurt.korbatits@nokia.com> | 2010-03-12 09:31:57 +1000 |
commit | b7ef079177ceec96f821393796c6c5b14c21704e (patch) | |
tree | 8b82c2643a38412aee35d809db5e7c56c1653003 | |
parent | 07f86351d9cdf84c515192ad4d279ba1a6d38d91 (diff) | |
download | qt4-tools-b7ef079177ceec96f821393796c6c5b14c21704e.tar.gz |
QAudioInput sometimes not writing to QIODevice
Handle error recovery better.
Task-number:QTBUG-8893
Reviewed-by:Derick Hawcroft
-rw-r--r-- | src/multimedia/audio/qaudioinput_alsa_p.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/multimedia/audio/qaudioinput_alsa_p.cpp b/src/multimedia/audio/qaudioinput_alsa_p.cpp index 5eb23d0cd4..ead9995925 100644 --- a/src/multimedia/audio/qaudioinput_alsa_p.cpp +++ b/src/multimedia/audio/qaudioinput_alsa_p.cpp @@ -121,6 +121,11 @@ int QAudioInputPrivate::xrun_recovery(int err) err = snd_pcm_prepare(handle); if(err < 0) reset = true; + else { + bytesAvailable = bytesReady(); + if (bytesAvailable <= 0) + reset = true; + } } else if((err == -ESTRPIPE)||(err == -EIO)) { errorState = QAudio::IOError; @@ -443,6 +448,7 @@ int QAudioInputPrivate::bytesReady() const if(deviceState != QAudio::ActiveState && deviceState != QAudio::IdleState) return 0; int frames = snd_pcm_avail_update(handle); + if (frames < 0) return frames; if((int)frames > (int)buffer_frames) frames = buffer_frames; @@ -459,6 +465,20 @@ qint64 QAudioInputPrivate::read(char* data, qint64 len) bytesAvailable = bytesReady(); + if (bytesAvailable < 0) { + // bytesAvailable as negative is error code, try to recover from it. + xrun_recovery(bytesAvailable); + bytesAvailable = bytesReady(); + if (bytesAvailable < 0) { + // recovery failed must stop and set error. + close(); + errorState = QAudio::IOError; + deviceState = QAudio::StoppedState; + emit stateChanged(deviceState); + return 0; + } + } + int count=0, err = 0; while(count < 5) { int chunks = bytesAvailable/period_size; |