avdtp: allow to set preferred sampling frequency for outgoing sbc streams

This commit is contained in:
Matthias Ringwald 2018-08-28 14:23:50 +02:00
parent 45dc8c25f9
commit 8e7044f9a8
2 changed files with 32 additions and 8 deletions

View File

@ -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;

View File

@ -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);