audioOutput_alsa.c: avoid changing our internal period and buffer time values
Passing a ref to snd_pcm_hw_params_set_{buffer,period}_time_near can modify our internal {period,buffer}_time members inside the AlsaData structure, making re-initializing the device across sample/bit rate and channel changes non-idempotent. git-svn-id: https://svn.musicpd.org/mpd/trunk@4616 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
b5361f7789
commit
0511e14db0
@ -140,8 +140,9 @@ static int alsa_openDevice(AudioOutput * audioOutput)
|
|||||||
snd_pcm_uframes_t alsa_period_size;
|
snd_pcm_uframes_t alsa_period_size;
|
||||||
int err;
|
int err;
|
||||||
const char *cmd = NULL;
|
const char *cmd = NULL;
|
||||||
unsigned int period_time;
|
|
||||||
int retry = MPD_ALSA_RETRY_NR;
|
int retry = MPD_ALSA_RETRY_NR;
|
||||||
|
unsigned int period_time, period_time_ro;
|
||||||
|
unsigned int buffer_time;
|
||||||
|
|
||||||
switch (audioFormat->bits) {
|
switch (audioFormat->bits) {
|
||||||
case 8:
|
case 8:
|
||||||
@ -175,6 +176,7 @@ static int alsa_openDevice(AudioOutput * audioOutput)
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
period_time_ro = period_time = ad->period_time;
|
||||||
configure_hw:
|
configure_hw:
|
||||||
/* configure HW params */
|
/* configure HW params */
|
||||||
snd_pcm_hw_params_alloca(&hwparams);
|
snd_pcm_hw_params_alloca(&hwparams);
|
||||||
@ -231,28 +233,29 @@ configure_hw:
|
|||||||
}
|
}
|
||||||
audioFormat->sampleRate = sampleRate;
|
audioFormat->sampleRate = sampleRate;
|
||||||
|
|
||||||
|
buffer_time = ad->buffer_time;
|
||||||
cmd = "snd_pcm_hw_params_set_buffer_time_near";
|
cmd = "snd_pcm_hw_params_set_buffer_time_near";
|
||||||
err = snd_pcm_hw_params_set_buffer_time_near(ad->pcmHandle, hwparams,
|
err = snd_pcm_hw_params_set_buffer_time_near(ad->pcmHandle, hwparams,
|
||||||
&ad->buffer_time, NULL);
|
&buffer_time, NULL);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
period_time = ad->period_time;
|
period_time = period_time_ro;
|
||||||
cmd = "snd_pcm_hw_params_set_period_time_near";
|
cmd = "snd_pcm_hw_params_set_period_time_near";
|
||||||
err = snd_pcm_hw_params_set_period_time_near(ad->pcmHandle, hwparams,
|
err = snd_pcm_hw_params_set_period_time_near(ad->pcmHandle, hwparams,
|
||||||
&ad->period_time, NULL);
|
&period_time, NULL);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
cmd = "snd_pcm_hw_params";
|
cmd = "snd_pcm_hw_params";
|
||||||
err = snd_pcm_hw_params(ad->pcmHandle, hwparams);
|
err = snd_pcm_hw_params(ad->pcmHandle, hwparams);
|
||||||
if (err == -EPIPE && --retry > 0) {
|
if (err == -EPIPE && --retry > 0) {
|
||||||
ad->period_time = period_time >> 1;
|
period_time_ro = period_time_ro >> 1;
|
||||||
goto configure_hw;
|
goto configure_hw;
|
||||||
} else if (err < 0)
|
} else if (err < 0)
|
||||||
goto error;
|
goto error;
|
||||||
if (retry != MPD_ALSA_RETRY_NR)
|
if (retry != MPD_ALSA_RETRY_NR)
|
||||||
DEBUG("ALSA period_time set to %d\n", ad->period_time);
|
DEBUG("ALSA period_time set to %d\n", period_time);
|
||||||
|
|
||||||
cmd = "snd_pcm_hw_params_get_buffer_size";
|
cmd = "snd_pcm_hw_params_get_buffer_size";
|
||||||
err = snd_pcm_hw_params_get_buffer_size(hwparams, &alsa_buffer_size);
|
err = snd_pcm_hw_params_get_buffer_size(hwparams, &alsa_buffer_size);
|
||||||
|
Loading…
Reference in New Issue
Block a user