IPlaybackRate.c revision ed46c29d6a09112dbbf584c82953f63289596fd6
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
21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
2261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_SetRate(SLPlaybackRateItf self, SLpermille rate)
2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
2661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
27d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const, so no lock needed
28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!(this->mMinRate <= rate && rate <= this->mMaxRate)) {
29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_lock_poke(this);
32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        this->mRate = rate;
33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_unlock_poke(this);
34ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = sles_to_android_audioPlayerSetPlayRate(this, rate);
36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else
37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
38497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
4261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
4361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
4561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetRate(SLPlaybackRateItf self, SLpermille *pRate)
4661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
49497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pRate) {
50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IPlaybackRate *this = (IPlaybackRate *) self;
53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_lock_peek(this);
54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLpermille rate = this->mRate;
55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_unlock_peek(this);
56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pRate = rate;
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
58497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
6161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
6261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
64d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPlaybackRate_SetPropertyConstraints(SLPlaybackRateItf self, SLuint32 constraints)
6561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
6861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
6961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mProperties = constraints;
70ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
71497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    // verify property support before storing
72497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    result = sles_to_android_audioPlayerSetPlaybackRateBehavior(this, constraints);
73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else
74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
75497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
76497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    interface_lock_poke(this);
77497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (result == SL_RESULT_SUCCESS) {
78497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        this->mProperties = constraints;
79497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
80497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    interface_unlock_poke(this);
81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
8361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
8461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
86d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPlaybackRate_GetProperties(SLPlaybackRateItf self, SLuint32 *pProperties)
8761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
90497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pProperties) {
91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IPlaybackRate *this = (IPlaybackRate *) self;
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_lock_peek(this);
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLuint32 properties = this->mProperties;
96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_unlock_peek(this);
97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pProperties = properties;
98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
99497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
10261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
10361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
10561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetCapabilitiesOfRate(SLPlaybackRateItf self,
10661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLpermille rate, SLuint32 *pCapabilities)
10761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
110497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pCapabilities) {
111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IPlaybackRate *this = (IPlaybackRate *) self;
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // const, so no lock needed
115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (!(this->mMinRate <= rate && rate <= this->mMaxRate)) {
116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            SLuint32 capabilities = 0;
119ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            sles_to_android_audioPlayerGetCapabilitiesOfRate(this, &capabilities);
121d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#else
122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            capabilities = this->mCapabilities;
123497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            *pCapabilities = capabilities;
125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
127ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
13061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
13161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
13361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetRateRange(SLPlaybackRateItf self, SLuint8 index,
134d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLpermille *pMinRate, SLpermille *pMaxRate, SLpermille *pStepSize, SLuint32 *pCapabilities)
13561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
137ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
138d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // only one range
139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pMinRate || NULL == pMaxRate || NULL == pStepSize || NULL == pCapabilities ||
140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        (0 < index)) {
141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IPlaybackRate *this = (IPlaybackRate *) self;
144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_lock_shared(this);
145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLpermille minRate = this->mMinRate;
146ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLpermille maxRate = this->mMaxRate;
147ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLpermille stepSize = this->mStepSize;
148ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLuint32 capabilities = this->mCapabilities;
149ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_unlock_shared(this);
150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMinRate = minRate;
151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMaxRate = maxRate;
152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pStepSize = stepSize;
153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pCapabilities = capabilities;
154ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
155ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
157ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
15861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
15961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
160ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
16161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLPlaybackRateItf_ IPlaybackRate_Itf = {
16261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_SetRate,
16361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetRate,
16461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_SetPropertyConstraints,
16561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetProperties,
16661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetCapabilitiesOfRate,
16761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetRateRange
16861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
16961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
17061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IPlaybackRate_init(void *self)
17161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
17261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
17361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mItf = &IPlaybackRate_Itf;
174d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    this->mProperties = SL_RATEPROP_NOPITCHCORAUDIO;
1750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mRate = 1000;
176d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const
1770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mMinRate = 500;
1780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mMaxRate = 2000;
179d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    this->mStepSize = 0;
180ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
181497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    this->mStepSize = 0;
182497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    // for an AudioPlayer, mCapabilities will be initialized in sles_to_android_audioPlayerCreate
183497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
184d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // The generic implementation sets no capabilities because the generic
185d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // implementation alone doesn't support any.
186497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    this->mCapabilities = 0;
187e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // SL_RATEPROP_SILENTAUDIO | SL_RATEPROP_STAGGEREDAUDIO | SL_RATEPROP_NOPITCHCORAUDIO |
188e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // SL_RATEPROP_PITCHCORAUDIO
18961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
190