I3DSource.c revision d2a7f0d6883a6d3835642e7b282f05ed1c54fe63
1a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* 2a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 3a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 4a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * you may not use this file except in compliance with the License. 6a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * You may obtain a copy of the License at 7a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 8a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 10a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * See the License for the specific language governing permissions and 14a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * limitations under the License. 15a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten */ 16a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 17a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* 3DSource implementation */ 18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h" 20a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 21d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetHeadRelative(SL3DSourceItf self, SLboolean headRelative) 22a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 24a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_poke(this); 25d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten this->mHeadRelative = SL_BOOLEAN_FALSE != headRelative; // normalize 26a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_poke(this); 27a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 28a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 29a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 30d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetHeadRelative(SL3DSourceItf self, SLboolean *pHeadRelative) 31a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 32a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten if (NULL == pHeadRelative) 33a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 34a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 35a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_peek(this); 36a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLboolean headRelative = this->mHeadRelative; 37a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_peek(this); 38a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pHeadRelative = headRelative; 39a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 40a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 41a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 42a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetRolloffDistances(SL3DSourceItf self, 43a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillimeter minDistance, SLmillimeter maxDistance) 44a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 45d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!((0 < minDistance) && (minDistance <= SL_MILLIMETER_MAX) && 46d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten (minDistance <= maxDistance) && (maxDistance <= SL_MILLIMETER_MAX))) 47d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 48a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 49a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_exclusive(this); 50a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mMinDistance = minDistance; 51a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mMaxDistance = maxDistance; 52a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_exclusive(this); 53a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 54a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 55a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 56a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_GetRolloffDistances(SL3DSourceItf self, 57a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillimeter *pMinDistance, SLmillimeter *pMaxDistance) 58a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 59a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten if (NULL == pMinDistance || NULL == pMaxDistance) 60a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 61a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 62a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_shared(this); 63a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillimeter minDistance = this->mMinDistance; 64a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillimeter maxDistance = this->mMaxDistance; 65a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_shared(this); 66a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pMinDistance = minDistance; 67a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pMaxDistance = maxDistance; 68a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 69a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 70a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 71d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRolloffMaxDistanceMute(SL3DSourceItf self, SLboolean mute) 72a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 73a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 74a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_poke(this); 75d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten this->mRolloffMaxDistanceMute = SL_BOOLEAN_FALSE != mute; // normalize 76a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_poke(this); 77a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 78a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 79a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 80d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRolloffMaxDistanceMute(SL3DSourceItf self, SLboolean *pMute) 81a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 82a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten if (NULL == pMute) 83a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 84a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 85a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_peek(this); 86a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLboolean mute = this->mRolloffMaxDistanceMute; 87a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_peek(this); 88a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pMute = mute; 89a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 90a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 91a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 92d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRolloffFactor(SL3DSourceItf self, SLpermille rolloffFactor) 93a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 94d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!((0 <= rolloffFactor) && (rolloffFactor <= 10000))) 95d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 96a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 97a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_poke(this); 98a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mRolloffFactor = rolloffFactor; 99a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_poke(this); 100a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 101a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 102a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 103d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRolloffFactor(SL3DSourceItf self, SLpermille *pRolloffFactor) 104a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 105a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 106a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_peek(this); 107a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLpermille rolloffFactor = this->mRolloffFactor; 108a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_peek(this); 109a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pRolloffFactor = rolloffFactor; 110a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 111a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 112a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 113d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRoomRolloffFactor(SL3DSourceItf self, SLpermille roomRolloffFactor) 114a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 115d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!((0 <= roomRolloffFactor) && (roomRolloffFactor <= 10000))) 116d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 117a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 118a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_poke(this); 119a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mRoomRolloffFactor = roomRolloffFactor; 120a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_poke(this); 121a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 122a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 123a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 124d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRoomRolloffFactor(SL3DSourceItf self, SLpermille *pRoomRolloffFactor) 125a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 126a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 127a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_peek(this); 128a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLpermille roomRolloffFactor = this->mRoomRolloffFactor; 129a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_peek(this); 130a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pRoomRolloffFactor = roomRolloffFactor; 131a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 132a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 133a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 134a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetRolloffModel(SL3DSourceItf self, SLuint8 model) 135a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 136d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten switch (model) { 137d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case SL_ROLLOFFMODEL_LINEAR: 138d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case SL_ROLLOFFMODEL_EXPONENTIAL: 139d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten break; 140d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten default: 141d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 142d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten } 143a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 144a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_poke(this); 145a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mDistanceModel = model; 146a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_poke(this); 147a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 148a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 149a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 150a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_GetRolloffModel(SL3DSourceItf self, SLuint8 *pModel) 151a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 152a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 153a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_peek(this); 154a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLuint8 model = this->mDistanceModel; 155a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_peek(this); 156a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pModel = model; 157a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 158a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 159a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 160a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetCone(SL3DSourceItf self, SLmillidegree innerAngle, 161a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillidegree outerAngle, SLmillibel outerLevel) 162a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 163d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // FIXME spec does not say anything about relationship between innerAngle and outerAngle 164d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!((0 <= innerAngle) && (innerAngle <= 360000) && 165d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten (0 <= outerAngle) && (outerAngle <= 360000) && 166d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten (SL_MILLIBEL_MIN <= outerLevel) && (outerLevel <= 0))) 167d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 168a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 169a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_exclusive(this); 170a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mConeInnerAngle = innerAngle; 171a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mConeOuterAngle = outerAngle; 172a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mConeOuterLevel = outerLevel; 173a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_exclusive(this); 174a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 175a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 176a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 177d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetCone(SL3DSourceItf self, SLmillidegree *pInnerAngle, 178d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLmillidegree *pOuterAngle, SLmillibel *pOuterLevel) 179a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 180a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten if (NULL == pInnerAngle || NULL == pOuterAngle || NULL == pOuterLevel) 181a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 182a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 183a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_lock_shared(this); 184a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillidegree innerAngle = this->mConeInnerAngle; 185a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillidegree outerAngle = this->mConeOuterAngle; 186a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillibel outerLevel = this->mConeOuterLevel; 187a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten interface_unlock_shared(this); 188a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pInnerAngle = innerAngle; 189a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pOuterAngle = outerAngle; 190a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pOuterLevel = outerLevel; 191a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten return SL_RESULT_SUCCESS; 192a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 193a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 194a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SL3DSourceItf_ I3DSource_Itf = { 195a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetHeadRelative, 196a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetHeadRelative, 197a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetRolloffDistances, 198a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetRolloffDistances, 199a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetRolloffMaxDistanceMute, 200a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetRolloffMaxDistanceMute, 201a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetRolloffFactor, 202a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetRolloffFactor, 203a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetRoomRolloffFactor, 204a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetRoomRolloffFactor, 205a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetRolloffModel, 206a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetRolloffModel, 207a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetCone, 208a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetCone 209a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}; 210a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 211a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid I3DSource_init(void *self) 212a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 213a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource *this = (I3DSource *) self; 214a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mItf = &I3DSource_Itf; 215a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mHeadRelative = SL_BOOLEAN_FALSE; 216a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mRolloffMaxDistanceMute = SL_BOOLEAN_FALSE; 217a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mMaxDistance = SL_MILLIMETER_MAX; 218a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mMinDistance = 1000; 219a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mConeInnerAngle = 360000; 220a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mConeOuterAngle = 360000; 221d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten this->mConeOuterLevel = 0; 222a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mRolloffFactor = 1000; 223d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten this->mRoomRolloffFactor = 0; 224a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten this->mDistanceModel = SL_ROLLOFFMODEL_EXPONENTIAL; 225a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 226