FreeCalypso > hg > fc-magnetite
comparison src/ui3/mfw/mfw_BtipsA2dp.c @ 420:e8ddbb0837ed
src/ui3: initial import of TCS3/LoCosto BMI & MFW code
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 21 Jan 2018 03:09:00 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
419:59143cd42ec7 | 420:e8ddbb0837ed |
---|---|
1 /* ========================================================= | |
2 * Texas Instruments OMAP(TM) Platform Software | |
3 * (c) Copyright Texas Instruments, Incorporated. All Rights Reserved. | |
4 * | |
5 * Use of this software is controlled by the terms and conditions found | |
6 * in the license agreement under which this software has been supplied. | |
7 * ========================================================== */ | |
8 /* | |
9 $Project name: Basic Bluetooth MMI | |
10 $Project code: | |
11 $Module: Bluetooth BMG APPlication | |
12 $File: mfw_BtipsA2dp.c | |
13 $Revision: 1.0 | |
14 $Author: Texas Instruments | |
15 $Date: 26/06/07 | |
16 | |
17 ******************************************************************************** | |
18 | |
19 Description: | |
20 | |
21 This module provides the BTIPS BMG APPlication functionality. | |
22 | |
23 ******************************************************************************** | |
24 $History: mfw_BtipsA2dp.c | |
25 | |
26 26/06/07 Sasken original version | |
27 | |
28 $End | |
29 | |
30 *******************************************************************************/ | |
31 | |
32 | |
33 | |
34 | |
35 /******************************************************************************* | |
36 | |
37 Include files | |
38 | |
39 *******************************************************************************/ | |
40 | |
41 #define ENTITY_MFW | |
42 | |
43 #if BT_STACK == XA_ENABLED | |
44 #include <me.h> | |
45 #include <bttypes.h> | |
46 #include <sec.h> | |
47 #endif | |
48 | |
49 #include "btl_common.h" | |
50 #include "debug.h" | |
51 #include "vsi.h" | |
52 #include "overide.h" | |
53 | |
54 /* BTL includes */ | |
55 #include "btl_a2dp.h" | |
56 #include "btl_config.h" | |
57 #include "bthal_mm.h" | |
58 | |
59 | |
60 #if defined (NEW_FRAME) | |
61 | |
62 #include "typedefs.h" | |
63 #include "vsi.h" | |
64 #include "pei.h" | |
65 #include "custom.h" | |
66 #include "gsm.h" | |
67 #include "prim.h" | |
68 | |
69 #else | |
70 | |
71 #include "STDDEFS.H" | |
72 #include "custom.h" | |
73 #include "gsm.h" | |
74 #include "vsi.h" | |
75 | |
76 #endif | |
77 #include "mfw_BtipsA2dp.h" | |
78 #include "mfw_mfw.h" | |
79 #include "mfw_win.h" | |
80 #include "mfw_icn.h" /* included for mfw_mnu.h */ | |
81 #include "mfw_mnu.h" | |
82 #include "mfw_tim.h" | |
83 #include "mfw_kbd.h" | |
84 #include "mfw_sat.h" /* included for MmiDummy.h, included for MmiMenu.h */ | |
85 #include "mfw_btips.h" | |
86 #include "mfw_ffs.h" | |
87 | |
88 extern char szSelectedFileName[256]; | |
89 extern char* szSelectedFileExt; | |
90 extern int a2dp_files_count; | |
91 //Array to load fileNames in content directory | |
92 extern char* a2dp_file_names[A2DP_MAX_FILES]; | |
93 | |
94 | |
95 /*------------------------------------------------------------------------------- | |
96 * MAX_SUPPORTED_BITPOOL type | |
97 * | |
98 * Represents the maximum supported bitpool | |
99 */ | |
100 #define MAX_SUPPORTED_BITPOOL (53) | |
101 | |
102 /*------------------------------------------------------------------------------- | |
103 * MIN_SUPPORTED_BITPOOL type | |
104 * | |
105 * Represents the minimum supported bitpool | |
106 */ | |
107 #define MIN_SUPPORTED_BITPOOL (2) | |
108 | |
109 #define A2DP_MAX_NUM_STREAMS (BTL_CONFIG_A2DP_MAX_NUM_SBC_STREAMS_PER_CONTEXT + \ | |
110 BTL_CONFIG_A2DP_MAX_NUM_MPEG1_2_AUDIO_STREAMS_PER_CONTEXT) | |
111 static BOOL isStreamClosed[A2DP_MAX_NUM_STREAMS]; | |
112 static BOOL playingNow = FALSE; | |
113 static BOOL streamingNow = FALSE; | |
114 static BtSecurityLevel securityLevel = BSL_NO_SECURITY; | |
115 static BtlA2dpContext *btlA2dpContext = 0; | |
116 static BtlA2dpCodec codec; | |
117 BtlA2dpStreamId streamId = -1; | |
118 static BthalMmSbcInfo sbcLocalCap; | |
119 static BthalMmMpeg1_2_audioInfo mp3LocalCap; | |
120 static BOOL streamSbcFile = FALSE; | |
121 extern T_MFW_HND hA2dpDeviceWnd; | |
122 BOOL bPlayMp3File = FALSE; | |
123 BOOL bPlaySbcFile = FALSE; | |
124 | |
125 void APP_A2DP_StartPcmStream(BTHAL_U32 streamId); | |
126 | |
127 static void mfw_btips_a2dpEventCallBack(const BtlA2dpEvent *event); | |
128 static char * pCodecType(AvdtpCodecType CType); | |
129 static char * pAvError(AvdtpError Error); | |
130 static void mfw_btips_a2dpSetDefaultSbcLocalCap(void); | |
131 static void mfw_btips_a2dpSetDefaultMp3LocalCap(void); | |
132 | |
133 #ifdef FF_MMI_BTIPS_APP | |
134 | |
135 /*Function Definitions*/ | |
136 void APP_A2DP_StartPcmStream(BTHAL_U32 streamId) | |
137 { | |
138 BtStatus status; | |
139 status = BTL_A2DP_StartStream(btlA2dpContext, streamId); | |
140 TRACE_FUNCTION_P1("BTL_A2DP_StartStream() returned %s.", | |
141 pBT_Status(status)); | |
142 } | |
143 | |
144 /******************************************************************************* | |
145 | |
146 $Function: mfw_btips_a2dpInit | |
147 | |
148 $Description: Function to initialise the a2dp file list. | |
149 | |
150 $Returns: None | |
151 | |
152 $Arguments: None | |
153 | |
154 *******************************************************************************/ | |
155 void mfw_btips_a2dpInit(void) | |
156 { | |
157 BtStatus status; | |
158 TRACE_FUNCTION("mfw_btips_a2dpInit"); | |
159 | |
160 status = BTL_A2DP_Create(0, mfw_btips_a2dpEventCallBack, &securityLevel, &btlA2dpContext); | |
161 mfw_btips_a2dpSetDefaultSbcLocalCap(); | |
162 mfw_btips_a2dpSetDefaultMp3LocalCap(); | |
163 bthalMmSetExternalSbcEncoder(streamSbcFile); | |
164 bthalMmSetPcmPlatformSupportedCapabilities(&sbcLocalCap); | |
165 TRACE_FUNCTION("SBC Local capabilities has been set"); | |
166 | |
167 bthalMmSetMp3PlatformSupportedCapabilities(&mp3LocalCap); | |
168 TRACE_FUNCTION("MP3 Local capabilities has been set"); | |
169 | |
170 status = BTL_A2DP_Enable(btlA2dpContext, 0, (BTL_A2DP_SUPPORTED_FEATURES_PLAYER | BTL_A2DP_SUPPORTED_FEATURES_MIXER)); | |
171 | |
172 TRACE_FUNCTION_P1("BTL_A2DP_Enable() returned %s.", pBT_Status(status)); | |
173 if (status == BT_STATUS_SUCCESS) | |
174 { | |
175 OS_MemSet(isStreamClosed, TRUE, A2DP_MAX_NUM_STREAMS); | |
176 | |
177 } | |
178 else | |
179 { | |
180 TRACE_FUNCTION("A2DP Enable Failed!"); | |
181 } | |
182 } | |
183 /******************************************************************************* | |
184 | |
185 $Function: mfw_btips_a2dpPopulateFiles | |
186 | |
187 $Description:Populates the MIDI file names into the array | |
188 | |
189 $Returns: The count of the files in the directory | |
190 | |
191 $Arguments: file_names:Pointer to the arrayto store file names | |
192 max_files_count:Max file counts to be stored in array | |
193 *******************************************************************************/ | |
194 | |
195 int mfw_btips_a2dpPopulateFiles(char **file_names, int max_files_count,char* dir_name_p) | |
196 { | |
197 | |
198 T_FFS_DIR dir = {0}; | |
199 char dest_name_p[100] = ""; | |
200 int i, files_count = 0; | |
201 char *fileExt; | |
202 | |
203 TRACE_FUNCTION("mfw_btips_a2dpPopulateFiles"); | |
204 | |
205 TRACE_FUNCTION_P1("a2dp_files_count - %s", dir_name_p); | |
206 if (ffs_opendir (dir_name_p, &dir) <= 0) | |
207 { | |
208 TRACE_FUNCTION("Cld not open Dir"); | |
209 | |
210 files_count = 0; | |
211 } | |
212 //Release previous allocated memory before allocating again | |
213 mfw_btips_a2dpUnpopulateFiles(file_names); | |
214 //read the file names | |
215 //file_count will be used to populate the array index | |
216 for (i = 0; ffs_readdir (&dir, dest_name_p, 100) > 0x0; i++) | |
217 { | |
218 | |
219 TRACE_FUNCTION_P1("Reading Dir - %s",dest_name_p); | |
220 (file_names[files_count]) = (char*)mfwAlloc(strlen(dest_name_p) + 1); | |
221 if(file_names[files_count] != NULL) | |
222 { | |
223 //Retrieve file extension.Store only the supported file formats in array | |
224 fileExt =mfw_btips_a2dpGetExtension(dest_name_p); | |
225 //List the MP3 files also.Mp3 files hsould not be listed or ULC | |
226 if ( (strcmp(fileExt, "mp3") == 0)) | |
227 { | |
228 | |
229 strcpy (file_names[files_count], dest_name_p); | |
230 TRACE_FUNCTION_P1("file_names - %s", file_names[files_count]); | |
231 files_count++; | |
232 } | |
233 else if ( (strcmp(fileExt, "wav")== 0)) | |
234 { | |
235 | |
236 strcpy (file_names[files_count], dest_name_p); | |
237 TRACE_FUNCTION_P1("file_names - %s", file_names[files_count]); | |
238 files_count++; | |
239 } | |
240 else if ( (strcmp(fileExt, "pcm")== 0)) | |
241 { | |
242 strcpy (file_names[files_count], dest_name_p); | |
243 TRACE_FUNCTION_P1("file_names - %s", file_names[files_count]); | |
244 files_count++; | |
245 } | |
246 else if(files_count >= max_files_count) | |
247 break; | |
248 } | |
249 else | |
250 { | |
251 //files_count = 0; | |
252 } | |
253 | |
254 } | |
255 //Closing the directory aa per the new FFS logic | |
256 ffs_closedir(dir); | |
257 | |
258 TRACE_EVENT_P1("read files_count is %d",files_count); | |
259 return files_count; | |
260 } | |
261 /******************************************************************************* | |
262 | |
263 $Function: mfw_btips_a2dpUnpopulateFiles | |
264 | |
265 $Description:Frees the memory allocated for the array | |
266 $Returns: None | |
267 | |
268 $Arguments: file_names:Pointer to the arrayto store file names | |
269 | |
270 *******************************************************************************/ | |
271 void mfw_btips_a2dpUnpopulateFiles(char **file_names) | |
272 { | |
273 int i; | |
274 TRACE_FUNCTION("mfw_btips_a2dpUnpopulateFiles"); | |
275 | |
276 //Free the allocated memory for file names | |
277 for (i = 0; i<A2DP_MAX_FILES; i++) | |
278 { | |
279 if(file_names[i]) | |
280 { | |
281 mfwFree((U8 *)file_names[i],(U16)strlen(file_names[i]) + 1); | |
282 } | |
283 file_names[i]=NULL; | |
284 } | |
285 | |
286 } | |
287 /******************************************************************************* | |
288 | |
289 $Function: mfw_btips_a2dpGetExtension | |
290 | |
291 $Description: public function to retrieve the extension of a file | |
292 | |
293 $Returns:Extention of the filename | |
294 | |
295 $Arguments: scr- Filename | |
296 | |
297 *******************************************************************************/ | |
298 char *mfw_btips_a2dpGetExtension(char *src) | |
299 { | |
300 int i,len; | |
301 | |
302 TRACE_FUNCTION("mfw_btips_a2dpGetExtension"); | |
303 len = strlen(src); | |
304 for(i = 0; i < len; i++){ | |
305 if(src[i] == '.'){ | |
306 return (src+i+1); | |
307 } | |
308 } | |
309 return (src+i); | |
310 } | |
311 /******************************************************************************* | |
312 | |
313 $Function: sounds_midi_return_file_number | |
314 | |
315 $Description: returns the file count | |
316 | |
317 $Returns: Count of the Midi files | |
318 | |
319 $Arguments: None | |
320 | |
321 *******************************************************************************/ | |
322 int mfw_btips_a2dpGetNumFiles(void) | |
323 { | |
324 TRACE_FUNCTION("sounds_midi_return_file_number"); | |
325 TRACE_FUNCTION_P1("mfw_btips_a2dpGetNumFiles -a2dp_files_count - %d", a2dp_files_count); | |
326 if(a2dp_files_count<=0) | |
327 return 0; | |
328 else | |
329 return a2dp_files_count; | |
330 | |
331 } | |
332 /******************************************************************************* | |
333 | |
334 $Function: mfw_btips_a2dpGetFileName | |
335 | |
336 $Description: Returns the file name | |
337 | |
338 $Returns: Name of the file | |
339 | |
340 $Arguments: index:The index of the file, whose name has to be retrieved | |
341 | |
342 *******************************************************************************/ | |
343 | |
344 char* mfw_btips_a2dpGetFileName(UBYTE index) | |
345 { | |
346 | |
347 TRACE_FUNCTION("mfw_btips_a2dpGetFileName"); | |
348 TRACE_EVENT_P2("A2dp_file_names[%d] is %s",index,(char *)a2dp_file_names[index]); | |
349 return (char *) a2dp_file_names[index]; | |
350 | |
351 } | |
352 | |
353 /******************************************************************************* | |
354 | |
355 $Function: mfw_btips_a2dpEventCallBack | |
356 | |
357 $Description: Returns the file name | |
358 | |
359 $Returns: Name of the file | |
360 | |
361 $Arguments: index:The index of the file, whose name has to be retrieved | |
362 | |
363 *******************************************************************************/ | |
364 | |
365 static void mfw_btips_a2dpEventCallBack(const BtlA2dpEvent *event) | |
366 { | |
367 | |
368 A2dpError error = A2DP_ERR_NO_ERROR; | |
369 A2dpCallbackParms *Parms; | |
370 BOOL streamStopped = FALSE; | |
371 BtStatus status; | |
372 // char szSelectedFilePath[256] | |
373 | |
374 Parms = event->callbackParms; | |
375 | |
376 TRACE_FUNCTION_P1("mfw_btips_a2dpEventCallBack %d",Parms->event); | |
377 | |
378 switch (Parms->event) { | |
379 case A2DP_EVENT_STREAM_OPEN_IND: | |
380 TRACE_FUNCTION_P1("A2DP_EVENT_STREAM_OPEN_IND streamId %d.", event->streamId); | |
381 TRACE_FUNCTION_P2(" Codec: %s, Length: %d", | |
382 pCodecType(Parms->p.configReq->codec.codecType), | |
383 Parms->p.configReq->codec.elemLen); | |
384 | |
385 /*if (promptUserOnIncomingConAndStart) | |
386 { | |
387 AppReport("Please Accept or Reject open stream request"); | |
388 } | |
389 else | |
390 */ | |
391 { | |
392 /* Auto-accept connection */ | |
393 status = BTL_A2DP_OpenStreamResponse(btlA2dpContext, event->streamId, A2DP_ERR_NO_ERROR); | |
394 TRACE_FUNCTION_P1("BTL_A2DP_OpenStreamResponse() returned %s.", | |
395 pBT_Status(status)); | |
396 } | |
397 | |
398 break; | |
399 | |
400 case A2DP_EVENT_GET_CONFIG_IND: | |
401 TRACE_FUNCTION_P1("A2DP_EVENT_GET_CONFIG_IND streamId %d.", event->streamId); | |
402 TRACE_FUNCTION("To configure and open strean press 'Open Stream' button "); | |
403 /*if(streamId > 0) | |
404 { | |
405 mfw_btips_a2dpCloseStream(); | |
406 }*/ | |
407 | |
408 status = BTL_A2DP_OpenStream(btlA2dpContext, streamId); | |
409 isStreamClosed[event->streamId] = FALSE; | |
410 bthalMmStreamStateIsConnected(event->streamId, TRUE); | |
411 TRACE_FUNCTION_P1("BTL_A2DP_OpenStream() returned %s.", | |
412 pBT_Status(status)); | |
413 break; | |
414 | |
415 case A2DP_EVENT_STREAM_OPEN: | |
416 TRACE_FUNCTION_P1("A2DP_EVENT_STREAM_OPEN streamId %d.", event->streamId); | |
417 isStreamClosed[event->streamId] = FALSE; | |
418 bthalMmStreamStateIsConnected(event->streamId, TRUE); | |
419 if(bPlaySbcFile) | |
420 { | |
421 TRACE_FUNCTION("Opening PCM File "); | |
422 if(AppPcmSimOpenFile(szSelectedFileName)) | |
423 { | |
424 TRACE_FUNCTION("PCM File Open Success!!"); | |
425 } | |
426 else | |
427 { | |
428 TRACE_FUNCTION("PCM File Open Failed!!"); | |
429 } | |
430 } | |
431 | |
432 if(bPlayMp3File) | |
433 { | |
434 TRACE_FUNCTION("Opening Mp3 File "); | |
435 if(AppMp3OpenFile(szSelectedFileName)) | |
436 { | |
437 TRACE_FUNCTION("Mp3 File Open Success!!"); | |
438 } | |
439 else | |
440 { | |
441 TRACE_FUNCTION("Mp3 File Open Failed!!"); | |
442 } | |
443 status = BTL_A2DP_StartStream(btlA2dpContext, streamId); | |
444 TRACE_FUNCTION_P1("BTL_A2DP_StartStream() returned %s.", | |
445 pBT_Status(status)); | |
446 | |
447 } | |
448 | |
449 | |
450 break; | |
451 | |
452 case A2DP_EVENT_STREAM_IDLE: | |
453 TRACE_FUNCTION_P1("A2DP_EVENT_STREAM_IDLE streamId %d.", event->streamId); | |
454 isStreamClosed[event->streamId] = FALSE; | |
455 streamStopped = TRUE; | |
456 | |
457 break; | |
458 | |
459 case A2DP_EVENT_STREAM_CLOSED: | |
460 TRACE_FUNCTION_P1("A2DP_EVENT_STREAM_CLOSED streamId %d.", event->streamId); | |
461 isStreamClosed[event->streamId] = TRUE; | |
462 streamStopped = TRUE; | |
463 bthalMmStreamStateIsConnected(event->streamId, FALSE); | |
464 break; | |
465 | |
466 case A2DP_EVENT_STREAM_START_IND: | |
467 TRACE_FUNCTION_P1("A2DP_EVENT_STREAM_START_IND streamId %d.", event->streamId); | |
468 | |
469 /*if (promptUserOnIncomingConAndStart) | |
470 { | |
471 AppReport("Please Accept or Reject start stream request"); | |
472 } | |
473 else | |
474 */ | |
475 { | |
476 /* Auto-accept stream start */ | |
477 status = BTL_A2DP_StartStreamResponse(btlA2dpContext, event->streamId, A2DP_ERR_NO_ERROR); | |
478 TRACE_FUNCTION_P1("BTL_A2DP_StartStreamResponse() returned %s.", | |
479 pBT_Status(status)); | |
480 } | |
481 | |
482 break; | |
483 | |
484 case A2DP_EVENT_STREAM_STARTED: | |
485 TRACE_FUNCTION_P1("A2DP_EVENT_STREAM_STARTED streamId %d.", event->streamId); | |
486 | |
487 isStreamClosed[event->streamId] = FALSE; | |
488 streamingNow = TRUE; | |
489 if(bPlaySbcFile) | |
490 { | |
491 TRACE_FUNCTION("Playing PCM File "); | |
492 AppPcmSimPlayFile(); | |
493 } | |
494 else if(bPlayMp3File) | |
495 { | |
496 TRACE_FUNCTION("Playing Mp3 File "); | |
497 AppMp3PlayFile(); | |
498 | |
499 } | |
500 TRACE_FUNCTION_P1("Playing File %s : ", szSelectedFileName); | |
501 break; | |
502 | |
503 case A2DP_EVENT_STREAM_SUSPENDED: | |
504 TRACE_FUNCTION_P1("A2DP_EVENT_STREAM_SUSPENDED streamId %d.", event->streamId); | |
505 | |
506 isStreamClosed[event->streamId] = FALSE; | |
507 | |
508 if (Parms->error != AVDTP_ERR_NO_ERROR) | |
509 { | |
510 TRACE_FUNCTION_P2("Stream Suspend Failed, reason: %s, status: %s", | |
511 pAvError(Parms->error), | |
512 pBT_Status(Parms->status)); | |
513 } | |
514 /*switch (event->streamId) | |
515 { | |
516 case (0): | |
517 SendDlgItemMessage(AppWnd, IDC_STREAM0_OPEND, BM_SETCHECK, BST_CHECKED, 0L); | |
518 SendDlgItemMessage(AppWnd, IDC_STREAM0_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
519 break; | |
520 | |
521 case (1): | |
522 SendDlgItemMessage(AppWnd, IDC_STREAM1_OPEND, BM_SETCHECK, BST_CHECKED, 0L); | |
523 SendDlgItemMessage(AppWnd, IDC_STREAM1_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
524 break; | |
525 | |
526 case (2): | |
527 SendDlgItemMessage(AppWnd, IDC_STREAM2_OPEND, BM_SETCHECK, BST_CHECKED, 0L); | |
528 SendDlgItemMessage(AppWnd, IDC_STREAM2_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
529 break; | |
530 | |
531 case (3): | |
532 SendDlgItemMessage(AppWnd, IDC_STREAM3_OPEND, BM_SETCHECK, BST_CHECKED, 0L); | |
533 SendDlgItemMessage(AppWnd, IDC_STREAM3_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
534 break; | |
535 } | |
536 */ | |
537 break; | |
538 | |
539 case A2DP_EVENT_STREAM_ABORTED: | |
540 TRACE_FUNCTION_P1("A2DP_EVENT_STREAM_ABORTED streamId %d.", event->streamId); | |
541 if (Parms->error != AVDTP_ERR_NO_ERROR) { | |
542 TRACE_FUNCTION_P2("Stream Abort Failed, reason: %s, status: %s", | |
543 pAvError(Parms->error), | |
544 pBT_Status(Parms->status)); | |
545 } | |
546 /*switch (event->streamId) | |
547 { | |
548 case (0): | |
549 if(isStreamClosed[0] == FALSE) | |
550 { | |
551 | |
552 SendDlgItemMessage(AppWnd, IDC_STREAM0_IDLE, BM_SETCHECK, BST_CHECKED, 0L); | |
553 } | |
554 SendDlgItemMessage(AppWnd, IDC_STREAM0_OPEND, BM_SETCHECK, BST_UNCHECKED, 0L); | |
555 SendDlgItemMessage(AppWnd, IDC_STREAM0_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
556 break; | |
557 | |
558 case (1): | |
559 if(isStreamClosed[1] == FALSE) | |
560 { | |
561 | |
562 SendDlgItemMessage(AppWnd, IDC_STREAM1_IDLE, BM_SETCHECK, BST_CHECKED, 0L); | |
563 } | |
564 SendDlgItemMessage(AppWnd, IDC_STREAM1_OPEND, BM_SETCHECK, BST_UNCHECKED, 0L); | |
565 SendDlgItemMessage(AppWnd, IDC_STREAM1_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
566 break; | |
567 | |
568 case (2): | |
569 if(isStreamClosed[2] == FALSE) | |
570 { | |
571 | |
572 SendDlgItemMessage(AppWnd, IDC_STREAM2_IDLE, BM_SETCHECK, BST_CHECKED, 0L); | |
573 } | |
574 SendDlgItemMessage(AppWnd, IDC_STREAM2_OPEND, BM_SETCHECK, BST_UNCHECKED, 0L); | |
575 SendDlgItemMessage(AppWnd, IDC_STREAM2_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
576 break; | |
577 | |
578 case (3): | |
579 if(isStreamClosed[3] == FALSE) | |
580 { | |
581 | |
582 SendDlgItemMessage(AppWnd, IDC_STREAM3_IDLE, BM_SETCHECK, BST_CHECKED, 0L); | |
583 } | |
584 SendDlgItemMessage(AppWnd, IDC_STREAM3_OPEND, BM_SETCHECK, BST_UNCHECKED, 0L); | |
585 SendDlgItemMessage(AppWnd, IDC_STREAM3_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
586 break; | |
587 } | |
588 */ | |
589 isStreamClosed[event->streamId] = FALSE; | |
590 streamStopped = TRUE; | |
591 bPlaySbcFile = FALSE; | |
592 bPlayMp3File = FALSE; | |
593 break; | |
594 | |
595 case A2DP_EVENT_DISABLED: | |
596 TRACE_FUNCTION("A2DP_EVENT_DISABLED"); | |
597 /*SendDlgItemMessage(AppWnd, IDC_STREAM0_IDLE, BM_SETCHECK, BST_UNCHECKED, 0L); | |
598 SendDlgItemMessage(AppWnd, IDC_STREAM0_OPEND, BM_SETCHECK, BST_UNCHECKED, 0L); | |
599 SendDlgItemMessage(AppWnd, IDC_STREAM0_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
600 SendDlgItemMessage(AppWnd, IDC_STREAM0_CLOSED, BM_SETCHECK, BST_UNCHECKED, 0L); | |
601 SendDlgItemMessage(AppWnd, IDC_STREAM1_IDLE, BM_SETCHECK, BST_UNCHECKED, 0L); | |
602 SendDlgItemMessage(AppWnd, IDC_STREAM1_OPEND, BM_SETCHECK, BST_UNCHECKED, 0L); | |
603 SendDlgItemMessage(AppWnd, IDC_STREAM1_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
604 SendDlgItemMessage(AppWnd, IDC_STREAM1_CLOSED, BM_SETCHECK, BST_UNCHECKED, 0L); | |
605 SendDlgItemMessage(AppWnd, IDC_STREAM2_IDLE, BM_SETCHECK, BST_UNCHECKED, 0L); | |
606 SendDlgItemMessage(AppWnd, IDC_STREAM2_OPEND, BM_SETCHECK, BST_UNCHECKED, 0L); | |
607 SendDlgItemMessage(AppWnd, IDC_STREAM2_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
608 SendDlgItemMessage(AppWnd, IDC_STREAM2_CLOSED, BM_SETCHECK, BST_UNCHECKED, 0L); | |
609 SendDlgItemMessage(AppWnd, IDC_STREAM3_IDLE, BM_SETCHECK, BST_UNCHECKED, 0L); | |
610 SendDlgItemMessage(AppWnd, IDC_STREAM3_OPEND, BM_SETCHECK, BST_UNCHECKED, 0L); | |
611 SendDlgItemMessage(AppWnd, IDC_STREAM3_STREAMING, BM_SETCHECK, BST_UNCHECKED, 0L); | |
612 SendDlgItemMessage(AppWnd, IDC_STREAM3_CLOSED, BM_SETCHECK, BST_UNCHECKED, 0L); | |
613 */ | |
614 streamStopped = TRUE; | |
615 | |
616 break; | |
617 | |
618 default: | |
619 TRACE_FUNCTION_P1("MFW A2DP Unexpected event %d!", Parms->event); | |
620 break; | |
621 } | |
622 | |
623 if ( streamStopped ) | |
624 { | |
625 streamingNow = FALSE; | |
626 } | |
627 } | |
628 /*--------------------------------------------------------------------------- | |
629 * pCodecType() | |
630 *--------------------------------------------------------------------------- | |
631 * | |
632 * Synopsis: Prints codec type message | |
633 * | |
634 */ | |
635 static char * pCodecType(AvdtpCodecType CType) | |
636 { | |
637 switch (CType) { | |
638 case AVDTP_CODEC_TYPE_SBC: | |
639 return "SBC"; | |
640 case AVDTP_CODEC_TYPE_MPEG1_2_AUDIO: | |
641 return "MPEG1_2_AUDIO"; | |
642 case AVDTP_CODEC_TYPE_MPEG2_4_AAC: | |
643 return "MPEG2_4_AAC"; | |
644 case AVDTP_CODEC_TYPE_ATRAC: | |
645 return "ATRAC"; | |
646 case AVDTP_CODEC_TYPE_NON_A2DP: | |
647 return "Non-A2DP"; | |
648 default: | |
649 return "UNKNOWN"; | |
650 } | |
651 } | |
652 /*--------------------------------------------------------------------------- | |
653 * pAvError() | |
654 *--------------------------------------------------------------------------- | |
655 * | |
656 * Synopsis: Prints AV error message | |
657 * | |
658 */ | |
659 static char * pAvError(AvdtpError Error) | |
660 { | |
661 switch (Error) { | |
662 case AVDTP_ERR_NO_ERROR: | |
663 return "AVDTP_ERR_NO_ERROR"; | |
664 case AVDTP_ERR_BAD_HEADER_FORMAT: | |
665 return "AVDTP_ERR_BAD_HEADER_FORMAT"; | |
666 case AVDTP_ERR_BAD_LENGTH: | |
667 return "AVDTP_ERR_BAD_LENGTH"; | |
668 case AVDTP_ERR_BAD_ACP_SEID: | |
669 return "AVDTP_ERR_BAD_ACP_SEID"; | |
670 case AVDTP_ERR_IN_USE: | |
671 return "AVDTP_ERR_IN_USE"; | |
672 case AVDTP_ERR_NOT_IN_USE: | |
673 return "AVDTP_ERR_NOT_IN_USE"; | |
674 case AVDTP_ERR_BAD_SERV_CATEGORY: | |
675 return "AVDTP_ERR_BAD_SERV_CATEGORY"; | |
676 case AVDTP_ERR_BAD_PAYLOAD_FORMAT: | |
677 return "AVDTP_ERR_BAD_PAYLOAD_FORMAT"; | |
678 case AVDTP_ERR_NOT_SUPPORTED_COMMAND: | |
679 return "AVDTP_ERR_NOT_SUPPORTED_COMMAND"; | |
680 case AVDTP_ERR_INVALID_CAPABILITIES: | |
681 return "AVDTP_ERR_INVALID_CAPABILITIES"; | |
682 case AVDTP_ERR_BAD_RECOVERY_TYPE: | |
683 return "AVDTP_ERR_BAD_RECOVERY_TYPE"; | |
684 case AVDTP_ERR_BAD_MEDIA_TRANSPORT_FORMAT: | |
685 return "AVDTP_ERR_BAD_MEDIA_TRANSPORT_FORMAT"; | |
686 case AVDTP_ERR_BAD_RECOVERY_FORMAT: | |
687 return "AVDTP_ERR_BAD_RECOVERY_FORMAT"; | |
688 case AVDTP_ERR_BAD_ROHC_FORMAT: | |
689 return "AVDTP_ERR_BAD_ROHC_FORMAT"; | |
690 case AVDTP_ERR_BAD_CP_FORMAT: | |
691 return "AVDTP_ERR_BAD_CP_FORMAT"; | |
692 case AVDTP_ERR_BAD_MULTIPLEXING_FORMAT: | |
693 return "AVDTP_ERR_BAD_MULTIPLEXING_FORMAT"; | |
694 case AVDTP_ERR_UNSUPPORTED_CONFIGURATION: | |
695 return "AVDTP_ERR_UNSUPPORTED_CONFIGURATION"; | |
696 case AVDTP_ERR_BAD_STATE: | |
697 return "AVDTP_ERR_BAD_STATE"; | |
698 case A2DP_ERR_BAD_SERVICE: | |
699 return" A2DP_ERR_BAD_SERVICE"; | |
700 case A2DP_ERR_INSUFFICIENT_RESOURCE: | |
701 return" A2DP_ERR_INSUFFICENT_RESOURCE"; | |
702 case A2DP_ERR_INVALID_CODEC_TYPE: | |
703 return" A2DP_ERR_INVALID_CODEC_TYPE"; | |
704 case A2DP_ERR_NOT_SUPPORTED_CODEC_TYPE: | |
705 return" A2DP_ERR_NOT_SUPPORTED_CODEC_TYPE"; | |
706 case A2DP_ERR_INVALID_SAMPLING_FREQUENCY: | |
707 return" A2DP_ERR_INVALID_SAMPLING_FREQUENCY"; | |
708 case A2DP_ERR_NOT_SUPPORTED_SAMP_FREQ: | |
709 return" A2DP_ERR_NOT_SUPPORTED_SAMP_FREQ"; | |
710 case A2DP_ERR_INVALID_CHANNEL_MODE: | |
711 return" A2DP_ERR_INVALID_CHANNEL_MODE"; | |
712 case A2DP_ERR_NOT_SUPPORTED_CHANNEL_MODE: | |
713 return" A2DP_ERR_NOT_SUPPORTED_CHANNEL_MODE"; | |
714 case A2DP_ERR_INVALID_SUBBANDS: | |
715 return" A2DP_ERR_INVALID_SUBBANDS"; | |
716 case A2DP_ERR_NOT_SUPPORTED_SUBBANDS: | |
717 return" A2DP_ERR_NOT_SUPPORTED_SUBBANDS"; | |
718 case A2DP_ERR_INVALID_ALLOCATION_METHOD: | |
719 return" A2DP_ERR_INVALID_ALLOCATION_METHOD"; | |
720 case A2DP_ERR_NOT_SUPPORTED_ALLOC_METHOD: | |
721 return" A2DP_ERR_NOT_SUPPORTED_ALLOC_METHOD"; | |
722 case A2DP_ERR_INVALID_MIN_BITPOOL_VALUE: | |
723 return" A2DP_ERR_INVALID_MIN_BITPOOL_VALUE"; | |
724 case A2DP_ERR_NOT_SUPPORTED_MIN_BITPOOL_VALUE: | |
725 return" A2DP_ERR_NOT_SUPPORTED_MIN_BITPOOL_VALUE"; | |
726 case A2DP_ERR_INVALID_MAX_BITPOOL_VALUE: | |
727 return" A2DP_ERR_INVALID_MAX_BITPOOL_VALUE"; | |
728 case A2DP_ERR_NOT_SUPPORTED_MAX_BITPOOL_VALUE: | |
729 return" A2DP_ERR_NOT_SUPPORTED_MAX_BITPOOL_VALUE"; | |
730 case A2DP_ERR_INVALID_LAYER: | |
731 return" A2DP_ERR_INVALID_LAYER"; | |
732 case A2DP_ERR_NOT_SUPPORTED_LAYER: | |
733 return" A2DP_ERR_NOT_SUPPORTED_LAYER"; | |
734 case A2DP_ERR_NOT_SUPPORTED_CRC: | |
735 return" A2DP_ERR_NOT_SUPPORTED_CRC"; | |
736 case A2DP_ERR_NOT_SUPPORTED_MPF: | |
737 return" A2DP_ERR_NOT_SUPPORTED_MPF"; | |
738 case A2DP_ERR_NOT_SUPPORTED_VBR: | |
739 return" A2DP_ERR_NOT_SUPPORTED_VBR"; | |
740 case A2DP_ERR_INVALID_BIT_RATE: | |
741 return" A2DP_ERR_INVALID_BIT_RATE"; | |
742 case A2DP_ERR_NOT_SUPPORTED_BIT_RATE: | |
743 return" A2DP_ERR_NOT_SUPPORTED_BIT_RATE"; | |
744 case A2DP_ERR_INVALID_OBJECT_TYPE: | |
745 return" A2DP_ERR_INVALID_OBJECT_TYPE"; | |
746 case A2DP_ERR_NOT_SUPPORTED_OBJECT_TYPE: | |
747 return" A2DP_ERR_NOT_SUPPORTED_OBJECT_TYPE"; | |
748 case A2DP_ERR_INVALID_CHANNELS: | |
749 return" A2DP_ERR_INVALID_CHANNELS"; | |
750 case A2DP_ERR_NOT_SUPPORTED_CHANNELS: | |
751 return" A2DP_ERR_NOT_SUPPORTED_CHANNELS"; | |
752 case A2DP_ERR_INVALID_VERSION: | |
753 return" A2DP_ERR_INVALID_VERSION"; | |
754 case A2DP_ERR_NOT_SUPPORTED_VERSION: | |
755 return" A2DP_ERR_NOT_SUPPORTED_VERSION"; | |
756 case A2DP_ERR_NOT_SUPPORTED_MAXIMUM_SUL: | |
757 return" A2DP_ERR_NOT_SUPPORTED_MAXIMUM_SUL"; | |
758 case A2DP_ERR_INVALID_BLOCK_LENGTH: | |
759 return" A2DP_ERR_INVALID_BLOCK_LENGTH"; | |
760 case A2DP_ERR_INVALID_CP_TYPE: | |
761 return" A2DP_ERR_INVALID_CP_TYPE"; | |
762 case A2DP_ERR_INVALID_CP_FORMAT: | |
763 return" A2DP_ERR_INVALID_CP_FORMAT"; | |
764 default: | |
765 return "UNKNOWN"; | |
766 } | |
767 } | |
768 | |
769 | |
770 /*--------------------------------------------------------------------------- | |
771 * mfw_btips_a2dpSetDefaultSbcLocalCap() | |
772 *--------------------------------------------------------------------------- | |
773 * | |
774 * Synopsis: Save local SBC capabilities | |
775 * | |
776 */ | |
777 static void mfw_btips_a2dpSetDefaultSbcLocalCap(void) | |
778 { | |
779 sbcLocalCap.samplingFreq = ( BTHAL_MM_SBC_SAMPLING_FREQ_16000 | BTHAL_MM_SBC_SAMPLING_FREQ_32000|BTHAL_MM_SBC_SAMPLING_FREQ_44100 |BTHAL_MM_SBC_SAMPLING_FREQ_48000); | |
780 sbcLocalCap.channelMode = BTHAL_MM_SBC_CHANNEL_MODE_MONO | BTHAL_MM_SBC_CHANNEL_MODE_DUAL_CHANNEL | BTHAL_MM_SBC_CHANNEL_MODE_STEREO | BTHAL_MM_SBC_CHANNEL_MODE_JOINT_STEREO; | |
781 sbcLocalCap.blockLength = (BTHAL_MM_SBC_BLOCK_LENGTH_4 | BTHAL_MM_SBC_BLOCK_LENGTH_8 | BTHAL_MM_SBC_BLOCK_LENGTH_12 | BTHAL_MM_SBC_BLOCK_LENGTH_16); | |
782 sbcLocalCap.subbands = BTHAL_MM_SBC_SUBBANDS_8 | BTHAL_MM_SBC_SUBBANDS_4; | |
783 sbcLocalCap.allocationMethod = BTHAL_MM_SBC_ALLOCATION_METHOD_LOUDNESS | BTHAL_MM_SBC_ALLOCATION_METHOD_SNR; | |
784 sbcLocalCap.maxBitpoolValue = MAX_SUPPORTED_BITPOOL; | |
785 sbcLocalCap.minBitpoolValue = MIN_SUPPORTED_BITPOOL; | |
786 } | |
787 | |
788 /*--------------------------------------------------------------------------- | |
789 * mfw_btips_a2dpSetDefaultMp3LocalCap() | |
790 *--------------------------------------------------------------------------- | |
791 * | |
792 * Synopsis: Save local PM3 capabilities | |
793 * | |
794 */ | |
795 static void mfw_btips_a2dpSetDefaultMp3LocalCap(void) | |
796 { | |
797 mp3LocalCap.bitRate = 0xFFFF; | |
798 mp3LocalCap.channelMode = (BTHAL_MM_MPEG1_2_AUDIO_CHANNEL_MODE_MONO | BTHAL_MM_MPEG1_2_AUDIO_CHANNEL_MODE_DUAL_CHANNEL | BTHAL_MM_MPEG1_2_AUDIO_CHANNEL_MODE_STEREO | BTHAL_MM_MPEG1_2_AUDIO_CHANNEL_MODE_JOINT_STEREO); | |
799 mp3LocalCap.crcProtection = BTHAL_MM_MPEG1_2_AUDIO_CRC_PROTECTION_SUPPORTED; | |
800 mp3LocalCap.layer = (BTHAL_MM_MPEG1_2_AUDIO_LAYER_1 | BTHAL_MM_MPEG1_2_AUDIO_LAYER_2 | BTHAL_MM_MPEG1_2_AUDIO_LAYER_3); | |
801 mp3LocalCap.mpf2 = BTHAL_MM_MPEG1_2_AUDIO_MPF2_SUPPORTED; | |
802 mp3LocalCap.samplingFreq = (BTHAL_MM_MPEG1_2_AUDIO_SAMPLING_FREQ_48000 | BTHAL_MM_MPEG1_2_AUDIO_SAMPLING_FREQ_44100 | BTHAL_MM_MPEG1_2_AUDIO_SAMPLING_FREQ_32000 | BTHAL_MM_MPEG1_2_AUDIO_SAMPLING_FREQ_24000 | BTHAL_MM_MPEG1_2_AUDIO_SAMPLING_FREQ_22050 | BTHAL_MM_MPEG1_2_AUDIO_SAMPLING_FREQ_16000); | |
803 mp3LocalCap.vbr = BTHAL_MM_MPEG1_2_AUDIO_VBR_SUPPORTED; | |
804 | |
805 } | |
806 BtStatus mfw_btips_a2dpConnectStream(BD_ADDR bdAddr) | |
807 { | |
808 BtStatus status; | |
809 | |
810 TRACE_FUNCTION("mfw_btips_a2dpConnectStream"); | |
811 | |
812 if ( (strcmp(szSelectedFileExt, "mp3") == 0)) | |
813 { | |
814 bPlayMp3File = TRUE; | |
815 bPlaySbcFile = FALSE; | |
816 codec = BTL_A2DP_CODEC_MPEG1_2_AUDIO; | |
817 status = BTL_A2DP_ConnectStream(btlA2dpContext,&bdAddr, codec, &streamId); | |
818 if (status == BT_STATUS_PENDING) | |
819 { | |
820 TRACE_FUNCTION("Connecting Mp3 stream (opening signaling channel in process)..."); | |
821 } | |
822 else | |
823 { | |
824 TRACE_FUNCTION_P1("connecting Mp3 stream failed, status: %s", pBT_Status(status)); | |
825 } | |
826 } | |
827 else if ( (strcmp(szSelectedFileExt, "pcm") == 0)) | |
828 { | |
829 bPlaySbcFile = TRUE; | |
830 bPlayMp3File = FALSE; | |
831 codec = BTL_A2DP_CODEC_SBC; | |
832 status = BTL_A2DP_ConnectStream(btlA2dpContext,&bdAddr, codec, &streamId); | |
833 if (status == BT_STATUS_PENDING) | |
834 { | |
835 TRACE_FUNCTION("Connecting SBC stream (opening signaling channel in process)..."); | |
836 } | |
837 else | |
838 { | |
839 TRACE_FUNCTION_P1("connecting SBC stream failed, status: %s", pBT_Status(status)); | |
840 } | |
841 | |
842 } | |
843 else if ( (strcmp(szSelectedFileExt, "wav") == 0)) | |
844 { | |
845 bPlaySbcFile = TRUE; | |
846 bPlayMp3File = FALSE; | |
847 codec = BTL_A2DP_CODEC_SBC; | |
848 status = BTL_A2DP_ConnectStream(btlA2dpContext,&bdAddr, codec, &streamId); | |
849 if (status == BT_STATUS_PENDING) | |
850 { | |
851 TRACE_FUNCTION("Connecting SBC stream (opening signaling channel in process)..."); | |
852 } | |
853 else | |
854 { | |
855 TRACE_FUNCTION_P1("connecting SBC stream failed, status: %s", pBT_Status(status)); | |
856 } | |
857 | |
858 } | |
859 return status; | |
860 } | |
861 BtStatus mfw_btips_a2dpCloseStream() | |
862 { | |
863 BtStatus status; | |
864 | |
865 TRACE_FUNCTION("mfw_btips_a2dpCloseStream"); | |
866 | |
867 if ( (strcmp(szSelectedFileExt, "mp3") == 0)) | |
868 { | |
869 //AppMp3StopFile(); | |
870 AppStopAudioFile(); | |
871 AppMp3CloseFile(); | |
872 } | |
873 else if ( (strcmp(szSelectedFileExt, "pcm") == 0)) | |
874 { | |
875 | |
876 AppPcmSimStopFile(); | |
877 AppPcmSimCloseFile(); | |
878 } | |
879 else if ( (strcmp(szSelectedFileExt, "wav") == 0)) | |
880 { | |
881 | |
882 AppPcmSimStopFile(); | |
883 AppPcmSimCloseFile(); | |
884 } | |
885 status = BTL_A2DP_CloseStream(btlA2dpContext, streamId); | |
886 TRACE_FUNCTION_P1("BTL_A2DP_CloseStream returned %s", pBT_Status(status)); | |
887 return status; | |
888 } | |
889 | |
890 BOOL mfw_btips_a2dpGetConnectedDevice (BD_ADDR *bdAddr, U8 *name) | |
891 { | |
892 BtStatus status; | |
893 | |
894 status = BTL_A2DP_GetConnectedDevice (btlA2dpContext, streamId, bdAddr); | |
895 | |
896 if (status == BT_STATUS_SUCCESS) | |
897 { | |
898 mfw_btips_bmgGetDeviceName (bdAddr, name); | |
899 return TRUE; | |
900 } | |
901 return FALSE; | |
902 } | |
903 | |
904 BOOL mfw_btips_a2dpDisconnect (BD_ADDR bdAddr) | |
905 { | |
906 BtStatus btStatus; | |
907 | |
908 btStatus = BTL_A2DP_CloseStream (btlA2dpContext, streamId); | |
909 | |
910 return TRUE; | |
911 } | |
912 | |
913 #endif |