IPlaybackRate.c revision 24430c9070298f12e68b84c921add38da6ad0490
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 {
3124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        interface_lock_exclusive(this);
32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        this->mRate = rate;
3324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        interface_unlock_exclusive(this);
34ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
3524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) ?
3624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi                (CAudioPlayer *) this->mThis : NULL;
3724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        if (NULL != ap) {
3824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            result = android_audioPlayer_setPlayRate(ap, rate);
3924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        } else {
4024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
4124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        }
42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else
43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
44497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
4861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
4961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
5161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetRate(SLPlaybackRateItf self, SLpermille *pRate)
5261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
55497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pRate) {
56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IPlaybackRate *this = (IPlaybackRate *) self;
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_lock_peek(this);
60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLpermille rate = this->mRate;
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_unlock_peek(this);
62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pRate = rate;
63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
64497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
6761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
6861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
70d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPlaybackRate_SetPropertyConstraints(SLPlaybackRateItf self, SLuint32 constraints)
7161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
7461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
7561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mProperties = constraints;
76ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
77497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    // verify property support before storing
7824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) ?
7924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            (CAudioPlayer *) this->mThis : NULL;
8024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    if (NULL != ap) {
8124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        result = android_audioPlayer_setPlaybackRateBehavior(ap, constraints);
8224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    } else {
8324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        result = SL_RESULT_PARAMETER_INVALID;
8424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    }
8524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi
86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else
87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
88497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
89497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    interface_lock_poke(this);
90497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (result == SL_RESULT_SUCCESS) {
91497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi        this->mProperties = constraints;
92497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
93497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    interface_unlock_poke(this);
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
9661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
9761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
99d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IPlaybackRate_GetProperties(SLPlaybackRateItf self, SLuint32 *pProperties)
10061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
103497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pProperties) {
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IPlaybackRate *this = (IPlaybackRate *) self;
107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_lock_peek(this);
108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLuint32 properties = this->mProperties;
109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_unlock_peek(this);
110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pProperties = properties;
111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
112497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
11561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
11661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
11861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetCapabilitiesOfRate(SLPlaybackRateItf self,
11961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLpermille rate, SLuint32 *pCapabilities)
12061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
123497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (NULL == pCapabilities) {
124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IPlaybackRate *this = (IPlaybackRate *) self;
127ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // const, so no lock needed
128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (!(this->mMinRate <= rate && rate <= this->mMaxRate)) {
129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            SLuint32 capabilities = 0;
132ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
13324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) ?
13424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi                    (CAudioPlayer *) this->mThis : NULL;
13524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            if (NULL != ap) {
13624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi                android_audioPlayer_getCapabilitiesOfRate(ap, &capabilities);
13724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            }
138d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#else
139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            capabilities = this->mCapabilities;
140497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            *pCapabilities = capabilities;
142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
146ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
14761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
14861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
149ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
15061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IPlaybackRate_GetRateRange(SLPlaybackRateItf self, SLuint8 index,
151d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLpermille *pMinRate, SLpermille *pMaxRate, SLpermille *pStepSize, SLuint32 *pCapabilities)
15261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
154ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
155d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // only one range
156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pMinRate || NULL == pMaxRate || NULL == pStepSize || NULL == pCapabilities ||
157ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        (0 < index)) {
158ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
159ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
160ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        IPlaybackRate *this = (IPlaybackRate *) self;
161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_lock_shared(this);
162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLpermille minRate = this->mMinRate;
163ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLpermille maxRate = this->mMaxRate;
164ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLpermille stepSize = this->mStepSize;
165ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLuint32 capabilities = this->mCapabilities;
166ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        interface_unlock_shared(this);
167ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMinRate = minRate;
168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMaxRate = maxRate;
169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pStepSize = stepSize;
170ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pCapabilities = capabilities;
171ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
172ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
173ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
174ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
17561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
17661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
177ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
17861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLPlaybackRateItf_ IPlaybackRate_Itf = {
17961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_SetRate,
18061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetRate,
18161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_SetPropertyConstraints,
18261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetProperties,
18361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetCapabilitiesOfRate,
18461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate_GetRateRange
18561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
18661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
18761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IPlaybackRate_init(void *self)
18861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
18924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    //SL_LOGV("IPlaybackRate_init called");
19061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IPlaybackRate *this = (IPlaybackRate *) self;
19161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    this->mItf = &IPlaybackRate_Itf;
192d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    this->mProperties = SL_RATEPROP_NOPITCHCORAUDIO;
1930b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mRate = 1000;
194d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const
1950b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mMinRate = 500;
1960b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    this->mMaxRate = 2000;
197d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    this->mStepSize = 0;
198ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
199497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    this->mStepSize = 0;
200497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    // for an AudioPlayer, mCapabilities will be initialized in sles_to_android_audioPlayerCreate
201497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
202d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // The generic implementation sets no capabilities because the generic
203d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // implementation alone doesn't support any.
204497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    this->mCapabilities = 0;
205e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // SL_RATEPROP_SILENTAUDIO | SL_RATEPROP_STAGGEREDAUDIO | SL_RATEPROP_NOPITCHCORAUDIO |
206e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // SL_RATEPROP_PITCHCORAUDIO
20761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
208