diff --git a/src/classic/a2dp_source.c b/src/classic/a2dp_source.c index 19e2254f9..9fe0f41f0 100644 --- a/src/classic/a2dp_source.c +++ b/src/classic/a2dp_source.c @@ -810,8 +810,7 @@ uint8_t a2dp_source_stream_send_media_packet(uint16_t a2dp_cid, uint8_t local_se return avdtp_source_stream_send_media_packet(a2dp_cid, local_seid, packet, size); } -static void avdtp_config_sbc_store(uint8_t * config, uint16_t sampling_frequency_hz, avdtp_channel_mode_t channel_mode, uint8_t block_length, uint8_t subbands, - avdtp_sbc_allocation_method_t allocation_method, uint8_t min_bitpool_value, uint8_t max_bitpool_value) { +static void avdtp_config_sbc_set_sampling_frequency(uint8_t * config, uint16_t sampling_frequency_hz){ avdtp_sbc_sampling_frequency_t sampling_frequency; switch (sampling_frequency_hz){ case 16000: @@ -827,6 +826,11 @@ static void avdtp_config_sbc_store(uint8_t * config, uint16_t sampling_frequency sampling_frequency = AVDTP_SBC_44100; break; } + config[0] = (((uint8_t) sampling_frequency) << 4) | (config[0] & 0x0f); +} + +static void avdtp_config_sbc_store(uint8_t * config, uint16_t sampling_frequency_hz, avdtp_channel_mode_t channel_mode, uint8_t block_length, uint8_t subbands, + avdtp_sbc_allocation_method_t allocation_method, uint8_t min_bitpool_value, uint8_t max_bitpool_value) { avdtp_sbc_channel_mode_t sbc_channel_mode; switch (channel_mode){ case AVDTP_CHANNEL_MODE_MONO: @@ -842,18 +846,16 @@ static void avdtp_config_sbc_store(uint8_t * config, uint16_t sampling_frequency sbc_channel_mode = AVDTP_SBC_JOINT_STEREO; break; } - config[0] = (((uint8_t) sampling_frequency) << 4) | ((uint8_t) sbc_channel_mode); + config[0] = (uint8_t) sbc_channel_mode; config[1] = (block_length << 4) | (subbands << 2) | allocation_method; config[2] = min_bitpool_value; config[3] = max_bitpool_value; + avdtp_config_sbc_set_sampling_frequency(config, sampling_frequency_hz); } -static void avdtp_config_mpeg_audio_store(uint8_t * config, avdtp_mpeg_layer_t layer, uint8_t crc, avdtp_channel_mode_t channel_mode, uint8_t media_payload_format, - uint16_t sampling_frequency, uint8_t vbr, uint8_t bit_rate_index){ - - config[0] = (((uint8_t) layer) << 5) | ((crc & 0x01) << 4) | (1 << (channel_mode - AVDTP_CHANNEL_MODE_MONO)); +static void avdtp_config_mpeg_audio_set_sampling_frequency(uint8_t * config, uint16_t sampling_frequency_hz) { uint8_t sampling_frequency_index = 0; - switch (sampling_frequency){ + switch (sampling_frequency_hz){ case 16000: sampling_frequency_index = 5; break; @@ -870,28 +872,42 @@ static void avdtp_config_mpeg_audio_store(uint8_t * config, avdtp_mpeg_layer_t l sampling_frequency_index = 1; break; case 48000: + sampling_frequency_index = 0; break; } - config[1] = ((media_payload_format & 0x01) << 6) | (1 << sampling_frequency_index); + config[1] = (config[1] & 0xC0) | (1 << sampling_frequency_index); +} + +static void avdtp_config_mpeg_audio_store(uint8_t * config, avdtp_mpeg_layer_t layer, uint8_t crc, avdtp_channel_mode_t channel_mode, uint8_t media_payload_format, + uint16_t sampling_frequency, uint8_t vbr, uint8_t bit_rate_index){ + + config[0] = (((uint8_t) layer) << 5) | ((crc & 0x01) << 4) | (1 << (channel_mode - AVDTP_CHANNEL_MODE_MONO)); + config[1] = ((media_payload_format & 0x01) << 6) ; uint16_t bit_rate_mask = 1 << bit_rate_index; config[2] = ((vbr & 0x01) << 7) | ((bit_rate_mask >> 8) & 0x3f); config[3] = bit_rate_mask & 0xff; + avdtp_config_mpeg_audio_set_sampling_frequency(config, sampling_frequency); } -static void avdtp_config_mpeg_aac_store(uint8_t * config, avdtp_aac_object_type_t object_type, uint32_t sampling_frequency, uint8_t channels, uint32_t bit_rate, uint8_t vbr) { - config[0] = 1 << ((object_type - AVDTP_AAC_MPEG4_SCALABLE) + 4); + +static void avdtp_config_mpeg_aac_set_sampling_frequency(uint8_t * config, uint16_t sampling_frequency_hz) { uint16_t sampling_frequency_bitmap = 0; uint8_t i; const uint32_t aac_sampling_frequency_table[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000 }; for (i=0;i<12;i++){ - if (sampling_frequency == aac_sampling_frequency_table[i]){ + if (sampling_frequency_hz == aac_sampling_frequency_table[i]){ sampling_frequency_bitmap = 1 << i; break; } } config[1] = sampling_frequency_bitmap >> 4; + config[2] = ((sampling_frequency_bitmap & 0x0f) << 4) | (config[2] & 0x0f); +} + +static void avdtp_config_mpeg_aac_store(uint8_t * config, avdtp_aac_object_type_t object_type, uint32_t sampling_frequency, uint8_t channels, uint32_t bit_rate, uint8_t vbr) { + config[0] = 1 << (7 -(object_type - AVDTP_AAC_MPEG2_LC)); uint8_t channels_bitmap = 0; switch (channels){ case 1: @@ -903,10 +919,26 @@ static void avdtp_config_mpeg_aac_store(uint8_t * config, avdtp_aac_object_type default: break; } - config[2] = ((sampling_frequency_bitmap & 0x0f) << 4) | (channels_bitmap << 2); + config[2] = channels_bitmap << 2; config[3] = ((vbr & 0x01) << 7) | ((bit_rate >> 16) & 0x7f); config[4] = (bit_rate >> 8) & 0xff; config[5] = bit_rate & 0xff; + avdtp_config_mpeg_aac_set_sampling_frequency(config, sampling_frequency); +} + +static void avdtp_config_atrac_set_sampling_frequency(uint8_t * config, uint16_t sampling_frequency_hz) { + uint8_t fs_bitmap = 0; + switch (sampling_frequency_hz){ + case 44100: + fs_bitmap = 2; + break; + case 48000: + fs_bitmap = 1; + break; + default: + break; + } + config[1] = (fs_bitmap << 4) | (config[1] & 0x0F); } static void avdtp_config_atrac_store(uint8_t * config, avdtp_atrac_version_t version, avdtp_channel_mode_t channel_mode, uint16_t sampling_frequency, uint8_t vbr, @@ -926,24 +958,14 @@ static void avdtp_config_atrac_store(uint8_t * config, avdtp_atrac_version_t ver break; } config[0] = ((version - AVDTP_ATRAC_VERSION_1 + 1) << 5) | (channel_mode_bitamp << 2); - uint8_t fs_bitmap = 0; - switch (sampling_frequency){ - case 44100: - fs_bitmap = 2; - break; - case 48000: - fs_bitmap = 1; - break; - default: - break; - } uint32_t bit_rate_bitmap = 1 << (0x18 - bit_rate_index); - config[1] = (fs_bitmap << 4) | ((vbr & 0x01) << 3) | ((bit_rate_bitmap >> 16) & 0x07); + config[1] = ((vbr & 0x01) << 3) | ((bit_rate_bitmap >> 16) & 0x07); config[2] = (bit_rate_bitmap >> 8) & 0xff; config[3] = bit_rate_bitmap & 0xff; config[4] = maximum_sul >> 8; config[5] = maximum_sul & 0xff; config[6] = 0; + avdtp_config_atrac_set_sampling_frequency(config, sampling_frequency); } static void a2dp_source_config_init(uint8_t remote_seid, avdtp_media_codec_type_t codec_type, const uint8_t * codec_info, uint8_t codec_info_len){