On 03/04/2013 04:38 PM, Mikel Astiz wrote: > From: Mikel Astiz <mikel.astiz at bmw-carit.de> > > Use the information provided by the form factor to decide which name and > description should be used during port creation. > --- > src/modules/bluetooth/module-bluetooth-device.c | 82 +++++++++++++++++++++++-- > 1 file changed, 76 insertions(+), 6 deletions(-) > > diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c > index 9dc0cb3..2741734 100644 > --- a/src/modules/bluetooth/module-bluetooth-device.c > +++ b/src/modules/bluetooth/module-bluetooth-device.c > @@ -152,6 +152,9 @@ struct userdata { > pa_bluetooth_discovery *discovery; > bool auto_connect; > > + char *output_port_name; > + char *input_port_name; > + > pa_card *card; > pa_sink *sink; > pa_source *source; > @@ -1269,10 +1272,10 @@ static void handle_transport_state_change(struct userdata *u, struct pa_bluetoot > pa_card_profile_set_available(cp, transport_state_to_availability(state)); > > /* Update port availability */ > - pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-output")); > + pa_assert_se(port = pa_hashmap_get(u->card->ports, u->output_port_name)); > pa_device_port_set_available(port, get_port_availability(u, PA_DIRECTION_OUTPUT)); > > - pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-input")); > + pa_assert_se(port = pa_hashmap_get(u->card->ports, u->input_port_name)); > pa_device_port_set_available(port, get_port_availability(u, PA_DIRECTION_INPUT)); > > /* Acquire or release transport as needed */ > @@ -1516,13 +1519,13 @@ static void connect_ports(struct userdata *u, void *sink_or_source_new_data, pa_ > if (direction == PA_DIRECTION_OUTPUT) { > pa_sink_new_data *sink_new_data = sink_or_source_new_data; > > - pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-output")); > + pa_assert_se(port = pa_hashmap_get(u->card->ports, u->output_port_name)); > pa_assert_se(pa_hashmap_put(sink_new_data->ports, port->name, port) >= 0); > pa_device_port_ref(port); > } else { > pa_source_new_data *source_new_data = sink_or_source_new_data; > > - pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-input")); > + pa_assert_se(port = pa_hashmap_get(u->card->ports, u->input_port_name)); > pa_assert_se(pa_hashmap_put(source_new_data->ports, port->name, port) >= 0); > pa_device_port_ref(port); > } > @@ -2067,17 +2070,81 @@ off: > /* Run from main thread */ > static void create_card_ports(struct userdata *u, pa_hashmap *ports) { > pa_device_port *port; > + const char *name_prefix = NULL; > + const char *input_description = NULL; > + const char *output_description = NULL; > > pa_assert(u); > pa_assert(ports); > + pa_assert(u->device); > + > + switch (pa_bluetooth_get_form_factor(u->device->class)) { > + case PA_BT_FORM_FACTOR_UNKNOWN: > + name_prefix = "unknown"; > + output_description = _("Bluetooth Output"); > + input_description = _("Bluetooth Input"); > + break; > + > + case PA_BT_FORM_FACTOR_HEADSET: > + name_prefix = "headset"; > + input_description = output_description = _("Headset"); > + break; > + > + case PA_BT_FORM_FACTOR_HANDSFREE: > + name_prefix = "handsfree"; > + input_description = output_description = _("Hands-free"); I believe the "Handsfree" spelling is more common, but not sure. > + break; > + > + case PA_BT_FORM_FACTOR_MICROPHONE: > + name_prefix = "microphone"; > + input_description = output_description = _("Microphone"); input_description = _("Microphone"); > + break; > + > + case PA_BT_FORM_FACTOR_SPEAKER: > + name_prefix = "speaker"; > + input_description = output_description = _("Speaker"); output_description = _("Speaker"); > + break; > + > + case PA_BT_FORM_FACTOR_HEADPHONE: > + name_prefix = "headphone"; > + input_description = output_description = _("Headphone"); output_description = _("Headphone"); > + break; > + > + case PA_BT_FORM_FACTOR_PORTABLE: > + name_prefix = "portable"; > + input_description = output_description = _("Portable"); > + break; > + > + case PA_BT_FORM_FACTOR_CAR: > + name_prefix = "car"; > + input_description = output_description = _("Car"); > + break; > + > + case PA_BT_FORM_FACTOR_HIFI: > + name_prefix = "hifi"; > + input_description = output_description = _("HiFi"); > + break; > > - pa_assert_se(port = pa_device_port_new(u->core, "bluetooth-output", _("Bluetooth Output"), 0)); > + case PA_BT_FORM_FACTOR_PHONE: > + name_prefix = "phone"; > + input_description = output_description = _("Phone"); > + break; > + } > + if (!name_prefix) name_prefix = "unknown"; if (!input_description) input_description = _("Bluetooth Input"); if (!output_description) output_description = _("Bluetooth Output"); ...and then the PA_BT_FORM_FACTOR_UNKNOWN case can be skipped, as well as the asserts below. Looks good otherwise. > + pa_assert(name_prefix); > + pa_assert(output_description); > + pa_assert(input_description); > + > + u->output_port_name = pa_sprintf_malloc("%s-output", name_prefix); > + u->input_port_name = pa_sprintf_malloc("%s-input", name_prefix); > + > + pa_assert_se(port = pa_device_port_new(u->core, u->output_port_name, output_description, 0)); > pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0); > port->is_output = 1; > port->is_input = 0; > port->available = get_port_availability(u, PA_DIRECTION_OUTPUT); > > - pa_assert_se(port = pa_device_port_new(u->core, "bluetooth-input", _("Bluetooth Input"), 0)); > + pa_assert_se(port = pa_device_port_new(u->core, u->input_port_name, input_description, 0)); > pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0); > port->is_output = 0; > port->is_input = 1; > @@ -2521,6 +2588,9 @@ void pa__done(pa_module *m) { > if (u->modargs) > pa_modargs_free(u->modargs); > > + pa_xfree(u->output_port_name); > + pa_xfree(u->input_port_name); > + > pa_xfree(u->address); > pa_xfree(u->path); > > -- David Henningsson, Canonical Ltd. https://launchpad.net/~diwic