pa_idxset_remove_by_data(streams, i, NULL);
}
-/* Remove the sink-input from ducking streams */
-static void remove_sink_input_from_ducking_streams(pa_stream_manager *m, pa_sink_input *i) {
+/* It can be utilized when it requires to invoke the ramp finish hook forcedly */
+static stream_ducking* fire_ramp_finish_hook_when_ducking_or_unducking_state(pa_stream_manager *m, pa_sink_input *i) {
uint32_t idx = 0;
stream_ducking *sd = NULL;
void *stream = NULL;
PA_IDXSET_FOREACH(stream, sd->idx_ducking_streams, idx) {
if (stream != i)
continue;
-
if (sd->state == STREAM_DUCKING_STATE_DUCKING ||
- sd->state == STREAM_DUCKING_STATE_UNDUCKING)
+ sd->state == STREAM_DUCKING_STATE_UNDUCKING) {
+ pa_log_debug("stream(%p, index:%u) ducking state[%s]",
+ i, i->index, sd->state == STREAM_DUCKING_STATE_DUCKING ? "DUCKING" : "UNDUCKING");
pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_RAMP_FINISH], i);
+ }
+ return sd;
+ }
+ }
- pa_log_error("remove stream(idx:%u,%p) from idx_ducking_streams, trigger_index(%u)",
- i->index, i, sd->trigger_index);
- pa_idxset_remove_by_data(sd->idx_ducking_streams, i, NULL);
+ return NULL;
+}
- return;
- }
+/* Remove the sink-input from ducking streams */
+static void remove_sink_input_from_ducking_streams(pa_stream_manager *m, pa_sink_input *i) {
+ stream_ducking *sd;
+
+ pa_assert(m);
+
+ if ((sd = fire_ramp_finish_hook_when_ducking_or_unducking_state(m, i))) {
+ pa_log_error("remove stream(%p, index:%u) from idx_ducking_streams, trigger_index(%u)",
+ i, i->index, sd->trigger_index);
+ pa_idxset_remove_by_data(sd->idx_ducking_streams, i, NULL);
}
}
switch (i->state) {
case PA_SINK_INPUT_CORKED:
process_stream(m, i, STREAM_SINK_INPUT, PROCESS_COMMAND_CHANGE_ROUTE_BY_STATE_CHANGED_CORKED, false);
+ fire_ramp_finish_hook_when_ducking_or_unducking_state(m, i);
break;
case PA_SINK_INPUT_RUNNING:
process_stream(m, i, STREAM_SINK_INPUT, PROCESS_COMMAND_CHANGE_ROUTE_BY_STATE_CHANGED_RUNNING, false);