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 22a6585530d8cf92658042c001b6a27fc397c62b9fGlenn Kastenstatic SLresult IVolume_SetVolumeLevel(SLVolumeItf self, SLmillibel level_) 230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26a6585530d8cf92658042c001b6a27fc397c62b9fGlenn Kasten int level = level_; 27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((SL_MILLIBEL_MIN <= level) && (level <= PLATFORM_MILLIBEL_MAX_VOLUME))) { 28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 31bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillibel oldLevel = thiz->mLevel; 33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (oldLevel != level) { 34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mLevel = level; 35bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 36ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } else { 37bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 38ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 460b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_GetVolumeLevel(SLVolumeItf self, SLmillibel *pLevel) 470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pLevel) { 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 53bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 54b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_lock_shared(thiz); 55bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillibel level = thiz->mLevel; 56b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_unlock_shared(thiz); 57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pLevel = level; 58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 65d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IVolume_GetMaxVolumeLevel(SLVolumeItf self, SLmillibel *pMaxLevel) 660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pMaxLevel) { 70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMaxLevel = PLATFORM_MILLIBEL_MAX_VOLUME; 73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 800b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_SetMute(SLVolumeItf self, SLboolean mute) 810b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 84bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 85d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten mute = SL_BOOLEAN_FALSE != mute; // normalize 86bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 87bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean oldMute = thiz->mMute; 88e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldMute != mute) { 89bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMute = (SLuint8) mute; 90bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 91ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } else { 92bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 93ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 1000b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_GetMute(SLVolumeItf self, SLboolean *pMute) 1010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pMute) { 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 107bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 108b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_lock_shared(thiz); 109bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean mute = thiz->mMute; 110b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_unlock_shared(thiz); 111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMute = mute; 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 1190b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_EnableStereoPosition(SLVolumeItf self, SLboolean enable) 1200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 123bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 124d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten enable = SL_BOOLEAN_FALSE != enable; // normalize 125bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 126bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean oldEnable = thiz->mEnableStereoPosition; 127e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldEnable != enable) { 128bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEnableStereoPosition = (SLuint8) enable; 129bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 13018abcc4b70fab1f84d6fbebac3a8e34480a6c4d3Glenn Kasten } else { 131bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 13218abcc4b70fab1f84d6fbebac3a8e34480a6c4d3Glenn Kasten } 133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 138ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 139f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivistatic SLresult IVolume_IsEnabledStereoPosition(SLVolumeItf self, SLboolean *pEnable) 1400b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pEnable) { 144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 146bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 147b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_lock_shared(thiz); 148bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean enable = thiz->mEnableStereoPosition; 149b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_unlock_shared(thiz); 150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pEnable = enable; 151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 154ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 157ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 158f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivistatic SLresult IVolume_SetStereoPosition(SLVolumeItf self, SLpermille stereoPosition) 1590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 160ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((-1000 <= stereoPosition) && (1000 >= stereoPosition))) { 163ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 164ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 165bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 166bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 167bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille oldStereoPosition = thiz->mStereoPosition; 168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (oldStereoPosition != stereoPosition) { 169bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStereoPosition = stereoPosition; 170bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 171ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } else { 172bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 173ab7724988c1ff39ad3fc95a7ae0e638357708f7cGlenn Kasten } 174ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 175ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 177ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 180ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 181d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IVolume_GetStereoPosition(SLVolumeItf self, SLpermille *pStereoPosition) 1820b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 183ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 185ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pStereoPosition) { 186ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 187ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 188bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 189b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_lock_shared(thiz); 190bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille stereoPosition = thiz->mStereoPosition; 191b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_unlock_shared(thiz); 192ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pStereoPosition = stereoPosition; 193ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 194ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 195ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 196ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 199ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 2000b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLVolumeItf_ IVolume_Itf = { 2010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_SetVolumeLevel, 2020b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetVolumeLevel, 2030b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetMaxVolumeLevel, 2040b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_SetMute, 2050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetMute, 2060b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_EnableStereoPosition, 2070b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_IsEnabledStereoPosition, 2080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_SetStereoPosition, 2090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetStereoPosition 2100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 2110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 2120b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid IVolume_init(void *self) 2130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 214bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 215bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IVolume_Itf; 216bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mLevel = 0; 217bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMute = SL_BOOLEAN_FALSE; 218bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEnableStereoPosition = SL_BOOLEAN_FALSE; 219bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStereoPosition = 0; 2200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 221