On Thu, 2012-02-09 at 19:13 +0530, Arun Raghavan wrote: > @@ -189,6 +191,47 @@ static pa_hook_result_t source_output_unlink_post_cb(pa_core *c, pa_source_outpu > return PA_HOOK_OK; > } > > +/* Set the inital profile for the card based on currently available Typo: "inital" -> "initial". > + * sink-inputs and source-outputs. */ > +static pa_hook_result_t card_new_cb(pa_core *c, pa_card_new_data *data, void *userdata) { > + const char *device_api; > + pa_sink_input *input; > + pa_source_output *output; > + pa_bool_t use_a2dp = TRUE; > + uint32_t idx; > + > + device_api = pa_proplist_gets(data->proplist, PA_PROP_DEVICE_API); > + if (!device_api || !pa_streq(device_api, "bluez")) > + return PA_HOOK_OK; > + > + PA_IDXSET_FOREACH(input, c->sink_inputs, idx) { > + if (pa_streq(GET_ROLE(input), "phone")) { > + use_a2dp = FALSE; > + goto done; > + } > + } > + > + PA_IDXSET_FOREACH(output, c->source_outputs, idx) { > + if (pa_streq(GET_ROLE(output), "phone")) { > + use_a2dp = FALSE; > + break; > + } > + } > + > +done: > + if (use_a2dp) { > + pa_log_info("No phone streams, switching card '%s' to A2DP profile", data->name); To be precise, you're not switching the profile, you're setting the initial profile. > + pa_card_new_data_set_profile(data, "a2dp"); > + data->save_profile = FALSE; > + } else { > + pa_log_info("Have a phone stream, switching card '%s' to HSP/HFP profile", data->name); > + pa_card_new_data_set_profile(data, "hsp"); > + data->save_profile = FALSE; > + } The profile should be set only if it's not already set by someone else. -- Tanu