diff options
author | Eric Wong <normalperson@yhbt.net> | 2008-09-08 20:43:59 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-09-08 20:43:59 +0200 |
commit | d0ab3a31ac90f05be34877ce70ed07afdf00e829 (patch) | |
tree | 56f6980baf3bd6eb417e230d5e8a03e65b0f03e0 /src/audioOutputs | |
parent | 7d0c32b45089376f55a56f98472193a4802cba64 (diff) | |
download | mpd-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 'src/audioOutputs')
-rw-r--r-- | src/audioOutputs/audioOutput_alsa.c | 10 |
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; |