1e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg/* 2e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * 3e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * BlueZ - Bluetooth protocol stack for Linux 4e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * 55592142cb9383df0556b27ac59e96547b380310bJohan Hedberg * Copyright (C) 2006-2010 Nokia Corporation 69184e2eeb7b97371c6b83b747c8984e2340d2b47Marcel Holtmann * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org> 7e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * 8e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * 9e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * This program is free software; you can redistribute it and/or modify 10e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * it under the terms of the GNU General Public License as published by 11e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * the Free Software Foundation; either version 2 of the License, or 12e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * (at your option) any later version. 13e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * 14e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * This program is distributed in the hope that it will be useful, 15e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * but WITHOUT ANY WARRANTY; without even the implied warranty of 16e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * GNU General Public License for more details. 18e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * 19e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * You should have received a copy of the GNU General Public License 20e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * along with this program; if not, write to the Free Software 21e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 22e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg * 23e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg */ 24e929f72c17c104ed4eb6c15bda8f5d2be58c8084Johan Hedberg 256763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg#define A2DP_CODEC_SBC 0x00 266763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg#define A2DP_CODEC_MPEG12 0x01 276763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg#define A2DP_CODEC_MPEG24 0x02 286763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg#define A2DP_CODEC_ATRAC 0x03 296763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg 309ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_SAMPLING_FREQ_16000 (1 << 3) 319ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_SAMPLING_FREQ_32000 (1 << 2) 329ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_SAMPLING_FREQ_44100 (1 << 1) 339ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_SAMPLING_FREQ_48000 1 349ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz 359ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_CHANNEL_MODE_MONO (1 << 3) 369ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_CHANNEL_MODE_DUAL_CHANNEL (1 << 2) 379ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_CHANNEL_MODE_STEREO (1 << 1) 389ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_CHANNEL_MODE_JOINT_STEREO 1 399ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz 409ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_BLOCK_LENGTH_4 (1 << 3) 419ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_BLOCK_LENGTH_8 (1 << 2) 429ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_BLOCK_LENGTH_12 (1 << 1) 439ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_BLOCK_LENGTH_16 1 449ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz 459ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_SUBBANDS_4 (1 << 1) 469ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_SUBBANDS_8 1 479ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz 489ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_ALLOCATION_SNR (1 << 1) 499ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define SBC_ALLOCATION_LOUDNESS 1 509ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz 51489c2e0dbd76d9cecec62d19fafd9e7baddb72e7Luiz Augusto von Dentz#define MPEG_CHANNEL_MODE_MONO (1 << 3) 52489c2e0dbd76d9cecec62d19fafd9e7baddb72e7Luiz Augusto von Dentz#define MPEG_CHANNEL_MODE_DUAL_CHANNEL (1 << 2) 53489c2e0dbd76d9cecec62d19fafd9e7baddb72e7Luiz Augusto von Dentz#define MPEG_CHANNEL_MODE_STEREO (1 << 1) 54489c2e0dbd76d9cecec62d19fafd9e7baddb72e7Luiz Augusto von Dentz#define MPEG_CHANNEL_MODE_JOINT_STEREO 1 55489c2e0dbd76d9cecec62d19fafd9e7baddb72e7Luiz Augusto von Dentz 569ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define MPEG_LAYER_MP1 (1 << 2) 579ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define MPEG_LAYER_MP2 (1 << 1) 589ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define MPEG_LAYER_MP3 1 599ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz 609ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define MPEG_SAMPLING_FREQ_16000 (1 << 5) 619ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define MPEG_SAMPLING_FREQ_22050 (1 << 4) 629ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define MPEG_SAMPLING_FREQ_24000 (1 << 3) 639ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define MPEG_SAMPLING_FREQ_32000 (1 << 2) 649ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define MPEG_SAMPLING_FREQ_44100 (1 << 1) 659ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz#define MPEG_SAMPLING_FREQ_48000 1 666763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg 672934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentz#define MAX_BITPOOL 64 682934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentz#define MIN_BITPOOL 2 692934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentz 70e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz#if __BYTE_ORDER == __LITTLE_ENDIAN 71e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz 726763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedbergstruct sbc_codec_cap { 736763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg struct avdtp_media_codec_capability cap; 746763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg uint8_t channel_mode:4; 756763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg uint8_t frequency:4; 766763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg uint8_t allocation_method:2; 776763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg uint8_t subbands:2; 786763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg uint8_t block_length:4; 796763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg uint8_t min_bitpool; 806763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg uint8_t max_bitpool; 816763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg} __attribute__ ((packed)); 826763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg 839ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentzstruct mpeg_codec_cap { 849ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz struct avdtp_media_codec_capability cap; 859ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t channel_mode:4; 869ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t crc:1; 879ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t layer:3; 889ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t frequency:6; 899ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t mpf:1; 909ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t rfa:1; 91489c2e0dbd76d9cecec62d19fafd9e7baddb72e7Luiz Augusto von Dentz uint16_t bitrate; 929ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz} __attribute__ ((packed)); 939ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz 94e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz#elif __BYTE_ORDER == __BIG_ENDIAN 95e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz 96e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentzstruct sbc_codec_cap { 97e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz struct avdtp_media_codec_capability cap; 98e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz uint8_t frequency:4; 99e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz uint8_t channel_mode:4; 100e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz uint8_t block_length:4; 101e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz uint8_t subbands:2; 102e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz uint8_t allocation_method:2; 103e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz uint8_t min_bitpool; 104e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz uint8_t max_bitpool; 105e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz} __attribute__ ((packed)); 106e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz 1079ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentzstruct mpeg_codec_cap { 1089ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz struct avdtp_media_codec_capability cap; 1099ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t layer:3; 1109ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t crc:1; 1119ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t channel_mode:4; 1129ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t rfa:1; 1139ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t mpf:1; 1149ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz uint8_t frequency:6; 115489c2e0dbd76d9cecec62d19fafd9e7baddb72e7Luiz Augusto von Dentz uint16_t bitrate; 1169ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz} __attribute__ ((packed)); 1179ae63b37bb909c66a931ee3934af1ad87047f326Luiz Augusto von Dentz 118e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz#else 119e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz#error "Unknown byte order" 120e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz#endif 121e00800b81712635aade50201cfc3e6eca8b53ae0Luiz Augusto von Dentz 122666938b54d631956826343ed278e2af4b982fc29Johan Hedbergstruct a2dp_sep; 123666938b54d631956826343ed278e2af4b982fc29Johan Hedberg 124f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentz 125f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentztypedef void (*a2dp_select_cb_t) (struct avdtp *session, 126f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentz struct a2dp_sep *sep, GSList *caps, 127f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentz void *user_data); 1282934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentztypedef void (*a2dp_config_cb_t) (struct avdtp *session, struct a2dp_sep *sep, 129cdd9e2e17ad674e5fc1a5ed19643880ef61d28c7Johan Hedberg struct avdtp_stream *stream, 1302934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentz struct avdtp_error *err, 1312934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentz void *user_data); 1322934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentztypedef void (*a2dp_stream_cb_t) (struct avdtp *session, 1332934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentz struct avdtp_error *err, 1342934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentz void *user_data); 135cdd9e2e17ad674e5fc1a5ed19643880ef61d28c7Johan Hedberg 136957d01bac7a4c448bbe0a15de613af7927d1c7d0Luiz Augusto von Dentzint a2dp_register(DBusConnection *conn, const bdaddr_t *src, GKeyFile *config); 137957d01bac7a4c448bbe0a15de613af7927d1c7d0Luiz Augusto von Dentzvoid a2dp_unregister(const bdaddr_t *src); 1386763ebb3c231740c66a235f94d56e8d8cc213d90Johan Hedberg 139f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentzstruct a2dp_sep *a2dp_add_sep(const bdaddr_t *src, uint8_t type, 140f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentz uint8_t codec, gboolean delay_reporting, 1412da716f340e99d315a9c773ea95253d583ba2b74Dmitriy Paliy struct media_endpoint *endpoint, int *err); 142f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentzvoid a2dp_remove_sep(struct a2dp_sep *sep); 143f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentz 1441340fb6eb3ae71c6a7f57602a1b2a6405c3b577aJoão Paulo Rechi Vitastruct a2dp_sep *a2dp_get(struct avdtp *session, struct avdtp_remote_sep *sep); 145f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentz 146f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentzunsigned int a2dp_select_capabilities(struct avdtp *session, 147f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentz uint8_t type, const char *sender, 148f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentz a2dp_select_cb_t cb, 149f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentz void *user_data); 1501340fb6eb3ae71c6a7f57602a1b2a6405c3b577aJoão Paulo Rechi Vitaunsigned int a2dp_config(struct avdtp *session, struct a2dp_sep *sep, 151bd30e5535a6d713727f8f9433954dcb9dd4b7168Luiz Augusto von Dentz a2dp_config_cb_t cb, GSList *caps, 152bd30e5535a6d713727f8f9433954dcb9dd4b7168Luiz Augusto von Dentz void *user_data); 1531340fb6eb3ae71c6a7f57602a1b2a6405c3b577aJoão Paulo Rechi Vitaunsigned int a2dp_resume(struct avdtp *session, struct a2dp_sep *sep, 1542934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentz a2dp_stream_cb_t cb, void *user_data); 1551340fb6eb3ae71c6a7f57602a1b2a6405c3b577aJoão Paulo Rechi Vitaunsigned int a2dp_suspend(struct avdtp *session, struct a2dp_sep *sep, 1562934e194f3ffe754e18477113c870a7b98f88454Luiz Augusto von Dentz a2dp_stream_cb_t cb, void *user_data); 1571340fb6eb3ae71c6a7f57602a1b2a6405c3b577aJoão Paulo Rechi Vitagboolean a2dp_cancel(struct audio_device *dev, unsigned int id); 158cdd9e2e17ad674e5fc1a5ed19643880ef61d28c7Johan Hedberg 159fc0d501d82773718d0f2d040f786136332c39813Johan Hedberggboolean a2dp_sep_lock(struct a2dp_sep *sep, struct avdtp *session); 160fc0d501d82773718d0f2d040f786136332c39813Johan Hedberggboolean a2dp_sep_unlock(struct a2dp_sep *sep, struct avdtp *session); 161c5e75a5051967530f29f9fabfb8593ef2723d57eLuiz Augusto von Dentzgboolean a2dp_sep_get_lock(struct a2dp_sep *sep); 162f87e1bed1320276e39cc5ccb250082fac90bdedeLuiz Augusto von Dentzstruct avdtp_stream *a2dp_sep_get_stream(struct a2dp_sep *sep); 163c5e75a5051967530f29f9fabfb8593ef2723d57eLuiz Augusto von Dentzstruct a2dp_sep *a2dp_get_sep(struct avdtp *session, 164c5e75a5051967530f29f9fabfb8593ef2723d57eLuiz Augusto von Dentz struct avdtp_stream *stream); 165