summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Guthrie <cguthrie@mandriva.org>2010-10-01 01:26:43 +0100
committerColin Guthrie <cguthrie@mandriva.org>2010-10-05 10:13:53 +0100
commit9109a188cd3d2e4d0d400f68a00aaefd02719e6c (patch)
tree27881676a8ba9a539a3bb7cc66af9fb5081ddbc0
parenta21b8328aab906f9128f4c5597115608fa4045bc (diff)
suspend: Do not assert when checking for device suspended status and a stream is not linked.
When looping through the streams on a given device checking to see if the stream is 'active' there should be no assert if the stream is not linked, it should simply be ignored. This assert can be hit if a sink and a sink input are both created and setup but the final put calls are left to the end as is done in module-ladspa-sink. While the order of the calls in module-ladspa-sink could be altered, we should deal gracefully with the way it is now and not complain about ending up in this state. A trigger case was trivial: 1. Load a ladspa-sink. 2. Play a stream and move it to it. 3. Unload the module, then reload it. 4. Due to module-stream-restore and module-suspend-on-idle, the hook callbacks will ultimately hit this assert. Thanks to Kim Therkelsen for highlighting this issue.
-rw-r--r--src/pulsecore/sink.c9
-rw-r--r--src/pulsecore/source.c9
2 files changed, 16 insertions, 2 deletions
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 3a92f67d..8d66f980 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -1745,7 +1745,14 @@ unsigned pa_sink_check_suspend(pa_sink *s) {
pa_sink_input_state_t st;
st = pa_sink_input_get_state(i);
- pa_assert(PA_SINK_INPUT_IS_LINKED(st));
+
+ /* We do not assert here. It is perfectly valid for a sink input to
+ * be in the INIT state (i.e. created, marked done but not yet put)
+ * and we should not care if it's unlinked as it won't contribute
+ * towarards our busy status.
+ */
+ if (!PA_SINK_INPUT_IS_LINKED(st))
+ continue;
if (st == PA_SINK_INPUT_CORKED)
continue;
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index 415c54bc..412a3db9 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -996,7 +996,14 @@ unsigned pa_source_check_suspend(pa_source *s) {
pa_source_output_state_t st;
st = pa_source_output_get_state(o);
- pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(st));
+
+ /* We do not assert here. It is perfectly valid for a source output to
+ * be in the INIT state (i.e. created, marked done but not yet put)
+ * and we should not care if it's unlinked as it won't contribute
+ * towarards our busy status.
+ */
+ if (!PA_SOURCE_OUTPUT_IS_LINKED(st))
+ continue;
if (st == PA_SOURCE_OUTPUT_CORKED)
continue;