avdtp_util.c (0737c3bfb7cd70d6c9d13767a079771f31769dde) avdtp_util.c (24d5fe847f80d6f46ff13a477a6de59ffa59664f)
1/*
2 * Copyright (C) 2016 BlueKitchen GmbH
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright

--- 711 unchanged lines hidden (view full) ---

720 little_endian_store_24(event, pos, bit_rate_index_bitmap);
721 pos += 3;
722 little_endian_store_16(event, pos, maximum_sul);
723 pos += 2;
724 event[1] = pos - 2;
725 avdtp_emit_sink_and_source(event, pos);
726}
727
1/*
2 * Copyright (C) 2016 BlueKitchen GmbH
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright

--- 711 unchanged lines hidden (view full) ---

720 little_endian_store_24(event, pos, bit_rate_index_bitmap);
721 pos += 3;
722 little_endian_store_16(event, pos, maximum_sul);
723 pos += 2;
724 event[1] = pos - 2;
725 avdtp_emit_sink_and_source(event, pos);
726}
727
728static void avdtp_signaling_emit_media_codec_mpeg_d_usac_capability(uint16_t avdtp_cid, uint8_t remote_seid, adtvp_media_codec_capabilities_t media_codec) {
729 const uint8_t * media_codec_information = media_codec.media_codec_information;
730 uint8_t event[18];
731 int pos = 0;
732 event[pos++] = HCI_EVENT_AVDTP_META;
733 pos++; // set later
734 event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_MPEG_D_USAC_CAPABILITY;
735 little_endian_store_16(event, pos, avdtp_cid);
736 pos += 2;
737 event[pos++] = remote_seid;
738 event[pos++] = media_codec.media_type;
739
740 uint32_t sampling_frequency_bitmap = ((media_codec_information[0] & 0x3F) << 20) |
741 (media_codec_information[1] << 12) |
742 (media_codec_information[2] << 4) |
743 (media_codec_information[3] >> 4);
744
745 uint8_t channels_bitmap = (media_codec_information[3] >> 2) & 0x03;
746 uint8_t vbr = (media_codec_information[4] >> 7) & 0x01;
747
748 uint16_t bit_rate_index_bitmap = ((media_codec_information[4]) & 0xEF) << 16 | (media_codec_information[5] << 8) | media_codec_information[6];
749
750 event[pos++] = media_codec_information[0] >> 6;
751 little_endian_store_32(event, pos, sampling_frequency_bitmap);
752 pos += 4;
753 event[pos++] = channels_bitmap;
754 event[pos++] = sampling_frequency_bitmap;
755 event[pos++] = vbr;
756 little_endian_store_24(event, pos, bit_rate_index_bitmap);
757 pos += 3;
758 event[1] = pos - 2;
759 avdtp_emit_sink_and_source(event, pos);
760}
761
762
728static void avdtp_signaling_emit_media_codec_other_capability(uint16_t avdtp_cid, uint8_t remote_seid, adtvp_media_codec_capabilities_t media_codec) {
729 uint8_t event[AVDTP_MAX_MEDIA_CODEC_INFORMATION_LENGTH + 11];
730 int pos = 0;
731 event[pos++] = HCI_EVENT_AVDTP_META;
732 pos++; // set later
733 event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CAPABILITY;
734 little_endian_store_16(event, pos, avdtp_cid);
735 pos += 2;

--- 132 unchanged lines hidden (view full) ---

868 avdtp_signaling_emit_media_codec_mpeg_audio_capability(avdtp_cid, remote_seid, media_codec);
869 break;
870 case AVDTP_CODEC_MPEG_2_4_AAC:
871 avdtp_signaling_emit_media_codec_mpeg_aac_capability(avdtp_cid, remote_seid, media_codec);
872 break;
873 case AVDTP_CODEC_ATRAC_FAMILY:
874 avdtp_signaling_emit_media_codec_atrac_capability(avdtp_cid, remote_seid, media_codec);
875 break;
763static void avdtp_signaling_emit_media_codec_other_capability(uint16_t avdtp_cid, uint8_t remote_seid, adtvp_media_codec_capabilities_t media_codec) {
764 uint8_t event[AVDTP_MAX_MEDIA_CODEC_INFORMATION_LENGTH + 11];
765 int pos = 0;
766 event[pos++] = HCI_EVENT_AVDTP_META;
767 pos++; // set later
768 event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_OTHER_CAPABILITY;
769 little_endian_store_16(event, pos, avdtp_cid);
770 pos += 2;

--- 132 unchanged lines hidden (view full) ---

903 avdtp_signaling_emit_media_codec_mpeg_audio_capability(avdtp_cid, remote_seid, media_codec);
904 break;
905 case AVDTP_CODEC_MPEG_2_4_AAC:
906 avdtp_signaling_emit_media_codec_mpeg_aac_capability(avdtp_cid, remote_seid, media_codec);
907 break;
908 case AVDTP_CODEC_ATRAC_FAMILY:
909 avdtp_signaling_emit_media_codec_atrac_capability(avdtp_cid, remote_seid, media_codec);
910 break;
911 case AVDTP_CODEC_MPEG_D_USAC:
912 avdtp_signaling_emit_media_codec_mpeg_d_usac_capability(avdtp_cid, remote_seid, media_codec);
913 break;
876 default:
877 avdtp_signaling_emit_media_codec_other_capability(avdtp_cid, remote_seid, media_codec);
878 break;
879 }
880}
881
882// emit events for all capabilities incl. final done event
883void avdtp_signaling_emit_capabilities(uint16_t avdtp_cid, uint8_t remote_seid, avdtp_capabilities_t *capabilities,

--- 214 unchanged lines hidden (view full) ---

1098}
1099
1100static uint16_t
1101avdtp_signaling_setup_media_codec_mpec_aac_config_event(uint8_t *event, uint16_t size,
1102 const avdtp_stream_endpoint_t *stream_endpoint,
1103 uint16_t avdtp_cid, uint8_t reconfigure,
1104 const uint8_t *media_codec_information) {
1105
914 default:
915 avdtp_signaling_emit_media_codec_other_capability(avdtp_cid, remote_seid, media_codec);
916 break;
917 }
918}
919
920// emit events for all capabilities incl. final done event
921void avdtp_signaling_emit_capabilities(uint16_t avdtp_cid, uint8_t remote_seid, avdtp_capabilities_t *capabilities,

--- 214 unchanged lines hidden (view full) ---

1136}
1137
1138static uint16_t
1139avdtp_signaling_setup_media_codec_mpec_aac_config_event(uint8_t *event, uint16_t size,
1140 const avdtp_stream_endpoint_t *stream_endpoint,
1141 uint16_t avdtp_cid, uint8_t reconfigure,
1142 const uint8_t *media_codec_information) {
1143
1106 btstack_assert(size >= AVDTP_MEDIA_CONFIG_MPEG_AUDIO_EVENT_LEN);
1144 btstack_assert(size >= AVDTP_MEDIA_CONFIG_MPEG_AAC_EVENT_LEN);
1107
1108 uint8_t local_seid = avdtp_local_seid(stream_endpoint);
1109 uint8_t remote_seid = avdtp_remote_seid(stream_endpoint);
1110
1111 uint16_t pos = 0;
1112 event[pos++] = HCI_EVENT_AVDTP_META;
1113 event[pos++] = AVDTP_MEDIA_CONFIG_MPEG_AAC_EVENT_LEN - 2;
1114

--- 48 unchanged lines hidden (view full) ---

1163 pos += 3;
1164 event[pos++] = vbr;
1165
1166 btstack_assert(AVDTP_MEDIA_CONFIG_MPEG_AAC_EVENT_LEN == pos);
1167
1168 return pos;
1169}
1170
1145
1146 uint8_t local_seid = avdtp_local_seid(stream_endpoint);
1147 uint8_t remote_seid = avdtp_remote_seid(stream_endpoint);
1148
1149 uint16_t pos = 0;
1150 event[pos++] = HCI_EVENT_AVDTP_META;
1151 event[pos++] = AVDTP_MEDIA_CONFIG_MPEG_AAC_EVENT_LEN - 2;
1152

--- 48 unchanged lines hidden (view full) ---

1201 pos += 3;
1202 event[pos++] = vbr;
1203
1204 btstack_assert(AVDTP_MEDIA_CONFIG_MPEG_AAC_EVENT_LEN == pos);
1205
1206 return pos;
1207}
1208
1209static uint16_t
1210avdtp_signaling_setup_media_codec_mpegd_config_event(uint8_t *event, uint16_t size,
1211 const avdtp_stream_endpoint_t *stream_endpoint,
1212 uint16_t avdtp_cid, uint8_t reconfigure,
1213 const uint8_t *media_codec_information) {
1214
1215 btstack_assert(size >= AVDTP_MEDIA_CONFIG_MPEG_D_USAC_EVENT_LEN);
1216
1217 uint8_t local_seid = avdtp_local_seid(stream_endpoint);
1218 uint8_t remote_seid = avdtp_remote_seid(stream_endpoint);
1219
1220 uint16_t pos = 0;
1221 event[pos++] = HCI_EVENT_AVDTP_META;
1222 event[pos++] = AVDTP_MEDIA_CONFIG_MPEG_D_USAC_EVENT_LEN - 2;
1223
1224 event[pos++] = AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_MPEG_D_USAC_CONFIGURATION;
1225
1226 little_endian_store_16(event, pos, avdtp_cid);
1227 pos += 2;
1228 event[pos++] = local_seid;
1229 event[pos++] = remote_seid;
1230 event[pos++] = reconfigure;
1231 event[pos++] = AVDTP_CODEC_MPEG_D_USAC;
1232
1233 uint8_t object_type_bitmap = media_codec_information[0] >> 6;
1234 uint32_t sampling_frequency_bitmap = ((media_codec_information[0] & 0x3F) << 20) |
1235 (media_codec_information[1] << 12) |
1236 (media_codec_information[2] << 4) |
1237 (media_codec_information[3] >> 4);
1238
1239 uint8_t channels_bitmap = (media_codec_information[3] >> 2) & 0x03;
1240 uint8_t vbr = (media_codec_information[4] >> 7) & 0x01;
1241
1242 uint32_t bit_rate = ((media_codec_information[3] & 0x7f) << 16) | (media_codec_information[4] << 8) | media_codec_information[5];
1243
1244 uint8_t object_type = 0;
1245 if (object_type_bitmap & 0x10){
1246 object_type = AVDTP_USAC_OBJECT_TYPE_MPEG_D_DRC;
1247 } else {
1248 object_type = AVDTP_USAC_OBJECT_TYPE_RFU;
1249 }
1250
1251 uint32_t sampling_frequency = 0;
1252 uint8_t i;
1253 const uint32_t usac_sampling_frequency_table[] = {
1254 96000, 88200, 76800, 70560,
1255 64000, 58800, 48000, 44100, 38400, 35280, 32000, 29400,
1256 24000, 22050, 19200, 17640, 16000, 14700, 12800, 12000,
1257 11760, 11025, 9600, 8820, 8000, 7350
1258 };
1259 for (i=0;i<26;i++){
1260 if (sampling_frequency_bitmap & (1U << i)) {
1261 sampling_frequency = usac_sampling_frequency_table[i];
1262 }
1263 }
1264
1265 uint8_t num_channels = 0;
1266 if (channels_bitmap & 0x02){
1267 num_channels = 1;
1268 } else if (channels_bitmap & 0x01){
1269 num_channels = 2;
1270 }
1271
1272 event[pos++] = object_type;
1273 little_endian_store_24(event, pos, sampling_frequency);
1274 pos += 3;
1275 event[pos++] = num_channels;
1276 event[pos++] = vbr;
1277 little_endian_store_24(event, pos, bit_rate);
1278 pos += 3;
1279
1280 btstack_assert(AVDTP_MEDIA_CONFIG_MPEG_D_USAC_EVENT_LEN == pos);
1281
1282 return pos;
1283}
1284
1171static uint16_t avdtp_signaling_setup_media_codec_atrac_config_event(uint8_t *event, uint16_t size,
1172 const avdtp_stream_endpoint_t *stream_endpoint,
1173 uint16_t avdtp_cid, uint8_t reconfigure,
1174 const uint8_t *media_codec_information) {
1175 btstack_assert(size >= AVDTP_MEDIA_CONFIG_ATRAC_EVENT_LEN);
1176
1177 uint8_t local_seid = avdtp_local_seid(stream_endpoint);
1178 uint8_t remote_seid = avdtp_remote_seid(stream_endpoint);

--- 118 unchanged lines hidden (view full) ---

1297 return avdtp_signaling_setup_media_codec_mpeg_audio_config_event(event, size, stream_endpoint, avdtp_cid, reconfigure,
1298 media_codec->media_codec_information);
1299 case AVDTP_CODEC_MPEG_2_4_AAC:
1300 return avdtp_signaling_setup_media_codec_mpec_aac_config_event(event, size, stream_endpoint, avdtp_cid, reconfigure,
1301 media_codec->media_codec_information);
1302 case AVDTP_CODEC_ATRAC_FAMILY:
1303 return avdtp_signaling_setup_media_codec_atrac_config_event(event, size, stream_endpoint, avdtp_cid, reconfigure,
1304 media_codec->media_codec_information);
1285static uint16_t avdtp_signaling_setup_media_codec_atrac_config_event(uint8_t *event, uint16_t size,
1286 const avdtp_stream_endpoint_t *stream_endpoint,
1287 uint16_t avdtp_cid, uint8_t reconfigure,
1288 const uint8_t *media_codec_information) {
1289 btstack_assert(size >= AVDTP_MEDIA_CONFIG_ATRAC_EVENT_LEN);
1290
1291 uint8_t local_seid = avdtp_local_seid(stream_endpoint);
1292 uint8_t remote_seid = avdtp_remote_seid(stream_endpoint);

--- 118 unchanged lines hidden (view full) ---

1411 return avdtp_signaling_setup_media_codec_mpeg_audio_config_event(event, size, stream_endpoint, avdtp_cid, reconfigure,
1412 media_codec->media_codec_information);
1413 case AVDTP_CODEC_MPEG_2_4_AAC:
1414 return avdtp_signaling_setup_media_codec_mpec_aac_config_event(event, size, stream_endpoint, avdtp_cid, reconfigure,
1415 media_codec->media_codec_information);
1416 case AVDTP_CODEC_ATRAC_FAMILY:
1417 return avdtp_signaling_setup_media_codec_atrac_config_event(event, size, stream_endpoint, avdtp_cid, reconfigure,
1418 media_codec->media_codec_information);
1419 case AVDTP_CODEC_MPEG_D_USAC:
1420 return avdtp_signaling_setup_media_codec_mpegd_config_event(event, size, stream_endpoint, avdtp_cid, reconfigure,
1421 media_codec->media_codec_information);
1305 default:
1306 return avdtp_signaling_setup_media_codec_other_config_event(event, size, stream_endpoint, avdtp_cid, reconfigure,
1307 media_codec);
1308 }
1309}
1310
1311void avdtp_signaling_emit_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid, uint8_t reconfigure,
1312 avdtp_capabilities_t *configuration, uint16_t configured_service_categories) {

--- 242 unchanged lines hidden (view full) ---

1555 config[1] = ((configuration->vbr & 0x01) << 3) | ((bit_rate_bitmap >> 16) & 0x07);
1556 config[2] = (bit_rate_bitmap >> 8) & 0xff;
1557 config[3] = bit_rate_bitmap & 0xff;
1558 config[4] = configuration->maximum_sul >> 8;
1559 config[5] = configuration->maximum_sul & 0xff;
1560 config[6] = 0;
1561 avdtp_config_atrac_set_sampling_frequency(config, configuration->sampling_frequency);
1562}
1422 default:
1423 return avdtp_signaling_setup_media_codec_other_config_event(event, size, stream_endpoint, avdtp_cid, reconfigure,
1424 media_codec);
1425 }
1426}
1427
1428void avdtp_signaling_emit_configuration(avdtp_stream_endpoint_t *stream_endpoint, uint16_t avdtp_cid, uint8_t reconfigure,
1429 avdtp_capabilities_t *configuration, uint16_t configured_service_categories) {

--- 242 unchanged lines hidden (view full) ---

1672 config[1] = ((configuration->vbr & 0x01) << 3) | ((bit_rate_bitmap >> 16) & 0x07);
1673 config[2] = (bit_rate_bitmap >> 8) & 0xff;
1674 config[3] = bit_rate_bitmap & 0xff;
1675 config[4] = configuration->maximum_sul >> 8;
1676 config[5] = configuration->maximum_sul & 0xff;
1677 config[6] = 0;
1678 avdtp_config_atrac_set_sampling_frequency(config, configuration->sampling_frequency);
1679}
1680
1681void avdtp_config_mpegd_usac_set_sampling_frequency(uint8_t * config, uint16_t sampling_frequency_hz) {
1682 uint16_t sampling_frequency_bitmap = 0;
1683 uint8_t i;
1684 const uint32_t usac_sampling_frequency_table[] = {
1685 96000, 88200, 76800, 70560,
1686 64000, 58800, 48000, 44100, 38400, 35280, 32000, 29400,
1687 24000, 22050, 19200, 17640, 16000, 14700, 12800, 12000,
1688 11760, 11025, 9600, 8820, 8000, 7350
1689 };
1690 for (i=0;i<26;i++){
1691 if (sampling_frequency_hz == usac_sampling_frequency_table[i]){
1692 sampling_frequency_bitmap = 1 << i;
1693 break;
1694 }
1695 }
1696 config[0] = (config[0] & 0xC0) | sampling_frequency_bitmap >> 20;
1697 config[1] = sampling_frequency_bitmap >> 12;
1698 config[2] = sampling_frequency_bitmap >> 4;
1699 config[3] = (sampling_frequency_bitmap & 0x0f) << 4;
1700}
1701
1702void avdtp_config_mpegd_usac_store(uint8_t * config, const avdtp_configuration_mpegd_usac_t * configuration) {
1703 config[0] = 1 << (7 -(configuration->object_type - AVDTP_USAC_OBJECT_TYPE_MPEG_D_DRC)) & 0xC0;
1704 avdtp_config_mpegd_usac_set_sampling_frequency(config, configuration->sampling_frequency);
1705
1706 uint8_t channels_bitmap = 0;
1707 switch (configuration->channels){
1708 case 1:
1709 channels_bitmap = 0x08;
1710 break;
1711 case 2:
1712 channels_bitmap = 0x04;
1713 break;
1714 default:
1715 break;
1716 }
1717 config[3] = config[3] | channels_bitmap;
1718 config[4] = ((configuration->vbr & 0x01) << 7) | ((configuration->bit_rate >> 16) & 0x7f);
1719 config[5] = (configuration->bit_rate >> 8) & 0xff;
1720 config[6] = configuration->bit_rate & 0xff;
1721}