IPlay.c revision ef8931ae547cd703e69df9ad350d69825da0f546
10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* 20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * you may not use this file except in compliance with the License. 60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * You may obtain a copy of the License at 70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Unless required by applicable law or agreed to in writing, software 110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * See the License for the specific language governing permissions and 140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * limitations under the License. 150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten */ 160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* Play implementation */ 180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 19979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten#include "sles_allinclusive.h" 20979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten 210b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IPlay_SetPlayState(SLPlayItf self, SLuint32 state) 220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 236a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten switch (state) { 250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten case SL_PLAYSTATE_STOPPED: 260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten case SL_PLAYSTATE_PAUSED: 270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten case SL_PLAYSTATE_PLAYING: 280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten break; 290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten default: 300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten } 320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_exclusive(this); 34f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi if (this->mState != state) { 35f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi this->mState = state; 36f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi if (SL_PLAYSTATE_STOPPED == state) { 37f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi this->mPosition = (SLmillisecond) 0; 38f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi // this->mPositionSamples = 0; 39f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 40ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 41f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) { 42f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi result = sles_to_android_audioPlayerSetPlayState(this, state); 43f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#endif 45f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 466a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi interface_unlock_exclusive(this); 476a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi return result; 480b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 490b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 500b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IPlay_GetPlayState(SLPlayItf self, SLuint32 *pState) 510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (NULL == pState) 530b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 540b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_peek(this); 560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 state = this->mState; 570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_peek(this); 580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pState = state; 590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 620b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IPlay_GetDuration(SLPlayItf self, SLmillisecond *pMsec) 630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 64dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 650b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // FIXME: for SNDFILE only, check to see if already know duration 660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // if so, good, otherwise save position, 670b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // read quickly to end of file, counting frames, 680b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // use sample rate to compute duration, then seek back to current position 690b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (NULL == pMsec) 700b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 710b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 720b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_peek(this); 73ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 74dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) { 75dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi result = sles_to_android_audioPlayerGetDuration(this, &this->mDuration); 76dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi } 77dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi#endif 780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillisecond duration = this->mDuration; 790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_peek(this); 800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pMsec = duration; 81dc181a4a041fe4be7c91b92646b236b6d652f4a3Jean-Michel Trivi return result; 820b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 840b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IPlay_GetPosition(SLPlayItf self, SLmillisecond *pMsec) 850b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 860b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (NULL == pMsec) 870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 880b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 890b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_peek(this); 90ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 91b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) { 926a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi sles_to_android_audioPlayerGetPosition(this, &this->mPosition); 936a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 946a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif 950b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillisecond position = this->mPosition; 960b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_peek(this); 970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pMsec = position; 980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // FIXME handle SL_TIME_UNKNOWN 990b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 1000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 102d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPlay_RegisterCallback(SLPlayItf self, slPlayCallback callback, void *pContext) 1030b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 1040b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 1050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_exclusive(this); 1060b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mCallback = callback; 1070b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mContext = pContext; 1080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_exclusive(this); 1090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 1100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1120b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IPlay_SetCallbackEventsMask(SLPlayItf self, SLuint32 eventFlags) 1130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 1146a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 1150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 116cefec35685b74cec33db426e11111ba49a5c2e25Jean-Michel Trivi interface_lock_exclusive(this); 117f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi if (this->mEventFlags != eventFlags) { 118f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi this->mEventFlags = eventFlags; 119ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 120f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) { 121f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi result = sles_to_android_audioPlayerUseEventMask(this, eventFlags); 122f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 1236a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif 124f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 125cefec35685b74cec33db426e11111ba49a5c2e25Jean-Michel Trivi interface_unlock_exclusive(this); 1266a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi return result; 1270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 129d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPlay_GetCallbackEventsMask(SLPlayItf self, SLuint32 *pEventFlags) 1300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 1310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (NULL == pEventFlags) 1320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 1330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 1340b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_peek(this); 1350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 eventFlags = this->mEventFlags; 1360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_peek(this); 1370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pEventFlags = eventFlags; 1380b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 1390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1400b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1410b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IPlay_SetMarkerPosition(SLPlayItf self, SLmillisecond mSec) 1420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 1436a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 1440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 145cefec35685b74cec33db426e11111ba49a5c2e25Jean-Michel Trivi interface_lock_exclusive(this); 146f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi if (this->mMarkerPosition != mSec) { 147f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi this->mMarkerPosition = mSec; 148ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 149f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) { 150f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi result = sles_to_android_audioPlayerUseEventMask(this, this->mEventFlags); 151f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 1526a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif 153f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 154cefec35685b74cec33db426e11111ba49a5c2e25Jean-Michel Trivi interface_unlock_exclusive(this); 1556a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi return result; 1560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1580b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IPlay_ClearMarkerPosition(SLPlayItf self) 1590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 1600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 1610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_poke(this); 1620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mMarkerPosition = 0; 163ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 164b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) { 1656a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi // clearing the marker position can be simulated by using the event mask with a 1666a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi // cleared flag for the marker 1676a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi SLuint32 eventFlags = this->mEventFlags & (~SL_PLAYEVENT_HEADATMARKER); 1686a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi sles_to_android_audioPlayerUseEventMask(this, eventFlags); 1696a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi // FIXME verify this is still valid for a MediaPlayer 1706a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi } 1716a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif 1720b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_poke(this); 1730b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 1740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1760b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IPlay_GetMarkerPosition(SLPlayItf self, SLmillisecond *pMsec) 1770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 1780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (NULL == pMsec) 1790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 1800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 1810b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_peek(this); 1820b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillisecond markerPosition = this->mMarkerPosition; 1830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_peek(this); 1840b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pMsec = markerPosition; 1850b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 1860b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1880b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IPlay_SetPositionUpdatePeriod(SLPlayItf self, SLmillisecond mSec) 1890b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 190d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (0 == mSec) 191d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 1926a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 1930b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 194cefec35685b74cec33db426e11111ba49a5c2e25Jean-Michel Trivi interface_lock_exclusive(this); 195f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi if (this->mPositionUpdatePeriod != mSec) { 196f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi this->mPositionUpdatePeriod = mSec; 197ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 198f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi if (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) { 199f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi result = sles_to_android_audioPlayerUseEventMask(this, this->mEventFlags); 200f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 2016a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi#endif 202f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi } 203cefec35685b74cec33db426e11111ba49a5c2e25Jean-Michel Trivi interface_unlock_exclusive(this); 2046a7bf7733e955d4d89204627c34fb357d542a9ecJean-Michel Trivi return result; 2050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 2060b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 207d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPlay_GetPositionUpdatePeriod(SLPlayItf self, SLmillisecond *pMsec) 2080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 2090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (NULL == pMsec) 2100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 2110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 2120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_peek(this); 2130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillisecond positionUpdatePeriod = this->mPositionUpdatePeriod; 2140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_peek(this); 2150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pMsec = positionUpdatePeriod; 2160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 2170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 2180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 2190b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLPlayItf_ IPlay_Itf = { 2200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_SetPlayState, 2210b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_GetPlayState, 2220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_GetDuration, 2230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_GetPosition, 2240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_RegisterCallback, 2250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_SetCallbackEventsMask, 2260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_GetCallbackEventsMask, 2270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_SetMarkerPosition, 2280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_ClearMarkerPosition, 2290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_GetMarkerPosition, 2300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_SetPositionUpdatePeriod, 2310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay_GetPositionUpdatePeriod 2320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 2330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 2340b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid IPlay_init(void *self) 2350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 2360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IPlay *this = (IPlay *) self; 2370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mItf = &IPlay_Itf; 2380b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mState = SL_PLAYSTATE_STOPPED; 2390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mDuration = SL_TIME_UNKNOWN; 2400b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mPosition = (SLmillisecond) 0; 2410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // this->mPlay.mPositionSamples = 0; 2420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mCallback = NULL; 2430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mContext = NULL; 2440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mEventFlags = 0; 2450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mMarkerPosition = 0; 246f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi this->mPositionUpdatePeriod = 1000; 2470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 248