1 /******************************************************************************
2  *
3  *  Copyright (C) 2001-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /******************************************************************************
20  *
21  *  This file contains codec definitions from Widcomm's Universal Embedded
22  *  Drivers API.
23  *
24  ******************************************************************************/
25 
26 #ifndef UCODEC_H
27 #define UCODEC_H
28 
29 #include "bt_target.h"
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 
35 /*******************************************************************************
36 ** Codec APIs
37 *******************************************************************************/
38 
39 /**** Codec IDs ****/
40 #define UCODEC_ID_1             0
41 #define UCODEC_ID_2             1
42 #define UCODEC_ID_3             2
43 #define UCODEC_ID_4             3
44 #define UCODEC_NUMBER           4
45 
46 typedef UINT8 tUCODEC_ID;
47 
48 /**** Status ****/
49 #define UCODEC_SUCCESS              0x00
50 #define UCODEC_TX_DONE              0x01
51 #define UCODEC_RX_READY             0x02
52 #define UCODEC_FLOW_CTRL_ON         0x03
53 #define UCODEC_FLOW_CTRL_OFF        0x04
54 #define UCODEC_OVERFLOW             0x05
55 #define UCODEC_UNSUPORTED_CNF       0x06
56 #define UCODEC_WRONG_PARAM          0x07
57 #define UCODEC_NOT_CONFIGURED       0x08
58 #define UCODEC_OUT_OF_MEMORY        0x09
59 #define UCODEC_GENERIC_ERROR        0x0a
60 #define UCODEC_RECOVERABLE_ERROR    0x0b
61 #define UCODEC_UNRECOVERABLE_ERROR  0x0c
62 #define UCODEC_LOW_LEVEL_DRIVER_ERROR   (0x0d)
63 
64 typedef UINT8 tUCODEC_STATUS;
65 
66 /**** Media type ****/
67 #define UCODEC_MEDIA_TYPE_AUDIO 0
68 #define UCODEC_MEDIA_TYPE_VIDEO 1
69 #define UCODEC_MEDIA_TYPE_MULTI 2
70 
71 typedef UINT8 tUCODEC_MEDIA_TYPE;
72 
73 /**** Audio Codec type ****/
74 #define UCODEC_AUDIO_SBC        0
75 #define UCODEC_AUDIO_M12_LAYER1 1   /* layer1 (mp1) */
76 #define UCODEC_AUDIO_M12_LAYER2 2   /* layer2 (mp2) */
77 #define UCODEC_AUDIO_M12_LAYER3 3   /* layer3 (mp3) */
78 #define UCODEC_AUDIO_M24_2LC    4   /* MPEG-2 AAC LC */
79 #define UCODEC_AUDIO_M24_4LC    5   /* MPEG-4 AAC LC */
80 #define UCODEC_AUDIO_M24_4LTP   6   /* MPEG-4 AAC LTP */
81 #define UCODEC_AUDIO_M24_4S     7   /* MPEG-4 AAC scalable */
82 #define UCODEC_AUDIO_VOLUME     8   /* Volume settings */
83 #define UCODEC_AUDIO_BALANCE    9   /* Balance settings */
84 
85 typedef UINT8 tUCODEC_AUDIO_FEAT_TYPE;
86 
87 /**** Video Codec type -> TODO ****/
88 /*TBD*/
89 
90 typedef UINT8 tUCODEC_VIDEO_FEAT_TYPE;
91 
92 /**** SBC sample frequency ****/
93 #define UCODEC_SBC_SMP_FREQ_16    0  /* 16 */
94 #define UCODEC_SBC_SMP_FREQ_32    1  /* 23 */
95 #define UCODEC_SBC_SMP_FREQ_44    2  /* 44.1 */
96 #define UCODEC_SBC_SMP_FREQ_48    3  /* 48 */
97 
98 typedef UINT8 tUCODEC_SBC_SMP_FREQ;
99 
100 /**** SBC sample frequency ****/
101 #define UCODEC_SBC_SUBBAND_4    4
102 #define UCODEC_SBC_SUBBAND_8    8
103 
104 typedef UINT8 tUCODEC_SBC_SUBBAND;
105 /**** Allocation method ****/
106 #define UCODEC_SBC_ALLOC_MD_S   0   /* SNR */
107 #define UCODEC_SBC_ALLOC_MD_L   1   /* loundess */
108 
109 typedef UINT8 tUCODEC_SBC_ALLOC_MD;
110 
111 /**** MPEG sample frequency ****/
112 #define UCODEC_M12_SMP_FREQ_16    0   /* 16 */
113 #define UCODEC_M12_SMP_FREQ_22    1   /* 22 */
114 #define UCODEC_M12_SMP_FREQ_24    2  /* 24 */
115 #define UCODEC_M12_SMP_FREQ_32    3  /* 32 */
116 #define UCODEC_M12_SMP_FREQ_44    4  /* 44 */
117 #define UCODEC_M12_SMP_FREQ_48    5  /* 48 */
118 
119 typedef UINT8 tUCODEC_M12_SMP_FREQ;
120 
121 /**** Channel mode ****/
122 #define UCODEC_CHN_MONO            0
123 #define UCODEC_CHN_DUAL            1
124 #define UCODEC_CHN_STEREO          2
125 #define UCODEC_CHN_JOINT_STEREO    3
126 
127 typedef UINT8 tUCODEC_CH_MODE;
128 /**** Audio Codec type ****/
129 #define UCODEC_M24_SMP_FREQ_8     0   /*  8 */
130 #define UCODEC_M24_SMP_FREQ_11    1   /* 11 */
131 #define UCODEC_M24_SMP_FREQ_12    2   /* 12 */
132 #define UCODEC_M24_SMP_FREQ_16    3   /* 16 */
133 #define UCODEC_M24_SMP_FREQ_22    4   /* 22.05 */
134 #define UCODEC_M24_SMP_FREQ_24    5   /* 24 */
135 #define UCODEC_M24_SMP_FREQ_32    6   /* 32 */
136 #define UCODEC_M24_SMP_FREQ_44    7   /* 44.1 */
137 #define UCODEC_M24_SMP_FREQ_48    8   /* 48 */
138 #define UCODEC_M24_SMP_FREQ_64    9   /* 64 */
139 #define UCODEC_M24_SMP_FREQ_88    10  /* 88 */
140 #define UCODEC_M24_SMP_FREQ_96    11  /* 96 */
141 
142 typedef UINT8 tUCODEC_M24_SMP_FREQ;
143 
144 /**** Codec configuration structure ****/
145 typedef struct tUCODEC_CNF_SBC_TAG
146 {
147     tUCODEC_SBC_SMP_FREQ    SampleFreq;
148     tUCODEC_CH_MODE         ChannelMode;
149     UINT16                  Offset;     /* GKI buffer based offset for UCODEC_ReadBuf */
150     UINT16                  MtuSize;    /* Max buffer len for UCODEC_ReadBuf*/
151     UINT8                   PoolId;     /* GKI pool ID for UCODEC_ReadBuf */
152     UINT8                   NumBlock;   /* Number of block in block unit : 4 blocks 8 blocks 12 blocks 16 blocks are the possible value */
153     UINT8                   Subband;
154     tUCODEC_SBC_ALLOC_MD    AllocMthd;
155     UINT8                   MinBitPool;
156     UINT8                   MaxBitPool;
157 } tUCODEC_CNF_SBC;
158 
159 typedef struct tUCODEC_CNF_M12_TAG
160 {
161     tUCODEC_CH_MODE         ChannelMode; /* Mono, Dual, stereo, joint stereo */
162     tUCODEC_M12_SMP_FREQ    SampleFreq; /* Sample freq: 16, 22, 24, 32, 44, 48 */
163     UINT16                  BitRate;    /* Bit rate in bit per sec */
164     UINT16                  Offset;     /* GKI buffer based offset for UCODEC_ReadBuf */
165     UINT16                  MtuSize;    /* Max buffer len for UCODEC_ReadBuf*/
166     UINT8                   PoolId;     /* GKI pool ID for UCODEC_ReadBuf */
167     BOOLEAN                 VBR;        /* Variable Bit Rate */
168     BOOLEAN                 CRC_On;     /* CRC error detection */
169     BOOLEAN                 MPF;        /* Media payload format */
170 } tUCODEC_CNF_M12;
171 
172 typedef struct tUCODEC_CNF_M24_TAG
173 {
174     tUCODEC_M24_SMP_FREQ    SampleFreq; /* Sample freq: 8, 11, 12, 16, 22.05, 24, 32, 44.1, 48, 64, 88, 96 */
175     UINT32                  BitRate;    /* Bit rate */
176     UINT16                  Offset;     /* GKI buffer based offset for UCODEC_ReadBuf */
177     UINT16                  MtuSize;    /* Max buffer len for UCODEC_ReadBuf*/
178     UINT8                   PoolId;     /* GKI pool ID for UCODEC_ReadBuf */
179     UINT8                   Chanels;    /* 1 or 2 chanels */
180 } tUCODEC_CNF_M24;
181 
182 
183 typedef union tUCODEC_CODEC_TYPE_TAG
184 {
185     tUCODEC_AUDIO_FEAT_TYPE AudioType;
186     tUCODEC_VIDEO_FEAT_TYPE VideoType;
187 } tUCODEC_CODEC_TYPE;
188 
189 typedef union tUCODEC_FEATURE_TAG
190 {
191     /* Add here the audio feature structure */
192     tUCODEC_CNF_SBC SBCConfig;
193     tUCODEC_CNF_M12 M12Config;
194     tUCODEC_CNF_M24 M24Config;
195     UINT8           Volume;     /* 0 to mute. 0xFF for the max volume */
196     UINT8           Balance;    /* 0->100% right, 255->100% left */
197     /* Add here the video feature structure */
198     /* TBD */
199 } tUCODEC_FEATURE;
200 
201 typedef struct tUCODEC_CNF_TAG
202 {
203     tUCODEC_MEDIA_TYPE  MediaType;
204     tUCODEC_CODEC_TYPE  Type;
205     tUCODEC_FEATURE     Feature;
206 } tUCODEC_CNF;
207 
208 typedef struct tUCODEC_BUF_INFO_TAG
209 {
210     UINT8       NumOfFrames;
211     UINT32      TimesStamp;
212 } tUCODEC_BUF_INFO;
213 
214 
215 /******************************************************************************
216 **
217 ** Function         tUCODEC_CBACK_PTR
218 **
219 ** Description      This call back report CODEC indication.
220 **                  It report codec error as well as flow onfrol indication.
221 **
222 **                  Input : CodecId: Id of the codec that calls this call back.
223 **                          Status: ->UCODEC_FLOW_CTRL_OFF if the Tx Q just
224 **                                  went below the low watermark
225 **                                  ->UCODEC_RX_READY if data are ready to be
226 **                                  read. This olny hapens when the Rx Q was
227 **                                  empty before receiving data.
228 **                                  ->UCODEC_INTERNAL_ERROR if something went
229 **                                  wrong with the driver
230 **
231 **                  Output Parameters : None
232 **
233 ** Returns          None.
234 **
235 ******************************************************************************/
236 typedef void (* tUCODEC_CBACK_PTR)(tUCODEC_ID, tUCODEC_STATUS);
237 
238 /*******************************************************************************
239 ** Function Prototypes
240 *******************************************************************************/
241 
242 /******************************************************************************
243 **
244 ** Function         UCODEC_Init
245 **
246 ** Description      Startup initialisation function. This function is called
247 **                  before any orther function of UCODEC it initialize UCODEC
248 **                  internal structure an the external codec.
249 **
250 **                  Input : CodecId: Id of the codec to perform the operation on.
251 **
252 **                  Output Parameters : None
253 **
254 ** Returns          UCODEC_SUCCESS if The action was performed with sucess.
255 **                  Error code else.
256 **
257 ******************************************************************************/
258 BT_API extern tUCODEC_STATUS    UCODEC_Init       (void *);
259 
260 /******************************************************************************
261 **
262 ** Function         UCODEC_Configure
263 **
264 ** Description      Initialise the CODEC for a particular stream.
265 **
266 **
267 **                  Input : CodecId: Id of the codec to perform the operation on.
268 **                          CbackPrt: Call back pointer for codec feedback.
269 **                          pConfig: Pointer on a codec configuration structure.
270 **
271 **                  Output Parameters : None
272 **
273 ** Returns          UCODEC_SUCCESS if The action was performed with sucess.
274 **
275 ******************************************************************************/
276 BT_API extern tUCODEC_STATUS    UCODEC_Configure  (tUCODEC_ID, tUCODEC_CBACK_PTR, tUCODEC_CNF *);
277 
278 /******************************************************************************
279 **
280 ** Function         UCODEC_FlushTx
281 **
282 ** Description      Fluch Tx buffer Q.
283 **
284 **                  Input : CodecId: Id of the codec to perform the operation on.
285 **
286 **                  Output Parameters : None
287 **
288 ** Returns          UCODEC_SUCCESS if The action was performed with sucess.
289 **                  Error code else.
290 **
291 ******************************************************************************/
292 BT_API extern tUCODEC_STATUS    UCODEC_FlushTx      (tUCODEC_ID);
293 
294 /******************************************************************************
295 **
296 ** Function         UCODEC_FlushRx
297 **
298 ** Description      Fluch Rx buffer Q.
299 **
300 **                  Input : CodecId: Id of the codec to perform the operation on.
301 **
302 **                  Output Parameters : None
303 **
304 ** Returns          UCODEC_SUCCESS if The action was performed with sucess.
305 **                  Error code else.
306 **
307 ******************************************************************************/
308 BT_API extern tUCODEC_STATUS    UCODEC_FlushRx      (tUCODEC_ID);
309 
310 /******************************************************************************
311 **
312 ** Function         UCODEC_WriteBuf
313 **
314 ** Description      Send a buffer to the codec.
315 **
316 **                  Input : CodecId: Id of the codec to perform the operation on.
317 **                          pBuf: Pointer onto the GKI buffer to be send to the CODEC.
318 **
319 **                  Output Parameters : None
320 **
321 ** Returns          UCODEC_SUCCESS if The action was performed with sucess.
322 **                  UCODEC_FLOW_CTRL_ON if The codec buffer Q had reach a UCODEC_HIGH_WM
323 **                                      watermark. The buffer is queued
324 **                  UCODEC_OVERFLOW if The codec buffer Q had reach a critical
325 **                                     watermark. The buffer is dropped.
326 **
327 ******************************************************************************/
328 BT_API extern tUCODEC_STATUS    UCODEC_WriteBuf   (tUCODEC_ID, BT_HDR *);
329 
330 /******************************************************************************
331 **
332 ** Function         UCODEC_ReadBuf
333 **
334 ** Description      Get a buffer from the codec.
335 **
336 **                  Input : CodecId: Id of the codec to perform the operation on.
337 **
338 **                  Output Parameters : None
339 **
340 ** Returns          Pointer on the GKI buffer. NULL if the Rx Q is empty
341 **
342 ******************************************************************************/
343 BT_API extern tUCODEC_STATUS  UCODEC_ReadBuf    (tUCODEC_ID, BT_HDR **, tUCODEC_BUF_INFO *);
344 
345 /******************************************************************************
346 **
347 ** Function         UCODEC_Close
348 **
349 ** Description      This function is called to put the codec in low power mode
350 **
351 **
352 **                  Input : CodecId: Id of the codec to perform the operation on.
353 **
354 **                  Output Parameters : None
355 **
356 ** Returns          UCODEC_SUCCESS : The action was performed with sucess.
357 **                  Error code else.
358 **
359 ******************************************************************************/
360 BT_API extern tUCODEC_STATUS   UCODEC_Close   (tUCODEC_ID);
361 
362 /******************************************************************************
363 **
364 ** Function         UCODEC_Open
365 **
366 ** Description      This function is called to resume the codec from low power
367 **                  mode after UCODEC_Close had been called. It will put the
368 **                  codec in the state it was before UCODEC_Close being called.
369 **
370 **                  Input : CodecId: Id of the codec to perform the operation on.
371 **
372 **                  Output Parameters : None
373 **
374 ** Returns          UCODEC_SUCCESS : The action was performed with sucess.
375 **                  Error code else.
376 **
377 ******************************************************************************/
378 BT_API extern tUCODEC_STATUS   UCODEC_Open     (tUCODEC_ID);
379 
380 #ifdef __cplusplus
381 };
382 #endif
383 
384 
385 #endif /* UCODEC_H */
386