IPlaybackRate.c revision 0793e68d3c69c490de12633f757d7816fcde5392
123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten/*
223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten *
423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten * you may not use this file except in compliance with the License.
623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten * You may obtain a copy of the License at
723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten *
823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten *
1023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten * Unless required by applicable law or agreed to in writing, software
1123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
1223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten * See the License for the specific language governing permissions and
1423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten * limitations under the License.
1523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten */
1623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
1723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten/* PlaybackRate implementation */
1823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
1923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten#include "sles_allinclusive.h"
2023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
2123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstatic SLresult IPlaybackRate_SetRate(SLPlaybackRateItf self, SLpermille rate)
2223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten{
2323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
2423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    interface_lock_poke(this);
2523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    this->mRate = rate;
2623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    interface_unlock_poke(this);
270793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi#ifdef USE_ANDROID
280793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    return sles_to_android_audioPlayerSetPlayRate(this, rate);
290793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi#endif
3023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    return SL_RESULT_SUCCESS;
3123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}
3223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
3323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstatic SLresult IPlaybackRate_GetRate(SLPlaybackRateItf self, SLpermille *pRate)
3423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten{
350793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    if (NULL == pRate) {
3623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
370793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    }
3823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
3923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    interface_lock_peek(this);
4023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLpermille rate = this->mRate;
4123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    interface_unlock_peek(this);
4223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    *pRate = rate;
4323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    return SL_RESULT_SUCCESS;
4423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}
4523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
4623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstatic SLresult IPlaybackRate_SetPropertyConstraints(SLPlaybackRateItf self,
4723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLuint32 constraints)
4823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten{
4923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
500793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
5123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    this->mProperties = constraints;
520793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi#ifdef USE_ANDROID
530793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    // verify property support before storing
540793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    result = sles_to_android_audioPlayerSetPlaybackRateBehavior(this, constraints);
550793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi#endif
560793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    interface_lock_poke(this);
570793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    if (result == SL_RESULT_SUCCESS) {
580793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi        this->mProperties = constraints;
590793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    }
600793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    interface_unlock_poke(this);
610793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    return result;
6223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}
6323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
6423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstatic SLresult IPlaybackRate_GetProperties(SLPlaybackRateItf self,
6523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLuint32 *pProperties)
6623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten{
670793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    if (NULL == pProperties) {
6823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
690793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    }
7023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
710793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    interface_lock_peek(this);
7223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLuint32 properties = this->mProperties;
730793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    interface_unlock_peek(this);
7423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    *pProperties = properties;
7523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    return SL_RESULT_SUCCESS;
7623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}
7723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
7823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstatic SLresult IPlaybackRate_GetCapabilitiesOfRate(SLPlaybackRateItf self,
7923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLpermille rate, SLuint32 *pCapabilities)
8023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten{
810793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    if (NULL == pCapabilities) {
8223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
830793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    }
840793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    IPlaybackRate *this = (IPlaybackRate *) self;
850793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    SLuint32 capabilities = 0;
860793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi#ifdef USE_ANDROID
870793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    sles_to_android_audioPlayerGetCapabilitiesOfRate(this, &capabilities);
880793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi#endif
8923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    *pCapabilities = capabilities;
9023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    return SL_RESULT_SUCCESS;
9123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}
9223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
9323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstatic SLresult IPlaybackRate_GetRateRange(SLPlaybackRateItf self, SLuint8 index,
9423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLpermille *pMinRate, SLpermille *pMaxRate, SLpermille *pStepSize,
9523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLuint32 *pCapabilities)
9623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten{
9723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    if (NULL == pMinRate || NULL == pMaxRate || NULL == pStepSize || NULL == pCapabilities)
9823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
9923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
10023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    interface_lock_shared(this);
10123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLpermille minRate = this->mMinRate;
10223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLpermille maxRate = this->mMaxRate;
10323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLpermille stepSize = this->mStepSize;
10423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    SLuint32 capabilities = this->mCapabilities;
10523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    interface_unlock_shared(this);
10623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    *pMinRate = minRate;
10723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    *pMaxRate = maxRate;
10823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    *pStepSize = stepSize;
10923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    *pCapabilities = capabilities;
11023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    return SL_RESULT_SUCCESS;
11123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}
11223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
11323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenstatic const struct SLPlaybackRateItf_ IPlaybackRate_Itf = {
11423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate_SetRate,
11523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate_GetRate,
11623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate_SetPropertyConstraints,
11723b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate_GetProperties,
11823b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate_GetCapabilitiesOfRate,
11923b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate_GetRateRange
12023b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten};
12123b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten
12223b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kastenvoid IPlaybackRate_init(void *self)
12323b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten{
12423b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
12523b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten    this->mItf = &IPlaybackRate_Itf;
1264c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    this->mProperties = 0;
1274c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    this->mRate = 1000;
1284c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    this->mMinRate = 500;
1294c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    this->mMaxRate = 2000;
1304c048c5d0d281e4e5777d732fc92a98aee876f71Glenn Kasten    this->mStepSize = 100;
1310793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi#ifdef USE_ANDROID
1320793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    this->mStepSize = 0;
1330793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    // for an AudioPlayer, mCapabilities will be initialized in sles_to_android_audioPlayerCreate
1340793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi#endif
1350793e68d3c69c490de12633f757d7816fcde5392Jean-Michel Trivi    this->mCapabilities = 0;
13623b3f68cab75e480ac93d656a6e4f60b979de6d2Glenn Kasten}
137