12eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten/*
22eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten * Copyright (C) 2011 The Android Open Source Project
32eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten *
42eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
52eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten * you may not use this file except in compliance with the License.
62eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten * You may obtain a copy of the License at
72eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten *
82eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
92eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten *
102eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten * Unless required by applicable law or agreed to in writing, software
112eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
122eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten * See the License for the specific language governing permissions and
142eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten * limitations under the License.
152eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten */
162eac6c23b7bd8985e5bc842b9dec9fa3980dd100Glenn Kasten
175a4ced0f2f153380d984826f82c26c7507273b66Colin Cross/* StreamInformation implementation */
185a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
195a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#include "sles_allinclusive.h"
205a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
215a4ced0f2f153380d984826f82c26c7507273b66Colin Crossstatic XAresult IStreamInformation_QueryMediaContainerInformation( XAStreamInformationItf self,
225a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAMediaContainerInformation * info /* [out] */)
235a4ced0f2f153380d984826f82c26c7507273b66Colin Cross{
245a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_ENTER_INTERFACE
255a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
265a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    if (NULL == info) {
275a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        result = XA_RESULT_PARAMETER_INVALID;
285a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XA_LEAVE_INTERFACE
295a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    }
305a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
315a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#ifdef ANDROID
325a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation *thiz = (IStreamInformation *) self;
335a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    interface_lock_shared(thiz);
345a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    // always storing container info at index 0, as per spec
355a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    *info = thiz->mStreamInfoTable.itemAt(0).containerInfo;
365a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    interface_unlock_shared(thiz);
375a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    // even though the pointer to the media container info is returned, the values aren't set
385a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    //  for the actual container in this version, they are simply initialized to defaults
395a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    //  (see IStreamInformation_init)
405a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    result = XA_RESULT_SUCCESS;
415a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#else
425a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    SL_LOGE("QueryMediaContainerInformation is unsupported");
435a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    memset(info, 0, sizeof(XAMediaContainerInformation));
445a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    result = XA_RESULT_FEATURE_UNSUPPORTED;
455a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#endif
465a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
475a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_LEAVE_INTERFACE
485a4ced0f2f153380d984826f82c26c7507273b66Colin Cross}
495a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
505a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
515a4ced0f2f153380d984826f82c26c7507273b66Colin Crossstatic XAresult IStreamInformation_QueryStreamType( XAStreamInformationItf self,
525a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAuint32 streamIndex, /* [in] */
535a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAuint32 *domain)     /* [out] */
545a4ced0f2f153380d984826f82c26c7507273b66Colin Cross{
555a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_ENTER_INTERFACE
565a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
575a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    if (NULL == domain) {
585a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        result = XA_RESULT_PARAMETER_INVALID;
595a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XA_LEAVE_INTERFACE;
605a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    }
615a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
625a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#ifndef ANDROID
635a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    *domain = XA_DOMAINTYPE_UNKNOWN;
645a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#else
655a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    if (0 == streamIndex) {
665a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        // stream 0 is reserved for the container
675a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        result = XA_RESULT_PARAMETER_INVALID;
685a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        *domain = XA_DOMAINTYPE_UNKNOWN;
695a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    } else {
705a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        IStreamInformation *thiz = (IStreamInformation *) self;
715a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
725a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        interface_lock_shared(thiz);
735a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
745a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
755a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        // streams in the container are numbered 1..nbStreams
765a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        if (streamIndex <= nbStreams) {
775a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            result = XA_RESULT_SUCCESS;
785a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            *domain = thiz->mStreamInfoTable.itemAt(streamIndex).domain;
795a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        } else {
805a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            SL_LOGE("Querying stream type for stream %d, only %d streams available",
815a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                    streamIndex, nbStreams);
825a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            result = XA_RESULT_PARAMETER_INVALID;
835a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        }
845a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
855a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        interface_unlock_shared(thiz);
865a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    }
875a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#endif
885a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
895a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_LEAVE_INTERFACE
905a4ced0f2f153380d984826f82c26c7507273b66Colin Cross}
915a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
925a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
935a4ced0f2f153380d984826f82c26c7507273b66Colin Crossstatic XAresult IStreamInformation_QueryStreamInformation( XAStreamInformationItf self,
945a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAuint32 streamIndex, /* [in] */
955a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        void * info)          /* [out] */
965a4ced0f2f153380d984826f82c26c7507273b66Colin Cross{
975a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_ENTER_INTERFACE
985a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
995a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    if (NULL == info) {
1005a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        result = XA_RESULT_PARAMETER_INVALID;
1015a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    } else {
1025a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1035a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#ifndef ANDROID
1045a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        result = XA_RESULT_FEATURE_UNSUPPORTED;
1055a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#else
1065a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1075a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        IStreamInformation *thiz = (IStreamInformation *) self;
1085a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1095a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        interface_lock_shared(thiz);
1105a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1115a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
1125a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        // stream 0 is the container, and other streams in the container are numbered 1..nbStreams
1135a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        if (streamIndex <= nbStreams) {
1145a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            result = XA_RESULT_SUCCESS;
1155a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            const StreamInfo& streamInfo = thiz->mStreamInfoTable.itemAt((size_t)streamIndex);
1165a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1175a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            switch (streamInfo.domain) {
1185a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            case XA_DOMAINTYPE_CONTAINER:
1195a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                *(XAMediaContainerInformation *)info = streamInfo.containerInfo;
1205a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                break;
1215a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            case XA_DOMAINTYPE_AUDIO:
1225a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                *(XAAudioStreamInformation *)info = streamInfo.audioInfo;
1235a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                break;
1245a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            case XA_DOMAINTYPE_VIDEO:
1255a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                *(XAVideoStreamInformation *)info = streamInfo.videoInfo;
1265a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                break;
1275a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            case XA_DOMAINTYPE_IMAGE:
1285a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                *(XAImageStreamInformation *)info = streamInfo.imageInfo;
1295a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                break;
1305a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            case XA_DOMAINTYPE_TIMEDTEXT:
1315a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                *(XATimedTextStreamInformation *)info = streamInfo.textInfo;
1325a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                break;
1335a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            case XA_DOMAINTYPE_MIDI:
1345a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                *(XAMIDIStreamInformation *)info = streamInfo.midiInfo;
1355a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                break;
1365a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            case XA_DOMAINTYPE_VENDOR:
1375a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                *(XAVendorStreamInformation *)info = streamInfo.vendorInfo;
1385a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                break;
1395a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            default:
1405a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                SL_LOGE("StreamInformation::QueryStreamInformation index %u has "
1415a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                        "unknown domain %u", streamIndex, streamInfo.domain);
1425a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                result = XA_RESULT_INTERNAL_ERROR;
1435a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                break;
1445a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            }
1455a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1465a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        } else {
1475a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            SL_LOGE("Querying stream type for stream %d, only %d streams available",
1485a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                    streamIndex, nbStreams);
1495a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            result = XA_RESULT_PARAMETER_INVALID;
1505a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        }
1515a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1525a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        interface_unlock_shared(thiz);
1535a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#endif
1545a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1555a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    }
1565a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1575a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_LEAVE_INTERFACE
1585a4ced0f2f153380d984826f82c26c7507273b66Colin Cross}
1595a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1605a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1615a4ced0f2f153380d984826f82c26c7507273b66Colin Crossstatic XAresult IStreamInformation_QueryStreamName( XAStreamInformationItf self,
1625a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAuint32 streamIndex, /* [in] */
1635a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAuint16 * pNameSize, /* [in/out] */
1645a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAchar * pName)       /* [out] */
1655a4ced0f2f153380d984826f82c26c7507273b66Colin Cross{
1665a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_ENTER_INTERFACE
1675a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1685a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    if (NULL == pNameSize || streamIndex == 0) {
1695a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        result = XA_RESULT_PARAMETER_INVALID;
1705a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    } else {
1715a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#ifdef ANDROID
1725a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        IStreamInformation *thiz = (IStreamInformation *) self;
1735a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        interface_lock_shared(thiz);
1745a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
1755a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
1765a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        // streams in the container are numbered 1..nbStreams
1775a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        if (streamIndex <= nbStreams) {
1785a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            char streamName[16];        // large enough for the fixed format in next line
1795a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            snprintf(streamName, sizeof(streamName), "stream%u", streamIndex);
1805a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            size_t actualNameLength = strlen(streamName);
1815a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            if (NULL == pName) {
1825a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                // application is querying the name length in order to allocate a buffer
1835a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                result = XA_RESULT_SUCCESS;
1845a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            } else {
1855a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                SLuint16 availableNameLength = *pNameSize;
1865a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                if (actualNameLength > availableNameLength) {
1875a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                    memcpy(pName, streamName, availableNameLength);
1885a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                    result = XA_RESULT_BUFFER_INSUFFICIENT;
1895a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                } else if (actualNameLength == availableNameLength) {
1905a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                    memcpy(pName, streamName, availableNameLength);
1915a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                    result = XA_RESULT_SUCCESS;
1925a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                } else { // actualNameLength < availableNameLength
1935a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                    memcpy(pName, streamName, actualNameLength + 1);
1945a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                    result = XA_RESULT_SUCCESS;
1955a4ced0f2f153380d984826f82c26c7507273b66Colin Cross                }
1965a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            }
1975a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            *pNameSize = actualNameLength;
1985a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        } else {
1995a4ced0f2f153380d984826f82c26c7507273b66Colin Cross            result = XA_RESULT_PARAMETER_INVALID;
2005a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        }
2015a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2025a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        interface_unlock_shared(thiz);
2035a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#else
2045a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        SL_LOGE("unsupported XAStreamInformationItf function");
2055a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        result = XA_RESULT_FEATURE_UNSUPPORTED;
2065a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#endif
2075a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    }
2085a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2095a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_LEAVE_INTERFACE
2105a4ced0f2f153380d984826f82c26c7507273b66Colin Cross}
2115a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2125a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2135a4ced0f2f153380d984826f82c26c7507273b66Colin Crossstatic XAresult IStreamInformation_RegisterStreamChangeCallback( XAStreamInformationItf self,
2145a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        xaStreamEventChangeCallback callback, /* [in] */
2155a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        void * pContext)                      /* [in] */
2165a4ced0f2f153380d984826f82c26c7507273b66Colin Cross{
2175a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_ENTER_INTERFACE
2185a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2195a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation *thiz = (IStreamInformation *) self;
2205a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2215a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    interface_lock_exclusive(thiz);
2225a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2235a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    thiz->mCallback = callback;
2245a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    thiz->mContext = pContext;
2255a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    result = SL_RESULT_SUCCESS;
2265a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2275a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    interface_unlock_exclusive(thiz);
2285a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2295a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_LEAVE_INTERFACE
2305a4ced0f2f153380d984826f82c26c7507273b66Colin Cross}
2315a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2325a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2335a4ced0f2f153380d984826f82c26c7507273b66Colin Crossstatic XAresult IStreamInformation_QueryActiveStreams( XAStreamInformationItf self,
2345a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAuint32 *numStreams,      /* [in/out] */
2355a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAboolean *activeStreams)  /* [out] */
2365a4ced0f2f153380d984826f82c26c7507273b66Colin Cross{
2375a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_ENTER_INTERFACE
2385a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2395a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    if (NULL == numStreams) {
2405a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        result = XA_RESULT_PARAMETER_INVALID;
2415a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XA_LEAVE_INTERFACE;
2425a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    }
2435a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2445a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#ifdef ANDROID
2455a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation *thiz = (IStreamInformation *) self;
2465a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    interface_lock_shared(thiz);
2475a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2485a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    result = XA_RESULT_SUCCESS;
2495a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    *numStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
2505a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    // FIXME not setting activeStreams
2515a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2525a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    interface_unlock_shared(thiz);
2535a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#else
2545a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    result = SL_RESULT_FEATURE_UNSUPPORTED;
2555a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#endif
2565a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2575a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_LEAVE_INTERFACE
2585a4ced0f2f153380d984826f82c26c7507273b66Colin Cross}
2595a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2605a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2615a4ced0f2f153380d984826f82c26c7507273b66Colin Crossstatic XAresult IStreamInformation_SetActiveStream( XAStreamInformationItf self,
2625a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAuint32   streamNum, /* [in] */
2635a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAboolean  active,    /* [in] */
2645a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        XAboolean  commitNow) /* [in] */
2655a4ced0f2f153380d984826f82c26c7507273b66Colin Cross{
2665a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_ENTER_INTERFACE
2675a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2685a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    SL_LOGE("unsupported XAStreamInformationItf function");
2695a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    result = XA_RESULT_FEATURE_UNSUPPORTED;
2705a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2715a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    XA_LEAVE_INTERFACE
2725a4ced0f2f153380d984826f82c26c7507273b66Colin Cross}
2735a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2745a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2755a4ced0f2f153380d984826f82c26c7507273b66Colin Crossstatic const struct XAStreamInformationItf_ IStreamInformation_Itf = {
2765a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation_QueryMediaContainerInformation,
2775a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation_QueryStreamType,
2785a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation_QueryStreamInformation,
2795a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation_QueryStreamName,
2805a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation_RegisterStreamChangeCallback,
2815a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation_QueryActiveStreams,
2825a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation_SetActiveStream
2835a4ced0f2f153380d984826f82c26c7507273b66Colin Cross};
2845a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2855a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2865a4ced0f2f153380d984826f82c26c7507273b66Colin Crossvoid IStreamInformation_init(void *self)
2875a4ced0f2f153380d984826f82c26c7507273b66Colin Cross{
2885a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    SL_LOGV("IStreamInformation_init\n");
2895a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation *thiz = (IStreamInformation *) self;
2905a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    thiz->mItf = &IStreamInformation_Itf;
2915a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2925a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    thiz->mCallback = NULL;
2935a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    thiz->mContext = NULL;
2945a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2955a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    for (int i=0 ; i < NB_SUPPORTED_STREAMS ; i++) {
2965a4ced0f2f153380d984826f82c26c7507273b66Colin Cross        thiz->mActiveStreams[i] = XA_BOOLEAN_FALSE;
2975a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    }
2985a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
2995a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#ifdef ANDROID
3005a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    // placement new constructor for C++ field within C struct
3015a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    (void) new (&thiz->mStreamInfoTable) android::Vector<StreamInfo>();
3025a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    // initialize container info
3035a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    StreamInfo contInf;
3045a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    contInf.domain = XA_DOMAINTYPE_CONTAINER;
3055a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    contInf.containerInfo.containerType = XA_CONTAINERTYPE_UNSPECIFIED;
3065a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    contInf.containerInfo.mediaDuration = XA_TIME_UNKNOWN;
3075a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    // FIXME shouldn't this be 1 ?
3085a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    contInf.containerInfo.numStreams = 0;
3095a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    // always storing container info at index 0, as per spec: here, the table was still empty
3105a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    thiz->mStreamInfoTable.add(contInf);
3115a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#endif
3125a4ced0f2f153380d984826f82c26c7507273b66Colin Cross}
3135a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
3145a4ced0f2f153380d984826f82c26c7507273b66Colin Cross
3155a4ced0f2f153380d984826f82c26c7507273b66Colin Crossvoid IStreamInformation_deinit(void *self) {
3165a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#ifdef ANDROID
3175a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    IStreamInformation *thiz = (IStreamInformation *) self;
3185a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    // explicit destructor
3195a4ced0f2f153380d984826f82c26c7507273b66Colin Cross    thiz->mStreamInfoTable.~Vector<StreamInfo>();
3205a4ced0f2f153380d984826f82c26c7507273b66Colin Cross#endif
3215a4ced0f2f153380d984826f82c26c7507273b66Colin Cross}
322