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