<div>Hi guys,</div><div><br></div><div><div>When switching from A2DP to handsfree, it will automatically switch to other ports </div><div>and output audio for a short time, and then immediately switch to the handsfree output port.</div><div><br></div><div>How can we fix this issue? Thanks a lot.</div></div><div><br></div><div>In the following set_profile_cb function, this issue occurs after the stop_thread function calls </div><div>pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_UNLINK], s) in pa_sink_unlink.</div><div>------------------------</div><div><div>static int set_profile_cb(pa_card *c, pa_card_profile *new_profile) {</div><div>    struct userdata *u;</div><div>    pa_bluetooth_profile_t *p;</div><div><br></div><div>    pa_assert(c);</div><div>    pa_assert(new_profile);</div><div>    pa_assert_se(u = c->userdata);</div><div><br></div><div>    p = PA_CARD_PROFILE_DATA(new_profile);</div><div><br></div><div>    if (*p != PA_BLUETOOTH_PROFILE_OFF) {</div><div>        const pa_bluetooth_device *d = u->device;</div><div><br></div><div>        if (!d->transports[*p] || d->transports[*p]->state <= PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED) {</div><div>            pa_log_warn("Refused to switch profile to %s: Not connected", new_profile->name);</div><div>            return -PA_ERR_IO;</div><div>        }</div><div>    }</div><div><br></div><div>    stop_thread(u);</div><div><br></div><div>    u->profile = *p;</div><div><br></div><div>    if (u->profile != PA_BLUETOOTH_PROFILE_OFF)</div><div>        if (init_profile(u) < 0)</div><div>            goto off;</div><div><br></div><div>    if (u->sink || u->source)</div><div>        if (start_thread(u) < 0)</div><div>            goto off;</div><div><br></div><div>    return 0;</div><div><br></div><div>off:</div><div>    stop_thread(u);</div><div><br></div><div>    pa_assert_se(pa_card_set_profile(u->card, pa_hashmap_get(u->card->profiles, "off"), false) >= 0);</div><div><br></div><div>    return -PA_ERR_IO;</div><div>}</div></div><div><br></div><div><div>static void stop_thread(struct userdata *u) {</div><div>    pa_assert(u);</div><div><br></div><div>    if (u->sink || u->source)</div><div>        pa_proplist_unset(u->card->proplist, PA_PROP_BLUETOOTH_CODEC);</div><div><br></div><div>    if (u->sink)</div><div>        pa_sink_unlink(u->sink);</div><div><br></div><div>    /* Omitted */</div><div><br></div><div>}</div><div><br></div><div>void pa_sink_unlink(pa_sink* s) {</div><div>    bool linked;</div><div>    pa_sink_input *i, PA_UNUSED *j = NULL;</div><div><br></div><div>    pa_sink_assert_ref(s);</div><div>    pa_assert_ctl_context();</div><div><br></div><div>    /* Please note that pa_sink_unlink() does more than simply</div><div>     * reversing pa_sink_put(). It also undoes the registrations</div><div>     * already done in pa_sink_new()! */</div><div><br></div><div>    if (s->unlink_requested)</div><div>        return;</div><div><br></div><div>    s->unlink_requested = true;</div><div><br></div><div>    linked = PA_SINK_IS_LINKED(s->state);</div><div><br></div><div>    if (linked)</div><div>        pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_UNLINK], s);</div><div><br></div><div>    /* Omitted */</div><div>}</div></div><div>------------------</div><div><br></div><div>Thanks,</div><div>Chengyi</div><div><includetail><!--<![endif]--></includetail></div>