source: svn/newcon3bcm2_21bu/nexus/modules/audio/7552/src/nexus_tru_volume.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: 15.5 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_tru_volume.c $
39* $brcm_Revision: 8 $
40* $brcm_Date: 8/8/11 5:38p $
41*
42* API Description:
43*   API name: TruVolume
44*    Specific APIs related to SRS TruVolume (formerly Volume IQ) Audio Processing
45*
46* Revision History:
47*
48* $brcm_Log: /nexus/modules/audio/7422/src/nexus_tru_volume.c $
49*
50* 8   8/8/11 5:38p jgarrett
51* SWDTV-6761: Adding StudioSound
52*
53* 7   7/18/11 6:37p jgarrett
54* SWDTV-6761: Adding missing GetSettings while applying nexus settings to
55*  PI
56*
57* 6   5/25/11 5:16p jgarrett
58* SW7425-408: Adding BDBG_OBJECT to input/output types and MS11 features
59*
60* 5   4/26/11 11:35a jgarrett
61* SW7425-437: Resolving kernel mode shutdown issues
62*
63* 4   4/20/11 6:18p jtna
64* SW7425-365: fix build warnings for 2.6.37 kernel
65*
66* 3   4/19/11 10:05a jgarrett
67* SW7422-146: Fixing kernel crash on CTRL-C in brutus while tuned
68*
69* 2   2/28/11 4:50p jgarrett
70* SW7422-146: Adding TruVolume
71*
72* 1   1/10/11 3:26p jgarrett
73* SW7422-146: Adding full nexus API set
74*
75***************************************************************************/
76
77#include "nexus_audio_module.h"
78
79BDBG_MODULE(nexus_tru_volume);
80
81BDBG_OBJECT_ID(NEXUS_TruVolume);
82typedef struct NEXUS_TruVolume
83{
84    BDBG_OBJECT(NEXUS_TruVolume)
85    NEXUS_AudioInputObject connector;
86    NEXUS_TruVolumeSettings settings;
87    NEXUS_AudioInput input;
88    BAPE_TruVolumeHandle apeHandle;
89} NEXUS_TruVolume;
90
91void NEXUS_TruVolume_GetDefaultSettings(
92    NEXUS_TruVolumeSettings *pSettings   /* [out] default settings */
93    )
94{
95    unsigned i, j;
96   
97    BAPE_TruVolumeSettings piSettings;
98    BDBG_ASSERT(NULL != pSettings);
99    BAPE_TruVolume_GetDefaultSettings(&piSettings);
100    pSettings->enabled = piSettings.enabled;
101    pSettings->blockSize = piSettings.blockSize;
102    BDBG_CASSERT(NEXUS_TruVolumeBlockSize_eMax == (NEXUS_TruVolumeBlockSize)BAPE_TruVolumeBlockSize_eMax);
103    pSettings->enableNormalGain = piSettings.enableNormalGain;
104    pSettings->inputGain = piSettings.inputGain;
105    pSettings->outputGain = piSettings.outputGain;
106    pSettings->bypassGain = piSettings.bypassGain;
107    pSettings->referenceLevel = piSettings.referenceLevel;
108    pSettings->mode = piSettings.mode;
109    BDBG_CASSERT(BAPE_TruVolumeMode_eMax == (BAPE_TruVolumeMode)NEXUS_TruVolumeMode_eMax);
110    pSettings->speakerResolution = piSettings.speakerResolution;
111    BDBG_CASSERT(NEXUS_TruVolumeSpeakerResolution_eMax == (NEXUS_TruVolumeSpeakerResolution)BAPE_TruVolumeSpeakerResolution_eMax);
112    pSettings->maxGain = piSettings.maxGain;
113    pSettings->enableDcNotchFilter = piSettings.enableDcNotchFilter;
114    pSettings->enableNoiseManager = piSettings.enableNoiseManager;
115    pSettings->noiseManagerThreshold = piSettings.noiseManagerThreshold;
116    pSettings->enableNormalizer = piSettings.enableNormalizer;
117    pSettings->calibrate = piSettings.calibrate;
118   
119    /* HPF */
120    pSettings->highPassFilter.enabled = piSettings.highPassFilter.enabled;
121    BDBG_CASSERT((int)NEXUS_SrsFilterCoefGenMode_eFilterUser == (int)BAPE_SrsFilterCoefficientMode_eUser);
122    BDBG_CASSERT((int)NEXUS_SrsFilterCoefGenMode_eFilterSpec == (int)BAPE_SrsFilterCoefficientMode_eSpecification);
123    BDBG_CASSERT((int)NEXUS_SrsFilterCoefGenMode_eMax == (int)BAPE_SrsFilterCoefficientMode_eMax);
124    pSettings->highPassFilter.coefGenMode = (NEXUS_SrsFilterCoefGenMode)piSettings.highPassFilter.coefficientMode;
125    if ( pSettings->highPassFilter.coefGenMode == NEXUS_SrsFilterCoefGenMode_eFilterUser )
126    {
127        for ( i = 0; i < 3; i++ )
128        {
129            pSettings->highPassFilter.coefParam.highPassFilterCoefUser[i].filterOrder = (NEXUS_SrsFilterOrder)piSettings.highPassFilter.coefficientSettings.user[i].filterOrder;
130            for ( j = 0; j < 3; j++ )
131            {
132                pSettings->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].scale = (NEXUS_SrsFilterOrder)piSettings.highPassFilter.coefficientSettings.user[i].coefficients[j].scale;
133                pSettings->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].coefficientB0 = (NEXUS_SrsFilterOrder)piSettings.highPassFilter.coefficientSettings.user[i].coefficients[j].coefficientB0;
134                pSettings->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].coefficientB1 = (NEXUS_SrsFilterOrder)piSettings.highPassFilter.coefficientSettings.user[i].coefficients[j].coefficientB1;
135                pSettings->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].coefficientB2 = (NEXUS_SrsFilterOrder)piSettings.highPassFilter.coefficientSettings.user[i].coefficients[j].coefficientB2;
136                pSettings->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].coefficientA1 = (NEXUS_SrsFilterOrder)piSettings.highPassFilter.coefficientSettings.user[i].coefficients[j].coefficientA1;
137                pSettings->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].coefficientA2 = (NEXUS_SrsFilterOrder)piSettings.highPassFilter.coefficientSettings.user[i].coefficients[j].coefficientA2;
138            }
139        }
140    }
141    else
142    {
143        pSettings->highPassFilter.coefParam.highPassFilterCoefSpec.cutOffFrequency = piSettings.highPassFilter.coefficientSettings.specification.cutoffFrequency;
144        pSettings->highPassFilter.coefParam.highPassFilterCoefSpec.filterOrder = (NEXUS_SrsFilterOrder)piSettings.highPassFilter.coefficientSettings.specification.filterOrder;
145    }   
146}
147
148NEXUS_TruVolumeHandle NEXUS_TruVolume_Open(
149    const NEXUS_TruVolumeSettings *pSettings     /* Pass NULL for default settings */
150    )
151{
152    NEXUS_TruVolumeHandle handle;
153    BAPE_TruVolumeSettings defaults;
154    BAPE_Connector connector;
155    BERR_Code errCode;
156    handle = BKNI_Malloc(sizeof(NEXUS_TruVolume));
157    if ( NULL == handle )
158    {
159        (void)BERR_TRACE(BERR_OUT_OF_SYSTEM_MEMORY);
160        return NULL;
161    }
162    BKNI_Memset(handle, 0, sizeof(NEXUS_TruVolume));
163    BDBG_OBJECT_SET(handle, NEXUS_TruVolume);
164    NEXUS_AUDIO_INPUT_INIT(&handle->connector, NEXUS_AudioInputType_eTruVolume, handle);
165    handle->connector.format = NEXUS_AudioInputFormat_eNone;    /* Determined by inputs */
166    BAPE_TruVolume_GetDefaultSettings(&defaults);
167    errCode = BAPE_TruVolume_Create(NEXUS_AUDIO_DEVICE_HANDLE, &defaults, &handle->apeHandle);
168    if ( errCode )
169    {
170        (void)BERR_TRACE(errCode);
171        BDBG_OBJECT_DESTROY(handle, NEXUS_TruVolume);
172        BKNI_Free(handle);
173        return NULL;
174    }
175    handle->connector.format = NEXUS_AudioInputFormat_ePcmStereo;
176    BAPE_TruVolume_GetConnector(handle->apeHandle, &connector);
177    handle->connector.port = (uint32_t)connector;
178    if ( NULL == pSettings )
179    {
180        NEXUS_TruVolume_GetDefaultSettings(&handle->settings);
181    }
182    else
183    {
184        (void)NEXUS_TruVolume_SetSettings(handle, pSettings);
185    }
186
187    return handle;
188}
189
190void NEXUS_TruVolume_Close(
191    NEXUS_TruVolumeHandle handle
192    )
193{
194    BDBG_OBJECT_ASSERT(handle, NEXUS_TruVolume);
195    NEXUS_AudioInput_Shutdown(&handle->connector);
196    BAPE_TruVolume_Destroy(handle->apeHandle);
197    BDBG_OBJECT_DESTROY(handle, NEXUS_TruVolume);
198    BKNI_Free(handle);
199}
200
201
202void NEXUS_TruVolume_GetSettings(
203    NEXUS_TruVolumeHandle handle,
204    NEXUS_TruVolumeSettings *pSettings    /* [out] Settings */
205    )
206{
207    BDBG_OBJECT_ASSERT(handle, NEXUS_TruVolume);
208    BDBG_ASSERT(NULL != pSettings);
209   
210    BKNI_Memcpy(pSettings, &handle->settings, sizeof(NEXUS_TruVolumeSettings));
211}
212
213void NEXUS_TruVolume_P_ConvertSettings(
214    const NEXUS_TruVolumeSettings *pNexus, 
215    BAPE_TruVolumeSettings *pMagnum
216    )
217{
218    unsigned i, j;
219   
220    BDBG_ASSERT(NULL != pNexus);
221    BDBG_ASSERT(NULL != pMagnum);
222   
223    pMagnum->enabled = pNexus->enabled;
224    pMagnum->blockSize = pNexus->blockSize;
225    pMagnum->enableNormalGain = pNexus->enableNormalGain;
226    pMagnum->inputGain = pNexus->inputGain;
227    pMagnum->outputGain = pNexus->outputGain;
228    pMagnum->bypassGain = pNexus->bypassGain;
229    pMagnum->referenceLevel = pNexus->referenceLevel;
230    pMagnum->mode = pNexus->mode;
231    pMagnum->speakerResolution = pNexus->speakerResolution;
232    pMagnum->maxGain = pNexus->maxGain;
233    pMagnum->enableDcNotchFilter = pNexus->enableDcNotchFilter;
234    pMagnum->enableNoiseManager = pNexus->enableNoiseManager;
235    pMagnum->noiseManagerThreshold = pNexus->noiseManagerThreshold;
236    pMagnum->enableNormalizer = pNexus->enableNormalizer;
237    pMagnum->calibrate = pNexus->calibrate;
238    pMagnum->highPassFilter.enabled = pNexus->highPassFilter.enabled;
239    BDBG_CASSERT((int)BAPE_SrsFilterCoefficientMode_eUser == (int)NEXUS_SrsFilterCoefGenMode_eFilterUser);
240    BDBG_CASSERT((int)BAPE_SrsFilterCoefficientMode_eSpecification == (int)NEXUS_SrsFilterCoefGenMode_eFilterSpec);
241    BDBG_CASSERT((int)BAPE_SrsFilterCoefficientMode_eMax == (int)NEXUS_SrsFilterCoefGenMode_eMax);
242    pMagnum->highPassFilter.coefficientMode = (BAPE_SrsFilterCoefficientMode)pNexus->highPassFilter.coefGenMode;
243    if ( pNexus->highPassFilter.coefGenMode == NEXUS_SrsFilterCoefGenMode_eFilterUser )
244    {
245        for ( i = 0; i < 3; i++ )
246        {
247            pMagnum->highPassFilter.coefficientSettings.user[i].filterOrder = (BAPE_SrsFilterOrder)pNexus->highPassFilter.coefParam.highPassFilterCoefUser[i].filterOrder;   
248            for ( j = 0; j < 3; j++ )
249            {
250                pMagnum->highPassFilter.coefficientSettings.user[i].coefficients[j].scale = pNexus->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].scale;   
251                pMagnum->highPassFilter.coefficientSettings.user[i].coefficients[j].coefficientB0 = pNexus->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].coefficientB0;   
252                pMagnum->highPassFilter.coefficientSettings.user[i].coefficients[j].coefficientB1 = pNexus->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].coefficientB1;   
253                pMagnum->highPassFilter.coefficientSettings.user[i].coefficients[j].coefficientB2 = pNexus->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].coefficientB2;   
254                pMagnum->highPassFilter.coefficientSettings.user[i].coefficients[j].coefficientA1 = pNexus->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].coefficientA1;   
255                pMagnum->highPassFilter.coefficientSettings.user[i].coefficients[j].coefficientA2 = pNexus->highPassFilter.coefParam.highPassFilterCoefUser[i].coefficients[j].coefficientA2;   
256            }
257        }       
258    }
259    else
260    {
261        pMagnum->highPassFilter.coefficientSettings.specification.cutoffFrequency = pNexus->highPassFilter.coefParam.highPassFilterCoefSpec.cutOffFrequency;
262        pMagnum->highPassFilter.coefficientSettings.specification.filterOrder = (BAPE_SrsFilterOrder)pNexus->highPassFilter.coefParam.highPassFilterCoefSpec.filterOrder;
263    }
264}
265
266NEXUS_Error NEXUS_TruVolume_SetSettings(
267    NEXUS_TruVolumeHandle handle,
268    const NEXUS_TruVolumeSettings *pSettings
269    )
270{
271    BERR_Code errCode;
272    BAPE_TruVolumeSettings piSettings;
273   
274    BDBG_OBJECT_ASSERT(handle, NEXUS_TruVolume);
275    BDBG_ASSERT(NULL != pSettings);
276
277    BAPE_TruVolume_GetSettings(handle->apeHandle, &piSettings);
278
279    NEXUS_TruVolume_P_ConvertSettings(pSettings, &piSettings);
280   
281    errCode = BAPE_TruVolume_SetSettings(handle->apeHandle, &piSettings);
282    if ( errCode )
283    {
284        return BERR_TRACE(errCode);
285    }
286    BKNI_Memcpy(&handle->settings, pSettings, sizeof(NEXUS_TruVolumeSettings));
287    return BERR_SUCCESS;
288}
289
290NEXUS_AudioInput NEXUS_TruVolume_GetConnector(
291    NEXUS_TruVolumeHandle handle
292    )
293{
294    BDBG_OBJECT_ASSERT(handle, NEXUS_TruVolume);
295    return &handle->connector;
296}
297
298NEXUS_Error NEXUS_TruVolume_AddInput(
299    NEXUS_TruVolumeHandle handle,
300    NEXUS_AudioInput input
301    )
302{
303    NEXUS_Error errCode;
304    BDBG_OBJECT_ASSERT(handle, NEXUS_TruVolume);
305    BDBG_ASSERT(NULL != input);
306    if ( NULL != handle->input )
307    {
308        BDBG_ERR(("Only one input can be added"));
309        return BERR_TRACE(BERR_NOT_SUPPORTED);
310    }
311    errCode = BAPE_TruVolume_AddInput(handle->apeHandle, (BAPE_Connector)input->port);
312    if ( errCode )
313    {
314        return BERR_TRACE(errCode);
315    }
316    errCode = NEXUS_AudioInput_P_AddInput(&handle->connector, input);
317    if ( errCode )
318    {
319        (void)BAPE_TruVolume_RemoveInput(handle->apeHandle, (BAPE_Connector)input->port);
320        return BERR_TRACE(errCode);
321    }
322    handle->input = input;
323    return BERR_SUCCESS;
324}
325
326NEXUS_Error NEXUS_TruVolume_RemoveInput(
327    NEXUS_TruVolumeHandle handle,
328    NEXUS_AudioInput input
329    )
330{
331    NEXUS_Error errCode;
332    BDBG_OBJECT_ASSERT(handle, NEXUS_TruVolume);
333    BDBG_ASSERT(NULL != handle->input);
334    if ( input != handle->input )
335    {
336        BDBG_ERR(("Input not connected"));
337        return BERR_TRACE(BERR_NOT_SUPPORTED);
338    }
339    errCode = BAPE_TruVolume_RemoveInput(handle->apeHandle, (BAPE_Connector)input->port);
340    if ( errCode )
341    {
342        return BERR_TRACE(errCode);
343    }
344    errCode = NEXUS_AudioInput_P_RemoveInput(&handle->connector, input);
345    if ( errCode )
346    {
347        return BERR_TRACE(errCode);
348    }
349    handle->input = NULL;
350    return BERR_SUCCESS;
351}
352
353NEXUS_Error NEXUS_TruVolume_RemoveAllInputs(
354    NEXUS_TruVolumeHandle handle
355    )
356{
357    BDBG_OBJECT_ASSERT(handle, NEXUS_TruVolume);
358    if ( handle->input )
359    {
360        return NEXUS_TruVolume_RemoveInput(handle, handle->input);
361    }
362    return BERR_SUCCESS;
363}
364
Note: See TracBrowser for help on using the repository browser.