khronosfws/openmax_al/src/gst_adaptation/xaoutputmixadaptctx.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 "xaoutputmixadaptctx.h"
hgs
parents:
diff changeset
    20
#include "xaadaptationgst.h"
hgs
parents:
diff changeset
    21
#include "xacapabilitiesmgr.h"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
/*
hgs
parents:
diff changeset
    25
 * XAAdaptationGstCtx* XAOutputMixAdapt_Create()
hgs
parents:
diff changeset
    26
 * @returns XAOutputMixAdaptationCtx* - Pointer to created context
hgs
parents:
diff changeset
    27
 * Description: Allocates memory for Output Mix Adaptation Context and makes 1st phase initialization
hgs
parents:
diff changeset
    28
 */
hgs
parents:
diff changeset
    29
XAAdaptationBaseCtx* XAOutputMixAdapt_Create()
hgs
parents:
diff changeset
    30
{
hgs
parents:
diff changeset
    31
    XAOutputMixAdaptationCtx *pSelf = (XAOutputMixAdaptationCtx*)calloc(1, sizeof(XAOutputMixAdaptationCtx));
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
    DEBUG_API("->XAOutputMixAdapt_Create");
hgs
parents:
diff changeset
    34
    if ( pSelf)
hgs
parents:
diff changeset
    35
    {
hgs
parents:
diff changeset
    36
        if( XAAdaptationBase_Init(&(pSelf->baseObj.baseObj),XAOutputMixAdaptation)
hgs
parents:
diff changeset
    37
                    != XA_RESULT_SUCCESS )
hgs
parents:
diff changeset
    38
        {
hgs
parents:
diff changeset
    39
            DEBUG_ERR("Failed to init base context!!!");
hgs
parents:
diff changeset
    40
            free(pSelf);
hgs
parents:
diff changeset
    41
            pSelf = NULL;
hgs
parents:
diff changeset
    42
        }
hgs
parents:
diff changeset
    43
        else
hgs
parents:
diff changeset
    44
        {
hgs
parents:
diff changeset
    45
            XAuint32 devId;
hgs
parents:
diff changeset
    46
            pSelf->connectedObjects = g_array_new (FALSE, TRUE, sizeof (XAOMixAdaptConnObj));
hgs
parents:
diff changeset
    47
            pSelf->availableDevices = g_array_new (FALSE, TRUE, sizeof (XAuint32));
hgs
parents:
diff changeset
    48
            /*initially, only alsasink available*/
hgs
parents:
diff changeset
    49
//            devId = XA_ADAPTID_ALSASINK;
hgs
parents:
diff changeset
    50
            devId = XA_ADAPTID_DEVSOUNDSINK;
hgs
parents:
diff changeset
    51
            g_array_append_val(pSelf->availableDevices, devId);
hgs
parents:
diff changeset
    52
            pSelf->currentrouting = devId;
hgs
parents:
diff changeset
    53
        }
hgs
parents:
diff changeset
    54
    }
hgs
parents:
diff changeset
    55
    DEBUG_API("<-XAOutputMixAdapt_Create");
hgs
parents:
diff changeset
    56
    return (XAAdaptationBaseCtx* )&pSelf->baseObj;
hgs
parents:
diff changeset
    57
}
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
/*
hgs
parents:
diff changeset
    60
 * XAresult XAOutputMixAdapt_PostInit(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
    61
 * 2nd phase initialization of Output Mix Adaptation Context
hgs
parents:
diff changeset
    62
 */
hgs
parents:
diff changeset
    63
XAresult XAOutputMixAdapt_PostInit(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
    64
{
hgs
parents:
diff changeset
    65
    DEBUG_API("->XAOutputMixAdapt_PostInit");
hgs
parents:
diff changeset
    66
    if(bCtx == NULL || bCtx->baseObj.ctxId != XAOutputMixAdaptation )
hgs
parents:
diff changeset
    67
    {
hgs
parents:
diff changeset
    68
        DEBUG_ERR("Invalid parameter!!");
hgs
parents:
diff changeset
    69
        DEBUG_API("<-XAOutputMixAdapt_PostInit");
hgs
parents:
diff changeset
    70
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
    71
    }
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
    /* check and add devices to pSelf->availableDevices if such detection can be done */
hgs
parents:
diff changeset
    74
    DEBUG_API("<-XAOutputMixAdapt_PostInit");
hgs
parents:
diff changeset
    75
    return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
    76
}
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
/*
hgs
parents:
diff changeset
    79
 * void XAOutputMixAdapt_Destroy(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
    80
 * Destroys Output Mix Adaptation Context
hgs
parents:
diff changeset
    81
 * @param ctx - Output Mix Adaptation context to be destroyed
hgs
parents:
diff changeset
    82
 */
hgs
parents:
diff changeset
    83
void XAOutputMixAdapt_Destroy(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
    84
{
hgs
parents:
diff changeset
    85
    XAOutputMixAdaptationCtx* ctx = NULL;
hgs
parents:
diff changeset
    86
    DEBUG_API("->XAOutputMixAdapt_Destroy");
hgs
parents:
diff changeset
    87
    if(bCtx == NULL || bCtx->baseObj.ctxId != XAOutputMixAdaptation )
hgs
parents:
diff changeset
    88
    {
hgs
parents:
diff changeset
    89
        DEBUG_ERR("Invalid parameter!!");
hgs
parents:
diff changeset
    90
        DEBUG_API("<-XAOutputMixAdapt_Destroy");
hgs
parents:
diff changeset
    91
        return;
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
    ctx = (XAOutputMixAdaptationCtx*)bCtx;
hgs
parents:
diff changeset
    94
    g_array_free(ctx->connectedObjects, TRUE);
hgs
parents:
diff changeset
    95
    g_array_free(ctx->availableDevices, TRUE);
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
    XAAdaptationBase_Free( &(ctx->baseObj.baseObj) );
hgs
parents:
diff changeset
    98
    free(ctx);
hgs
parents:
diff changeset
    99
    DEBUG_API("<-XAOutputMixAdapt_Destroy");
hgs
parents:
diff changeset
   100
}
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
/*
hgs
parents:
diff changeset
   103
 * GstElement* XAOutputMixAdapt_GetSink(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   104
 */
hgs
parents:
diff changeset
   105
GstElement* XAOutputMixAdapt_GetSink(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   106
{
hgs
parents:
diff changeset
   107
    XAOutputMixAdaptationCtx* mixCtx = NULL;
hgs
parents:
diff changeset
   108
    /* create sink for current routing */
hgs
parents:
diff changeset
   109
    GstElement* newsink=NULL;
hgs
parents:
diff changeset
   110
    XACapabilities temp;
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
    DEBUG_API("->XAOutputMixAdapt_GetSink");
hgs
parents:
diff changeset
   113
    if(bCtx == NULL || bCtx->baseObj.ctxId != XAOutputMixAdaptation )
hgs
parents:
diff changeset
   114
    {
hgs
parents:
diff changeset
   115
        DEBUG_ERR("Invalid parameter!!");
hgs
parents:
diff changeset
   116
        DEBUG_API("<-XAOutputMixAdapt_GetSink");
hgs
parents:
diff changeset
   117
        return NULL;
hgs
parents:
diff changeset
   118
    }
hgs
parents:
diff changeset
   119
    mixCtx = (XAOutputMixAdaptationCtx*)bCtx;
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
    if(!mixCtx)
hgs
parents:
diff changeset
   122
    {
hgs
parents:
diff changeset
   123
        DEBUG_ERR("NULL context!");
hgs
parents:
diff changeset
   124
        return NULL;
hgs
parents:
diff changeset
   125
    }
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
    if( XA_RESULT_SUCCESS ==
hgs
parents:
diff changeset
   128
            XACapabilitiesMgr_GetCapsById(NULL, (XACapsType)((XACapsType)(XACAP_DEVSNK|XACAP_AUDIO)), mixCtx->currentrouting, &temp) )
hgs
parents:
diff changeset
   129
    {
hgs
parents:
diff changeset
   130
        newsink = gst_element_factory_make((char*)temp.adaptId,(char*)temp.adaptId);
hgs
parents:
diff changeset
   131
        if(!newsink)
hgs
parents:
diff changeset
   132
        {
hgs
parents:
diff changeset
   133
            DEBUG_ERR_A1("Could not create sink \"%s\"!", (char*)temp.adaptId);
hgs
parents:
diff changeset
   134
        }
hgs
parents:
diff changeset
   135
    }
hgs
parents:
diff changeset
   136
    else
hgs
parents:
diff changeset
   137
    {
hgs
parents:
diff changeset
   138
        DEBUG_ERR_A1("Could not find audio device by id 0x%x", (int)mixCtx->currentrouting);
hgs
parents:
diff changeset
   139
    }
hgs
parents:
diff changeset
   140
    DEBUG_API("<-XAOutputMixAdapt_GetSink");
hgs
parents:
diff changeset
   141
    return newsink;
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
}
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
/*
hgs
parents:
diff changeset
   146
 * XAresult XAOutputMixAdapt_ConnectObject(XAAdaptationGstCtx* omCtx, XAAdaptationGstCtx* bCtx, GstElement* usedMix)
hgs
parents:
diff changeset
   147
 */
hgs
parents:
diff changeset
   148
XAresult XAOutputMixAdapt_ConnectObject(XAAdaptationGstCtx* omCtx, XAAdaptationGstCtx* bCtx, GstElement* usedMix)
hgs
parents:
diff changeset
   149
{
hgs
parents:
diff changeset
   150
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   151
    XAuint32 i=0;
hgs
parents:
diff changeset
   152
    XAOutputMixAdaptationCtx* mixCtx =NULL;
hgs
parents:
diff changeset
   153
    DEBUG_API("->XAOutputMixAdapt_ConnectObject");
hgs
parents:
diff changeset
   154
    if( !omCtx || omCtx->baseObj.ctxId!=XAOutputMixAdaptation || !bCtx || !usedMix )
hgs
parents:
diff changeset
   155
    {
hgs
parents:
diff changeset
   156
        DEBUG_ERR("Invalid attribute!!");
hgs
parents:
diff changeset
   157
        DEBUG_API("<-XAOutputMixAdapt_ConnectObject");
hgs
parents:
diff changeset
   158
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   159
    }
hgs
parents:
diff changeset
   160
    mixCtx = (XAOutputMixAdaptationCtx*)omCtx;
hgs
parents:
diff changeset
   161
    if( !mixCtx || !bCtx || !usedMix )
hgs
parents:
diff changeset
   162
    {
hgs
parents:
diff changeset
   163
        DEBUG_ERR("Invalid attribute!!");
hgs
parents:
diff changeset
   164
        DEBUG_API("<-XAOutputMixAdapt_DisconnectObject");
hgs
parents:
diff changeset
   165
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   166
    }
hgs
parents:
diff changeset
   167
    for(i=0; i<mixCtx->connectedObjects->len; i++)
hgs
parents:
diff changeset
   168
    {
hgs
parents:
diff changeset
   169
        if( (g_array_index(mixCtx->connectedObjects, XAOMixAdaptConnObj, i)).ctx == bCtx )
hgs
parents:
diff changeset
   170
        {
hgs
parents:
diff changeset
   171
            /*item found already*/
hgs
parents:
diff changeset
   172
            ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   173
            break;
hgs
parents:
diff changeset
   174
        }
hgs
parents:
diff changeset
   175
    }
hgs
parents:
diff changeset
   176
    if(i==mixCtx->connectedObjects->len)
hgs
parents:
diff changeset
   177
    {
hgs
parents:
diff changeset
   178
        XAOMixAdaptConnObj tmp;
hgs
parents:
diff changeset
   179
        tmp.ctx= bCtx;
hgs
parents:
diff changeset
   180
        tmp.currentSink = usedMix;
hgs
parents:
diff changeset
   181
        g_array_append_val(mixCtx->connectedObjects, tmp);
hgs
parents:
diff changeset
   182
    }
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
    DEBUG_API("<-XAOutputMixAdapt_ConnectObject");
hgs
parents:
diff changeset
   185
    return ret;
hgs
parents:
diff changeset
   186
}
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
/*
hgs
parents:
diff changeset
   189
 * XAresult XAOutputMixAdapt_DisconnectObject(XAAdaptationGstCtx* omCtx, XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   190
 */
hgs
parents:
diff changeset
   191
XAresult XAOutputMixAdapt_DisconnectObject(XAAdaptationGstCtx* omCtx, XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   192
{
hgs
parents:
diff changeset
   193
    XAuint32 i=0;
hgs
parents:
diff changeset
   194
    XAOutputMixAdaptationCtx* mixCtx =NULL;
hgs
parents:
diff changeset
   195
    DEBUG_API("->XAOutputMixAdapt_DisconnectObject");
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
    if( !omCtx || omCtx->baseObj.ctxId!=XAOutputMixAdaptation || !bCtx )
hgs
parents:
diff changeset
   198
    {
hgs
parents:
diff changeset
   199
        DEBUG_ERR("Invalid attribute!!");
hgs
parents:
diff changeset
   200
        DEBUG_API("<-XAOutputMixAdapt_DisconnectObject");
hgs
parents:
diff changeset
   201
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   202
    }
hgs
parents:
diff changeset
   203
    mixCtx = (XAOutputMixAdaptationCtx*)omCtx;
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
    if( !mixCtx || !bCtx )
hgs
parents:
diff changeset
   206
    {
hgs
parents:
diff changeset
   207
        DEBUG_ERR("Invalid attribute!!");
hgs
parents:
diff changeset
   208
        DEBUG_API("<-XAOutputMixAdapt_DisconnectObject");
hgs
parents:
diff changeset
   209
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   210
    }
hgs
parents:
diff changeset
   211
    for(i=0; i<mixCtx->connectedObjects->len; i++)
hgs
parents:
diff changeset
   212
    {
hgs
parents:
diff changeset
   213
        XAOMixAdaptConnObj* tmp = &(g_array_index(mixCtx->connectedObjects, XAOMixAdaptConnObj, i));
hgs
parents:
diff changeset
   214
        if( tmp->ctx == bCtx  )
hgs
parents:
diff changeset
   215
        {
hgs
parents:
diff changeset
   216
            g_array_remove_index(mixCtx->connectedObjects, i);
hgs
parents:
diff changeset
   217
            DEBUG_API("<-XAOutputMixAdapt_DisconnectObject");
hgs
parents:
diff changeset
   218
            return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   219
        }
hgs
parents:
diff changeset
   220
    }
hgs
parents:
diff changeset
   221
    /*did not find, return error*/
hgs
parents:
diff changeset
   222
    DEBUG_ERR("Object not found!");
hgs
parents:
diff changeset
   223
    DEBUG_API("<-XAOutputMixAdapt_DisconnectObject");
hgs
parents:
diff changeset
   224
    return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   225
}
hgs
parents:
diff changeset
   226