IPlaybackRate.c revision bcc5c7225e3b7a1dbf2e9e830987f69167acf06f
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);
32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mRate = rate;
33bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
34ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
35bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) ?
36bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                (CAudioPlayer *) thiz->mThis : NULL;
3724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi        if (NULL != ap) {
388a1b7f28c1c3de212a302182022310ab7b227788Jean-Michel Trivi            result = android_audioPlayer_setPlayRate(ap, rate, true);
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 {
58bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPlaybackRate *thiz = (IPlaybackRate *) self;
59bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
60bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille rate = thiz->mRate;
61bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(thiz);
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
74bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPlaybackRate *thiz = (IPlaybackRate *) self;
75bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mProperties = constraints;
76ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
77497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    // verify property support before storing
78bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) ?
79bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            (CAudioPlayer *) thiz->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
89bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_poke(thiz);
90497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    if (result == SL_RESULT_SUCCESS) {
91bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties = constraints;
92497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    }
93bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_poke(thiz);
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 {
106bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPlaybackRate *thiz = (IPlaybackRate *) self;
107bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
108bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint32 properties = thiz->mProperties;
109bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(thiz);
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 {
126bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPlaybackRate *thiz = (IPlaybackRate *) self;
127ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // const, so no lock needed
128bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (!(thiz->mMinRate <= rate && rate <= thiz->mMaxRate)) {
129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            SLuint32 capabilities = 0;
132ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
133bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) ?
134bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    (CAudioPlayer *) thiz->mThis : NULL;
13524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            if (NULL != ap) {
13624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi                android_audioPlayer_getCapabilitiesOfRate(ap, &capabilities);
13724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi            }
138d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#else
139bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            capabilities = thiz->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 {
160bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IPlaybackRate *thiz = (IPlaybackRate *) self;
161bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_shared(thiz);
162bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille minRate = thiz->mMinRate;
163bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille maxRate = thiz->mMaxRate;
164bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLpermille stepSize = thiz->mStepSize;
165bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint32 capabilities = thiz->mCapabilities;
166bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_shared(thiz);
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{
189bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IPlaybackRate *thiz = (IPlaybackRate *) self;
190bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &IPlaybackRate_Itf;
191bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mProperties = SL_RATEPROP_NOPITCHCORAUDIO;
192bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mRate = 1000;
193d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const
194bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mMinRate = 500;
195bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mMaxRate = 2000;
196bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mStepSize = 0;
197ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID
198497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi    // for an AudioPlayer, mCapabilities will be initialized in sles_to_android_audioPlayerCreate
199497c71251661f9096f77d0a9bc08fe7a5eb49079Jean-Michel Trivi#endif
200d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // The generic implementation sets no capabilities because the generic
201d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // implementation alone doesn't support any.
202bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mCapabilities = 0;
203e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // SL_RATEPROP_SILENTAUDIO | SL_RATEPROP_STAGGEREDAUDIO | SL_RATEPROP_NOPITCHCORAUDIO |
204e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    // SL_RATEPROP_PITCHCORAUDIO
20561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
206