RDK Documentation (Open Sourced RDK Components)
btrMgr_streamIn.c
Go to the documentation of this file.
1 /*
2  * If not stated otherwise in this file or this component's Licenses.txt file the
3  * following copyright and licenses apply:
4  *
5  * Copyright 2016 RDK Management
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18 */
19 /**
20  * @file btrMgr_streamIn.c
21  *
22  * @description This file implements bluetooth manager's Generic streaming interface to external BT devices
23  *
24  */
25 
26 #ifdef HAVE_CONFIG_H
27 #include <config.h>
28 #endif
29 
30 /* System Headers */
31 #include <stdlib.h>
32 #include <string.h>
33 
34 /* Ext lib Headers */
35 #include <glib.h>
36 
37 /* Interface lib Headers */
38 #include "btrMgr_logger.h" //for rdklogger
39 
40 /* Local Headers */
41 #include "btrMgr_Types.h"
42 #include "btrMgr_mediaTypes.h"
43 #include "btrMgr_streamIn.h"
44 #ifdef USE_GST1
45 #include "btrMgr_streamInGst.h"
46 #endif
47 
48 /* Local types */
49 typedef struct _stBTRMgrSIHdl {
50  stBTRMgrMediaStatus lstBtrMgrSiStatus;
51  fPtr_BTRMgr_SI_StatusCb fpcBSiStatus;
52  void* pvcBUserData;
53 #ifdef USE_GST1
54  tBTRMgrSiGstHdl hBTRMgrSiGstHdl;
55 #endif
57 
58 
59 /* Static Function Prototypes */
60 
61 /* Local Op Threads Prototypes */
62 
63 /* Incoming Callbacks Prototypes */
64 #ifdef USE_GST1
65 static eBTRMgrSIGstRet btrMgr_SI_GstStatusCb (eBTRMgrSIGstStatus aeBtrMgrSiGstStatus, void* apvUserData);
66 #endif
67 
68 
69 /* Static Function Definition */
70 
71 /* Local Op Threads */
72 
73 /* Interfaces */
76  tBTRMgrSiHdl* phBTRMgrSiHdl,
77  fPtr_BTRMgr_SI_StatusCb afpcBSiStatus,
78  void* apvUserData
79 ) {
80  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
81  stBTRMgrSIHdl* pstBtrMgrSiHdl = NULL;
82 
83 #ifdef USE_GST1
84  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
85 #endif
86 
87  if ((pstBtrMgrSiHdl = (stBTRMgrSIHdl*)g_malloc0 (sizeof(stBTRMgrSIHdl))) == NULL) {
88  BTRMGRLOG_ERROR ("Unable to allocate memory\n");
89  return eBTRMgrInitFailure;
90  }
91 
92 #ifdef USE_GST1
93  if ((leBtrMgrSiGstRet = BTRMgr_SI_GstInit(&(pstBtrMgrSiHdl->hBTRMgrSiGstHdl), btrMgr_SI_GstStatusCb, pstBtrMgrSiHdl)) != eBTRMgrSIGstSuccess) {
94  BTRMGRLOG_ERROR("Return Status = %d\n", leBtrMgrSiGstRet);
95  leBtrMgrSiRet = eBTRMgrInitFailure;
96  }
97 #else
98  // TODO: Implement Stream out functionality using generic libraries
99 #endif
100 
101  if (leBtrMgrSiRet != eBTRMgrSuccess) {
102  BTRMgr_SI_DeInit((tBTRMgrSiHdl)pstBtrMgrSiHdl);
103  return leBtrMgrSiRet;
104  }
105 
106  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrState = eBTRMgrStateInitialized;
107  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrSFreq = eBTRMgrSFreq44_1K;
108  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrSFmt = eBTRMgrSFmt16bit;
109  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrAChan = eBTRMgrAChanStereo;
110  pstBtrMgrSiHdl->fpcBSiStatus = afpcBSiStatus;
111  pstBtrMgrSiHdl->pvcBUserData = apvUserData;
112 
113 
114  *phBTRMgrSiHdl = (tBTRMgrSiHdl)pstBtrMgrSiHdl;
115 
116  return leBtrMgrSiRet;
117 }
118 
119 
122  tBTRMgrSiHdl hBTRMgrSiHdl
123 ) {
124  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
125  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
126 
127 #ifdef USE_GST1
128  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
129 #endif
130 
131  if (pstBtrMgrSiHdl == NULL) {
132  return eBTRMgrNotInitialized;
133  }
134 
135 #ifdef USE_GST1
136  if ((leBtrMgrSiGstRet = BTRMgr_SI_GstDeInit(pstBtrMgrSiHdl->hBTRMgrSiGstHdl)) != eBTRMgrSIGstSuccess) {
137  BTRMGRLOG_ERROR("Return Status = %d\n", leBtrMgrSiGstRet);
138  leBtrMgrSiRet = eBTRMgrFailure;
139  }
140  pstBtrMgrSiHdl->hBTRMgrSiGstHdl = NULL;
141 #else
142  // TODO: Implement Stream out functionality using generic libraries
143 #endif
144 
145  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrState = eBTRMgrStateDeInitialized;
146 
147  g_free((void*)pstBtrMgrSiHdl);
148  pstBtrMgrSiHdl = NULL;
149 
150  return leBtrMgrSiRet;
151 }
152 
153 
156  tBTRMgrSiHdl hBTRMgrSiHdl
157 ) {
158  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
159  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
160 
161 #ifdef USE_GST1
162  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
163  (void)leBtrMgrSiGstRet;
164 #endif
165 
166  if (pstBtrMgrSiHdl == NULL) {
167  return eBTRMgrNotInitialized;
168  }
169 
170  return leBtrMgrSiRet;
171 }
172 
173 
176  tBTRMgrSiHdl hBTRMgrSiHdl
177 ) {
178  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
179  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
180 
181 #ifdef USE_GST1
182  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
183  (void)leBtrMgrSiGstRet;
184 #endif
185 
186  if (pstBtrMgrSiHdl == NULL) {
187  return eBTRMgrNotInitialized;
188  }
189 
190  return leBtrMgrSiRet;
191 }
192 
193 
196  tBTRMgrSiHdl hBTRMgrSiHdl,
197  stBTRMgrMediaStatus* apstBtrMgrSiStatus
198 ) {
199  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
200  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
201 
202 #ifdef USE_GST1
203  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
204  (void)leBtrMgrSiGstRet;
205 #endif
206 
207  if (pstBtrMgrSiHdl == NULL) {
208  return eBTRMgrNotInitialized;
209  }
210 
211  return leBtrMgrSiRet;
212 }
213 
214 
217  tBTRMgrSiHdl hBTRMgrSiHdl,
218  stBTRMgrMediaStatus* apstBtrMgrSiStatus
219 ) {
220  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
221  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
222 
223 #ifdef USE_GST1
224  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
225 #endif
226 
227  if (pstBtrMgrSiHdl == NULL) {
228  return eBTRMgrNotInitialized;
229  }
230 
231  if (apstBtrMgrSiStatus == NULL) {
232  return eBTRMgrFailInArg;
233  }
234 
235 
236 #ifdef USE_GST1
237  if (apstBtrMgrSiStatus->eBtrMgrState != eBTRMgrStateUnknown) {
238  //TODO: Figure out what to do at the lower layer
239  leBtrMgrSiRet = eBTRMgrFailure;
240  }
241 
242  if (apstBtrMgrSiStatus->eBtrMgrSFreq != eBTRMgrSFreqUnknown) {
243  //TODO: Figure out what to do at the lower layer
244  leBtrMgrSiRet = eBTRMgrFailure;
245  }
246 
247  if (apstBtrMgrSiStatus->eBtrMgrSFmt != eBTRMgrSFmtUnknown) {
248  //TODO: Figure out what to do at the lower layer
249  leBtrMgrSiRet = eBTRMgrFailure;
250  }
251 
252  if (apstBtrMgrSiStatus->eBtrMgrAChan != eBTRMgrAChanUnknown) {
253  //TODO: Figure out what to do at the lower layer
254  leBtrMgrSiRet = eBTRMgrFailure;
255  }
256 
257  if (apstBtrMgrSiStatus->ui8Volume != 255) {
258  if ((leBtrMgrSiGstRet = BTRMgr_SI_GstSetVolume(pstBtrMgrSiHdl->hBTRMgrSiGstHdl, apstBtrMgrSiStatus->ui8Volume)) != eBTRMgrSIGstSuccess) {
259  BTRMGRLOG_ERROR("Return Status = %d - Failed to set volume\n", leBtrMgrSiGstRet);
260  leBtrMgrSiRet = eBTRMgrFailure;
261  }
262  }
263 #else
264  // TODO: Implement Stream out functionality using generic libraries
265 #endif
266 
267  return leBtrMgrSiRet;
268 }
269 
270 
273  tBTRMgrSiHdl hBTRMgrSiHdl,
274  int aiInBufMaxSize,
275  stBTRMgrInASettings* apstBtrMgrSiInASettings
276 ) {
277  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
278  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
279 
280  eBTRMgrAChan leBtrMgrSiInAChan = eBTRMgrAChanUnknown;
281  eBTRMgrSFreq leBtrMgrSiInSFreq = eBTRMgrSFreqUnknown;
282 
283  const char* lpcBtrMgrInSiAChanMode = NULL;
284  unsigned int lui32BtrMgrInSiAChan= 0;
285  unsigned int lui32BtrMgrInSiSFreq= 0;
286 
287  unsigned char lui8SbcAllocMethod = 0;
288  unsigned char lui8SbcSubbands = 0;
289  unsigned char lui8SbcBlockLength = 0;
290  unsigned char lui8SbcMinBitpool = 0;
291  unsigned char lui8SbcMaxBitpool = 0;
292 
293  unsigned char lui8MpegCrc = 0;
294  unsigned char lui8MpegLayer = 0;
295  unsigned char lui8MpegMpf = 0;
296  unsigned char lui8MpegRfa = 0;
297  unsigned short lui16MpegBitrate = 0;
298 
299 #ifdef USE_GST1
300  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
301  const char* lpcAudioInType = NULL;
302 #endif
303 
304 
305  if (pstBtrMgrSiHdl == NULL) {
306  return eBTRMgrNotInitialized;
307  }
308 
309  if ((apstBtrMgrSiInASettings == NULL) || (apstBtrMgrSiInASettings->pstBtrMgrInCodecInfo == NULL)) {
310  return eBTRMgrFailInArg;
311  }
312 
313 
314  if (apstBtrMgrSiInASettings->eBtrMgrInAType == eBTRMgrATypeSBC) {
315  stBTRMgrSBCInfo* pstBtrMgrSiInSbcInfo = (stBTRMgrSBCInfo*)(apstBtrMgrSiInASettings->pstBtrMgrInCodecInfo);
316 
317  leBtrMgrSiInAChan = pstBtrMgrSiInSbcInfo->eBtrMgrSbcAChan;
318  leBtrMgrSiInSFreq = pstBtrMgrSiInSbcInfo->eBtrMgrSbcSFreq;
319  lui8SbcAllocMethod = pstBtrMgrSiInSbcInfo->ui8SbcAllocMethod;
320  lui8SbcSubbands = pstBtrMgrSiInSbcInfo->ui8SbcSubbands;
321  lui8SbcBlockLength = pstBtrMgrSiInSbcInfo->ui8SbcBlockLength;
322  lui8SbcMinBitpool = pstBtrMgrSiInSbcInfo->ui8SbcMinBitpool;
323  lui8SbcMaxBitpool = pstBtrMgrSiInSbcInfo->ui8SbcMaxBitpool;
324 
325  lpcAudioInType = BTRMGR_AUDIO_INPUT_TYPE_SBC;
326 
327  (void)lui8SbcAllocMethod;
328  (void)lui8SbcSubbands;
329  (void)lui8SbcBlockLength;
330  (void)lui8SbcMinBitpool;
331  (void)lui8SbcMaxBitpool;
332  }
333  else if (apstBtrMgrSiInASettings->eBtrMgrInAType == eBTRMgrATypeAAC) {
334  stBTRMgrMPEGInfo* pstBtrMgrSiInAacInfo = (stBTRMgrMPEGInfo*)(apstBtrMgrSiInASettings->pstBtrMgrInCodecInfo);
335 
336  leBtrMgrSiInAChan = pstBtrMgrSiInAacInfo->eBtrMgrMpegAChan;
337  leBtrMgrSiInSFreq = pstBtrMgrSiInAacInfo->eBtrMgrMpegSFreq;
338  lui8MpegCrc = pstBtrMgrSiInAacInfo->ui8MpegCrc;
339  lui8MpegLayer = pstBtrMgrSiInAacInfo->ui8MpegLayer;
340  lui8MpegMpf = pstBtrMgrSiInAacInfo->ui8MpegMpf;
341  lui8MpegRfa = pstBtrMgrSiInAacInfo->ui8MpegRfa;
342  lui16MpegBitrate = pstBtrMgrSiInAacInfo->ui16MpegBitrate;
343 
344  lpcAudioInType = BTRMGR_AUDIO_INPUT_TYPE_AAC;
345 
346  (void)lui8MpegCrc;
347  (void)lui8MpegLayer;
348  (void)lui8MpegMpf;
349  (void)lui8MpegRfa;
350  (void)lui16MpegBitrate;
351  }
352 
353 
354  switch (leBtrMgrSiInAChan) {
355  case eBTRMgrAChanMono:
356  lui32BtrMgrInSiAChan = 1;
357  lpcBtrMgrInSiAChanMode = BTRMGR_AUDIO_CHANNELMODE_MONO;
358  break;
359  case eBTRMgrAChanDualChannel:
360  lui32BtrMgrInSiAChan = 2;
361  lpcBtrMgrInSiAChanMode = BTRMGR_AUDIO_CHANNELMODE_DUAL;
362  break;
363  case eBTRMgrAChanStereo:
364  lui32BtrMgrInSiAChan = 2;
365  lpcBtrMgrInSiAChanMode = BTRMGR_AUDIO_CHANNELMODE_STEREO;
366  break;
367  case eBTRMgrAChanJStereo:
368  lui32BtrMgrInSiAChan = 2;
369  lpcBtrMgrInSiAChanMode = BTRMGR_AUDIO_CHANNELMODE_JSTEREO;
370  break;
371  case eBTRMgrAChan5_1:
372  lui32BtrMgrInSiAChan = 6;
373  break;
374  case eBTRMgrAChan7_1:
375  lui32BtrMgrInSiAChan = 8;
376  break;
377  case eBTRMgrAChanUnknown:
378  default:
379  lui32BtrMgrInSiAChan = 2;
380  lpcBtrMgrInSiAChanMode = BTRMGR_AUDIO_CHANNELMODE_STEREO;
381  break;
382  }
383 
384  (void)lui32BtrMgrInSiAChan;
385  (void)lpcBtrMgrInSiAChanMode;
386 
387 
388  switch (leBtrMgrSiInSFreq) {
389  case eBTRMgrSFreq8K:
390  lui32BtrMgrInSiSFreq = 8000;
391  break; //CID:23359 - missing break
392  case eBTRMgrSFreq16K:
393  lui32BtrMgrInSiSFreq = 16000;
394  break;
395  case eBTRMgrSFreq32K:
396  lui32BtrMgrInSiSFreq = 32000;
397  break;
398  case eBTRMgrSFreq44_1K:
399  lui32BtrMgrInSiSFreq = 44100;
400  break;
401  case eBTRMgrSFreq48K:
402  lui32BtrMgrInSiSFreq = 48000;
403  break;
404  case eBTRMgrSFreqUnknown:
405  default:
406  lui32BtrMgrInSiSFreq = 48000;
407  break;
408  }
409 
410 
411 #ifdef USE_GST1
412  if ((leBtrMgrSiGstRet = BTRMgr_SI_GstStart (pstBtrMgrSiHdl->hBTRMgrSiGstHdl,
413  aiInBufMaxSize,
414  apstBtrMgrSiInASettings->i32BtrMgrDevFd,
415  apstBtrMgrSiInASettings->i32BtrMgrDevMtu,
416  lui32BtrMgrInSiSFreq,
417  lpcAudioInType)) != eBTRMgrSIGstSuccess) {
418  BTRMGRLOG_ERROR("Return Status = %d\n", leBtrMgrSiGstRet);
419  leBtrMgrSiRet = eBTRMgrFailure;
420  }
421 #else
422  // TODO: Implement Stream out functionality using generic libraries
423 #endif
424 
425  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrState = eBTRMgrStatePlaying;
426  pstBtrMgrSiHdl->lstBtrMgrSiStatus.ui32OverFlowCnt = 0;
427  pstBtrMgrSiHdl->lstBtrMgrSiStatus.ui32UnderFlowCnt= 0;
428 
429  return leBtrMgrSiRet;
430 }
431 
432 
435  tBTRMgrSiHdl hBTRMgrSiHdl
436 ) {
437  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
438  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
439 
440 #ifdef USE_GST1
441  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
442 #endif
443 
444  if (pstBtrMgrSiHdl == NULL) {
445  return eBTRMgrNotInitialized;
446  }
447 
448 #ifdef USE_GST1
449  if ((leBtrMgrSiGstRet = BTRMgr_SI_GstStop(pstBtrMgrSiHdl->hBTRMgrSiGstHdl)) != eBTRMgrSIGstSuccess) {
450  BTRMGRLOG_ERROR("Return Status = %d\n", leBtrMgrSiGstRet);
451  leBtrMgrSiRet = eBTRMgrFailure;
452  }
453 #else
454  // TODO: Implement Stream out functionality using generic libraries
455 #endif
456 
457  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrState = eBTRMgrStateStopped;
458  pstBtrMgrSiHdl->lstBtrMgrSiStatus.ui32OverFlowCnt = 0;
459  pstBtrMgrSiHdl->lstBtrMgrSiStatus.ui32UnderFlowCnt= 0;
460 
461  return leBtrMgrSiRet;
462 }
463 
464 
467  tBTRMgrSiHdl hBTRMgrSiHdl
468 ) {
469  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
470  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
471 
472 #ifdef USE_GST1
473  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
474 #endif
475 
476  if (pstBtrMgrSiHdl == NULL) {
477  return eBTRMgrNotInitialized;
478  }
479 
480 #ifdef USE_GST1
481  if ((leBtrMgrSiGstRet = BTRMgr_SI_GstPause(pstBtrMgrSiHdl->hBTRMgrSiGstHdl)) != eBTRMgrSIGstSuccess) {
482  BTRMGRLOG_ERROR("Return Status = %d\n", leBtrMgrSiGstRet);
483  leBtrMgrSiRet = eBTRMgrFailure;
484  }
485 #else
486  // TODO: Implement Stream out functionality using generic libraries
487 #endif
488 
489  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrState = eBTRMgrStatePaused;
490 
491  return leBtrMgrSiRet;
492 }
493 
494 
497  tBTRMgrSiHdl hBTRMgrSiHdl
498 ) {
499  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
500  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
501 
502 #ifdef USE_GST1
503  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
504 #endif
505 
506  if (pstBtrMgrSiHdl == NULL) {
507  return eBTRMgrNotInitialized;
508  }
509 
510 #ifdef USE_GST1
511  if ((leBtrMgrSiGstRet = BTRMgr_SI_GstResume(pstBtrMgrSiHdl->hBTRMgrSiGstHdl)) != eBTRMgrSIGstSuccess) {
512  BTRMGRLOG_ERROR("Return Status = %d\n", leBtrMgrSiGstRet);
513  leBtrMgrSiRet = eBTRMgrFailure;
514  }
515 #else
516  // TODO: Implement Stream out functionality using generic libraries
517 #endif
518 
519  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrState = eBTRMgrStatePlaying;
520 
521  return leBtrMgrSiRet;
522 }
523 
524 
527  tBTRMgrSiHdl hBTRMgrSiHdl,
528  char* pcInBuf,
529  int aiInBufSize
530 ) {
531  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
532  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
533 
534 #ifdef USE_GST1
535  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
536 #endif
537 
538  if (pstBtrMgrSiHdl == NULL) {
539  return eBTRMgrNotInitialized;
540  }
541 
542  //TODO: Implement ping-pong/triple/circular buffering if needed
543 #ifdef USE_GST1
544  if ((leBtrMgrSiGstRet = BTRMgr_SI_GstSendBuffer(pstBtrMgrSiHdl->hBTRMgrSiGstHdl, pcInBuf, aiInBufSize)) != eBTRMgrSIGstSuccess) {
545  BTRMGRLOG_ERROR("Return Status = %d\n", leBtrMgrSiGstRet);
546  leBtrMgrSiRet = eBTRMgrFailure;
547  }
548 #else
549  // TODO: Implement Stream out functionality using generic libraries
550 #endif
551 
552  return leBtrMgrSiRet;
553 }
554 
555 
558  tBTRMgrSiHdl hBTRMgrSiHdl
559 ) {
560  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
561  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)hBTRMgrSiHdl;
562 
563 #ifdef USE_GST1
564  eBTRMgrSIGstRet leBtrMgrSiGstRet = eBTRMgrSIGstSuccess;
565 #endif
566 
567  if (pstBtrMgrSiHdl == NULL) {
568  return eBTRMgrNotInitialized;
569  }
570 
571 #ifdef USE_GST1
572  if ((leBtrMgrSiGstRet = BTRMgr_SI_GstSendEOS(pstBtrMgrSiHdl->hBTRMgrSiGstHdl)) != eBTRMgrSIGstSuccess) {
573  BTRMGRLOG_ERROR("Return Status = %d\n", leBtrMgrSiGstRet);
574  leBtrMgrSiRet = eBTRMgrFailure;
575  }
576 #else
577  // TODO: Implement Stream out functionality using generic libraries
578 #endif
579 
580  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrState = eBTRMgrStateCompleted;
581 
582  return leBtrMgrSiRet;
583 }
584 
585 
586 // Outgoing callbacks Registration Interfaces
587 
588 /* Incoming Callbacks Definitions */
589 #ifdef USE_GST1
590 static eBTRMgrSIGstRet
591 btrMgr_SI_GstStatusCb (
592  eBTRMgrSIGstStatus aeBtrMgrSiGstStatus,
593  void* apvUserData
594 ) {
595  stBTRMgrSIHdl* pstBtrMgrSiHdl = (stBTRMgrSIHdl*)apvUserData;
596  eBTRMgrRet leBtrMgrSiRet = eBTRMgrSuccess;
597  gboolean bTriggerCb = FALSE;
598 
599  if (pstBtrMgrSiHdl) {
600 
601  switch (aeBtrMgrSiGstStatus) {
602  case eBTRMgrSIGstStInitialized:
603  case eBTRMgrSIGstStDeInitialized:
604  case eBTRMgrSIGstStPaused:
605  case eBTRMgrSIGstStPlaying:
606  break;
607  case eBTRMgrSIGstStUnderflow:
608  pstBtrMgrSiHdl->lstBtrMgrSiStatus.ui32UnderFlowCnt++;
609  break;
610  case eBTRMgrSIGstStOverflow:
611  pstBtrMgrSiHdl->lstBtrMgrSiStatus.ui32OverFlowCnt++;
612  break;
613  case eBTRMgrSIGstStCompleted:
614  case eBTRMgrSIGstStStopped:
615  break;
616  case eBTRMgrSIGstStWarning:
617  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrState = eBTRMgrStateWarning;
618  bTriggerCb = TRUE;
619  break;
620  case eBTRMgrSIGstStError:
621  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrState = eBTRMgrStateError;
622  bTriggerCb = TRUE;
623  break;
624  case eBTRMgrSIGstStUnknown:
625  default:
626  pstBtrMgrSiHdl->lstBtrMgrSiStatus.eBtrMgrState = eBTRMgrStateUnknown;
627  break;
628  }
629 
630  //TODO: Move to a local static function, which, if possible, can trigger the callback in the context
631  // of a task thread.
632  if ((pstBtrMgrSiHdl->fpcBSiStatus) && (bTriggerCb == TRUE)) {
633  stBTRMgrMediaStatus lstBtrMgrSiMediaStatus;
634 
635  memcpy (&lstBtrMgrSiMediaStatus, &(pstBtrMgrSiHdl->lstBtrMgrSiStatus), sizeof(stBTRMgrMediaStatus));
636 
637  leBtrMgrSiRet = pstBtrMgrSiHdl->fpcBSiStatus(&lstBtrMgrSiMediaStatus, pstBtrMgrSiHdl->pvcBUserData);
638  BTRMGRLOG_TRACE("Return Status = %d\n", leBtrMgrSiRet);
639  }
640  }
641 
642  return eBTRMgrSIGstSuccess;
643 }
644 #endif
_stBTRMgrSBCInfo::eBtrMgrSbcSFreq
eBTRMgrSFreq eBtrMgrSbcSFreq
frequency
Definition: btrMgr_mediaTypes.h:115
_stBTRMgrSBCInfo
Represents the Subband coding (SBC) audio codec information.
Definition: btrMgr_mediaTypes.h:114
_stBTRMgrMPEGInfo::ui16MpegBitrate
unsigned short ui16MpegBitrate
bitrate
Definition: btrMgr_mediaTypes.h:136
btrMgr_Types.h
BTRMgr_SI_Start
eBTRMgrRet BTRMgr_SI_Start(tBTRMgrSiHdl hBTRMgrSiHdl, int aiInBufMaxSize, stBTRMgrInASettings *apstBtrMgrSiInASettings)
This API uses BTRMgr_SI_GstStart(), starts the pipeline.
Definition: btrMgr_streamIn.c:272
BTRMgr_SI_GstInit
eBTRMgrSIGstRet BTRMgr_SI_GstInit(tBTRMgrSiGstHdl *phBTRMgrSiGstHdl, fPtr_BTRMgr_SI_GstStatusCb afpcBSiGstStatus, void *apvUserData)
This API initializes the streaming interface.
Definition: btrMgr_streamInGst.c:257
btrMgr_mediaTypes.h
_stBTRMgrMPEGInfo::ui8MpegMpf
unsigned char ui8MpegMpf
mpf
Definition: btrMgr_mediaTypes.h:134
_stBTRMgrInASettings
Represents the audio input settings.
Definition: btrMgr_mediaTypes.h:142
BTRMgr_SI_GstStart
eBTRMgrSIGstRet BTRMgr_SI_GstStart(tBTRMgrSiGstHdl hBTRMgrSiGstHdl, int aiInBufMaxSize, int aiBTDevFd, int aiBTDevMTU, unsigned int aiBTDevSFreq, const char *apcAudioInType)
This API starts the playback and listens to the events associated with it.
Definition: btrMgr_streamInGst.c:485
BTRMgr_SI_Init
eBTRMgrRet BTRMgr_SI_Init(tBTRMgrSiHdl *phBTRMgrSiHdl, fPtr_BTRMgr_SI_StatusCb afpcBSiStatus, void *apvUserData)
This API invokes BTRMgr_SI_GstInit() for the stream in initializations.
Definition: btrMgr_streamIn.c:75
_stBTRMgrSBCInfo::ui8SbcSubbands
unsigned char ui8SbcSubbands
subbands
Definition: btrMgr_mediaTypes.h:118
_stBTRMgrMPEGInfo::ui8MpegLayer
unsigned char ui8MpegLayer
layer
Definition: btrMgr_mediaTypes.h:133
btrMgr_streamIn.h
_stBTRMgrSIHdl
Definition: btrMgr_streamIn.c:49
BTRMgr_SI_GstSetVolume
eBTRMgrSIGstRet BTRMgr_SI_GstSetVolume(tBTRMgrSiGstHdl hBTRMgrSiGstHdl, unsigned char ui8Volume)
This API resumes the current operation and listens to the events.
Definition: btrMgr_streamInGst.c:673
_stBTRMgrSBCInfo::ui8SbcAllocMethod
unsigned char ui8SbcAllocMethod
allocation_method
Definition: btrMgr_mediaTypes.h:117
BTRMgr_SI_GstSendBuffer
eBTRMgrSIGstRet BTRMgr_SI_GstSendBuffer(tBTRMgrSiGstHdl hBTRMgrSiGstHdl, char *pcInBuf, int aiInBufSize)
This API pushes the buffer to the queue.
Definition: btrMgr_streamInGst.c:698
BTRMgr_SI_GetStatus
eBTRMgrRet BTRMgr_SI_GetStatus(tBTRMgrSiHdl hBTRMgrSiHdl, stBTRMgrMediaStatus *apstBtrMgrSiStatus)
This API will fetch the current settings used by this interface.
Definition: btrMgr_streamIn.c:195
_stBTRMgrMediaStatus
Represents the media file status.
Definition: btrMgr_mediaTypes.h:165
BTRMgr_SI_Stop
eBTRMgrRet BTRMgr_SI_Stop(tBTRMgrSiHdl hBTRMgrSiHdl)
This API uses BTRMgr_SI_GstStop() for closing the pipeline.
Definition: btrMgr_streamIn.c:434
BTRMgr_SI_GstDeInit
eBTRMgrSIGstRet BTRMgr_SI_GstDeInit(tBTRMgrSiGstHdl hBTRMgrSiGstHdl)
This API performs the cleanup operations.
Definition: btrMgr_streamInGst.c:410
_stBTRMgrMPEGInfo::ui8MpegRfa
unsigned char ui8MpegRfa
rfa
Definition: btrMgr_mediaTypes.h:135
BTRMgr_SI_Pause
eBTRMgrRet BTRMgr_SI_Pause(tBTRMgrSiHdl hBTRMgrSiHdl)
This API uses BTRMgr_SI_GstPause() for pausing the current operation.
Definition: btrMgr_streamIn.c:466
BTRMgr_SI_GetCurrentSettings
eBTRMgrRet BTRMgr_SI_GetCurrentSettings(tBTRMgrSiHdl hBTRMgrSiHdl)
This API will fetch the current settings used by this interface.
Definition: btrMgr_streamIn.c:175
BTRMgr_SI_SetStatus
eBTRMgrRet BTRMgr_SI_SetStatus(tBTRMgrSiHdl hBTRMgrSiHdl, stBTRMgrMediaStatus *apstBtrMgrSiStatus)
This API will set the current settings used by this interface.
Definition: btrMgr_streamIn.c:216
BTRMgr_SI_GstSendEOS
eBTRMgrSIGstRet BTRMgr_SI_GstSendEOS(tBTRMgrSiGstHdl hBTRMgrSiGstHdl)
This API is used to push EOS(End of Stream) to the queue.
Definition: btrMgr_streamInGst.c:751
BTRMgr_SI_GetDefaultSettings
eBTRMgrRet BTRMgr_SI_GetDefaultSettings(tBTRMgrSiHdl hBTRMgrSiHdl)
This API is used to load the default settings used by this interface.
Definition: btrMgr_streamIn.c:155
eBTRMgrSFreq
enum _eBTRMgrSFreq eBTRMgrSFreq
Represents the frequency supported.
eBTRMgrRet
enum _eBTRMgrRet eBTRMgrRet
Represents the bluetooth manager return values.
BTRMgr_SI_GstStop
eBTRMgrSIGstRet BTRMgr_SI_GstStop(tBTRMgrSiGstHdl hBTRMgrSiGstHdl)
This API stops the current playback and sets the state as NULL.
Definition: btrMgr_streamInGst.c:562
BTRMgr_SI_SendEOS
eBTRMgrRet BTRMgr_SI_SendEOS(tBTRMgrSiHdl hBTRMgrSiHdl)
This API is used to indicate the End of stream.
Definition: btrMgr_streamIn.c:557
eBTRMgrAChan
enum _eBTRMgrAChan eBTRMgrAChan
Represents the Audio channel supported.
BTRMgr_SI_GstResume
eBTRMgrSIGstRet BTRMgr_SI_GstResume(tBTRMgrSiGstHdl hBTRMgrSiGstHdl)
This API resumes the current operation and listens to the events.
Definition: btrMgr_streamInGst.c:635
_stBTRMgrSBCInfo::ui8SbcMaxBitpool
unsigned char ui8SbcMaxBitpool
max_bitpool
Definition: btrMgr_mediaTypes.h:121
_stBTRMgrSBCInfo::ui8SbcBlockLength
unsigned char ui8SbcBlockLength
block_length
Definition: btrMgr_mediaTypes.h:119
BTRMgr_SI_Resume
eBTRMgrRet BTRMgr_SI_Resume(tBTRMgrSiHdl hBTRMgrSiHdl)
This API uses BTRMgr_SI_GstResume() to resume the status.
Definition: btrMgr_streamIn.c:496
BTRMgr_SI_GstPause
eBTRMgrSIGstRet BTRMgr_SI_GstPause(tBTRMgrSiGstHdl hBTRMgrSiGstHdl)
This API pauses the current playback and listens to the events.
Definition: btrMgr_streamInGst.c:597
_stBTRMgrMPEGInfo
Represents the MPEG codec details.
Definition: btrMgr_mediaTypes.h:129
_stBTRMgrSBCInfo::ui8SbcMinBitpool
unsigned char ui8SbcMinBitpool
min_bitpool
Definition: btrMgr_mediaTypes.h:120
_stBTRMgrSBCInfo::eBtrMgrSbcAChan
eBTRMgrAChan eBtrMgrSbcAChan
channel_mode
Definition: btrMgr_mediaTypes.h:116
_stBTRMgrMPEGInfo::eBtrMgrMpegSFreq
eBTRMgrSFreq eBtrMgrMpegSFreq
frequency
Definition: btrMgr_mediaTypes.h:130
BTRMgr_SI_DeInit
eBTRMgrRet BTRMgr_SI_DeInit(tBTRMgrSiHdl hBTRMgrSiHdl)
This API invokes BTRMgr_SI_GstDeInit() for the deinitializations.
Definition: btrMgr_streamIn.c:121
BTRMgr_SI_SendBuffer
eBTRMgrRet BTRMgr_SI_SendBuffer(tBTRMgrSiHdl hBTRMgrSiHdl, char *pcInBuf, int aiInBufSize)
Invokes BTRMgr_SI_GstSendBuffer() to add the buffer to the queue.
Definition: btrMgr_streamIn.c:526
_stBTRMgrMPEGInfo::eBtrMgrMpegAChan
eBTRMgrAChan eBtrMgrMpegAChan
channel_mode
Definition: btrMgr_mediaTypes.h:131
_stBTRMgrMPEGInfo::ui8MpegCrc
unsigned char ui8MpegCrc
crc
Definition: btrMgr_mediaTypes.h:132
TRUE
#define TRUE
Defines for TRUE/FALSE/ENABLE flags.
Definition: wifi_common_hal.h:199
btrMgr_streamInGst.h