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