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