IVolume.cpp revision ab7724988c1ff39ad3fc95a7ae0e638357708f7c
10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* 20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * you may not use this file except in compliance with the License. 60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * You may obtain a copy of the License at 70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Unless required by applicable law or agreed to in writing, software 110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * See the License for the specific language governing permissions and 140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * limitations under the License. 150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten */ 160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* Volume implementation */ 180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 19979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten#include "sles_allinclusive.h" 20979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 220b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_SetVolumeLevel(SLVolumeItf self, SLmillibel level) 230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((SL_MILLIBEL_MIN <= level) && (level <= PLATFORM_MILLIBEL_MAX_VOLUME))) { 27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 31bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillibel oldLevel = thiz->mLevel; 32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (oldLevel != level) { 33bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mLevel = level; 34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 35ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } else { 36bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 37ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 450b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_GetVolumeLevel(SLVolumeItf self, SLmillibel *pLevel) 460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pLevel) { 50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 52bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 53b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_lock_shared(thiz); 54bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillibel level = thiz->mLevel; 55b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_unlock_shared(thiz); 56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pLevel = level; 57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 64d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IVolume_GetMaxVolumeLevel(SLVolumeItf self, SLmillibel *pMaxLevel) 650b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pMaxLevel) { 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMaxLevel = PLATFORM_MILLIBEL_MAX_VOLUME; 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 790b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_SetMute(SLVolumeItf self, SLboolean mute) 800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 83bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 84d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten mute = SL_BOOLEAN_FALSE != mute; // normalize 85bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 86bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean oldMute = thiz->mMute; 87e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldMute != mute) { 88bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMute = (SLuint8) mute; 89bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 90ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } else { 91bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 92ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 960b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 990b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_GetMute(SLVolumeItf self, SLboolean *pMute) 1000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pMute) { 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 106bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 107b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_lock_shared(thiz); 108bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean mute = thiz->mMute; 109b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_unlock_shared(thiz); 110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMute = mute; 111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 1180b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_EnableStereoPosition(SLVolumeItf self, SLboolean enable) 1190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 122bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 123d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten enable = SL_BOOLEAN_FALSE != enable; // normalize 124bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 125bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean oldEnable = thiz->mEnableStereoPosition; 126e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldEnable != enable) { 127bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEnableStereoPosition = (SLuint8) enable; 128bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 12918abcc4b70fab1f84d6fbebac3a8e34480a6c4d3Glenn Kasten } else { 130bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 13118abcc4b70fab1f84d6fbebac3a8e34480a6c4d3Glenn Kasten } 132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 137ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 138f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivistatic SLresult IVolume_IsEnabledStereoPosition(SLVolumeItf self, SLboolean *pEnable) 1390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pEnable) { 143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 145bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 146b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_lock_shared(thiz); 147bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean enable = thiz->mEnableStereoPosition; 148b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_unlock_shared(thiz); 149ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pEnable = enable; 150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1540b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 157f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivistatic SLresult IVolume_SetStereoPosition(SLVolumeItf self, SLpermille stereoPosition) 1580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 159ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 160ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((-1000 <= stereoPosition) && (1000 >= stereoPosition))) { 162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 163ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 164bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 165bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 166bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille oldStereoPosition = thiz->mStereoPosition; 167ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (oldStereoPosition != stereoPosition) { 168bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStereoPosition = stereoPosition; 169bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 170ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } else { 171bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 172ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } 173ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 174ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 175ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 179ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 180d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IVolume_GetStereoPosition(SLVolumeItf self, SLpermille *pStereoPosition) 1810b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 182ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 183ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pStereoPosition) { 185ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 186ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 187bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 188b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_lock_shared(thiz); 189bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille stereoPosition = thiz->mStereoPosition; 190b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_unlock_shared(thiz); 191ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pStereoPosition = stereoPosition; 192ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 193ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 194ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 195ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1960b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 198ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 1990b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLVolumeItf_ IVolume_Itf = { 2000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_SetVolumeLevel, 2010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetVolumeLevel, 2020b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetMaxVolumeLevel, 2030b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_SetMute, 2040b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetMute, 2050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_EnableStereoPosition, 2060b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_IsEnabledStereoPosition, 2070b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_SetStereoPosition, 2080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetStereoPosition 2090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 2100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 2110b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid IVolume_init(void *self) 2120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 213bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 214bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IVolume_Itf; 215bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mLevel = 0; 216bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMute = SL_BOOLEAN_FALSE; 217bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEnableStereoPosition = SL_BOOLEAN_FALSE; 218bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStereoPosition = 0; 2190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 220