diff options
author | David Henningsson <david.henningsson@canonical.com> | 2011-09-12 12:57:20 +0200 |
---|---|---|
committer | Arun Raghavan <arun.raghavan@collabora.co.uk> | 2011-09-14 15:47:17 +0530 |
commit | f8624a7876444ebb5587c1f1bc821ab5c3a2b639 (patch) | |
tree | 466d74d68bb0f4be55cd12d128d300724e2bf6d5 | |
parent | 38be4a2d440ce51750b96727b638f947f75d69b6 (diff) |
sink,source: Avoid crash by not updating volume on shutdown
Sometimes the ALSA mixer can be modified during a point at shutdown
which causes a race condition trying to update the volume of an
unlinked sink.
Includes typo fix by our Chief Typo Spotter, Colin, and a clarifying
comment by me.
BugLink: http://bugs.launchpad.net/bugs/841968
Signed-off-by: David Henningsson <david.henningsson@canonical.com>
-rw-r--r-- | src/modules/alsa/alsa-sink.c | 3 | ||||
-rw-r--r-- | src/modules/alsa/alsa-source.c | 3 | ||||
-rw-r--r-- | src/pulsecore/sink.c | 4 | ||||
-rw-r--r-- | src/pulsecore/source.c | 4 |
4 files changed, 14 insertions, 0 deletions
diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c index d164128b4..5b8dd3154 100644 --- a/src/modules/alsa/alsa-sink.c +++ b/src/modules/alsa/alsa-sink.c @@ -1212,6 +1212,9 @@ static int ctl_mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) { if (mask == SND_CTL_EVENT_MASK_REMOVE) return 0; + if (!PA_SINK_IS_LINKED(u->sink->state)) + return 0; + if (u->sink->suspend_cause & PA_SUSPEND_SESSION) return 0; diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c index 229edf12a..4b3c8b7a7 100644 --- a/src/modules/alsa/alsa-source.c +++ b/src/modules/alsa/alsa-source.c @@ -1063,6 +1063,9 @@ static int ctl_mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) { if (mask == SND_CTL_EVENT_MASK_REMOVE) return 0; + if (!PA_SOURCE_IS_LINKED(u->source->state)) + return 0; + if (u->source->suspend_cause & PA_SUSPEND_SESSION) return 0; diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index a29d61db1..d97fb7eec 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -2623,6 +2623,10 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offse /* This message is sent from IO-thread and handled in main thread. */ pa_assert_ctl_context(); + /* Make sure we're not messing with main thread when no longer linked */ + if (!PA_SINK_IS_LINKED(s->state)) + return 0; + pa_sink_get_volume(s, TRUE); pa_sink_get_mute(s, TRUE); return 0; diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c index 5f57265c8..0282828f8 100644 --- a/src/pulsecore/source.c +++ b/src/pulsecore/source.c @@ -2045,6 +2045,10 @@ int pa_source_process_msg(pa_msgobject *object, int code, void *userdata, int64_ /* This message is sent from IO-thread and handled in main thread. */ pa_assert_ctl_context(); + /* Make sure we're not messing with main thread when no longer linked */ + if (!PA_SOURCE_IS_LINKED(s->state)) + return 0; + pa_source_get_volume(s, TRUE); pa_source_get_mute(s, TRUE); return 0; |