]> code.delx.au - pulseaudio/blob - src/modules/bluetooth/ipc.h
Merge commit 'origin/master-tx' into master-tx
[pulseaudio] / src / modules / bluetooth / ipc.h
1 /*
2 *
3 * BlueZ - Bluetooth protocol stack for Linux
4 *
5 * Copyright (C) 2004-2008 Marcel Holtmann <marcel@holtmann.org>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 *
21 */
22
23 /*
24 Message sequence chart of streaming sequence for A2DP transport
25
26 Audio daemon User
27 on snd_pcm_open
28 <--BT_GETCAPABILITIES_REQ
29
30 BT_GETCAPABILITIES_RSP-->
31
32 on snd_pcm_hw_params
33 <--BT_SETCONFIGURATION_REQ
34
35 BT_SETCONFIGURATION_RSP-->
36
37 on snd_pcm_prepare
38 <--BT_STREAMSTART_REQ
39
40 <Moves to streaming state>
41 BT_STREAMSTART_RSP-->
42
43 BT_STREAMFD_IND -->
44
45 < streams data >
46 ..........
47
48 on snd_pcm_drop/snd_pcm_drain
49
50 <--BT_STREAMSTOP_REQ
51
52 <Moves to open state>
53 BT_STREAMSTOP_RSP-->
54
55 on IPC close or appl crash
56 <Moves to idle>
57
58 */
59
60 #ifndef BT_AUDIOCLIENT_H
61 #define BT_AUDIOCLIENT_H
62
63 #ifdef __cplusplus
64 extern "C" {
65 #endif
66
67 #include <stdint.h>
68 #include <stdio.h>
69 #include <unistd.h>
70 #include <sys/socket.h>
71 #include <sys/un.h>
72 #include <errno.h>
73
74 #define BT_AUDIO_IPC_PACKET_SIZE 128
75 #define BT_IPC_SOCKET_NAME "\0/org/bluez/audio"
76
77 /* Generic message header definition, except for RSP messages */
78 typedef struct {
79 uint8_t msg_type;
80 } __attribute__ ((packed)) bt_audio_msg_header_t;
81
82 /* Generic message header definition, for all RSP messages */
83 typedef struct {
84 bt_audio_msg_header_t msg_h;
85 uint8_t posix_errno;
86 } __attribute__ ((packed)) bt_audio_rsp_msg_header_t;
87
88 /* Messages list */
89 #define BT_GETCAPABILITIES_REQ 0
90 #define BT_GETCAPABILITIES_RSP 1
91
92 #define BT_SETCONFIGURATION_REQ 2
93 #define BT_SETCONFIGURATION_RSP 3
94
95 #define BT_STREAMSTART_REQ 4
96 #define BT_STREAMSTART_RSP 5
97
98 #define BT_STREAMSTOP_REQ 6
99 #define BT_STREAMSTOP_RSP 7
100
101 #define BT_STREAMSUSPEND_IND 8
102 #define BT_STREAMRESUME_IND 9
103
104 #define BT_CONTROL_REQ 10
105 #define BT_CONTROL_RSP 11
106 #define BT_CONTROL_IND 12
107
108 #define BT_STREAMFD_IND 13
109
110 /* BT_GETCAPABILITIES_REQ */
111
112 #define BT_CAPABILITIES_TRANSPORT_A2DP 0
113 #define BT_CAPABILITIES_TRANSPORT_SCO 1
114 #define BT_CAPABILITIES_TRANSPORT_ANY 2
115
116 #define BT_CAPABILITIES_ACCESS_MODE_READ 1
117 #define BT_CAPABILITIES_ACCESS_MODE_WRITE 2
118 #define BT_CAPABILITIES_ACCESS_MODE_READWRITE 3
119
120 #define BT_FLAG_AUTOCONNECT 1
121
122 struct bt_getcapabilities_req {
123 bt_audio_msg_header_t h;
124 char device[18]; /* Address of the remote Device */
125 uint8_t transport; /* Requested transport */
126 uint8_t flags; /* Requested flags */
127 } __attribute__ ((packed));
128
129 /* BT_GETCAPABILITIES_RSP */
130
131 /**
132 * SBC Codec parameters as per A2DP profile 1.0 ยง 4.3
133 */
134
135 #define BT_SBC_SAMPLING_FREQ_16000 (1 << 3)
136 #define BT_SBC_SAMPLING_FREQ_32000 (1 << 2)
137 #define BT_SBC_SAMPLING_FREQ_44100 (1 << 1)
138 #define BT_SBC_SAMPLING_FREQ_48000 1
139
140 #define BT_A2DP_CHANNEL_MODE_MONO (1 << 3)
141 #define BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL (1 << 2)
142 #define BT_A2DP_CHANNEL_MODE_STEREO (1 << 1)
143 #define BT_A2DP_CHANNEL_MODE_JOINT_STEREO 1
144
145 #define BT_A2DP_BLOCK_LENGTH_4 (1 << 3)
146 #define BT_A2DP_BLOCK_LENGTH_8 (1 << 2)
147 #define BT_A2DP_BLOCK_LENGTH_12 (1 << 1)
148 #define BT_A2DP_BLOCK_LENGTH_16 1
149
150 #define BT_A2DP_SUBBANDS_4 (1 << 1)
151 #define BT_A2DP_SUBBANDS_8 1
152
153 #define BT_A2DP_ALLOCATION_SNR (1 << 1)
154 #define BT_A2DP_ALLOCATION_LOUDNESS 1
155
156 #define BT_MPEG_SAMPLING_FREQ_16000 (1 << 5)
157 #define BT_MPEG_SAMPLING_FREQ_22050 (1 << 4)
158 #define BT_MPEG_SAMPLING_FREQ_24000 (1 << 3)
159 #define BT_MPEG_SAMPLING_FREQ_32000 (1 << 2)
160 #define BT_MPEG_SAMPLING_FREQ_44100 (1 << 1)
161 #define BT_MPEG_SAMPLING_FREQ_48000 1
162
163 #define BT_MPEG_LAYER_1 (1 << 2)
164 #define BT_MPEG_LAYER_2 (1 << 1)
165 #define BT_MPEG_LAYER_3 1
166
167 typedef struct {
168 uint8_t channel_mode;
169 uint8_t frequency;
170 uint8_t allocation_method;
171 uint8_t subbands;
172 uint8_t block_length;
173 uint8_t min_bitpool;
174 uint8_t max_bitpool;
175 } __attribute__ ((packed)) sbc_capabilities_t;
176
177 typedef struct {
178 uint8_t channel_mode;
179 uint8_t crc;
180 uint8_t layer;
181 uint8_t frequency;
182 uint8_t mpf;
183 uint16_t bitrate;
184 } __attribute__ ((packed)) mpeg_capabilities_t;
185
186 struct bt_getcapabilities_rsp {
187 bt_audio_rsp_msg_header_t rsp_h;
188 uint8_t transport; /* Granted transport */
189 sbc_capabilities_t sbc_capabilities; /* A2DP only */
190 mpeg_capabilities_t mpeg_capabilities; /* A2DP only */
191 uint16_t sampling_rate; /* SCO only */
192 } __attribute__ ((packed));
193
194 /* BT_SETCONFIGURATION_REQ */
195 struct bt_setconfiguration_req {
196 bt_audio_msg_header_t h;
197 char device[18]; /* Address of the remote Device */
198 uint8_t transport; /* Requested transport */
199 uint8_t access_mode; /* Requested access mode */
200 sbc_capabilities_t sbc_capabilities; /* A2DP only - only one of this field
201 and next one must be filled */
202 mpeg_capabilities_t mpeg_capabilities; /* A2DP only */
203 } __attribute__ ((packed));
204
205 /* BT_SETCONFIGURATION_RSP */
206 struct bt_setconfiguration_rsp {
207 bt_audio_rsp_msg_header_t rsp_h;
208 uint8_t transport; /* Granted transport */
209 uint8_t access_mode; /* Granted access mode */
210 uint16_t link_mtu; /* Max length that transport supports */
211 } __attribute__ ((packed));
212
213 /* BT_STREAMSTART_REQ */
214 #define BT_STREAM_ACCESS_READ 0
215 #define BT_STREAM_ACCESS_WRITE 1
216 #define BT_STREAM_ACCESS_READWRITE 2
217 struct bt_streamstart_req {
218 bt_audio_msg_header_t h;
219 } __attribute__ ((packed));
220
221 /* BT_STREAMSTART_RSP */
222 struct bt_streamstart_rsp {
223 bt_audio_rsp_msg_header_t rsp_h;
224 } __attribute__ ((packed));
225
226 /* BT_STREAMFD_IND */
227 /* This message is followed by one byte of data containing the stream data fd
228 as ancilliary data */
229 struct bt_streamfd_ind {
230 bt_audio_msg_header_t h;
231 } __attribute__ ((packed));
232
233 /* BT_STREAMSTOP_REQ */
234 struct bt_streamstop_req {
235 bt_audio_msg_header_t h;
236 } __attribute__ ((packed));
237
238 /* BT_STREAMSTOP_RSP */
239 struct bt_streamstop_rsp {
240 bt_audio_rsp_msg_header_t rsp_h;
241 } __attribute__ ((packed));
242
243 /* BT_STREAMSUSPEND_IND */
244 struct bt_streamsuspend_ind {
245 bt_audio_msg_header_t h;
246 } __attribute__ ((packed));
247
248 /* BT_STREAMRESUME_IND */
249 struct bt_streamresume_ind {
250 bt_audio_msg_header_t h;
251 } __attribute__ ((packed));
252
253 /* BT_CONTROL_REQ */
254
255 #define BT_CONTROL_KEY_POWER 0x40
256 #define BT_CONTROL_KEY_VOL_UP 0x41
257 #define BT_CONTROL_KEY_VOL_DOWN 0x42
258 #define BT_CONTROL_KEY_MUTE 0x43
259 #define BT_CONTROL_KEY_PLAY 0x44
260 #define BT_CONTROL_KEY_STOP 0x45
261 #define BT_CONTROL_KEY_PAUSE 0x46
262 #define BT_CONTROL_KEY_RECORD 0x47
263 #define BT_CONTROL_KEY_REWIND 0x48
264 #define BT_CONTROL_KEY_FAST_FORWARD 0x49
265 #define BT_CONTROL_KEY_EJECT 0x4A
266 #define BT_CONTROL_KEY_FORWARD 0x4B
267 #define BT_CONTROL_KEY_BACKWARD 0x4C
268
269 struct bt_control_req {
270 bt_audio_msg_header_t h;
271 uint8_t mode; /* Control Mode */
272 uint8_t key; /* Control Key */
273 } __attribute__ ((packed));
274
275 /* BT_CONTROL_RSP */
276 struct bt_control_rsp {
277 bt_audio_rsp_msg_header_t rsp_h;
278 uint8_t mode; /* Control Mode */
279 uint8_t key; /* Control Key */
280 } __attribute__ ((packed));
281
282 /* BT_CONTROL_IND */
283 struct bt_control_ind {
284 bt_audio_msg_header_t h;
285 uint8_t mode; /* Control Mode */
286 uint8_t key; /* Control Key */
287 } __attribute__ ((packed));
288
289 /* Function declaration */
290
291 /* Opens a connection to the audio service: return a socket descriptor */
292 int bt_audio_service_open(void);
293
294 /* Closes a connection to the audio service */
295 int bt_audio_service_close(int sk);
296
297 /* Receives stream data file descriptor : must be called after a
298 BT_STREAMFD_IND message is returned */
299 int bt_audio_service_get_data_fd(int sk);
300
301 /* Human readable message type string */
302 const char *bt_audio_strmsg(int type);
303
304 #ifdef __cplusplus
305 }
306 #endif
307
308 #endif /* BT_AUDIOCLIENT_H */