~ubuntu-branches/ubuntu/wily/bluez/wily

« back to all changes in this revision

Viewing changes to audio/ipc.h

  • Committer: Bazaar Package Importer
  • Author(s): Mario Limonciello
  • Date: 2008-10-07 12:10:29 UTC
  • Revision ID: james.westby@ubuntu.com-20081007121029-4gup4fmmh2vfo5nh
Tags: upstream-4.12
Import upstream version 4.12

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 */