source: svn/newcon3bcm2_21bu/nexus/modules/audio/7552/src/nexus_i2s_output.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 27.9 KB
Line 
1/***************************************************************************
2*     (c)2004-2011 Broadcom Corporation
3*
4*  This program is the proprietary software of Broadcom Corporation and/or its licensors,
5*  and may only be used, duplicated, modified or distributed pursuant to the terms and
6*  conditions of a separate, written license agreement executed between you and Broadcom
7*  (an "Authorized License").  Except as set forth in an Authorized License, Broadcom grants
8*  no license (express or implied), right to use, or waiver of any kind with respect to the
9*  Software, and Broadcom expressly reserves all rights in and to the Software and all
10*  intellectual property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU
11*  HAVE NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY
12*  NOTIFY BROADCOM AND DISCONTINUE ALL USE OF THE SOFTWARE.
13*
14*  Except as expressly set forth in the Authorized License,
15*
16*  1.     This program, including its structure, sequence and organization, constitutes the valuable trade
17*  secrets of Broadcom, and you shall use all reasonable efforts to protect the confidentiality thereof,
18*  and to use this information only in connection with your use of Broadcom integrated circuit products.
19*
20*  2.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
21*  AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
22*  WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
23*  THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND ALL IMPLIED WARRANTIES
24*  OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE,
25*  LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION
26*  OR CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF
27*  USE OR PERFORMANCE OF THE SOFTWARE.
28*
29*  3.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR ITS
30*  LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL, INDIRECT, OR
31*  EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY WAY RELATING TO YOUR
32*  USE OF OR INABILITY TO USE THE SOFTWARE EVEN IF BROADCOM HAS BEEN ADVISED OF
33*  THE POSSIBILITY OF SUCH DAMAGES; OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT
34*  ACTUALLY PAID FOR THE SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE
35*  LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF
36*  ANY LIMITED REMEDY.
37*
38* $brcm_Workfile: nexus_i2s_output.c $
39* $brcm_Revision: 9 $
40* $brcm_Date: 8/31/11 4:33p $
41*
42* API Description:
43*   API name: I2sOutput
44*    Specific APIs related to I2S audio outputs.
45*
46* Revision History:
47*
48* $brcm_Log: /nexus/modules/audio/7422/src/nexus_i2s_output.c $
49*
50* 9   8/31/11 4:33p jgarrett
51* SWDTV-8467: Removing connector re-initialization on GetConnector()
52*  call, switched default to stereo mode for DTV systems
53*
54* 8   8/18/11 5:51p jgarrett
55* SWDTV-6306: Merge DTV APE changes to main branch
56*
57* Nexus_APE_Integration/1   7/8/11 6:40p jgarrett
58* SWDTV-6760: Adding I2sMultiOutput
59*                                                                                                   
60* 7   7/6/11 6:41p jgarrett
61* SW7552-55: Mapping channelMode to stereoMode
62*
63* 6   5/25/11 5:16p jgarrett
64* SW7425-408: Adding BDBG_OBJECT to input/output types and MS11 features
65*
66* 5   4/26/11 11:35a jgarrett
67* SW7425-437: Resolving kernel mode shutdown issues
68*
69* 4   2/22/11 5:44p jgarrett
70* SW7422-146: Implemented type renaming based on filter graph review
71*  comments
72*
73* 3   1/31/11 6:46p gskerl
74* SW7422-146:Removed references to BAPE_I2sOutputSettings.mclkRate.
75*
76* 2   1/18/11 5:14p gskerl
77* SW7422-146:Updated to support APE API.
78*
79* 1   12/17/10 3:56p jgarrett
80* SW7422-146: Adding initial nexus on APE for 7422
81*
82***************************************************************************/
83
84#include "nexus_audio_module.h"
85#include "priv/nexus_core_audio.h"
86
87BDBG_MODULE(nexus_i2s_output);
88
89#if NEXUS_NUM_I2S_OUTPUTS || NEXUS_NUM_I2S_MULTI_OUTPUTS
90/***************************************************************************
91Summary:
92    Move and convert fields from a NEXUS_I2sOutputSettings struct to a
93    BAPE_I2sOutputSettings struct.
94See Also:
95    NEXUS_I2sOutput_P_ConvertSettingsFromBape
96 ***************************************************************************/
97static NEXUS_Error NEXUS_I2sOutput_P_ConvertSettingsToBape(
98    BAPE_I2sOutputSettings  *pBapeSettings,
99    const NEXUS_I2sOutputSettings *pSettings
100    )
101{
102    NEXUS_Error errCode;
103
104    switch ( pSettings->lsbAtLRClock )
105    {
106    case false:
107        pBapeSettings->justification = BAPE_I2sJustification_eMsbFirst;
108        break;
109    default:
110    case true:
111        pBapeSettings->justification = BAPE_I2sJustification_eLsbFirst;
112        break;
113    }
114
115    switch ( pSettings->alignedToLRClock )
116    {
117    case false:
118        pBapeSettings->dataAlignment = BAPE_I2sDataAlignment_eDelayed;
119        break;
120    default:
121    case true:
122        pBapeSettings->dataAlignment = BAPE_I2sDataAlignment_eAligned;
123        break;
124    }
125
126    switch ( pSettings->lrClkPolarity )
127    {
128    case false:
129        pBapeSettings->lrPolarity = BAPE_I2sLRClockPolarity_eLeftLow;
130        break;
131    default:
132    case true:
133        pBapeSettings->lrPolarity = BAPE_I2sLRClockPolarity_eLeftHigh;
134        break;
135    }
136
137    switch ( pSettings->sclkRate )
138    {
139    case NEXUS_I2sOutputSclkRate_e64Fs:
140        pBapeSettings->sclkRate = BAPE_SclkRate_e64Fs;
141        break;
142    case NEXUS_I2sOutputSclkRate_e128Fs:
143        pBapeSettings->sclkRate = BAPE_SclkRate_e128Fs;
144        break;
145    default:
146        BDBG_ERR(("NEXUS_I2sOutputSettings.sclkRate:%d is invalid", pSettings->sclkRate));
147        errCode = BERR_TRACE(BERR_INVALID_PARAMETER);
148        return errCode;
149    }
150
151    if ( NEXUS_I2sOutputMclkRate_eAuto !=  pSettings->mclkRate )
152    {
153        BDBG_ERR(("NEXUS_I2sOutputSettings.mclkRate:%d is invalid. Must be set to NEXUS_I2sOutputMclkRate_eAuto ", pSettings->mclkRate));
154        errCode = BERR_TRACE(BERR_INVALID_PARAMETER);
155        return errCode;
156    }
157
158    return NEXUS_SUCCESS;
159}
160
161/***************************************************************************
162Summary:
163    Move and convert fields from a NEXUS_I2sOutputSettings struct to a
164    BAPE_I2sOutputSettings struct.
165See Also:
166    NEXUS_I2sOutput_P_ConvertSettingsToBape
167 ***************************************************************************/
168static NEXUS_Error NEXUS_I2sOutput_P_ConvertSettingsFromBape(
169    NEXUS_I2sOutputSettings *pSettings,
170    BAPE_I2sOutputSettings  *pBapeSettings
171    )
172{
173    switch ( pBapeSettings->justification )
174    {
175    default:
176    case BAPE_I2sJustification_eMsbFirst:
177        pSettings->lsbAtLRClock = false;
178        break;
179    case BAPE_I2sJustification_eLsbFirst:
180        pSettings->lsbAtLRClock = true;
181        break;
182    }
183
184    switch ( pBapeSettings->dataAlignment )
185    {
186    default:
187    case BAPE_I2sDataAlignment_eDelayed:
188        pSettings->alignedToLRClock = false;
189        break;
190    case BAPE_I2sDataAlignment_eAligned:
191        pSettings->alignedToLRClock = true;
192        break;
193    }
194
195    switch ( pBapeSettings->lrPolarity )
196    {
197    default:
198    case BAPE_I2sLRClockPolarity_eLeftLow:
199        pSettings->lrClkPolarity = false;
200        break;
201    case BAPE_I2sLRClockPolarity_eLeftHigh:
202        pSettings->lrClkPolarity = true;
203        break;
204    }
205
206    switch ( pBapeSettings->sclkRate )
207    {
208    default:
209    case BAPE_SclkRate_e64Fs:
210        pSettings->sclkRate = NEXUS_I2sOutputSclkRate_e64Fs;
211        break;
212    case BAPE_SclkRate_e128Fs:
213        pSettings->sclkRate = NEXUS_I2sOutputSclkRate_e128Fs;
214        break;
215    }
216
217    /* BAPE doesn't expose this, just set it to Auto.  */
218    pSettings->mclkRate = NEXUS_I2sOutputMclkRate_eAuto;
219
220    return NEXUS_SUCCESS;
221}
222#endif
223
224#if NEXUS_NUM_I2S_OUTPUTS
225BDBG_OBJECT_ID(NEXUS_I2sOutput);
226
227typedef struct NEXUS_I2sOutput
228{
229    BDBG_OBJECT(NEXUS_I2sOutput)
230    bool opened;
231    BAPE_I2sOutputHandle handle;
232    NEXUS_I2sOutputSettings settings;
233    NEXUS_AudioOutputObject connector;
234} NEXUS_I2sOutput;
235
236static NEXUS_I2sOutput g_i2sOutputs[NEXUS_NUM_I2S_OUTPUTS];
237
238static NEXUS_Error NEXUS_I2sOutput_P_SetChannelMode(void *pHandle, NEXUS_AudioChannelMode channelMode);
239
240/***************************************************************************
241Summary:
242        Get default settings for an I2S output
243See Also:
244
245 ***************************************************************************/
246void NEXUS_I2sOutput_GetDefaultSettings(
247    NEXUS_I2sOutputSettings *pSettings   /* [out] default settings */
248    )
249{
250    BAPE_I2sOutputSettings bapeI2sOutputSettings;
251    NEXUS_Error errCode;
252
253    BDBG_ASSERT(NULL != pSettings);
254    BKNI_Memset(pSettings, 0, sizeof(*pSettings));
255
256    BAPE_I2sOutput_GetDefaultSettings(&bapeI2sOutputSettings);
257
258    errCode = NEXUS_I2sOutput_P_ConvertSettingsFromBape(pSettings, &bapeI2sOutputSettings);
259    BDBG_ASSERT(errCode == NEXUS_SUCCESS);  /* We should never get bad stuff from BAPE */
260}
261
262/***************************************************************************
263Summary:
264        Open an I2S Output device
265See Also:
266    NEXUS_I2sOutput_Close
267 ***************************************************************************/
268NEXUS_I2sOutputHandle NEXUS_I2sOutput_Open(
269    unsigned index,
270    const NEXUS_I2sOutputSettings *pSettings
271    )
272{
273    BAPE_I2sOutputHandle i2sHandle;
274    NEXUS_Error errCode;
275    BAPE_OutputPort connector;
276
277    if ( index >= NEXUS_NUM_I2S_OUTPUTS )
278    {
279        BDBG_ERR(("I2sOutput %u not supported on this chipset", index));
280        errCode = BERR_TRACE(BERR_INVALID_PARAMETER);
281        return NULL;
282    }
283
284    if ( g_i2sOutputs[index].opened )
285    {
286        BDBG_ERR(("I2sOutput %u is already open", index));
287        return NULL;
288    }
289
290    errCode = BAPE_I2sOutput_Open( NEXUS_AUDIO_DEVICE_HANDLE, index, NULL, &i2sHandle );
291    if ( errCode )
292    {
293        (void)BERR_TRACE(errCode);
294        return NULL;
295    }
296
297    g_i2sOutputs[index].opened = true;
298    /* Initialize connector */
299    g_i2sOutputs[index].handle = i2sHandle;
300    NEXUS_AUDIO_OUTPUT_INIT(&g_i2sOutputs[index].connector, NEXUS_AudioOutputType_eI2s, &g_i2sOutputs[index]);
301    g_i2sOutputs[index].connector.setChannelMode = NEXUS_I2sOutput_P_SetChannelMode;
302    BDBG_OBJECT_SET(&g_i2sOutputs[index], NEXUS_I2sOutput);
303    NEXUS_I2sOutput_SetSettings(&g_i2sOutputs[index], pSettings);
304
305    BAPE_I2sOutput_GetOutputPort(i2sHandle, &connector);
306    g_i2sOutputs[index].connector.port = (uint32_t)connector;
307
308    /* Success */
309    return &g_i2sOutputs[index];
310}
311
312/***************************************************************************
313Summary:
314        Close an I2S Output device
315See Also:
316    NEXUS_I2sOutput_Open
317 ***************************************************************************/
318void NEXUS_I2sOutput_Close(
319    NEXUS_I2sOutputHandle handle
320    )
321{
322    BDBG_OBJECT_ASSERT(handle, NEXUS_I2sOutput);
323
324    NEXUS_AudioOutput_Shutdown(&handle->connector);
325    BAPE_I2sOutput_Close(handle->handle);
326    /* This is equivalent to BDBG_OBJECT_UNSET and also clears other flags */
327    BKNI_Memset(handle, 0, sizeof(NEXUS_I2sOutput));
328}
329
330
331/***************************************************************************
332Summary:
333        Get settings for an I2S output
334See Also:
335        NEXUS_I2sOutput_SetSettings
336 ***************************************************************************/
337void NEXUS_I2sOutput_GetSettings(
338    NEXUS_I2sOutputHandle handle,
339    NEXUS_I2sOutputSettings *pSettings  /* [out] Settings */
340    )
341{
342    BDBG_OBJECT_ASSERT(handle, NEXUS_I2sOutput);
343    BDBG_ASSERT(NULL != pSettings);
344
345    *pSettings = handle->settings;
346}
347
348/***************************************************************************
349Summary:
350        Set settings for an I2S output
351See Also:
352        NEXUS_I2sOutput_GetSettings
353 ***************************************************************************/
354NEXUS_Error NEXUS_I2sOutput_SetSettings(
355    NEXUS_I2sOutputHandle handle,
356    const NEXUS_I2sOutputSettings *pSettings    /* [in] Settings */
357    )
358{
359    NEXUS_I2sOutputSettings settings;
360    BAPE_I2sOutputSettings bapeI2sSettings;
361    NEXUS_Error errCode;
362
363    /* Sanity Check */
364    BDBG_OBJECT_ASSERT(handle, NEXUS_I2sOutput);
365
366    if ( NULL == pSettings )
367    {
368        NEXUS_I2sOutput_GetDefaultSettings(&settings);
369        pSettings = &settings;
370    }
371    BAPE_I2sOutput_GetSettings(handle->handle, &bapeI2sSettings);
372
373    errCode = NEXUS_I2sOutput_P_ConvertSettingsToBape(&bapeI2sSettings, pSettings);
374    if (errCode)
375    {
376        return BERR_TRACE(errCode);
377    }
378
379    errCode = BAPE_I2sOutput_SetSettings(handle->handle, &bapeI2sSettings);
380    if (errCode)
381    {
382        return BERR_TRACE(errCode);
383    }
384
385    handle->settings = *pSettings;
386
387    /* success */
388    return BERR_SUCCESS;
389}
390
391/***************************************************************************
392Summary:
393    Get the audio connector for an I2S output
394See Also:
395
396 ***************************************************************************/
397NEXUS_AudioOutput NEXUS_I2sOutput_GetConnector(
398    NEXUS_I2sOutputHandle handle
399    )
400{
401    BDBG_OBJECT_ASSERT(handle, NEXUS_I2sOutput);
402    return &handle->connector;
403}
404
405static NEXUS_Error NEXUS_I2sOutput_P_SetChannelMode(void *pHandle, NEXUS_AudioChannelMode channelMode)
406{
407    BERR_Code errCode;
408    BAPE_I2sOutputSettings i2sOutputSettings;
409
410    NEXUS_I2sOutputHandle handle = (NEXUS_I2sOutputHandle) pHandle;
411    BDBG_OBJECT_ASSERT(handle, NEXUS_I2sOutput);
412   
413    BAPE_I2sOutput_GetSettings(handle->handle, &i2sOutputSettings);
414    switch ( channelMode )
415    {
416    default:
417    case NEXUS_AudioChannelMode_eStereo:
418        i2sOutputSettings.stereoMode = BAPE_StereoMode_eLeftRight;
419        break;
420    case NEXUS_AudioChannelMode_eLeft:
421        i2sOutputSettings.stereoMode = BAPE_StereoMode_eLeftLeft;
422        break;
423    case NEXUS_AudioChannelMode_eRight:
424        i2sOutputSettings.stereoMode = BAPE_StereoMode_eRightRight;
425        break;
426    case NEXUS_AudioChannelMode_eSwapped:
427        i2sOutputSettings.stereoMode = BAPE_StereoMode_eRightLeft;
428        break;
429    }
430
431    errCode = BAPE_I2sOutput_SetSettings(handle->handle, &i2sOutputSettings);
432    if ( errCode )
433    {
434        return BERR_TRACE(errCode);
435    }
436    return BERR_SUCCESS;
437}
438#else
439/***************************************************************************
440Summary:
441        Get default settings for an I2S output
442See Also:
443
444 ***************************************************************************/
445void NEXUS_I2sOutput_GetDefaultSettings(
446    NEXUS_I2sOutputSettings *pSettings   /* [out] default settings */
447    )
448{
449    BSTD_UNUSED(pSettings);
450}
451
452/***************************************************************************
453Summary:
454        Open an I2S Output device
455See Also:
456    NEXUS_I2sOutput_Close
457 ***************************************************************************/
458NEXUS_I2sOutputHandle NEXUS_I2sOutput_Open(
459    unsigned index,
460    const NEXUS_I2sOutputSettings *pSettings
461    )
462{
463    NEXUS_Error errCode;
464    BSTD_UNUSED(index);
465    BSTD_UNUSED(pSettings);
466    errCode = BERR_TRACE(BERR_NOT_SUPPORTED);
467    return NULL;
468}
469
470/***************************************************************************
471Summary:
472        Close an I2S Output device
473See Also:
474    NEXUS_I2sOutput_Open
475 ***************************************************************************/
476void NEXUS_I2sOutput_Close(
477    NEXUS_I2sOutputHandle handle
478    )
479{
480    BSTD_UNUSED(handle);
481}
482
483/***************************************************************************
484Summary:
485        Get settings for an I2S output
486See Also:
487        NEXUS_I2sOutput_SetSettings
488 ***************************************************************************/
489void NEXUS_I2sOutput_GetSettings(
490    NEXUS_I2sOutputHandle handle,
491    NEXUS_I2sOutputSettings *pSettings  /* [out] Settings */
492    )
493{
494    BSTD_UNUSED(handle);
495    BSTD_UNUSED(pSettings);
496}
497
498/***************************************************************************
499Summary:
500        Set settings for an I2S output
501See Also:
502        NEXUS_I2sOutput_GetSettings
503 ***************************************************************************/
504NEXUS_Error NEXUS_I2sOutput_SetSettings(
505    NEXUS_I2sOutputHandle handle,
506    const NEXUS_I2sOutputSettings *pSettings
507    )
508{
509    BSTD_UNUSED(handle);
510    BSTD_UNUSED(pSettings);
511    return BERR_TRACE(BERR_NOT_SUPPORTED);
512}
513
514/***************************************************************************
515Summary:
516    Get the audio connector for an I2S output
517See Also:
518
519 ***************************************************************************/
520NEXUS_AudioOutput NEXUS_I2sOutput_GetConnector(
521    NEXUS_I2sOutputHandle handle
522    )
523{
524    BSTD_UNUSED(handle);
525    return NULL;
526}
527#endif
528
529#if NEXUS_NUM_I2S_MULTI_OUTPUTS
530BDBG_OBJECT_ID(NEXUS_I2sMultiOutput);
531
532typedef struct NEXUS_I2sMultiOutput
533{
534    BDBG_OBJECT(NEXUS_I2sMultiOutput)
535    bool opened;
536    BAPE_I2sMultiOutputHandle handle;
537    NEXUS_I2sMultiOutputSettings settings;
538    NEXUS_AudioOutputObject connectors[BAPE_ChannelPair_eMax];
539    unsigned numConnectors;
540} NEXUS_I2sMultiOutput;
541
542static NEXUS_I2sMultiOutput g_i2sMultiOutputs[NEXUS_NUM_I2S_MULTI_OUTPUTS];
543
544static NEXUS_Error NEXUS_I2sMultiOutput_P_SetChannelMode(void *pHandle, NEXUS_AudioChannelMode channelMode);
545
546/***************************************************************************
547Summary:
548        Get default settings for an I2S output
549See Also:
550
551 ***************************************************************************/
552void NEXUS_I2sMultiOutput_GetDefaultSettings(
553    NEXUS_I2sMultiOutputSettings *pSettings   /* [out] default settings */
554    )
555{
556    BAPE_I2sMultiOutputSettings bapeI2sOutputSettings;
557    NEXUS_Error errCode;
558
559    BDBG_ASSERT(NULL != pSettings);
560    BKNI_Memset(pSettings, 0, sizeof(*pSettings));
561
562    BAPE_I2sMultiOutput_GetDefaultSettings(&bapeI2sOutputSettings);
563
564    switch ( bapeI2sOutputSettings.mode )
565    {
566    case BAPE_I2sMultiMode_eMultichannel:
567        pSettings->mode = NEXUS_I2sMultiMode_eMultichannel;
568        break;
569    case BAPE_I2sMultiMode_eStereo:
570        pSettings->mode = NEXUS_I2sMultiMode_eStereo;
571        break;
572    default:
573        BDBG_ERR(("Unsupported I2SMultiMode %u", bapeI2sOutputSettings.mode));
574        break;
575    }
576   
577    #if NEXUS_DTV_PLATFORM
578    /* Default DTV chips to the stereo interface */
579    pSettings->mode = NEXUS_I2sMultiMode_eStereo;
580    #endif
581   
582    errCode = NEXUS_I2sOutput_P_ConvertSettingsFromBape(&pSettings->i2sSettings, &bapeI2sOutputSettings.i2sSettings);
583    BDBG_ASSERT(errCode == NEXUS_SUCCESS);  /* We should never get bad stuff from BAPE */
584}
585
586/***************************************************************************
587Summary:
588        Open an I2S Output device
589See Also:
590    NEXUS_I2sMultiOutput_Close
591 ***************************************************************************/
592NEXUS_I2sMultiOutputHandle NEXUS_I2sMultiOutput_Open(
593    unsigned index,
594    const NEXUS_I2sMultiOutputSettings *pSettings
595    )
596{
597    BAPE_I2sMultiOutputHandle i2sHandle;
598    NEXUS_Error errCode;
599    BAPE_I2sMultiOutputSettings apeSettings;
600    NEXUS_I2sMultiOutputSettings settings;
601    BAPE_OutputPort connector;
602    unsigned i, numConnectors=1;
603
604    if ( NULL == pSettings )
605    {
606        NEXUS_I2sMultiOutput_GetDefaultSettings(&settings);
607        pSettings = &settings;
608    }
609
610    if ( index >= NEXUS_NUM_I2S_MULTI_OUTPUTS )
611    {
612        BDBG_ERR(("I2sOutput %u not supported on this chipset", index));
613        errCode = BERR_TRACE(BERR_INVALID_PARAMETER);
614        return NULL;
615    }
616
617    if ( g_i2sMultiOutputs[index].opened )
618    {
619        BDBG_ERR(("I2sOutput %u is already open", index));
620        return NULL;
621    }
622
623    BAPE_I2sMultiOutput_GetDefaultSettings(&apeSettings);
624    switch ( pSettings->mode )
625    {
626    case NEXUS_I2sMultiMode_eMultichannel:
627        apeSettings.mode = BAPE_I2sMultiMode_eMultichannel;
628        break;
629    case NEXUS_I2sMultiMode_eStereo:
630        apeSettings.mode = BAPE_I2sMultiMode_eStereo;
631#if NEXUS_DTV_PLATFORM
632        numConnectors = 3;    /* DTV chips only have a 5.1 interface */
633#else
634        numConnectors = 4;    /* STB/BD chips have 7.1 */
635#endif
636        break;
637    default:
638        BDBG_ERR(("Unsupported I2SMultiMode %u", pSettings->mode));
639        (void)BERR_TRACE(BERR_INVALID_PARAMETER);
640        return NULL;
641    }
642    errCode = BAPE_I2sMultiOutput_Open( NEXUS_AUDIO_DEVICE_HANDLE, index, &apeSettings, &i2sHandle );
643    if ( errCode )
644    {
645        (void)BERR_TRACE(errCode);
646        return NULL;
647    }
648
649    g_i2sMultiOutputs[index].opened = true;
650    /* Defer connector init until GetConnector() */
651    g_i2sMultiOutputs[index].handle = i2sHandle;
652    BDBG_OBJECT_SET(&g_i2sMultiOutputs[index], NEXUS_I2sMultiOutput);
653    errCode = NEXUS_I2sMultiOutput_SetSettings(&g_i2sMultiOutputs[index], pSettings);
654    if ( errCode )
655    {
656        (void)BERR_TRACE(errCode);
657        NEXUS_I2sMultiOutput_Close(&g_i2sMultiOutputs[index]);
658        return NULL;
659    }
660   
661    for ( i = 0; i < numConnectors; i++ )
662    {
663        BAPE_I2sMultiOutput_GetStereoOutputPort(i2sHandle, i, &connector);
664        NEXUS_AUDIO_OUTPUT_INIT(&g_i2sMultiOutputs[index].connectors[i], NEXUS_AudioOutputType_eI2s, &g_i2sMultiOutputs[index]);
665        g_i2sMultiOutputs[index].connectors[i].setChannelMode = NEXUS_I2sMultiOutput_P_SetChannelMode;
666        g_i2sMultiOutputs[index].connectors[i].port = (uint32_t)connector;
667    }
668
669    g_i2sMultiOutputs[index].opened = true;
670    g_i2sMultiOutputs[index].numConnectors = numConnectors;
671   
672    /* Success */
673    return &g_i2sMultiOutputs[index];   
674}
675
676/***************************************************************************
677Summary:
678        Close an I2S Output device
679See Also:
680    NEXUS_I2sMultiOutput_Open
681 ***************************************************************************/
682void NEXUS_I2sMultiOutput_Close(
683    NEXUS_I2sMultiOutputHandle handle
684    )
685{
686    unsigned i;
687
688    BDBG_OBJECT_ASSERT(handle, NEXUS_I2sMultiOutput);
689
690    for ( i = 0; i < handle->numConnectors; i++ )
691    {
692        NEXUS_AudioOutput_Shutdown(&handle->connectors[i]);
693    }
694    BAPE_I2sMultiOutput_Close(handle->handle);
695    /* This is equivalent to BDBG_OBJECT_UNSET and also clears other flags */
696    BKNI_Memset(handle, 0, sizeof(NEXUS_I2sMultiOutput));
697}
698
699
700/***************************************************************************
701Summary:
702        Get settings for an I2S output
703See Also:
704        NEXUS_I2sMultiOutput_SetSettings
705 ***************************************************************************/
706void NEXUS_I2sMultiOutput_GetSettings(
707    NEXUS_I2sMultiOutputHandle handle,
708    NEXUS_I2sMultiOutputSettings *pSettings  /* [out] Settings */
709    )
710{
711    BDBG_OBJECT_ASSERT(handle, NEXUS_I2sMultiOutput);
712    BDBG_ASSERT(NULL != pSettings);
713
714    *pSettings = handle->settings;
715}
716
717/***************************************************************************
718Summary:
719        Set settings for an I2S output
720See Also:
721        NEXUS_I2sMultiOutput_GetSettings
722 ***************************************************************************/
723NEXUS_Error NEXUS_I2sMultiOutput_SetSettings(
724    NEXUS_I2sMultiOutputHandle handle,
725    const NEXUS_I2sMultiOutputSettings *pSettings    /* [in] Settings */
726    )
727{
728    BAPE_I2sMultiOutputSettings bapeI2sSettings;
729    NEXUS_Error errCode;
730
731    /* Sanity Check */
732    BDBG_OBJECT_ASSERT(handle, NEXUS_I2sMultiOutput);
733
734    BAPE_I2sMultiOutput_GetSettings(handle->handle, &bapeI2sSettings);
735
736    /* Ignore changes to mode.  They're not supported anyway. */
737
738    errCode = NEXUS_I2sOutput_P_ConvertSettingsToBape(&bapeI2sSettings.i2sSettings, &pSettings->i2sSettings);
739    if (errCode)
740    {
741        return BERR_TRACE(errCode);
742    }
743
744    errCode = BAPE_I2sMultiOutput_SetSettings(handle->handle, &bapeI2sSettings);
745    if (errCode)
746    {
747        return BERR_TRACE(errCode);
748    }
749
750    handle->settings = *pSettings;
751
752    /* success */
753    return BERR_SUCCESS;
754}
755
756/***************************************************************************
757Summary:
758    Get the audio connector for an I2S output
759See Also:
760
761 ***************************************************************************/
762NEXUS_AudioOutput NEXUS_I2sMultiOutput_GetConnector(
763    NEXUS_I2sMultiOutputHandle handle
764    )
765{
766    return NEXUS_I2sMultiOutput_GetStereoConnector(handle, 0);
767}
768
769NEXUS_AudioOutput NEXUS_I2sMultiOutput_GetStereoConnector(
770    NEXUS_I2sMultiOutputHandle handle,
771    NEXUS_AudioChannelPair channelPair
772    )
773{
774    BDBG_OBJECT_ASSERT(handle, NEXUS_I2sMultiOutput);
775
776    if ( (unsigned)channelPair < handle->numConnectors )
777    {
778        return &handle->connectors[channelPair];
779    }
780    else
781    {
782        (void)BERR_TRACE(BERR_NOT_SUPPORTED);
783        return NULL;
784    }   
785}
786
787static NEXUS_Error NEXUS_I2sMultiOutput_P_SetChannelMode(void *pHandle, NEXUS_AudioChannelMode channelMode)
788{
789    BERR_Code errCode;
790    BAPE_I2sMultiOutputSettings i2sOutputSettings;
791
792    NEXUS_I2sMultiOutputHandle handle = (NEXUS_I2sMultiOutputHandle) pHandle;
793    BDBG_OBJECT_ASSERT(handle, NEXUS_I2sMultiOutput);
794   
795    BAPE_I2sMultiOutput_GetSettings(handle->handle, &i2sOutputSettings);
796    switch ( channelMode )
797    {
798    default:
799    case NEXUS_AudioChannelMode_eStereo:
800        i2sOutputSettings.i2sSettings.stereoMode = BAPE_StereoMode_eLeftRight;
801        break;
802    case NEXUS_AudioChannelMode_eLeft:
803        i2sOutputSettings.i2sSettings.stereoMode = BAPE_StereoMode_eLeftLeft;
804        break;
805    case NEXUS_AudioChannelMode_eRight:
806        i2sOutputSettings.i2sSettings.stereoMode = BAPE_StereoMode_eRightRight;
807        break;
808    case NEXUS_AudioChannelMode_eSwapped:
809        i2sOutputSettings.i2sSettings.stereoMode = BAPE_StereoMode_eRightLeft;
810        break;
811    }
812
813    errCode = BAPE_I2sMultiOutput_SetSettings(handle->handle, &i2sOutputSettings);
814    if ( errCode )
815    {
816        return BERR_TRACE(errCode);
817    }
818    return BERR_SUCCESS;
819}
820#else
821/***************************************************************************
822Summary:
823        Get default settings for an I2S output
824See Also:
825
826 ***************************************************************************/
827void NEXUS_I2sMultiOutput_GetDefaultSettings(
828    NEXUS_I2sMultiOutputSettings *pSettings   /* [out] default settings */
829    )
830{
831    BSTD_UNUSED(pSettings);
832}
833
834/***************************************************************************
835Summary:
836        Open an I2S Output device
837See Also:
838    NEXUS_I2sMultiOutput_Close
839 ***************************************************************************/
840NEXUS_I2sMultiOutputHandle NEXUS_I2sMultiOutput_Open(
841    unsigned index,
842    const NEXUS_I2sMultiOutputSettings *pSettings
843    )
844{
845    NEXUS_Error errCode;
846    BSTD_UNUSED(index);
847    BSTD_UNUSED(pSettings);
848    errCode = BERR_TRACE(BERR_NOT_SUPPORTED);
849    return NULL;
850}
851
852/***************************************************************************
853Summary:
854        Close an I2S Output device
855See Also:
856    NEXUS_I2sMultiOutput_Open
857 ***************************************************************************/
858void NEXUS_I2sMultiOutput_Close(
859    NEXUS_I2sMultiOutputHandle handle
860    )
861{
862    BSTD_UNUSED(handle);
863}
864
865/***************************************************************************
866Summary:
867        Get settings for an I2S output
868See Also:
869        NEXUS_I2sMultiOutput_SetSettings
870 ***************************************************************************/
871void NEXUS_I2sMultiOutput_GetSettings(
872    NEXUS_I2sMultiOutputHandle handle,
873    NEXUS_I2sMultiOutputSettings *pSettings  /* [out] Settings */
874    )
875{
876    BSTD_UNUSED(handle);
877    BSTD_UNUSED(pSettings);
878}
879
880/***************************************************************************
881Summary:
882        Set settings for an I2S output
883See Also:
884        NEXUS_I2sMultiOutput_GetSettings
885 ***************************************************************************/
886NEXUS_Error NEXUS_I2sMultiOutput_SetSettings(
887    NEXUS_I2sMultiOutputHandle handle,
888    const NEXUS_I2sMultiOutputSettings *pSettings
889    )
890{
891    BSTD_UNUSED(handle);
892    BSTD_UNUSED(pSettings);
893    return BERR_TRACE(BERR_NOT_SUPPORTED);
894}
895
896/***************************************************************************
897Summary:
898    Get the audio connector for an I2S output
899See Also:
900
901 ***************************************************************************/
902NEXUS_AudioOutput NEXUS_I2sMultiOutput_GetConnector(
903    NEXUS_I2sMultiOutputHandle handle
904    )
905{
906    BSTD_UNUSED(handle);
907    return NULL;
908}
909
910NEXUS_AudioOutput NEXUS_I2sMultiOutput_GetStereoConnector(
911    NEXUS_I2sMultiOutputHandle handle,
912    NEXUS_AudioChannelPair channelPair
913    )
914{
915    BSTD_UNUSED(handle);
916    BSTD_UNUSED(channelPair);
917    return NULL;
918}
919
920#endif
Note: See TracBrowser for help on using the repository browser.