diff options
author | Max Kellermann <max@duempel.org> | 2009-03-26 19:43:18 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-03-26 19:43:18 +0100 |
commit | 617a4fd2d2eff45393c4e243129a4648822d5d86 (patch) | |
tree | 0b11f58f1dd145a273378e31a5ba8506251abe97 /src/mixer_control.c | |
parent | 7475ded935a00d790d4e97ecf55f4fb3306d80fb (diff) | |
download | mpd-617a4fd2d2eff45393c4e243129a4648822d5d86.tar.gz mpd-617a4fd2d2eff45393c4e243129a4648822d5d86.tar.xz mpd-617a4fd2d2eff45393c4e243129a4648822d5d86.zip |
mixer: added flag "open"
Remember if a mixer object is open or closed. Don't call open() again
if it is already open. This guarantees that the mixer plugin is
always called in a consistent state, and we will be able to remove
lots of checks from the implementations.
To support mixers which are automatically opened even if the audio
output is still closed (to set the volume before playback starts),
this patch also adds the "global" flag to the mixer_plugin struct.
Both ALSA and OSS set this flag, while PULSE does not.
Diffstat (limited to '')
-rw-r--r-- | src/mixer_control.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/src/mixer_control.c b/src/mixer_control.c index f1d67a078..4e86a9aa2 100644 --- a/src/mixer_control.c +++ b/src/mixer_control.c @@ -76,7 +76,12 @@ mixer_open(struct mixer *mixer) assert(mixer->plugin != NULL); g_mutex_lock(mixer->mutex); - success = mixer->plugin->open(mixer); + + if (mixer->open) + success = true; + else + success = mixer->open = mixer->plugin->open(mixer); + g_mutex_unlock(mixer->mutex); return success; @@ -89,10 +94,22 @@ mixer_close(struct mixer *mixer) assert(mixer->plugin != NULL); g_mutex_lock(mixer->mutex); - mixer->plugin->close(mixer); + + if (mixer->open) { + mixer->plugin->close(mixer); + mixer->open = false; + } + g_mutex_unlock(mixer->mutex); } +void +mixer_auto_close(struct mixer *mixer) +{ + if (!mixer->plugin->global) + mixer_close(mixer); +} + int mixer_get_volume(struct mixer *mixer) { @@ -100,8 +117,16 @@ mixer_get_volume(struct mixer *mixer) assert(mixer != NULL); + if (mixer->plugin->global && !mixer_open(mixer)) + return -1; + g_mutex_lock(mixer->mutex); - volume = mixer->plugin->get_volume(mixer); + + if (mixer->open) { + volume = mixer->plugin->get_volume(mixer); + } else + volume = -1; + g_mutex_unlock(mixer->mutex); return volume; @@ -114,8 +139,16 @@ mixer_set_volume(struct mixer *mixer, unsigned volume) assert(mixer != NULL); + if (mixer->plugin->global && !mixer_open(mixer)) + return false; + g_mutex_lock(mixer->mutex); - success = mixer->plugin->set_volume(mixer, volume); + + if (mixer->open) { + success = mixer->plugin->set_volume(mixer, volume); + } else + success = false; + g_mutex_unlock(mixer->mutex); return success; |