diff --git a/src/classic/avdtp.c b/src/classic/avdtp.c index c8b29568f..8a9e00211 100644 --- a/src/classic/avdtp.c +++ b/src/classic/avdtp.c @@ -1029,6 +1029,10 @@ uint8_t avdtp_reconfigure(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); } +void avdtp_set_preferred_sampling_frequeny(avdtp_stream_endpoint_t * stream_endpoint, uint32_t sampling_frequency){ + stream_endpoint->preferred_sampling_frequency = sampling_frequency; +} + uint8_t avdtp_choose_sbc_channel_mode(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_channel_mode_bitmap){ uint8_t * media_codec = stream_endpoint->sep.capabilities.media_codec.media_codec_information; uint8_t channel_mode_bitmap = (media_codec[0] & 0x0F) & remote_channel_mode_bitmap; @@ -1098,16 +1102,27 @@ uint8_t avdtp_choose_sbc_block_length(avdtp_stream_endpoint_t * stream_endpoint, uint8_t avdtp_choose_sbc_sampling_frequency(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_sampling_frequency_bitmap){ if (!stream_endpoint) return 0; uint8_t * media_codec = stream_endpoint->sep.capabilities.media_codec.media_codec_information; - uint8_t sampling_frequency_bitmap = (media_codec[0] >> 4) & remote_sampling_frequency_bitmap; + uint8_t supported_sampling_frequency_bitmap = (media_codec[0] >> 4) & remote_sampling_frequency_bitmap; + uint8_t sampling_frequency = AVDTP_SBC_44100; // some default - uint8_t sampling_frequency = AVDTP_SBC_44100; - if (sampling_frequency_bitmap & AVDTP_SBC_48000){ + // use preferred sampling frequency if possible + if ((stream_endpoint->preferred_sampling_frequency == 48000) && (supported_sampling_frequency_bitmap & AVDTP_SBC_48000)){ sampling_frequency = AVDTP_SBC_48000; - } else if (sampling_frequency_bitmap & AVDTP_SBC_44100){ + } else if ((stream_endpoint->preferred_sampling_frequency == 44100) && (supported_sampling_frequency_bitmap & AVDTP_SBC_44100)){ sampling_frequency = AVDTP_SBC_44100; - } else if (sampling_frequency_bitmap & AVDTP_SBC_32000){ + } else if ((stream_endpoint->preferred_sampling_frequency == 32000) && (supported_sampling_frequency_bitmap & AVDTP_SBC_32000)){ sampling_frequency = AVDTP_SBC_32000; - } else if (sampling_frequency_bitmap & AVDTP_SBC_16000){ + } else if ((stream_endpoint->preferred_sampling_frequency == 16000) && (supported_sampling_frequency_bitmap & AVDTP_SBC_16000)){ + sampling_frequency = AVDTP_SBC_16000; + } + // otherwise, use highest available + else if (supported_sampling_frequency_bitmap & AVDTP_SBC_48000){ + sampling_frequency = AVDTP_SBC_48000; + } else if (supported_sampling_frequency_bitmap & AVDTP_SBC_44100){ + sampling_frequency = AVDTP_SBC_44100; + } else if (supported_sampling_frequency_bitmap & AVDTP_SBC_32000){ + sampling_frequency = AVDTP_SBC_32000; + } else if (supported_sampling_frequency_bitmap & AVDTP_SBC_16000){ sampling_frequency = AVDTP_SBC_16000; } return sampling_frequency; diff --git a/src/classic/avdtp.h b/src/classic/avdtp.h index 999df7b18..06961f350 100644 --- a/src/classic/avdtp.h +++ b/src/classic/avdtp.h @@ -477,6 +477,9 @@ typedef struct avdtp_stream_endpoint { avdtp_media_type_t media_type; uint8_t media_codec_sbc_info[4]; + // preferred sampling frequency + uint32_t preferred_sampling_frequency; + // register request for media L2cap connection release uint8_t media_disconnect; uint8_t media_connect; @@ -561,15 +564,21 @@ uint8_t avdtp_get_configuration(uint16_t avdtp_cid, uint8_t remote_seid, avdtp_c uint8_t avdtp_set_configuration(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, uint16_t configured_services_bitmap, avdtp_capabilities_t configuration, avdtp_context_t * context); uint8_t avdtp_reconfigure(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, uint16_t configured_services_bitmap, avdtp_capabilities_t configuration, avdtp_context_t * context); +// frequency will be used by avdtp_choose_sbc_sampling_frequency if supported by both endpoints +void avdtp_set_preferred_sampling_frequeny(avdtp_stream_endpoint_t * stream_endpoint, uint32_t sampling_frequency); +// +void avdtp_set_preferred_sbc_channel_mode(avdtp_stream_endpoint_t * stream_endpoint, uint32_t sampling_frequency); + uint8_t avdtp_choose_sbc_channel_mode(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_channel_mode_bitmap); uint8_t avdtp_choose_sbc_allocation_method(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_allocation_method_bitmap); - +uint8_t avdtp_choose_sbc_sampling_frequency(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_sampling_frequency_bitmap); uint8_t avdtp_choose_sbc_subbands(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_subbands_bitmap); uint8_t avdtp_choose_sbc_block_length(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_block_length_bitmap); -uint8_t avdtp_choose_sbc_sampling_frequency(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_sampling_frequency_bitmap); uint8_t avdtp_choose_sbc_max_bitpool_value(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_max_bitpool_value); uint8_t avdtp_choose_sbc_min_bitpool_value(avdtp_stream_endpoint_t * stream_endpoint, uint8_t remote_min_bitpool_value); + + uint8_t avdtp_stream_endpoint_seid(avdtp_stream_endpoint_t * stream_endpoint); void avdtp_configuration_timeout_handler(btstack_timer_source_t * timer); void avdtp_configuration_timer_start(avdtp_connection_t * connection);