IPlaybackRate.c revision 497c71251661f9096f77d0a9bc08fe7a5eb49079
161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/*
261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Copyright (C) 2010 The Android Open Source Project
361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * you may not use this file except in compliance with the License.
661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * You may obtain a copy of the License at
761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
1061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Unless required by applicable law or agreed to in writing, software
1161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
1261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * See the License for the specific language governing permissions and
1461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * limitations under the License.
1561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten */
1661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* PlaybackRate implementation */
1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#include "sles_allinclusive.h"
2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
2161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_SetRate(SLPlaybackRateItf self, SLpermille rate)
2261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
2461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_poke(this);
2561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mRate = rate;
2661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_poke(this);
27497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#ifdef USE_ANDROID
28497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    return sles_to_android_audioPlayerSetPlayRate(this, rate);
29497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
3061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
3161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
3261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
3361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetRate(SLPlaybackRateItf self, SLpermille *pRate)
3461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
35497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pRate) {
3661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
37497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
3861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
3961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_peek(this);
4061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLpermille rate = this->mRate;
4161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_peek(this);
4261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pRate = rate;
4361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
4461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
4561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
4661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_SetPropertyConstraints(SLPlaybackRateItf self,
4761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLuint32 constraints)
4861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
4961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
50497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
5161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mProperties = constraints;
52497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#ifdef USE_ANDROID
53497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    // verify property support before storing
54497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    result = sles_to_android_audioPlayerSetPlaybackRateBehavior(this, constraints);
55497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
56497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    interface_lock_poke(this);
57497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (result == SL_RESULT_SUCCESS) {
58497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        this->mProperties = constraints;
59497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
60497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    interface_unlock_poke(this);
61497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    return result;
6261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
6361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
6461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetProperties(SLPlaybackRateItf self,
6561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLuint32 *pProperties)
6661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
67497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pProperties) {
6861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
69497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
7061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
71497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    interface_lock_peek(this);
7261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLuint32 properties = this->mProperties;
73497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    interface_unlock_peek(this);
7461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pProperties = properties;
7561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
7661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
7761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
7861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetCapabilitiesOfRate(SLPlaybackRateItf self,
7961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLpermille rate, SLuint32 *pCapabilities)
8061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
81497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pCapabilities) {
8261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
83497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
84497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    IPlaybackRate *this = (IPlaybackRate *) self;
85497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    SLuint32 capabilities = 0;
86497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#ifdef USE_ANDROID
87497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    sles_to_android_audioPlayerGetCapabilitiesOfRate(this, &capabilities);
88497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
8961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pCapabilities = capabilities;
9061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
9161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
9261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
9361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetRateRange(SLPlaybackRateItf self, SLuint8 index,
9461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLpermille *pMinRate, SLpermille *pMaxRate, SLpermille *pStepSize,
9561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLuint32 *pCapabilities)
9661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
9761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    if (NULL == pMinRate || NULL == pMaxRate || NULL == pStepSize || NULL == pCapabilities)
9861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
9961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
10061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_lock_shared(this);
10161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLpermille minRate = this->mMinRate;
10261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLpermille maxRate = this->mMaxRate;
10361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLpermille stepSize = this->mStepSize;
10461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLuint32 capabilities = this->mCapabilities;
10561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    interface_unlock_shared(this);
10661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pMinRate = minRate;
10761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pMaxRate = maxRate;
10861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pStepSize = stepSize;
10961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    *pCapabilities = capabilities;
11061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    return SL_RESULT_SUCCESS;
11161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
11261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
11361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLPlaybackRateItf_ IPlaybackRate_Itf = {
11461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_SetRate,
11561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetRate,
11661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_SetPropertyConstraints,
11761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetProperties,
11861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetCapabilitiesOfRate,
11961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetRateRange
12061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
12161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
12261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IPlaybackRate_init(void *self)
12361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
12461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
12561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mItf = &IPlaybackRate_Itf;
1260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mProperties = 0;
1270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mRate = 1000;
1280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mMinRate = 500;
1290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mMaxRate = 2000;
1300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mStepSize = 100;
131497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#ifdef USE_ANDROID
132497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    this->mStepSize = 0;
133497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    // for an AudioPlayer, mCapabilities will be initialized in sles_to_android_audioPlayerCreate
134497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
135497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    this->mCapabilities = 0;
13661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
137