a2dp.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911
  1. // SPDX-License-Identifier: LGPL-2.1-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2015 Andrzej Kaczmarek <andrzej.kaczmarek@codecoup.pl>
  7. * Copyright (C) 2018 Pali Rohár <pali.rohar@gmail.com>
  8. *
  9. *
  10. */
  11. #ifdef HAVE_CONFIG_H
  12. #include <config.h>
  13. #endif
  14. #define _GNU_SOURCE
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include "lib/bluetooth.h"
  19. #include "src/shared/util.h"
  20. #include "bt.h"
  21. #include "packet.h"
  22. #include "display.h"
  23. #include "l2cap.h"
  24. #include "a2dp.h"
  25. #define BASE_INDENT 4
  26. /* Codec Types */
  27. #define A2DP_CODEC_SBC 0x00
  28. #define A2DP_CODEC_MPEG12 0x01
  29. #define A2DP_CODEC_MPEG24 0x02
  30. #define A2DP_CODEC_ATRAC 0x04
  31. #define A2DP_CODEC_VENDOR 0xff
  32. /* Vendor Specific A2DP Codecs */
  33. #define APTX_VENDOR_ID 0x0000004f
  34. #define APTX_CODEC_ID 0x0001
  35. #define FASTSTREAM_VENDOR_ID 0x0000000a
  36. #define FASTSTREAM_CODEC_ID 0x0001
  37. #define APTX_LL_VENDOR_ID 0x0000000a
  38. #define APTX_LL_CODEC_ID 0x0002
  39. #define APTX_HD_VENDOR_ID 0x000000D7
  40. #define APTX_HD_CODEC_ID 0x0024
  41. #define LDAC_VENDOR_ID 0x0000012d
  42. #define LDAC_CODEC_ID 0x00aa
  43. struct bit_desc {
  44. uint8_t bit_num;
  45. const char *str;
  46. };
  47. static const struct bit_desc sbc_frequency_table[] = {
  48. { 7, "16000" },
  49. { 6, "32000" },
  50. { 5, "44100" },
  51. { 4, "48000" },
  52. { }
  53. };
  54. static const struct bit_desc sbc_channel_mode_table[] = {
  55. { 3, "Mono" },
  56. { 2, "Dual Channel" },
  57. { 1, "Stereo" },
  58. { 0, "Joint Stereo" },
  59. { }
  60. };
  61. static const struct bit_desc sbc_blocklen_table[] = {
  62. { 7, "4" },
  63. { 6, "8" },
  64. { 5, "12" },
  65. { 4, "16" },
  66. { }
  67. };
  68. static const struct bit_desc sbc_subbands_table[] = {
  69. { 3, "4" },
  70. { 2, "8" },
  71. { }
  72. };
  73. static const struct bit_desc sbc_allocation_table[] = {
  74. { 1, "SNR" },
  75. { 0, "Loudness" },
  76. { }
  77. };
  78. static const struct bit_desc mpeg12_layer_table[] = {
  79. { 7, "Layer I (mp1)" },
  80. { 6, "Layer II (mp2)" },
  81. { 5, "Layer III (mp3)" },
  82. { }
  83. };
  84. static const struct bit_desc mpeg12_channel_mode_table[] = {
  85. { 3, "Mono" },
  86. { 2, "Dual Channel" },
  87. { 1, "Stereo" },
  88. { 0, "Joint Stereo" },
  89. { }
  90. };
  91. static const struct bit_desc mpeg12_frequency_table[] = {
  92. { 5, "16000" },
  93. { 4, "22050" },
  94. { 3, "24000" },
  95. { 2, "32000" },
  96. { 1, "44100" },
  97. { 0, "48000" },
  98. { }
  99. };
  100. static const struct bit_desc mpeg12_bitrate_table[] = {
  101. { 14, "1110" },
  102. { 13, "1101" },
  103. { 12, "1100" },
  104. { 11, "1011" },
  105. { 10, "1010" },
  106. { 9, "1001" },
  107. { 8, "1000" },
  108. { 7, "0111" },
  109. { 6, "0110" },
  110. { 5, "0101" },
  111. { 4, "0100" },
  112. { 3, "0011" },
  113. { 2, "0010" },
  114. { 1, "0001" },
  115. { 0, "0000" },
  116. { }
  117. };
  118. static const struct bit_desc aac_object_type_table[] = {
  119. { 7, "MPEG-2 AAC LC" },
  120. { 6, "MPEG-4 AAC LC" },
  121. { 5, "MPEG-4 AAC LTP" },
  122. { 4, "MPEG-4 AAC scalable" },
  123. { 3, "RFA (b3)" },
  124. { 2, "RFA (b2)" },
  125. { 1, "RFA (b1)" },
  126. { 0, "RFA (b0)" },
  127. { }
  128. };
  129. static const struct bit_desc aac_frequency_table[] = {
  130. { 15, "8000" },
  131. { 14, "11025" },
  132. { 13, "12000" },
  133. { 12, "16000" },
  134. { 11, "22050" },
  135. { 10, "24000" },
  136. { 9, "32000" },
  137. { 8, "44100" },
  138. { 7, "48000" },
  139. { 6, "64000" },
  140. { 5, "88200" },
  141. { 4, "96000" },
  142. { }
  143. };
  144. static const struct bit_desc aac_channels_table[] = {
  145. { 3, "1" },
  146. { 2, "2" },
  147. { }
  148. };
  149. static const struct bit_desc aptx_frequency_table[] = {
  150. { 7, "16000" },
  151. { 6, "32000" },
  152. { 5, "44100" },
  153. { 4, "48000" },
  154. { }
  155. };
  156. static const struct bit_desc aptx_channel_mode_table[] = {
  157. { 0, "Mono" },
  158. { 1, "Stereo" },
  159. { }
  160. };
  161. static const struct bit_desc faststream_direction_table[] = {
  162. { 0, "Sink" },
  163. { 1, "Source" },
  164. { }
  165. };
  166. static const struct bit_desc faststream_sink_frequency_table[] = {
  167. /* in config buffer, there may be more frequency bits
  168. * and 48kHz takes precedence over 41kHz
  169. */
  170. { 0, "48000" },
  171. { 1, "44100" },
  172. { }
  173. };
  174. static const struct bit_desc faststream_source_frequency_table[] = {
  175. { 5, "16000" },
  176. { }
  177. };
  178. static void print_value_bits(uint8_t indent, uint32_t value,
  179. const struct bit_desc *table)
  180. {
  181. int i;
  182. for (i = 0; table[i].str; i++) {
  183. if (value & (1 << table[i].bit_num))
  184. print_field("%*c%s", indent + 2, ' ', table[i].str);
  185. }
  186. }
  187. static const char *find_value_bit(uint32_t value,
  188. const struct bit_desc *table)
  189. {
  190. int i;
  191. for (i = 0; table[i].str; i++) {
  192. if (value & (1 << table[i].bit_num))
  193. return table[i].str;
  194. }
  195. return "Unknown";
  196. }
  197. struct vndcodec {
  198. uint32_t vendor_id;
  199. uint16_t codec_id;
  200. char *codec_name;
  201. bool (*codec_vendor_cap)(uint8_t losc, struct l2cap_frame *frame);
  202. bool (*codec_vendor_cfg)(uint8_t losc, struct l2cap_frame *frame);
  203. };
  204. static bool codec_vendor_aptx_cap(uint8_t losc, struct l2cap_frame *frame);
  205. static bool codec_vendor_aptx_cfg(uint8_t losc, struct l2cap_frame *frame);
  206. static bool codec_vendor_faststream_cap(uint8_t losc,
  207. struct l2cap_frame *frame);
  208. static bool codec_vendor_faststream_cfg(uint8_t losc,
  209. struct l2cap_frame *frame);
  210. static bool codec_vendor_aptx_ll_cap(uint8_t losc, struct l2cap_frame *frame);
  211. static bool codec_vendor_aptx_ll_cfg(uint8_t losc, struct l2cap_frame *frame);
  212. static bool codec_vendor_aptx_hd_cap(uint8_t losc, struct l2cap_frame *frame);
  213. static bool codec_vendor_aptx_hd_cfg(uint8_t losc, struct l2cap_frame *frame);
  214. static bool codec_vendor_ldac(uint8_t losc, struct l2cap_frame *frame);
  215. static const struct vndcodec vndcodecs[] = {
  216. { APTX_VENDOR_ID, APTX_CODEC_ID, "aptX",
  217. codec_vendor_aptx_cap, codec_vendor_aptx_cfg },
  218. { FASTSTREAM_VENDOR_ID, FASTSTREAM_CODEC_ID, "FastStream",
  219. codec_vendor_faststream_cap, codec_vendor_faststream_cfg },
  220. { APTX_LL_VENDOR_ID, APTX_LL_CODEC_ID, "aptX Low Latency",
  221. codec_vendor_aptx_ll_cap, codec_vendor_aptx_ll_cfg },
  222. { APTX_HD_VENDOR_ID, APTX_HD_CODEC_ID, "aptX HD",
  223. codec_vendor_aptx_hd_cap, codec_vendor_aptx_hd_cfg },
  224. { LDAC_VENDOR_ID, LDAC_CODEC_ID, "LDAC",
  225. codec_vendor_ldac, codec_vendor_ldac },
  226. { }
  227. };
  228. static const char *vndcodec2str(uint32_t vendor_id, uint16_t codec_id)
  229. {
  230. size_t i;
  231. for (i = 0; i < sizeof(vndcodecs)/sizeof(*vndcodecs); i++) {
  232. if (vndcodecs[i].vendor_id == vendor_id &&
  233. vndcodecs[i].codec_id == codec_id)
  234. return vndcodecs[i].codec_name;
  235. }
  236. return "Unknown";
  237. }
  238. static bool codec_sbc_cap(uint8_t losc, struct l2cap_frame *frame)
  239. {
  240. uint8_t cap = 0;
  241. if (losc != 4)
  242. return false;
  243. l2cap_frame_get_u8(frame, &cap);
  244. print_field("%*cFrequency: 0x%02x", BASE_INDENT, ' ', cap & 0xf0);
  245. print_value_bits(BASE_INDENT, cap & 0xf0, sbc_frequency_table);
  246. print_field("%*cChannel Mode: 0x%02x", BASE_INDENT, ' ', cap & 0x0f);
  247. print_value_bits(BASE_INDENT, cap & 0x0f, sbc_channel_mode_table);
  248. l2cap_frame_get_u8(frame, &cap);
  249. print_field("%*cBlock Length: 0x%02x", BASE_INDENT, ' ', cap & 0xf0);
  250. print_value_bits(BASE_INDENT, cap & 0xf0, sbc_blocklen_table);
  251. print_field("%*cSubbands: 0x%02x", BASE_INDENT, ' ', cap & 0x0c);
  252. print_value_bits(BASE_INDENT, cap & 0x0c, sbc_subbands_table);
  253. print_field("%*cAllocation Method: 0x%02x", BASE_INDENT, ' ',
  254. cap & 0x03);
  255. print_value_bits(BASE_INDENT, cap & 0x03, sbc_allocation_table);
  256. l2cap_frame_get_u8(frame, &cap);
  257. print_field("%*cMinimum Bitpool: %d", BASE_INDENT, ' ', cap);
  258. l2cap_frame_get_u8(frame, &cap);
  259. print_field("%*cMaximum Bitpool: %d", BASE_INDENT, ' ', cap);
  260. return true;
  261. }
  262. static bool codec_sbc_cfg(uint8_t losc, struct l2cap_frame *frame)
  263. {
  264. uint8_t cap = 0;
  265. if (losc != 4)
  266. return false;
  267. l2cap_frame_get_u8(frame, &cap);
  268. print_field("%*cFrequency: %s (0x%02x)", BASE_INDENT, ' ',
  269. find_value_bit(cap & 0xf0, sbc_frequency_table),
  270. cap & 0xf0);
  271. print_field("%*cChannel Mode: %s (0x%02x)", BASE_INDENT, ' ',
  272. find_value_bit(cap & 0x0f, sbc_channel_mode_table),
  273. cap & 0x0f);
  274. l2cap_frame_get_u8(frame, &cap);
  275. print_field("%*cBlock Length: %s (0x%02x)", BASE_INDENT, ' ',
  276. find_value_bit(cap & 0xf0, sbc_blocklen_table),
  277. cap & 0xf0);
  278. print_field("%*cSubbands: %s (0x%02x)", BASE_INDENT, ' ',
  279. find_value_bit(cap & 0x0c, sbc_subbands_table),
  280. cap & 0x0c);
  281. print_field("%*cAllocation Method: %s (0x%02x)", BASE_INDENT, ' ',
  282. find_value_bit(cap & 0x03, sbc_allocation_table),
  283. cap & 0x03);
  284. l2cap_frame_get_u8(frame, &cap);
  285. print_field("%*cMinimum Bitpool: %d", BASE_INDENT, ' ', cap);
  286. l2cap_frame_get_u8(frame, &cap);
  287. print_field("%*cMaximum Bitpool: %d", BASE_INDENT, ' ', cap);
  288. return true;
  289. }
  290. static bool codec_mpeg12_cap(uint8_t losc, struct l2cap_frame *frame)
  291. {
  292. uint16_t cap = 0;
  293. uint8_t layer;
  294. uint8_t chan;
  295. uint8_t freq;
  296. uint16_t bitrate;
  297. bool crc, mpf, vbr;
  298. if (losc != 4)
  299. return false;
  300. if (!l2cap_frame_get_be16(frame, &cap))
  301. return false;
  302. layer = (cap >> 8) & 0xe0;
  303. crc = cap & 0x1000;
  304. chan = (cap >> 8) & 0x0f;
  305. mpf = cap & 0x0040;
  306. freq = cap & 0x003f;
  307. if (!l2cap_frame_get_be16(frame, &cap))
  308. return false;
  309. vbr = cap & 0x8000;
  310. bitrate = cap & 0x7fff;
  311. print_field("%*cLayer: 0x%02x", BASE_INDENT, ' ', layer);
  312. print_value_bits(BASE_INDENT, layer, mpeg12_layer_table);
  313. print_field("%*cCRC: %s", BASE_INDENT, ' ', crc ? "Yes" : "No");
  314. print_field("%*cChannel Mode: 0x%02x", BASE_INDENT, ' ', chan);
  315. print_value_bits(BASE_INDENT, chan, mpeg12_channel_mode_table);
  316. print_field("%*cMedia Payload Format: %s", BASE_INDENT, ' ',
  317. mpf ? "RFC-2250 RFC-3119" : "RFC-2250");
  318. print_field("%*cFrequency: 0x%02x", BASE_INDENT, ' ', freq);
  319. print_value_bits(BASE_INDENT, freq, mpeg12_frequency_table);
  320. if (!vbr) {
  321. print_field("%*cBitrate Index: 0x%04x", BASE_INDENT, ' ',
  322. bitrate);
  323. print_value_bits(BASE_INDENT, freq, mpeg12_bitrate_table);
  324. }
  325. print_field("%*cVBR: %s", BASE_INDENT, ' ', vbr ? "Yes" : "No");
  326. return true;
  327. }
  328. static bool codec_mpeg12_cfg(uint8_t losc, struct l2cap_frame *frame)
  329. {
  330. uint16_t cap = 0;
  331. uint8_t layer;
  332. uint8_t chan;
  333. uint8_t freq;
  334. uint16_t bitrate;
  335. bool crc, mpf, vbr;
  336. if (losc != 4)
  337. return false;
  338. if (!l2cap_frame_get_be16(frame, &cap))
  339. return false;
  340. layer = (cap >> 8) & 0xe0;
  341. crc = cap & 0x1000;
  342. chan = (cap >> 8) & 0x0f;
  343. mpf = cap & 0x0040;
  344. freq = cap & 0x003f;
  345. if (!l2cap_frame_get_be16(frame, &cap))
  346. return false;
  347. vbr = cap & 0x8000;
  348. bitrate = cap & 0x7fff;
  349. print_field("%*cLayer: %s (0x%02x)", BASE_INDENT, ' ',
  350. find_value_bit(layer, mpeg12_layer_table),
  351. layer);
  352. print_field("%*cCRC: %s", BASE_INDENT, ' ', crc ? "Yes" : "No");
  353. print_field("%*cChannel Mode: %s (0x%02x)", BASE_INDENT, ' ',
  354. find_value_bit(chan, mpeg12_channel_mode_table),
  355. chan);
  356. print_field("%*cMedia Payload Format: %s", BASE_INDENT, ' ',
  357. mpf ? "RFC-2250 RFC-3119" : "RFC-2250");
  358. print_field("%*cFrequency: %s (0x%02x)", BASE_INDENT, ' ',
  359. find_value_bit(freq, mpeg12_frequency_table),
  360. freq);
  361. if (!vbr)
  362. print_field("%*cBitrate Index: %s (0x%04x)", BASE_INDENT, ' ',
  363. find_value_bit(freq, mpeg12_bitrate_table),
  364. bitrate);
  365. print_field("%*cVBR: %s", BASE_INDENT, ' ', vbr ? "Yes" : "No");
  366. return true;
  367. }
  368. static bool codec_aac_cap(uint8_t losc, struct l2cap_frame *frame)
  369. {
  370. uint16_t cap = 0;
  371. uint8_t type;
  372. uint16_t freq;
  373. uint8_t chan;
  374. uint32_t bitrate;
  375. bool vbr;
  376. if (losc != 6)
  377. return false;
  378. if (!l2cap_frame_get_be16(frame, &cap))
  379. return false;
  380. type = cap >> 8;
  381. freq = cap << 8;
  382. if (!l2cap_frame_get_be16(frame, &cap))
  383. return false;
  384. freq |= (cap >> 8) & 0xf0;
  385. chan = (cap >> 8) & 0x0c;
  386. bitrate = (cap << 16) & 0x7f0000;
  387. vbr = cap & 0x0080;
  388. if (!l2cap_frame_get_be16(frame, &cap))
  389. return false;
  390. bitrate |= cap;
  391. print_field("%*cObject Type: 0x%02x", BASE_INDENT, ' ', type);
  392. print_value_bits(BASE_INDENT, type, aac_object_type_table);
  393. print_field("%*cFrequency: 0x%02x", BASE_INDENT, ' ', freq);
  394. print_value_bits(BASE_INDENT, freq, aac_frequency_table);
  395. print_field("%*cChannels: 0x%02x", BASE_INDENT, ' ', chan);
  396. print_value_bits(BASE_INDENT, chan, aac_channels_table);
  397. print_field("%*cBitrate: %ubps", BASE_INDENT, ' ', bitrate);
  398. print_field("%*cVBR: %s", BASE_INDENT, ' ', vbr ? "Yes" : "No");
  399. return true;
  400. }
  401. static bool codec_aac_cfg(uint8_t losc, struct l2cap_frame *frame)
  402. {
  403. uint16_t cap = 0;
  404. uint8_t type;
  405. uint16_t freq;
  406. uint8_t chan;
  407. uint32_t bitrate;
  408. bool vbr;
  409. if (losc != 6)
  410. return false;
  411. if (!l2cap_frame_get_be16(frame, &cap))
  412. return false;
  413. type = cap >> 8;
  414. freq = cap << 8;
  415. if (!l2cap_frame_get_be16(frame, &cap))
  416. return false;
  417. freq |= (cap >> 8) & 0xf0;
  418. chan = (cap >> 8) & 0x0c;
  419. bitrate = (cap << 16) & 0x7f0000;
  420. vbr = cap & 0x0080;
  421. if (!l2cap_frame_get_be16(frame, &cap))
  422. return false;
  423. bitrate |= cap;
  424. print_field("%*cObject Type: %s (0x%02x)", BASE_INDENT, ' ',
  425. find_value_bit(type, aac_object_type_table), type);
  426. print_field("%*cFrequency: %s (0x%02x)", BASE_INDENT, ' ',
  427. find_value_bit(freq, aac_frequency_table), freq);
  428. print_field("%*cChannels: %s (0x%02x)", BASE_INDENT, ' ',
  429. find_value_bit(chan, aac_channels_table), chan);
  430. print_field("%*cBitrate: %ubps", BASE_INDENT, ' ', bitrate);
  431. print_field("%*cVBR: %s", BASE_INDENT, ' ', vbr ? "Yes" : "No");
  432. return true;
  433. }
  434. static bool codec_vendor_aptx_cap(uint8_t losc, struct l2cap_frame *frame)
  435. {
  436. uint8_t cap = 0;
  437. if (losc != 1)
  438. return false;
  439. l2cap_frame_get_u8(frame, &cap);
  440. print_field("%*cFrequency: 0x%02x", BASE_INDENT + 2, ' ', cap & 0xf0);
  441. print_value_bits(BASE_INDENT + 2, cap & 0xf0, aptx_frequency_table);
  442. print_field("%*cChannel Mode: 0x%02x", BASE_INDENT + 2, ' ',
  443. cap & 0x0f);
  444. print_value_bits(BASE_INDENT + 2, cap & 0x0f, aptx_channel_mode_table);
  445. return true;
  446. }
  447. static bool codec_vendor_faststream_cap(uint8_t losc, struct l2cap_frame *frame)
  448. {
  449. uint8_t cap = 0;
  450. if (losc != 2)
  451. return false;
  452. l2cap_frame_get_u8(frame, &cap);
  453. print_field("%*cDirection: 0x%02x", BASE_INDENT + 2, ' ', cap);
  454. print_value_bits(BASE_INDENT + 2, cap, faststream_direction_table);
  455. l2cap_frame_get_u8(frame, &cap);
  456. print_field("%*cSink Frequency: 0x%02x", BASE_INDENT + 2, ' ',
  457. cap & 0x0f);
  458. print_value_bits(BASE_INDENT + 2, cap & 0x0f,
  459. faststream_sink_frequency_table);
  460. print_field("%*cSource Frequency: 0x%02x", BASE_INDENT + 2, ' ',
  461. cap & 0xf0);
  462. print_value_bits(BASE_INDENT + 2, cap & 0xf0,
  463. faststream_source_frequency_table);
  464. return true;
  465. }
  466. static bool codec_vendor_aptx_ll_cap(uint8_t losc, struct l2cap_frame *frame)
  467. {
  468. uint8_t cap = 0;
  469. uint16_t level = 0;
  470. if (losc != 2 && losc != 11)
  471. return false;
  472. l2cap_frame_get_u8(frame, &cap);
  473. print_field("%*cFrequency: 0x%02x", BASE_INDENT + 2, ' ', cap & 0xf0);
  474. print_value_bits(BASE_INDENT + 2, cap & 0xf0, aptx_frequency_table);
  475. print_field("%*cChannel Mode: 0x%02x", BASE_INDENT + 2, ' ',
  476. cap & 0x0f);
  477. print_value_bits(BASE_INDENT + 2, cap & 0x0f, aptx_channel_mode_table);
  478. l2cap_frame_get_u8(frame, &cap);
  479. print_field("%*cBidirectional link: %s", BASE_INDENT, ' ',
  480. (cap & 1) ? "Yes" : "No");
  481. if ((cap & 2) && losc == 11) {
  482. /* reserved */
  483. l2cap_frame_get_u8(frame, &cap);
  484. l2cap_frame_get_le16(frame, &level);
  485. print_field("%*cTarget codec buffer level: %u (0x%02x)",
  486. BASE_INDENT + 2, ' ', level, level);
  487. l2cap_frame_get_le16(frame, &level);
  488. print_field("%*cInitial codec buffer level: %u (0x%02x)",
  489. BASE_INDENT + 2, ' ', level, level);
  490. l2cap_frame_get_u8(frame, &cap);
  491. print_field("%*cSRA max rate: %g (0x%02x)",
  492. BASE_INDENT + 2, ' ', cap / 10000.0, cap);
  493. l2cap_frame_get_u8(frame, &cap);
  494. print_field("%*cSRA averaging time: %us (0x%02x)",
  495. BASE_INDENT + 2, ' ', cap, cap);
  496. l2cap_frame_get_le16(frame, &level);
  497. print_field("%*cGood working codec buffer level: %u (0x%02x)",
  498. BASE_INDENT + 2, ' ', level, level);
  499. }
  500. return true;
  501. }
  502. static bool codec_vendor_aptx_hd_cap(uint8_t losc, struct l2cap_frame *frame)
  503. {
  504. uint8_t cap = 0;
  505. if (losc != 5)
  506. return false;
  507. l2cap_frame_get_u8(frame, &cap);
  508. print_field("%*cFrequency: 0x%02x", BASE_INDENT + 2, ' ', cap & 0xf0);
  509. print_value_bits(BASE_INDENT + 2, cap & 0xf0, aptx_frequency_table);
  510. print_field("%*cChannel Mode: 0x%02x", BASE_INDENT + 2, ' ',
  511. cap & 0x0f);
  512. print_value_bits(BASE_INDENT + 2, cap & 0x0f, aptx_channel_mode_table);
  513. /* reserved */
  514. l2cap_frame_get_u8(frame, &cap);
  515. l2cap_frame_get_u8(frame, &cap);
  516. l2cap_frame_get_u8(frame, &cap);
  517. l2cap_frame_get_u8(frame, &cap);
  518. return true;
  519. }
  520. static bool codec_vendor_ldac(uint8_t losc, struct l2cap_frame *frame)
  521. {
  522. uint16_t cap = 0;
  523. if (losc != 2)
  524. return false;
  525. l2cap_frame_get_le16(frame, &cap);
  526. print_field("%*cUnknown: 0x%04x", BASE_INDENT + 2, ' ', cap);
  527. return true;
  528. }
  529. static bool codec_vendor_cap(uint8_t losc, struct l2cap_frame *frame)
  530. {
  531. uint32_t vendor_id = 0;
  532. uint16_t codec_id = 0;
  533. size_t i;
  534. if (losc < 6)
  535. return false;
  536. l2cap_frame_get_le32(frame, &vendor_id);
  537. l2cap_frame_get_le16(frame, &codec_id);
  538. losc -= 6;
  539. print_field("%*cVendor ID: %s (0x%08x)", BASE_INDENT, ' ',
  540. bt_compidtostr(vendor_id), vendor_id);
  541. print_field("%*cVendor Specific Codec ID: %s (0x%04x)", BASE_INDENT,
  542. ' ', vndcodec2str(vendor_id, codec_id), codec_id);
  543. for (i = 0; i < sizeof(vndcodecs)/sizeof(*vndcodecs); i++) {
  544. if (vndcodecs[i].vendor_id == vendor_id &&
  545. vndcodecs[i].codec_id == codec_id)
  546. return vndcodecs[i].codec_vendor_cap(losc, frame);
  547. }
  548. packet_hexdump(frame->data, losc);
  549. l2cap_frame_pull(frame, frame, losc);
  550. return true;
  551. }
  552. static bool codec_vendor_aptx_cfg(uint8_t losc, struct l2cap_frame *frame)
  553. {
  554. uint8_t cap = 0;
  555. if (losc != 1)
  556. return false;
  557. l2cap_frame_get_u8(frame, &cap);
  558. print_field("%*cFrequency: %s (0x%02x)", BASE_INDENT + 2, ' ',
  559. find_value_bit(cap & 0xf0, aptx_frequency_table),
  560. cap & 0xf0);
  561. print_field("%*cChannel Mode: %s (0x%02x)", BASE_INDENT + 2, ' ',
  562. find_value_bit(cap & 0x0f, aptx_channel_mode_table),
  563. cap & 0x0f);
  564. return true;
  565. }
  566. static bool codec_vendor_faststream_cfg(uint8_t losc, struct l2cap_frame *frame)
  567. {
  568. uint8_t cap = 0;
  569. if (losc != 2)
  570. return false;
  571. l2cap_frame_get_u8(frame, &cap);
  572. /* FastStream codec is bi-directional */
  573. print_field("%*cDirection: 0x%02x", BASE_INDENT + 2, ' ', cap);
  574. print_value_bits(BASE_INDENT + 2, cap, faststream_direction_table);
  575. l2cap_frame_get_u8(frame, &cap);
  576. print_field("%*cSink Frequency: %s (0x%02x)", BASE_INDENT + 2, ' ',
  577. find_value_bit(cap & 0x0f,
  578. faststream_sink_frequency_table),
  579. cap & 0x0f);
  580. print_field("%*cSource Frequency: %s (0x%02x)", BASE_INDENT + 2, ' ',
  581. find_value_bit(cap & 0xf0,
  582. faststream_source_frequency_table),
  583. cap & 0xf0);
  584. return true;
  585. }
  586. static bool codec_vendor_aptx_ll_cfg(uint8_t losc, struct l2cap_frame *frame)
  587. {
  588. uint8_t cap = 0;
  589. uint16_t level = 0;
  590. if (losc != 2 && losc != 11)
  591. return false;
  592. l2cap_frame_get_u8(frame, &cap);
  593. print_field("%*cFrequency: %s (0x%02x)", BASE_INDENT + 2, ' ',
  594. find_value_bit(cap & 0xf0, aptx_frequency_table),
  595. cap & 0xf0);
  596. print_field("%*cChannel Mode: %s (0x%02x)", BASE_INDENT + 2, ' ',
  597. find_value_bit(cap & 0x0f, aptx_channel_mode_table),
  598. cap & 0x0f);
  599. l2cap_frame_get_u8(frame, &cap);
  600. print_field("%*cBidirectional link: %s", BASE_INDENT, ' ',
  601. (cap & 1) ? "Yes" : "No");
  602. if ((cap & 2) && losc == 11) {
  603. /* reserved */
  604. l2cap_frame_get_u8(frame, &cap);
  605. l2cap_frame_get_le16(frame, &level);
  606. print_field("%*cTarget codec buffer level: %u (0x%02x)",
  607. BASE_INDENT + 2, ' ', level, level);
  608. l2cap_frame_get_le16(frame, &level);
  609. print_field("%*cInitial codec buffer level: %u (0x%02x)",
  610. BASE_INDENT + 2, ' ', level, level);
  611. l2cap_frame_get_u8(frame, &cap);
  612. print_field("%*cSRA max rate: %g (0x%02x)",
  613. BASE_INDENT + 2, ' ', cap / 10000.0, cap);
  614. l2cap_frame_get_u8(frame, &cap);
  615. print_field("%*cSRA averaging time: %us (0x%02x)",
  616. BASE_INDENT + 2, ' ', cap, cap);
  617. l2cap_frame_get_le16(frame, &level);
  618. print_field("%*cGood working codec buffer level: %u (0x%02x)",
  619. BASE_INDENT + 2, ' ', level, level);
  620. }
  621. return true;
  622. }
  623. static bool codec_vendor_aptx_hd_cfg(uint8_t losc, struct l2cap_frame *frame)
  624. {
  625. uint8_t cap = 0;
  626. if (losc != 5)
  627. return false;
  628. l2cap_frame_get_u8(frame, &cap);
  629. print_field("%*cFrequency: %s (0x%02x)", BASE_INDENT + 2, ' ',
  630. find_value_bit(cap & 0xf0, aptx_frequency_table),
  631. cap & 0xf0);
  632. print_field("%*cChannel Mode: %s (0x%02x)", BASE_INDENT + 2, ' ',
  633. find_value_bit(cap & 0x0f, aptx_channel_mode_table),
  634. cap & 0x0f);
  635. /* reserved */
  636. l2cap_frame_get_u8(frame, &cap);
  637. l2cap_frame_get_u8(frame, &cap);
  638. l2cap_frame_get_u8(frame, &cap);
  639. l2cap_frame_get_u8(frame, &cap);
  640. return true;
  641. }
  642. static bool codec_vendor_cfg(uint8_t losc, struct l2cap_frame *frame)
  643. {
  644. uint32_t vendor_id = 0;
  645. uint16_t codec_id = 0;
  646. size_t i;
  647. if (losc < 6)
  648. return false;
  649. l2cap_frame_get_le32(frame, &vendor_id);
  650. l2cap_frame_get_le16(frame, &codec_id);
  651. losc -= 6;
  652. print_field("%*cVendor ID: %s (0x%08x)", BASE_INDENT, ' ',
  653. bt_compidtostr(vendor_id), vendor_id);
  654. print_field("%*cVendor Specific Codec ID: %s (0x%04x)", BASE_INDENT,
  655. ' ', vndcodec2str(vendor_id, codec_id), codec_id);
  656. for (i = 0; i < sizeof(vndcodecs)/sizeof(*vndcodecs); i++) {
  657. if (vndcodecs[i].vendor_id == vendor_id &&
  658. vndcodecs[i].codec_id == codec_id)
  659. return vndcodecs[i].codec_vendor_cfg(losc, frame);
  660. }
  661. packet_hexdump(frame->data, losc);
  662. l2cap_frame_pull(frame, frame, losc);
  663. return true;
  664. }
  665. bool a2dp_codec_cap(uint8_t codec, uint8_t losc, struct l2cap_frame *frame)
  666. {
  667. switch (codec) {
  668. case A2DP_CODEC_SBC:
  669. return codec_sbc_cap(losc, frame);
  670. case A2DP_CODEC_MPEG12:
  671. return codec_mpeg12_cap(losc, frame);
  672. case A2DP_CODEC_MPEG24:
  673. return codec_aac_cap(losc, frame);
  674. case A2DP_CODEC_VENDOR:
  675. return codec_vendor_cap(losc, frame);
  676. default:
  677. packet_hexdump(frame->data, losc);
  678. l2cap_frame_pull(frame, frame, losc);
  679. return true;
  680. }
  681. }
  682. bool a2dp_codec_cfg(uint8_t codec, uint8_t losc, struct l2cap_frame *frame)
  683. {
  684. switch (codec) {
  685. case A2DP_CODEC_SBC:
  686. return codec_sbc_cfg(losc, frame);
  687. case A2DP_CODEC_MPEG12:
  688. return codec_mpeg12_cfg(losc, frame);
  689. case A2DP_CODEC_MPEG24:
  690. return codec_aac_cfg(losc, frame);
  691. case A2DP_CODEC_VENDOR:
  692. return codec_vendor_cfg(losc, frame);
  693. default:
  694. packet_hexdump(frame->data, losc);
  695. l2cap_frame_pull(frame, frame, losc);
  696. return true;
  697. }
  698. }