aboutsummaryrefslogtreecommitdiffstats
path: root/src/audioOutputs
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2008-09-08 20:43:59 +0200
committerMax Kellermann <max@duempel.org>2008-09-08 20:43:59 +0200
commitd0ab3a31ac90f05be34877ce70ed07afdf00e829 (patch)
tree56f6980baf3bd6eb417e230d5e8a03e65b0f03e0 /src/audioOutputs
parent7d0c32b45089376f55a56f98472193a4802cba64 (diff)
downloadmpd-d0ab3a31ac90f05be34877ce70ed07afdf00e829.tar.gz
mpd-d0ab3a31ac90f05be34877ce70ed07afdf00e829.tar.xz
mpd-d0ab3a31ac90f05be34877ce70ed07afdf00e829.zip
alsa: only run snd_config_update_free_global once atexit
This is safer than the patch in http://www.musicpd.org/mantis/view.php?id=1542 with multiple audio outputs enabled. Sadly, I only noticed that patch/problem when I googled for "snd_config_update_free_global"
Diffstat (limited to '')
-rw-r--r--src/audioOutputs/audioOutput_alsa.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/audioOutputs/audioOutput_alsa.c b/src/audioOutputs/audioOutput_alsa.c
index ccde87691..0172725e0 100644
--- a/src/audioOutputs/audioOutput_alsa.c
+++ b/src/audioOutputs/audioOutput_alsa.c
@@ -74,8 +74,15 @@ static void freeAlsaData(AlsaData * ad)
static int alsa_initDriver(struct audio_output *audioOutput,
ConfigParam * param)
{
+ /* no need for pthread_once thread-safety when reading config */
+ static int free_global_registered;
AlsaData *ad = newAlsaData();
+ if (!free_global_registered) {
+ atexit((void(*)(void))snd_config_update_free_global);
+ free_global_registered = 1;
+ }
+
if (param) {
BlockParam *bp;
@@ -107,8 +114,6 @@ static int alsa_testDefault(void)
int ret = snd_pcm_open(&handle, default_device,
SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
- snd_config_update_free_global();
-
if (ret) {
WARNING("Error opening default ALSA device: %s\n",
snd_strerror(-ret));
@@ -153,7 +158,6 @@ static int alsa_openDevice(struct audio_output *audioOutput)
err = snd_pcm_open(&ad->pcmHandle, ad->device,
SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
- snd_config_update_free_global();
if (err < 0) {
ad->pcmHandle = NULL;
goto error;