if (sd) {
uint32_t ducking_idx = 0;
pa_sink_input *stream = NULL;
+ hal_ducking_activation_info ducking_activation_info = {
+ sd->target_role, sd->duration, sd->ratio, false
+ };
- pa_log_info(" - remove sd(%p), trigger_index(%u)", sd, idx);
+ pa_log_info(" - remove sd(%p) state(%d), trigger_index(%u)", sd, sd->state, idx);
+
+ if (sd->state == STREAM_DUCKING_STATE_UNDUCKED || sd->state == STREAM_DUCKING_STATE_UNDUCKING)
+ goto skip_unducking;
PA_IDXSET_FOREACH(stream, sd->idx_ducking_streams, ducking_idx) {
- hal_ducking_activation_info ducking_activation_info;
/* Note: It is added temporarily to find missing index of idx_ducking_streams */
if (!pa_idxset_get_by_data(m->core->sink_inputs, stream, NULL)) {
pa_log_error("could not find stream(%p), skip it", stream);
pa_log_info(" -- remove volume ramp, key(%s) from remained stream(idx:%u)", sd->vol_key, stream->index);
pa_sink_input_remove_volume_factor(stream, sd->vol_key);
pa_sink_input_remove_volume_ramp_factor(stream, sd->vol_key, true);
-
- /* notify ducking activation */
- ducking_activation_info.target_role = sd->target_role;
- ducking_activation_info.duration = sd->duration;
- ducking_activation_info.ratio = sd->ratio;
- ducking_activation_info.is_activated = false;
-
- pa_hal_interface_notify_ducking_activation_changed(m->hal, &ducking_activation_info);
}
+ pa_hal_interface_notify_ducking_activation_changed(m->hal, &ducking_activation_info);
+
+ skip_unducking:
pa_idxset_free(sd->idx_ducking_streams, NULL);
pa_hashmap_remove(m->stream_duckings, PA_UINT_TO_PTR(idx));
pa_xfree(sd);