diff options
Diffstat (limited to 'comms/qsstv/files/patch-sound_soundalsa.cpp')
-rw-r--r-- | comms/qsstv/files/patch-sound_soundalsa.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/comms/qsstv/files/patch-sound_soundalsa.cpp b/comms/qsstv/files/patch-sound_soundalsa.cpp new file mode 100644 index 000000000000..10768b88f714 --- /dev/null +++ b/comms/qsstv/files/patch-sound_soundalsa.cpp @@ -0,0 +1,80 @@ +--- sound/soundalsa.cpp.orig 2019-04-18 09:34:09 UTC ++++ sound/soundalsa.cpp +@@ -64,6 +64,8 @@ void soundAlsa::prepareCapture() + { + int err; + if(!soundDriverOK) return; ++ snd_pcm_drop(captureHandle); ++ snd_pcm_reset(captureHandle); + if((err=snd_pcm_prepare (captureHandle)) < 0) + { + alsaErrorHandler(err,"Unable to prepare "+inputAudioDevice); +@@ -77,6 +79,8 @@ void soundAlsa::prepareCapture() + void soundAlsa::preparePlayback() + { + if(!soundDriverOK) return; ++ snd_pcm_drop(captureHandle); ++ snd_pcm_reset(captureHandle); + snd_pcm_prepare (playbackHandle); + } + +@@ -99,6 +103,8 @@ int soundAlsa::read(int &countAvailable) + if ( count == -EPIPE ) + { + // Overrun ++ snd_pcm_drop(captureHandle); ++ snd_pcm_reset(captureHandle); + snd_pcm_prepare (captureHandle ); + snd_pcm_start (captureHandle); + errorOut() << "Overrun"; +@@ -153,6 +159,8 @@ int soundAlsa::write(uint numFrames) + else if ( framesWritten == -EPIPE ) + { + /* underrun */ ++ snd_pcm_drop(captureHandle); ++ snd_pcm_reset(captureHandle); + error = snd_pcm_prepare (playbackHandle); + if ( error < 0 ) + { +@@ -384,5 +392,41 @@ void getCardList(QStringList &alsaInputL + n++; + } + snd_device_name_free_hint(hints); ++ ++ snd_config_t *pcmc; ++ snd_pcm_t *pcm; ++ if (!snd_config) ++ snd_config_update(); ++ if(snd_config_search(snd_config, "pcm", &pcmc)==0) { ++ snd_config_iterator_t i, next; ++ snd_config_for_each(i, next, pcmc) { ++ snd_config_t *n = snd_config_iterator_entry(i); ++ if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) ++ continue; ++ const char *id; ++ if(snd_config_get_id(n, &id)==0) { ++ deviceName = QString(id); ++ if (deviceName == "hw" || ++ deviceName == "plughw" || ++ deviceName == "plug" || ++ deviceName == "dsnoop" || ++ deviceName == "tee" || ++ deviceName == "file" || ++ deviceName == "null" || ++ deviceName == "shm" || ++ deviceName == "cards" || ++ deviceName == "rate_convert") ++ continue; ++ if (snd_pcm_open(&pcm, id, SND_PCM_STREAM_PLAYBACK, 0) == 0) { ++ alsaOutputList.append(deviceName + " "); ++ snd_pcm_close(pcm); ++ } ++ if (snd_pcm_open(&pcm, id, SND_PCM_STREAM_CAPTURE, 0) == 0) { ++ alsaInputList.append(deviceName + " "); ++ snd_pcm_close(pcm); ++ } ++ } ++ } ++ } + } + |