xref: /aosp_15_r20/frameworks/wilhelm/src/itf/ISeek.cpp (revision bebae9c0e76121f8312ccb50385c080b3a0b023c)
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