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