diff options
Diffstat (limited to 'src/modules/bluetooth/module-bluetooth-device.c')
-rw-r--r-- | src/modules/bluetooth/module-bluetooth-device.c | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c index c70a79d2..fa9d6bf3 100644 --- a/src/modules/bluetooth/module-bluetooth-device.c +++ b/src/modules/bluetooth/module-bluetooth-device.c @@ -104,6 +104,7 @@ struct a2dp_info { }; struct hsp_info { + pcm_capabilities_t pcm_capabilities; pa_sink *sco_sink; pa_source *sco_source; pa_hook_slot *sink_state_changed_slot; @@ -271,23 +272,33 @@ static int parse_caps(struct userdata *u, const struct bt_get_capabilities_rsp * return -1; } - if (u->profile != PROFILE_A2DP) - return 0; + if (u->profile == PROFILE_HSP) { + if (bytes_left <= 0 || codec->length != sizeof(u->hsp.pcm_capabilities)) + return -1; - while (bytes_left > 0) { - if (codec->type == BT_A2DP_CODEC_SBC) - break; + pa_assert(codec->type == BT_HFP_CODEC_PCM); - bytes_left -= codec->length; - codec = (const codec_capabilities_t*) ((const uint8_t*) codec + codec->length); + memcpy(&u->hsp.pcm_capabilities, codec, sizeof(u->hsp.pcm_capabilities)); } - if (bytes_left <= 0 || codec->length != sizeof(u->a2dp.sbc_capabilities)) - return -1; + if (u->profile == PROFILE_A2DP) { + + while (bytes_left > 0) { + if (codec->type == BT_A2DP_CODEC_SBC) + break; + + bytes_left -= codec->length; + codec = (const codec_capabilities_t*) ((const uint8_t*) codec + codec->length); + } + + if (bytes_left <= 0 || codec->length != sizeof(u->a2dp.sbc_capabilities)) + return -1; + + pa_assert(codec->type == BT_A2DP_CODEC_SBC); - pa_assert(codec->type == BT_A2DP_CODEC_SBC); + memcpy(&u->a2dp.sbc_capabilities, codec, sizeof(u->a2dp.sbc_capabilities)); + } - memcpy(&u->a2dp.sbc_capabilities, codec, sizeof(u->a2dp.sbc_capabilities)); return 0; } @@ -1334,10 +1345,9 @@ static int add_sink(struct userdata *u) { } static int add_source(struct userdata *u) { + pa_proplist *p; if (USE_SCO_OVER_PCM(u)) { - pa_proplist *p; - u->source = u->hsp.sco_source; u->source->card = u->card; /* FIXME! */ p = pa_proplist_new(); @@ -1379,6 +1389,11 @@ static int add_source(struct userdata *u) { /* u->source->get_volume = source_get_volume_cb; */ /* u->source->set_volume = source_set_volume_cb; */ + p = pa_proplist_new(); + pa_proplist_sets(p, "bluetooth.nrec", pa_yes_no(u->hsp.pcm_capabilities.flags & BT_PCM_FLAG_NREC)); + pa_proplist_update(u->source->proplist, PA_UPDATE_MERGE, p); + pa_proplist_free(p); + return 0; } |