zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

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:
Msrc/Nio/AlsaEngine.cpp | 26++++++++++++++++++--------
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; }