ISeek.c revision 0b167267bda99b68346045ccab14e810121d5de4
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/* Seek implementation */ 180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "sles_allinclusive.h" 200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 210b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult ISeek_SetPosition(SLSeekItf self, SLmillisecond pos, 220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 seekMode) 230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten switch (seekMode) { 250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten case SL_SEEKMODE_FAST: 260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten case SL_SEEKMODE_ACCURATE: 270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten break; 280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten default: 290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten } 310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ISeek *this = (ISeek *) self; 320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_poke(this); 330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mPos = pos; 340b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_poke(this); 350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 380b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult ISeek_SetLoop(SLSeekItf self, SLboolean loopEnable, 390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillisecond startPos, SLmillisecond endPos) 400b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ISeek *this = (ISeek *) self; 420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_exclusive(this); 430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mLoopEnabled = loopEnable; 440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mStartPos = startPos; 450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mEndPos = endPos; 460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_exclusive(this); 470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 480b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 490b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 500b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult ISeek_GetLoop(SLSeekItf self, SLboolean *pLoopEnabled, 510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillisecond *pStartPos, SLmillisecond *pEndPos) 520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 530b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (NULL == pLoopEnabled || NULL == pStartPos || NULL == pEndPos) 540b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ISeek *this = (ISeek *) self; 560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_shared(this); 570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLboolean loopEnabled = this->mLoopEnabled; 580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillisecond startPos = this->mStartPos; 590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillisecond endPos = this->mEndPos; 600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_shared(this); 610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pLoopEnabled = loopEnabled; 620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pStartPos = startPos; 630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pEndPos = endPos; 640b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 650b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 670b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLSeekItf_ ISeek_Itf = { 680b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ISeek_SetPosition, 690b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ISeek_SetLoop, 700b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ISeek_GetLoop 710b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 720b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 730b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid ISeek_init(void *self) 740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten ISeek *this = (ISeek *) self; 760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mItf = &ISeek_Itf; 770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mPos = (SLmillisecond) -1; 780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mStartPos = (SLmillisecond) -1; 790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mEndPos = (SLmillisecond) -1; 800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#ifndef NDEBUG 810b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mLoopEnabled = SL_BOOLEAN_FALSE; 820b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#endif 830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 84