static void master_source_state_subscribe_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { struct userdata *u = userdata; pa_assert(c); pa_assert(u); if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE) return; if (!u->master_source) return; if (u->master_source != pa_idxset_get_by_index(c->sources, idx)) return; if (pa_source_get_state(u->master_source) == u->previous_master_source_state) return; u->previous_master_source_state = pa_source_get_state(u->master_source); if (u->previous_master_source_state == PA_SOURCE_SUSPENDED) { meego_algorithm_hook_fire(u->hooks[HOOK_SOURCE_RESET], NULL); pa_log_debug("VOICE_HOOK_SOURCE_RESET fired"); voice_aep_ear_ref_loop_reset(u); } }
/* Called from main context */ static int voip_sink_set_state(pa_sink *s, pa_sink_state_t state) { struct userdata *u; int ret = 0; ENTER(); pa_sink_assert_ref(s); pa_assert_se(u = s->userdata); ret = voice_sink_set_state(s, u->raw_sink, state); /* TODO: Check if we still need to fiddle with PROP_MIXER_TUNING_MODE */ if (s->state != PA_SINK_RUNNING && state == PA_SINK_RUNNING) { voice_aep_ear_ref_loop_reset(u); meego_algorithm_hook_fire(u->hooks[HOOK_CALL_BEGIN], s); } else if (s->state == PA_SINK_RUNNING && state != PA_SINK_RUNNING) meego_algorithm_hook_fire(u->hooks[HOOK_CALL_END], s); pa_log_debug("(%p): called with %d", (void *)s, state); return ret; }
/* Generic source state change logic. Used by raw_source and voice_source */ int voice_source_set_state(pa_source *s, pa_source *other, pa_source_state_t state) { struct userdata *u; pa_source_assert_ref(s); pa_assert_se(u = s->userdata); if (!other) { pa_log_debug("other source not initialized or freed"); return 0; } pa_source_assert_ref(other); if (u->hw_source_output) { if (pa_source_output_get_state(u->hw_source_output) == PA_SOURCE_OUTPUT_RUNNING) { if (state == PA_SOURCE_SUSPENDED && pa_source_get_state(other) == PA_SOURCE_SUSPENDED && pa_atomic_load(&u->cmt_connection.ul_state) != CMT_UL_ACTIVE) { pa_source_output_cork(u->hw_source_output, TRUE); pa_log_debug("hw_source_output corked"); } } else if (pa_source_output_get_state(u->hw_source_output) == PA_SOURCE_OUTPUT_CORKED) { if (PA_SOURCE_IS_OPENED(state) || PA_SOURCE_IS_OPENED(pa_source_get_state(other)) || pa_atomic_load(&u->cmt_connection.ul_state) == CMT_UL_ACTIVE) { pa_source_output_cork(u->hw_source_output, FALSE); pa_log_debug("hw_source_output uncorked"); } } } if (pa_atomic_load(&u->cmt_connection.ul_state) != CMT_UL_ACTIVE && !PA_SOURCE_IS_OPENED(pa_source_get_state(u->voip_source))) { voice_aep_ear_ref_loop_reset(u); } return 0; }
void voice_update_parameters(struct userdata *u) { pa_sink *sink; const char *s; double tmp_d, old_d; int tmp, old; size_t nbytes; const void *data; ENTER(); sink = voice_get_original_master_sink(u); if (!sink) { pa_log_warn("Original master sink not found, parameters not updated."); return; } u->updating_parameters = TRUE; if (!pa_proplist_get(sink->proplist, "x-maemo.xprot.parameters.left", &data, &nbytes)) xprot_change_params(u->xprot, data, nbytes, 0); if (!pa_proplist_get(sink->proplist,"x-maemo.xprot.parameters.right", &data, &nbytes)) xprot_change_params(u->xprot, data, nbytes, 1); s = voice_pa_proplist_gets(sink->proplist, "x-maemo.cmt.ul_timing_advance"); old = u->ul_timing_advance; if (!pa_atoi(s, &tmp) && tmp > -5000 && tmp < 5000) u->ul_timing_advance = tmp; pa_log_debug("cmt_ul_timing_advance \"%s\" %d %d", s, u->ul_timing_advance, old); s = voice_pa_proplist_gets(sink->proplist, "x-maemo.alt_mixer_compensation"); /* CHECKME */ old_d = u->alt_mixer_compensation; if (!pa_atod(s, &tmp_d) && tmp_d > 0.0 && tmp_d <= 60.0) /* < 60.0 ? */ u->alt_mixer_compensation = pa_sw_volume_from_dB(tmp_d); pa_log_debug("alt_mixer_compensation \"%s\" %d %f", s, u->alt_mixer_compensation, old_d); s = voice_pa_proplist_gets(sink->proplist, "x-maemo.ear_ref_padding"); old = u->ear_ref.loop_padding_usec ; if (!pa_atoi(s, &tmp) && tmp > -10000 && tmp < 199999) u->ear_ref.loop_padding_usec = tmp; pa_log_debug("ear_ref_padding \"%s\" %d %d", s, u->ear_ref.loop_padding_usec, old); voice_parse_aep_steps(u, voice_pa_proplist_gets(sink->proplist, "x-maemo.audio_aep_mb_steps")); s = voice_pa_proplist_gets(sink->proplist, "x-maemo.nrec"); u->nrec_enable = pa_parse_boolean(s); if (u->master_source && pa_proplist_gets(u->master_source->proplist, "bluetooth.nrec")) { /* WTF ?!? */ u->sidetone_enable = pa_parse_boolean(s) && u->nrec_enable; } if (!pa_proplist_get(sink->proplist, "x-maemo.aep.switches", (const void **)&data, &nbytes) ) { uint16_t *as = (uint16_t *)data; aep_switches.field_0 = as[0]; aep_switches.field_2 = as[1]; aep_switches.field_4 = 0; if ( aep_switches.field_0 & 0x400 ) aep_switches.field_4 = 0x30; if (aep_switches.field_0 & 1) aep_switches.field_4 |= 0x300u; aep_switches.field_4 |= 0x1800u; } if (!pa_proplist_get(sink->proplist, "x-maemo.aep.parameters", &data, &nbytes)) { const char *argv[7] = { "../execute/d4gnt560", "b-ai-1n------0---u", "/dev/null", "/dev/null", "/dev/null", "/dev/null", "/dev/null", }; if (strlen(aep_runtime_switch) >= strlen(argv[1])) argv[1] = aep_runtime_switch; fprintf(stderr, "AEP runtime switch %s\n", argv[1]); current_aep_tuning = (void *)data; init_main(7, argv); voice_aep_ear_ref_loop_reset(u); } sidetone_write_parameters(u); if (!pa_proplist_get(sink->proplist, "x-maemo.wb_meq.parameters", &data, &nbytes)) iir_eq_change_params(u->wb_mic_iir_eq, data, nbytes); if (!pa_proplist_get(sink->proplist, "x-maemo.nb_meq.parameters", &data, &nbytes) ) iir_eq_change_params(u->nb_mic_iir_eq, data, nbytes); if (!pa_proplist_get(sink->proplist,"x-maemo.wb_eeq.parameters", &data, &nbytes)) fir_eq_change_params(u->wb_ear_iir_eq, data, nbytes); if (!pa_proplist_get(sink->proplist, "x-maemo.nb_eeq.parameters", &data, &nbytes)) iir_eq_change_params(u->nb_ear_iir_eq, data, nbytes); u->aep_enable = voice_pa_proplist_get_bool(sink->proplist, "x-maemo.aep"); u->wb_meq_enable = voice_pa_proplist_get_bool(sink->proplist, "x-maemo.wb_meq"); u->wb_eeq_enable = voice_pa_proplist_get_bool(sink->proplist, "x-maemo.wb_eeq"); u->nb_meq_enable = voice_pa_proplist_get_bool(sink->proplist, "x-maemo.nb_meq"); u->nb_eeq_enable = voice_pa_proplist_get_bool(sink->proplist, "x-maemo.nb_eeq"); u->xprot->displ_limit = voice_pa_proplist_get_bool(sink->proplist, "x-maemo.xprot.displacement"); u->xprot->temp_limit = voice_pa_proplist_get_bool(sink->proplist, "x-maemo.xprot.temperature"); u->xprot_enable = u->xprot->displ_limit || u->xprot->temp_limit; u->updating_parameters = FALSE; }