1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker *
4*bebae9c0SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker *
8*bebae9c0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker *
10*bebae9c0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker */
16*bebae9c0SAndroid Build Coastguard Worker
17*bebae9c0SAndroid Build Coastguard Worker /* Seek implementation */
18*bebae9c0SAndroid Build Coastguard Worker
19*bebae9c0SAndroid Build Coastguard Worker #include "sles_allinclusive.h"
20*bebae9c0SAndroid Build Coastguard Worker
21*bebae9c0SAndroid Build Coastguard Worker
ISeek_SetPosition(SLSeekItf self,SLmillisecond pos,SLuint32 seekMode)22*bebae9c0SAndroid Build Coastguard Worker static SLresult ISeek_SetPosition(SLSeekItf self, SLmillisecond pos, SLuint32 seekMode)
23*bebae9c0SAndroid Build Coastguard Worker {
24*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
25*bebae9c0SAndroid Build Coastguard Worker
26*bebae9c0SAndroid Build Coastguard Worker switch (seekMode) {
27*bebae9c0SAndroid Build Coastguard Worker case SL_SEEKMODE_FAST:
28*bebae9c0SAndroid Build Coastguard Worker case SL_SEEKMODE_ACCURATE:
29*bebae9c0SAndroid Build Coastguard Worker {
30*bebae9c0SAndroid Build Coastguard Worker // maximum position is a special value that indicates a seek is not pending
31*bebae9c0SAndroid Build Coastguard Worker if (SL_TIME_UNKNOWN == pos) {
32*bebae9c0SAndroid Build Coastguard Worker pos = SL_TIME_UNKNOWN - 1;
33*bebae9c0SAndroid Build Coastguard Worker }
34*bebae9c0SAndroid Build Coastguard Worker ISeek *thiz = (ISeek *) self;
35*bebae9c0SAndroid Build Coastguard Worker interface_lock_exclusive(thiz);
36*bebae9c0SAndroid Build Coastguard Worker thiz->mPos = pos;
37*bebae9c0SAndroid Build Coastguard Worker // at this point the seek is merely pending, so do not yet update other fields
38*bebae9c0SAndroid Build Coastguard Worker interface_unlock_exclusive_attributes(thiz, ATTR_POSITION);
39*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
40*bebae9c0SAndroid Build Coastguard Worker }
41*bebae9c0SAndroid Build Coastguard Worker break;
42*bebae9c0SAndroid Build Coastguard Worker default:
43*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
44*bebae9c0SAndroid Build Coastguard Worker break;
45*bebae9c0SAndroid Build Coastguard Worker }
46*bebae9c0SAndroid Build Coastguard Worker
47*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
48*bebae9c0SAndroid Build Coastguard Worker }
49*bebae9c0SAndroid Build Coastguard Worker
50*bebae9c0SAndroid Build Coastguard Worker
ISeek_SetLoop(SLSeekItf self,SLboolean loopEnable,SLmillisecond startPos,SLmillisecond endPos)51*bebae9c0SAndroid Build Coastguard Worker static SLresult ISeek_SetLoop(SLSeekItf self, SLboolean loopEnable,
52*bebae9c0SAndroid Build Coastguard Worker SLmillisecond startPos, SLmillisecond endPos)
53*bebae9c0SAndroid Build Coastguard Worker {
54*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
55*bebae9c0SAndroid Build Coastguard Worker
56*bebae9c0SAndroid Build Coastguard Worker if (!(startPos < endPos)) {
57*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
58*bebae9c0SAndroid Build Coastguard Worker } else {
59*bebae9c0SAndroid Build Coastguard Worker ISeek *thiz = (ISeek *) self;
60*bebae9c0SAndroid Build Coastguard Worker interface_lock_exclusive(thiz);
61*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
62*bebae9c0SAndroid Build Coastguard Worker if ((startPos != 0) && (endPos != SL_TIME_UNKNOWN)) {
63*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
64*bebae9c0SAndroid Build Coastguard Worker } else {
65*bebae9c0SAndroid Build Coastguard Worker switch (IObjectToObjectID((thiz)->mThis)) {
66*bebae9c0SAndroid Build Coastguard Worker case SL_OBJECTID_AUDIOPLAYER: {
67*bebae9c0SAndroid Build Coastguard Worker CAudioPlayer *ap = InterfaceToCAudioPlayer(thiz);
68*bebae9c0SAndroid Build Coastguard Worker if (NULL != ap) {
69*bebae9c0SAndroid Build Coastguard Worker result = android_audioPlayer_loop(ap, loopEnable);
70*bebae9c0SAndroid Build Coastguard Worker } else {
71*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
72*bebae9c0SAndroid Build Coastguard Worker }
73*bebae9c0SAndroid Build Coastguard Worker break;
74*bebae9c0SAndroid Build Coastguard Worker }
75*bebae9c0SAndroid Build Coastguard Worker case XA_OBJECTID_MEDIAPLAYER: {
76*bebae9c0SAndroid Build Coastguard Worker CMediaPlayer *mp = InterfaceToCMediaPlayer(thiz);
77*bebae9c0SAndroid Build Coastguard Worker if (NULL != mp) {
78*bebae9c0SAndroid Build Coastguard Worker result = android_Player_loop(mp, loopEnable);
79*bebae9c0SAndroid Build Coastguard Worker } else {
80*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
81*bebae9c0SAndroid Build Coastguard Worker }
82*bebae9c0SAndroid Build Coastguard Worker break;
83*bebae9c0SAndroid Build Coastguard Worker }
84*bebae9c0SAndroid Build Coastguard Worker default: {
85*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
86*bebae9c0SAndroid Build Coastguard Worker }
87*bebae9c0SAndroid Build Coastguard Worker }
88*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
89*bebae9c0SAndroid Build Coastguard Worker thiz->mLoopEnabled = SL_BOOLEAN_FALSE != loopEnable; // normalize
90*bebae9c0SAndroid Build Coastguard Worker // start and end positions already initialized to [0, end of stream]
91*bebae9c0SAndroid Build Coastguard Worker /*thiz->mStartPos = 0;
92*bebae9c0SAndroid Build Coastguard Worker thiz->mEndPos = (SLmillisecond) SL_TIME_UNKNOWN;*/
93*bebae9c0SAndroid Build Coastguard Worker }
94*bebae9c0SAndroid Build Coastguard Worker }
95*bebae9c0SAndroid Build Coastguard Worker #else
96*bebae9c0SAndroid Build Coastguard Worker thiz->mLoopEnabled = SL_BOOLEAN_FALSE != loopEnable; // normalize
97*bebae9c0SAndroid Build Coastguard Worker thiz->mStartPos = startPos;
98*bebae9c0SAndroid Build Coastguard Worker thiz->mEndPos = endPos;
99*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
100*bebae9c0SAndroid Build Coastguard Worker #endif
101*bebae9c0SAndroid Build Coastguard Worker interface_unlock_exclusive(thiz);
102*bebae9c0SAndroid Build Coastguard Worker }
103*bebae9c0SAndroid Build Coastguard Worker
104*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
105*bebae9c0SAndroid Build Coastguard Worker }
106*bebae9c0SAndroid Build Coastguard Worker
107*bebae9c0SAndroid Build Coastguard Worker
ISeek_GetLoop(SLSeekItf self,SLboolean * pLoopEnabled,SLmillisecond * pStartPos,SLmillisecond * pEndPos)108*bebae9c0SAndroid Build Coastguard Worker static SLresult ISeek_GetLoop(SLSeekItf self, SLboolean *pLoopEnabled,
109*bebae9c0SAndroid Build Coastguard Worker SLmillisecond *pStartPos, SLmillisecond *pEndPos)
110*bebae9c0SAndroid Build Coastguard Worker {
111*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
112*bebae9c0SAndroid Build Coastguard Worker
113*bebae9c0SAndroid Build Coastguard Worker if (NULL == pLoopEnabled || NULL == pStartPos || NULL == pEndPos) {
114*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
115*bebae9c0SAndroid Build Coastguard Worker } else {
116*bebae9c0SAndroid Build Coastguard Worker ISeek *thiz = (ISeek *) self;
117*bebae9c0SAndroid Build Coastguard Worker interface_lock_shared(thiz);
118*bebae9c0SAndroid Build Coastguard Worker SLboolean loopEnabled = thiz->mLoopEnabled;
119*bebae9c0SAndroid Build Coastguard Worker SLmillisecond startPos = thiz->mStartPos;
120*bebae9c0SAndroid Build Coastguard Worker SLmillisecond endPos = thiz->mEndPos;
121*bebae9c0SAndroid Build Coastguard Worker interface_unlock_shared(thiz);
122*bebae9c0SAndroid Build Coastguard Worker *pLoopEnabled = loopEnabled;
123*bebae9c0SAndroid Build Coastguard Worker *pStartPos = startPos;
124*bebae9c0SAndroid Build Coastguard Worker *pEndPos = endPos;
125*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
126*bebae9c0SAndroid Build Coastguard Worker }
127*bebae9c0SAndroid Build Coastguard Worker
128*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
129*bebae9c0SAndroid Build Coastguard Worker }
130*bebae9c0SAndroid Build Coastguard Worker
131*bebae9c0SAndroid Build Coastguard Worker
132*bebae9c0SAndroid Build Coastguard Worker static const struct SLSeekItf_ ISeek_Itf = {
133*bebae9c0SAndroid Build Coastguard Worker ISeek_SetPosition,
134*bebae9c0SAndroid Build Coastguard Worker ISeek_SetLoop,
135*bebae9c0SAndroid Build Coastguard Worker ISeek_GetLoop
136*bebae9c0SAndroid Build Coastguard Worker };
137*bebae9c0SAndroid Build Coastguard Worker
ISeek_init(void * self)138*bebae9c0SAndroid Build Coastguard Worker void ISeek_init(void *self)
139*bebae9c0SAndroid Build Coastguard Worker {
140*bebae9c0SAndroid Build Coastguard Worker ISeek *thiz = (ISeek *) self;
141*bebae9c0SAndroid Build Coastguard Worker thiz->mItf = &ISeek_Itf;
142*bebae9c0SAndroid Build Coastguard Worker thiz->mPos = (SLmillisecond) SL_TIME_UNKNOWN;
143*bebae9c0SAndroid Build Coastguard Worker thiz->mStartPos = (SLmillisecond) 0;
144*bebae9c0SAndroid Build Coastguard Worker thiz->mEndPos = (SLmillisecond) SL_TIME_UNKNOWN;
145*bebae9c0SAndroid Build Coastguard Worker thiz->mLoopEnabled = SL_BOOLEAN_FALSE;
146*bebae9c0SAndroid Build Coastguard Worker }
147