commit a0ddae2c32945e97e518164702be1819b543950e
parent b4e38da7d4d7c95b97316d622cfdcf9b7ccd13a8
Author: Johannes Lorenz <johannes89@ist-einmalig.de>
Date: Wed, 28 Sep 2016 21:56:59 +0200
AlsaEngine: Fix hanging connection after s2ram. Use snd_pcm_hw_params_set_buffer_size_near.
Diffstat:
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/src/Nio/AlsaEngine.cpp b/src/Nio/AlsaEngine.cpp
@@ -319,6 +319,18 @@ bool AlsaEngine::openAudio()
snd_pcm_hw_params_set_periods_near(audio.handle,
audio.params, &audio.periods, NULL);
+ /* Set buffer size (in frames). The resulting latency is given by */
+ /* latency = periodsize * periods / (rate * bytes_per_frame) */
+ snd_pcm_uframes_t alsa_buffersize = synth.buffersize;
+ rc = snd_pcm_hw_params_set_buffer_size_near(audio.handle,
+ audio.params,
+ &alsa_buffersize);
+
+ /* At this place, ALSA's and zyn's buffer sizes may differ. */
+ /* This should not be a problem. */
+ if((int)alsa_buffersize != synth.buffersize)
+ cerr << "ALSA buffer size: " << alsa_buffersize << endl;
+
/* Write the parameters to the driver */
rc = snd_pcm_hw_params(audio.handle, audio.params);
if(rc < 0) {
@@ -328,12 +340,6 @@ bool AlsaEngine::openAudio()
return false;
}
- /* Set buffer size (in frames). The resulting latency is given by */
- /* latency = periodsize * periods / (rate * bytes_per_frame) */
- snd_pcm_hw_params_set_buffer_size(audio.handle,
- audio.params,
- synth.buffersize);
-
//snd_pcm_hw_params_get_period_size(audio.params, &audio.frames, NULL);
//snd_pcm_hw_params_get_period_time(audio.params, &val, NULL);
@@ -371,8 +377,12 @@ void *AlsaEngine::processAudio()
snd_pcm_prepare(handle);
}
else
- if(rc < 0)
- cerr << "error from writei: " << snd_strerror(rc) << endl;
+ if(rc < 0) {
+ cerr << "AlsaEngine: Recovering connection..." << endl;
+ rc = snd_pcm_recover(handle, rc, 0);
+ if(rc < 0)
+ throw "Could not recover ALSA connection";
+ }
}
return NULL;
}