source: svn/newcon3bcm2_21bu/nexus/modules/audio/7552/src/nexus_spdif_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: 12.0 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_spdif_output.c $
39* $brcm_Revision: 6 $
40* $brcm_Date: 7/6/11 6:41p $
41*
42* API Description:
43*   API name: SpdifOutput
44*    Specific APIs related to SPDIF audio outputs.
45*
46* Revision History:
47*
48* $brcm_Log: /nexus/modules/audio/7422/src/nexus_spdif_output.c $
49*
50* 6   7/6/11 6:41p jgarrett
51* SW7552-55: Mapping channelMode to stereoMode
52*
53* 5   5/25/11 5:16p jgarrett
54* SW7425-408: Adding BDBG_OBJECT to input/output types and MS11 features
55*
56* 4   4/26/11 11:35a jgarrett
57* SW7425-437: Resolving kernel mode shutdown issues
58*
59* 3   4/20/11 6:16p jtna
60* SW7425-365: fix build warnings for 2.6.37 kernel
61*
62* 2   2/22/11 5:44p jgarrett
63* SW7422-146: Implemented type renaming based on filter graph review
64*  comments
65*
66* 1   12/17/10 3:57p jgarrett
67* SW7422-146: Adding initial nexus on APE for 7422
68*
69***************************************************************************/
70#include "nexus_audio_module.h"
71
72BDBG_MODULE(nexus_spdif_output);
73
74BDBG_OBJECT_ID(NEXUS_SpdifOutput);
75typedef struct NEXUS_SpdifOutput
76{
77    BDBG_OBJECT(NEXUS_SpdifOutput)
78    bool opened;
79    bool rawStatus;
80    BAPE_SpdifOutputHandle handle;
81    NEXUS_SpdifOutputSettings settings;
82    NEXUS_AudioOutputObject connector;
83    NEXUS_AudioRawChannelStatus rawChannelStatus;
84} NEXUS_SpdifOutput;
85
86static NEXUS_SpdifOutput g_spdifOutputs[NEXUS_NUM_SPDIF_OUTPUTS];
87
88static NEXUS_Error NEXUS_SpdifOutput_P_SetChannelMode(void *pHandle, NEXUS_AudioChannelMode channelMode);
89
90/***************************************************************************
91Summary:
92    Get default settings for a SPDIF Output
93See Also:
94    NEXUS_SpdifOutput_Get
95 ***************************************************************************/
96void NEXUS_SpdifOutput_GetDefaultSettings(
97    NEXUS_SpdifOutputSettings *pSettings   /* [out] default settings */
98    )
99{
100    BAPE_SpdifOutputSettings defaults;
101    BSTD_UNUSED(pSettings);
102    BAPE_SpdifOutput_GetDefaultSettings(&defaults);
103    pSettings->limitTo16Bits = defaults.limitTo16Bits;
104    pSettings->dither = defaults.ditherEnabled;
105    BDBG_CASSERT(NEXUS_SpdifOutputBurstType_eMax == (NEXUS_SpdifOutputBurstType)BAPE_SpdifBurstType_eMax);
106    pSettings->burstType = defaults.underflowBurst;
107    pSettings->channelStatusInfo.professionalMode = defaults.channelStatus.professional;
108    pSettings->channelStatusInfo.swCopyRight = defaults.channelStatus.copyright;
109    pSettings->channelStatusInfo.categoryCode = defaults.channelStatus.categoryCode;
110    pSettings->channelStatusInfo.clockAccuracy = defaults.channelStatus.clockAccuracy;
111}
112
113/***************************************************************************
114Summary:
115    Open a SPDIF Output
116See Also:
117    NEXUS_SpdifOutput_Close
118 ***************************************************************************/
119NEXUS_SpdifOutputHandle NEXUS_SpdifOutput_Open(
120    unsigned index,
121    const NEXUS_SpdifOutputSettings *pSettings     /* Pass NULL for default settings */
122    )
123{
124    BAPE_SpdifOutputHandle spdifHandle;
125    BERR_Code errCode;
126    BAPE_OutputPort connector;
127
128    /* Sanity check */
129    if ( index >= NEXUS_NUM_SPDIF_OUTPUTS )
130    {
131        BDBG_ERR(("SpdifOutput Index %u out of range", index));
132        return NULL;
133    }
134
135    if ( g_spdifOutputs[index].opened )
136    {
137        BDBG_ERR(("SpdifOutput %d already open", index));
138        return NULL;
139    }
140
141    errCode = BAPE_SpdifOutput_Open(NEXUS_AUDIO_DEVICE_HANDLE, index, NULL, &spdifHandle);
142    if ( errCode )
143    {
144        (void)BERR_TRACE(errCode);
145        return NULL;
146    }
147
148    g_spdifOutputs[index].opened = true;
149    /* Initialize connector */
150    g_spdifOutputs[index].handle = spdifHandle;
151    NEXUS_AUDIO_OUTPUT_INIT(&g_spdifOutputs[index].connector, NEXUS_AudioOutputType_eSpdif, &g_spdifOutputs[index]);
152    g_spdifOutputs[index].connector.setChannelMode = NEXUS_SpdifOutput_P_SetChannelMode;
153    BDBG_OBJECT_SET(&g_spdifOutputs[index], NEXUS_SpdifOutput);
154    NEXUS_SpdifOutput_SetSettings(&g_spdifOutputs[index], pSettings);
155
156    BAPE_SpdifOutput_GetOutputPort(spdifHandle, &connector);
157    g_spdifOutputs[index].connector.port = (uint32_t)connector;
158
159    /* Success */
160    return &g_spdifOutputs[index];
161}
162
163/***************************************************************************
164Summary:
165    Close a SPDIF Output
166Description:
167    Input to the SPDIF output must be removed prior to closing.
168See Also:
169    NEXUS_SpdifOutput_Open
170    NEXUS_AudioOutput_RemoveInput
171    NEXUS_AudioOutput_RemoveAllInputs
172 ***************************************************************************/
173void NEXUS_SpdifOutput_Close(
174    NEXUS_SpdifOutputHandle handle
175    )
176{
177    BDBG_OBJECT_ASSERT(handle, NEXUS_SpdifOutput);
178
179    NEXUS_AudioOutput_Shutdown(&handle->connector);
180    BAPE_SpdifOutput_Close(handle->handle);
181    BKNI_Memset(handle, 0, sizeof(NEXUS_SpdifOutput));
182}
183
184/***************************************************************************
185Summary:
186    Get Settings for a SPDIF Output
187See Also:
188    NEXUS_SpdifOutput_SetSettings
189 ***************************************************************************/
190void NEXUS_SpdifOutput_GetSettings(
191    NEXUS_SpdifOutputHandle handle,
192    NEXUS_SpdifOutputSettings *pSettings    /* [out] Settings */
193    )
194{
195    /* Sanity Check */
196    BDBG_OBJECT_ASSERT(handle, NEXUS_SpdifOutput);
197    BDBG_ASSERT(NULL != pSettings);
198
199    /* Copy settings */
200    *pSettings = handle->settings;
201}
202
203/***************************************************************************
204Summary:
205    Set Settings for a SPDIF Output
206See Also:
207    NEXUS_SpdifOutput_GetSettings
208 ***************************************************************************/
209NEXUS_Error NEXUS_SpdifOutput_SetSettings(
210    NEXUS_SpdifOutputHandle handle,
211    const NEXUS_SpdifOutputSettings *pSettings
212    )
213{
214    int i;
215    BERR_Code errCode;
216    NEXUS_SpdifOutputSettings defaults;
217    BAPE_SpdifOutputSettings settings;
218
219    BDBG_OBJECT_ASSERT(handle, NEXUS_SpdifOutput);
220    if ( NULL == pSettings )
221    {
222        NEXUS_SpdifOutput_GetDefaultSettings(&defaults);
223        pSettings = &defaults;
224    }
225
226    BAPE_SpdifOutput_GetSettings(handle->handle, &settings);
227   
228    settings.limitTo16Bits = pSettings->limitTo16Bits;
229    settings.ditherEnabled = pSettings->dither;
230    settings.useRawChannelStatus = handle->rawStatus;
231    if ( handle->rawStatus )
232    {
233        uint32_t raw;
234        raw = handle->rawChannelStatus.leftChannelLow;
235        for ( i = 0; i < 4; i++ )
236        {
237            settings.rawChannelStatus[i] = raw&0xff;
238            raw >>= 8;
239        }
240        raw = handle->rawChannelStatus.leftChannelHigh;
241        for ( i = 4; i < 8; i++ )
242        {
243            settings.rawChannelStatus[i] = raw&0xff;
244            raw >>= 8;
245        }
246    }
247    else
248    {
249        settings.channelStatus.professional = pSettings->channelStatusInfo.professionalMode;
250        settings.channelStatus.copyright = pSettings->channelStatusInfo.swCopyRight;
251        settings.channelStatus.categoryCode = pSettings->channelStatusInfo.categoryCode;
252        settings.channelStatus.clockAccuracy = pSettings->channelStatusInfo.clockAccuracy;
253    }
254
255    errCode = BAPE_SpdifOutput_SetSettings(handle->handle, &settings);
256    if ( errCode )
257    {
258        return BERR_TRACE(errCode);
259    }
260
261    handle->settings = *pSettings;
262
263    return NEXUS_SUCCESS;
264}
265
266/***************************************************************************
267Summary:
268    Get the audio connector for a SPDIF output
269See Also:
270
271 ***************************************************************************/
272NEXUS_AudioOutput NEXUS_SpdifOutput_GetConnector(
273    NEXUS_SpdifOutputHandle handle
274    )
275{
276    BDBG_OBJECT_ASSERT(handle, NEXUS_SpdifOutput);
277    return &handle->connector;
278}
279
280/***************************************************************************
281Summary:
282    Program the transmitted channel status in raw format.
283Description:
284    This API will set the SPDIF channel status bits using raw 64-bit values
285    per channel.  Not available on all platforms.  Once set, the values in
286    NEXUS_SpdifOutputSettings will be ignored.  To clear these settings, pass
287    NULL for pChannelStatus.
288See Also:
289    NEXUS_AudioDecoder_GetRawChannelStatus
290 ***************************************************************************/
291NEXUS_Error NEXUS_SpdifOutput_SetRawChannelStatus(
292    NEXUS_SpdifOutputHandle handle,
293    NEXUS_AudioRawChannelStatus *pChannelStatus
294    )
295{
296    BDBG_OBJECT_ASSERT(handle, NEXUS_SpdifOutput);
297    if ( NULL == pChannelStatus )
298    {
299        handle->rawStatus = false;
300    }
301    else
302    {
303        handle->rawStatus = true;
304        handle->rawChannelStatus = *pChannelStatus;
305        NEXUS_SpdifOutput_SetSettings(handle, &handle->settings);
306    }
307    return NEXUS_SUCCESS;
308}
309
310static NEXUS_Error NEXUS_SpdifOutput_P_SetChannelMode(void *pHandle, NEXUS_AudioChannelMode channelMode)
311{
312    BERR_Code errCode;
313    BAPE_SpdifOutputSettings spdifOutputSettings;
314
315    NEXUS_SpdifOutputHandle handle = (NEXUS_SpdifOutputHandle) pHandle;
316    BDBG_OBJECT_ASSERT(handle, NEXUS_SpdifOutput);
317   
318    BAPE_SpdifOutput_GetSettings(handle->handle, &spdifOutputSettings);
319    switch ( channelMode )
320    {
321    default:
322    case NEXUS_AudioChannelMode_eStereo:
323        spdifOutputSettings.stereoMode = BAPE_StereoMode_eLeftRight;
324        break;
325    case NEXUS_AudioChannelMode_eLeft:
326        spdifOutputSettings.stereoMode = BAPE_StereoMode_eLeftLeft;
327        break;
328    case NEXUS_AudioChannelMode_eRight:
329        spdifOutputSettings.stereoMode = BAPE_StereoMode_eRightRight;
330        break;
331    case NEXUS_AudioChannelMode_eSwapped:
332        spdifOutputSettings.stereoMode = BAPE_StereoMode_eRightLeft;
333        break;
334    }
335
336    errCode = BAPE_SpdifOutput_SetSettings(handle->handle, &spdifOutputSettings);
337    if ( errCode )
338    {
339        return BERR_TRACE(errCode);
340    }
341    return BERR_SUCCESS;
342}
343
Note: See TracBrowser for help on using the repository browser.