IPlaybackRate.c revision 6d78c9bfb68f8a0db1855bc28c087c39a7eb6f2c
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
26bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPlaybackRate *thiz = (IPlaybackRate *) self;
27d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const, so no lock needed
28bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    if (!(thiz->mMinRate <= rate && rate <= thiz->mMaxRate)) {
29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
31bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
32ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
33bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) ?
34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                (CAudioPlayer *) thiz->mThis : NULL;
3524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        if (NULL != ap) {
366d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten            result = android_audioPlayer_setPlaybackRateAndConstraints(ap, rate, thiz->mProperties);
3724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        } else {
386d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten            result = SL_RESULT_FEATURE_UNSUPPORTED;
3924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        }
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else
41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
42497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
436d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        if (SL_RESULT_SUCCESS == result) {
446d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten            thiz->mRate = rate;
456d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        }
466d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        interface_unlock_exclusive(thiz);
47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
5061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
5161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
5361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetRate(SLPlaybackRateItf self, SLpermille *pRate)
5461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
57497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pRate) {
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
60bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPlaybackRate *thiz = (IPlaybackRate *) self;
616d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        interface_lock_shared(thiz);
62bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille rate = thiz->mRate;
636d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        interface_unlock_shared(thiz);
64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pRate = rate;
65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
66497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
6961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
7061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
72d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPlaybackRate_SetPropertyConstraints(SLPlaybackRateItf self, SLuint32 constraints)
7361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
76bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPlaybackRate *thiz = (IPlaybackRate *) self;
776d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    if (constraints & ~(SL_RATEPROP_SILENTAUDIO | SL_RATEPROP_STAGGEREDAUDIO |
786d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten            SL_RATEPROP_NOPITCHCORAUDIO | SL_RATEPROP_PITCHCORAUDIO)) {
7924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
806d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    // const, so no lock needed
816d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    } else if (!(thiz->mCapabilities & constraints)) {
826d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        result = SL_RESULT_FEATURE_UNSUPPORTED;
836d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    } else {
846d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        interface_lock_exclusive(thiz);
856d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten#ifdef ANDROID
866d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        // verify property support before storing
876d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) ?
886d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten                (CAudioPlayer *) thiz->mThis : NULL;
896d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        if (NULL != ap) {
906d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten            result = android_audioPlayer_setPlaybackRateAndConstraints(ap, thiz->mRate,
916d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten                    constraints);
926d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        } else {
936d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten            result = SL_RESULT_FEATURE_UNSUPPORTED;
946d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        }
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else
966d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        result = SL_RESULT_SUCCESS;
97497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
986d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        if (result == SL_RESULT_SUCCESS) {
996d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten            thiz->mProperties = constraints;
1006d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        }
1016d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        interface_unlock_exclusive(thiz);
102497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
10561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
10661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
108d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPlaybackRate_GetProperties(SLPlaybackRateItf self, SLuint32 *pProperties)
10961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
112497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pProperties) {
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
115bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPlaybackRate *thiz = (IPlaybackRate *) self;
1166d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        interface_lock_shared(thiz);
117bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint32 properties = thiz->mProperties;
1186d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        interface_unlock_shared(thiz);
119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pProperties = properties;
120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
121497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
12461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
12561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
12761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetCapabilitiesOfRate(SLPlaybackRateItf self,
12861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLpermille rate, SLuint32 *pCapabilities)
12961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
132497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pCapabilities) {
133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
135bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPlaybackRate *thiz = (IPlaybackRate *) self;
1366d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        SLuint32 capabilities;
137ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // const, so no lock needed
138bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (!(thiz->mMinRate <= rate && rate <= thiz->mMaxRate)) {
1396d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten            capabilities = 0;
140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
142bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            capabilities = thiz->mCapabilities;
143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
1456d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        *pCapabilities = capabilities;
146ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
147ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
148ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
14961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
15061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
15261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetRateRange(SLPlaybackRateItf self, SLuint8 index,
153d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLpermille *pMinRate, SLpermille *pMaxRate, SLpermille *pStepSize, SLuint32 *pCapabilities)
15461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
155ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
157d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // only one range
158ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pMinRate || NULL == pMaxRate || NULL == pStepSize || NULL == pCapabilities ||
159ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        (0 < index)) {
160ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
162bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPlaybackRate *thiz = (IPlaybackRate *) self;
1636d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten        // const, so no lock needed
164bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille minRate = thiz->mMinRate;
165bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille maxRate = thiz->mMaxRate;
166bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille stepSize = thiz->mStepSize;
167bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint32 capabilities = thiz->mCapabilities;
168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMinRate = minRate;
169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMaxRate = maxRate;
170ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pStepSize = stepSize;
171ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pCapabilities = capabilities;
172ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
173ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
174ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
175ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
17661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
17761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
178ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
17961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLPlaybackRateItf_ IPlaybackRate_Itf = {
18061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_SetRate,
18161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetRate,
18261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_SetPropertyConstraints,
18361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetProperties,
18461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetCapabilitiesOfRate,
18561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetRateRange
18661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
18761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
18861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IPlaybackRate_init(void *self)
18961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
190bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPlaybackRate *thiz = (IPlaybackRate *) self;
191bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &IPlaybackRate_Itf;
192bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mProperties = SL_RATEPROP_NOPITCHCORAUDIO;
193bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mRate = 1000;
1946d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    // const after initialization; these are default values which may be overwritten
1956d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    // during object creation but will not be modified after that
1966d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    // (e.g. for an Android AudioPlayer, see sles_to_android_audioPlayerCreate)
1976d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    thiz->mMinRate = 1000;
1986d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    thiz->mMaxRate = 1000;
199bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mStepSize = 0;
2006d78c9bfb68f8a0db1855bc28c087c39a7eb6f2cGlenn Kasten    thiz->mCapabilities = SL_RATEPROP_NOPITCHCORAUDIO;
20161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
202