khronosfws/openmax_al/src/gst_adaptation/xaequalizeritfadaptation.c
author hgs
Fri, 14 May 2010 18:19:45 -0500
changeset 20 b67dd1fc57c5
parent 19 4a629bc82c5e
permissions -rw-r--r--
201019
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: 
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
20
hgs
parents: 19
diff changeset
    18
#include <gst/gst.h>
19
hgs
parents:
diff changeset
    19
#include "xaadaptationgst.h"
hgs
parents:
diff changeset
    20
#include "xamediaplayeradaptctx.h"
hgs
parents:
diff changeset
    21
#include "xamediarecorderadaptctx.h"
hgs
parents:
diff changeset
    22
#include "xaoutputmixadaptctx.h"
hgs
parents:
diff changeset
    23
#include "xaequalizeritfadaptation.h"
hgs
parents:
diff changeset
    24
//#include "XAStaticCapsAdaptation.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
static const XAmilliHertz centerFrequencies[EQUALIZER_NUM_OF_BANDS] = {
hgs
parents:
diff changeset
    27
        29000, 59000, 119000, 227000, 474000,
hgs
parents:
diff changeset
    28
        947000, 1889000, 3770000, 7523000, 15011000 };
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
static const char* band_names[EQUALIZER_NUM_OF_BANDS] = {
hgs
parents:
diff changeset
    31
        "band0", "band1", "band2", "band3", "band4",
hgs
parents:
diff changeset
    32
        "band5", "band6", "band7", "band8", "band9" };
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
/*static const XAmilliHertz bandFreqRangeMin = 0;
hgs
parents:
diff changeset
    35
static const XAmilliHertz bandFreqRangeMax = 0;*/
hgs
parents:
diff changeset
    36
static const XAmillibel bandLevelRangeMin = -2400;
hgs
parents:
diff changeset
    37
static const XAmillibel bandLevelRangeMax = 1200;
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
/*
hgs
parents:
diff changeset
    41
 * XAresult XAEqualizerItfAdapt_GetBandLevelRange(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
    42
 *                                                XAmillibel *pMin,
hgs
parents:
diff changeset
    43
 *                                                XAmillibel *pMax)
hgs
parents:
diff changeset
    44
 */
hgs
parents:
diff changeset
    45
XAresult XAEqualizerItfAdapt_GetBandLevelRange(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
    46
                                               XAmillibel *pMin,
hgs
parents:
diff changeset
    47
                                               XAmillibel *pMax)
hgs
parents:
diff changeset
    48
{
hgs
parents:
diff changeset
    49
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
    50
    DEBUG_API("->XAEqualizerItfAdapt_GetBandLevelRange");
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
    if( (!pMin && !pMax) ) /* other may be NULL */
hgs
parents:
diff changeset
    53
    {
hgs
parents:
diff changeset
    54
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
    55
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
    56
    }
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    if (pMin)
hgs
parents:
diff changeset
    59
    {
hgs
parents:
diff changeset
    60
        *pMin = bandLevelRangeMin;
hgs
parents:
diff changeset
    61
    }
hgs
parents:
diff changeset
    62
    if (pMax)
hgs
parents:
diff changeset
    63
    {
hgs
parents:
diff changeset
    64
        *pMax = bandLevelRangeMax;
hgs
parents:
diff changeset
    65
    }
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
    DEBUG_API("<-XAEqualizerItfAdapt_GetBandLevelRange");
hgs
parents:
diff changeset
    68
    return ret;
hgs
parents:
diff changeset
    69
}
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
/*
hgs
parents:
diff changeset
    72
 * XAresult XAEqualizerItfAdapt_SetBandLevel(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
    73
 *                                           XAuint16 band,
hgs
parents:
diff changeset
    74
 *                                           XAmillibel level)
hgs
parents:
diff changeset
    75
 */
hgs
parents:
diff changeset
    76
XAresult XAEqualizerItfAdapt_SetBandLevel(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
    77
                                          XAuint16 band,
hgs
parents:
diff changeset
    78
                                          XAmillibel level)
hgs
parents:
diff changeset
    79
{
hgs
parents:
diff changeset
    80
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
    81
    GstElement *equ=NULL, *audiopp=NULL;
hgs
parents:
diff changeset
    82
    DEBUG_API("->XAEqualizerItfAdapt_SetBandLevel");
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
    if(!bCtx ||
hgs
parents:
diff changeset
    85
        band >= EQUALIZER_NUM_OF_BANDS  ||
hgs
parents:
diff changeset
    86
        level < bandLevelRangeMin ||
hgs
parents:
diff changeset
    87
        level > bandLevelRangeMax)
hgs
parents:
diff changeset
    88
    {
hgs
parents:
diff changeset
    89
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
    90
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
    91
    }
hgs
parents:
diff changeset
    92
    else
hgs
parents:
diff changeset
    93
    {
hgs
parents:
diff changeset
    94
        if( bCtx->baseObj.ctxId == XAMediaPlayerAdaptation || bCtx->baseObj.ctxId == XAMediaRecorderAdaptation )
hgs
parents:
diff changeset
    95
        {
hgs
parents:
diff changeset
    96
            audiopp = gst_bin_get_by_name( GST_BIN(bCtx->bin), "audiopp" );
hgs
parents:
diff changeset
    97
            equ = gst_bin_get_by_name( GST_BIN(audiopp), "pp_equ" );
hgs
parents:
diff changeset
    98
            if(equ)
hgs
parents:
diff changeset
    99
            {
hgs
parents:
diff changeset
   100
                g_object_set( G_OBJECT(equ), band_names[band], (gdouble)(level/1000), NULL );
hgs
parents:
diff changeset
   101
            }
hgs
parents:
diff changeset
   102
            else
hgs
parents:
diff changeset
   103
            {
hgs
parents:
diff changeset
   104
                DEBUG_ERR("Media object equalizer element not found!!");
hgs
parents:
diff changeset
   105
            }
hgs
parents:
diff changeset
   106
        }
hgs
parents:
diff changeset
   107
        else if( bCtx->baseObj.ctxId == XAOutputMixAdaptation )
hgs
parents:
diff changeset
   108
        {
hgs
parents:
diff changeset
   109
    	    XAOutputMixAdaptationCtx* context = (XAOutputMixAdaptationCtx*) bCtx;
hgs
parents:
diff changeset
   110
    	    guint iterator;
hgs
parents:
diff changeset
   111
    	    for ( iterator = 0; iterator < context->connectedObjects->len; iterator++ )
hgs
parents:
diff changeset
   112
            {
hgs
parents:
diff changeset
   113
                GstBin* basebin = GST_BIN(g_array_index(context->connectedObjects,XAOMixAdaptConnObj,iterator).ctx->bin);
hgs
parents:
diff changeset
   114
                equ=NULL;
hgs
parents:
diff changeset
   115
                audiopp=NULL;
hgs
parents:
diff changeset
   116
                audiopp = gst_bin_get_by_name( basebin, "audiopp" );
hgs
parents:
diff changeset
   117
                if(audiopp)
hgs
parents:
diff changeset
   118
                {
hgs
parents:
diff changeset
   119
                    equ = gst_bin_get_by_name( GST_BIN(audiopp), "pp_equ" );
hgs
parents:
diff changeset
   120
                }
hgs
parents:
diff changeset
   121
                if(equ)
hgs
parents:
diff changeset
   122
                {
hgs
parents:
diff changeset
   123
                    g_object_set( G_OBJECT(equ), band_names[band], (gdouble)(level/1000), NULL );
hgs
parents:
diff changeset
   124
                }
hgs
parents:
diff changeset
   125
                else
hgs
parents:
diff changeset
   126
                {
hgs
parents:
diff changeset
   127
                    DEBUG_ERR_A1("Could not find equalizer for player %u!!", iterator);
hgs
parents:
diff changeset
   128
                }
hgs
parents:
diff changeset
   129
            }
hgs
parents:
diff changeset
   130
        }
hgs
parents:
diff changeset
   131
        else
hgs
parents:
diff changeset
   132
        {
hgs
parents:
diff changeset
   133
            DEBUG_ERR_A1("Not supported adaptation element: %d", bCtx->baseObj.ctxId);
hgs
parents:
diff changeset
   134
            return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   135
        }
hgs
parents:
diff changeset
   136
    }
hgs
parents:
diff changeset
   137
    if(equ)
hgs
parents:
diff changeset
   138
    {
hgs
parents:
diff changeset
   139
        gst_object_unref(equ);
hgs
parents:
diff changeset
   140
    }
hgs
parents:
diff changeset
   141
	if(audiopp)
hgs
parents:
diff changeset
   142
    {
hgs
parents:
diff changeset
   143
        gst_object_unref(audiopp);
hgs
parents:
diff changeset
   144
    }
hgs
parents:
diff changeset
   145
	
hgs
parents:
diff changeset
   146
    DEBUG_API("<-XAEqualizerItfAdapt_SetBandLevel");
hgs
parents:
diff changeset
   147
    return ret;
hgs
parents:
diff changeset
   148
}
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
/*
hgs
parents:
diff changeset
   151
 * XAresult XAEqualizerItfAdapt_GetCenterFreq(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   152
 *                                            XAuint16 band,
hgs
parents:
diff changeset
   153
 *                                            XAmilliHertz *pCenter)
hgs
parents:
diff changeset
   154
 */
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
XAresult XAEqualizerItfAdapt_GetCenterFreq(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   157
                                           XAuint16 band,
hgs
parents:
diff changeset
   158
                                           XAmilliHertz *pCenter)
hgs
parents:
diff changeset
   159
{
hgs
parents:
diff changeset
   160
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   161
    DEBUG_API("->XAEqualizerItfAdapt_GetCenterFreq");
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
    if(!pCenter || band >= EQUALIZER_NUM_OF_BANDS)
hgs
parents:
diff changeset
   164
    {
hgs
parents:
diff changeset
   165
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   166
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   167
    }
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
    *pCenter = centerFrequencies[band];
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
    DEBUG_API("<-XAEqualizerItfAdapt_GetCenterFreq");
hgs
parents:
diff changeset
   172
    return ret;
hgs
parents:
diff changeset
   173
}
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
/*
hgs
parents:
diff changeset
   176
 * XAresult XAEqualizerItfAdapt_GetBandFreqRange(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   177
 *                                               XAuint16 band,
hgs
parents:
diff changeset
   178
 *                                               XAmilliHertz *pMin,
hgs
parents:
diff changeset
   179
 *                                               XAmilliHerts *pMax)
hgs
parents:
diff changeset
   180
 */
hgs
parents:
diff changeset
   181
XAresult XAEqualizerItfAdapt_GetBandFreqRange(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   182
                                              XAuint16 band,
hgs
parents:
diff changeset
   183
                                              XAmilliHertz *pMin,
hgs
parents:
diff changeset
   184
                                              XAmilliHertz *pMax)
hgs
parents:
diff changeset
   185
{
hgs
parents:
diff changeset
   186
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   187
    DEBUG_API("->XAEqualizerItfAdapt_GetBandFreqRange");
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
    /* pMin or pMax may be NULL */
hgs
parents:
diff changeset
   190
    if((!pMin && !pMax)  || band >= EQUALIZER_NUM_OF_BANDS)
hgs
parents:
diff changeset
   191
    {
hgs
parents:
diff changeset
   192
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   193
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   194
    }
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
    /* in this implementation there are no ranges */
hgs
parents:
diff changeset
   197
    if (pMin)
hgs
parents:
diff changeset
   198
    {
hgs
parents:
diff changeset
   199
        *pMin = centerFrequencies[band];
hgs
parents:
diff changeset
   200
    }
hgs
parents:
diff changeset
   201
    if (pMax)
hgs
parents:
diff changeset
   202
    {
hgs
parents:
diff changeset
   203
        *pMax = centerFrequencies[band];
hgs
parents:
diff changeset
   204
    }
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
    DEBUG_API("<-XAEqualizerItfAdapt_GetBandFreqRange");
hgs
parents:
diff changeset
   207
    return ret;
hgs
parents:
diff changeset
   208
}
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
/*
hgs
parents:
diff changeset
   211
 * XAresult XAEqualizerItfAdapt_GetBand(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   212
 *                                      XAmilliHertz frequency,
hgs
parents:
diff changeset
   213
 *                                      XAuint16 *pBand)
hgs
parents:
diff changeset
   214
 */
hgs
parents:
diff changeset
   215
XAresult XAEqualizerItfAdapt_GetBand(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   216
                                     XAmilliHertz frequency,
hgs
parents:
diff changeset
   217
                                     XAuint16 *pBand)
hgs
parents:
diff changeset
   218
{
hgs
parents:
diff changeset
   219
    XAuint16 index=0;
hgs
parents:
diff changeset
   220
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   221
    DEBUG_API("->XAEqualizerItfAdapt_GetBand");
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
    if(!pBand)
hgs
parents:
diff changeset
   224
    {
hgs
parents:
diff changeset
   225
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   226
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   227
    }
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
    *pBand = XA_EQUALIZER_UNDEFINED;
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
    /* as there are no ranges, it must match exactly */
hgs
parents:
diff changeset
   232
    for (index = 0; index < EQUALIZER_NUM_OF_BANDS; index++)
hgs
parents:
diff changeset
   233
    {
hgs
parents:
diff changeset
   234
        if (frequency == centerFrequencies[index])
hgs
parents:
diff changeset
   235
        {
hgs
parents:
diff changeset
   236
            *pBand = index;
hgs
parents:
diff changeset
   237
            break;
hgs
parents:
diff changeset
   238
        }
hgs
parents:
diff changeset
   239
    }
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
    DEBUG_API("<-XAEqualizerItfAdapt_GetBand");
hgs
parents:
diff changeset
   242
    return ret;
hgs
parents:
diff changeset
   243
}
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
/*
hgs
parents:
diff changeset
   246
 * XAresult XAEqualizerItfAdapt_GetDefaultBandLevel(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   247
 *                                           XAuint16 band,
hgs
parents:
diff changeset
   248
 *                                           XAmillibel *pLevel)
hgs
parents:
diff changeset
   249
 */
hgs
parents:
diff changeset
   250
XAresult XAEqualizerItfAdapt_GetDefaultBandLevel(XAAdaptationGstCtx *bCtx,
hgs
parents:
diff changeset
   251
                                                 XAuint16 band,
hgs
parents:
diff changeset
   252
                                                 XAmillibel *pLevel)
hgs
parents:
diff changeset
   253
{
hgs
parents:
diff changeset
   254
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   255
    DEBUG_API("->XAEqualizerItfAdapt_GetDefaultBandLevel");
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
    if(!pLevel)
hgs
parents:
diff changeset
   258
    {
hgs
parents:
diff changeset
   259
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   260
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   261
    }
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
    pLevel = EQUALIZER_DEFAULT_BAND_LEVEL;
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
    DEBUG_API("<-XAEqualizerItfAdapt_GetDefaultBandLevel");
hgs
parents:
diff changeset
   266
    return ret;
hgs
parents:
diff changeset
   267
}
hgs
parents:
diff changeset
   268