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 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 22d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetHeadRelative(SL3DSourceItf self, SLboolean headRelative) 23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 27bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 28bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mHeadRelative = SL_BOOLEAN_FALSE != headRelative; // normalize 29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 33a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 34a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 36d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetHeadRelative(SL3DSourceItf self, SLboolean *pHeadRelative) 37a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pHeadRelative) { 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 43bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 44bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 45bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean headRelative = thiz->mHeadRelative; 46bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pHeadRelative = headRelative; 48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 52a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 53a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 55a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetRolloffDistances(SL3DSourceItf self, 56a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillimeter minDistance, SLmillimeter maxDistance) 57a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 60d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!((0 < minDistance) && (minDistance <= SL_MILLIMETER_MAX) && 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten (minDistance <= maxDistance) && (maxDistance <= SL_MILLIMETER_MAX))) { 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 64bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 65bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 66bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMinDistance = minDistance; 67bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMaxDistance = maxDistance; 68bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 73a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 74a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 76a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_GetRolloffDistances(SL3DSourceItf self, 77a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillimeter *pMinDistance, SLmillimeter *pMaxDistance) 78a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pMinDistance || NULL == pMaxDistance) { 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 84bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; interface_lock_shared(thiz); 85bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillimeter minDistance = thiz->mMinDistance; 86bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillimeter maxDistance = thiz->mMaxDistance; 87bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_shared(thiz); 88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMinDistance = minDistance; 89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMaxDistance = maxDistance; 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 94a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 95a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 97d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRolloffMaxDistanceMute(SL3DSourceItf self, SLboolean mute) 98a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 101bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 102bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 103bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mRolloffMaxDistanceMute = SL_BOOLEAN_FALSE != mute; // normalize 104bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 108a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 109a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 111d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRolloffMaxDistanceMute(SL3DSourceItf self, SLboolean *pMute) 112a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pMute) { 116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 118bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 119bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 120bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean mute = thiz->mRolloffMaxDistanceMute; 121bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMute = mute; 123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 127a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 128a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 130d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRolloffFactor(SL3DSourceItf self, SLpermille rolloffFactor) 131a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((0 <= rolloffFactor) && (rolloffFactor <= 10000))) { 135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 137bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 138bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 139bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mRolloffFactor = rolloffFactor; 140bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 145a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 146a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 147ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 148d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRolloffFactor(SL3DSourceItf self, SLpermille *pRolloffFactor) 149a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 152bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 153bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 154bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille rolloffFactor = thiz->mRolloffFactor; 155bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 156a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pRolloffFactor = rolloffFactor; 157ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 158ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 159ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 160a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 161a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 163d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRoomRolloffFactor(SL3DSourceItf self, SLpermille roomRolloffFactor) 164a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 165ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 166ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 167ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((0 <= roomRolloffFactor) && (roomRolloffFactor <= 10000))) { 168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 170bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 171bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 172bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mRoomRolloffFactor = roomRolloffFactor; 173bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 174ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 175ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 177ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 178a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 179a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 180ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 181d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRoomRolloffFactor(SL3DSourceItf self, SLpermille *pRoomRolloffFactor) 182a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 183ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 185bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 186bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 187bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille roomRolloffFactor = thiz->mRoomRolloffFactor; 188bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 189a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pRoomRolloffFactor = roomRolloffFactor; 190ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 191ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 192ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 193a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 194a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 195ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 196a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetRolloffModel(SL3DSourceItf self, SLuint8 model) 197a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 198ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 199ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 200d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten switch (model) { 201d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case SL_ROLLOFFMODEL_LINEAR: 202d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case SL_ROLLOFFMODEL_EXPONENTIAL: 203ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten { 204bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 205bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 206bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDistanceModel = model; 207bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 208ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 209ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 210d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten break; 211d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten default: 212ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 213ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 214d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten } 215ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 216ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 217a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 218a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 219ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 220a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_GetRolloffModel(SL3DSourceItf self, SLuint8 *pModel) 221a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 222ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 223ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 224bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 225bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 226bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLuint8 model = thiz->mDistanceModel; 227bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 228a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *pModel = model; 229ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 230ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 231ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 232a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 233a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 234ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 235a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetCone(SL3DSourceItf self, SLmillidegree innerAngle, 236a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillidegree outerAngle, SLmillibel outerLevel) 237a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 238ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 239ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 240d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!((0 <= innerAngle) && (innerAngle <= 360000) && 241d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten (0 <= outerAngle) && (outerAngle <= 360000) && 242ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten (SL_MILLIBEL_MIN <= outerLevel) && (outerLevel <= 0))) { 243ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 244ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 245bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 246bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 247bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mConeInnerAngle = innerAngle; 248bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mConeOuterAngle = outerAngle; 249bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mConeOuterLevel = outerLevel; 250bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 251ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 252ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 253ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 254ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 255a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 256a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 257ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 258d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetCone(SL3DSourceItf self, SLmillidegree *pInnerAngle, 259d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLmillidegree *pOuterAngle, SLmillibel *pOuterLevel) 260a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 261ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 262ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 263ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pInnerAngle || NULL == pOuterAngle || NULL == pOuterLevel) { 264ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 265ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 266bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 267bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_shared(thiz); 268bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillidegree innerAngle = thiz->mConeInnerAngle; 269bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillidegree outerAngle = thiz->mConeOuterAngle; 270bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillibel outerLevel = thiz->mConeOuterLevel; 271bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_shared(thiz); 272ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pInnerAngle = innerAngle; 273ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pOuterAngle = outerAngle; 274ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pOuterLevel = outerLevel; 275ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 276ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 277ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 278ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 279a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 280a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 281ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 282a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SL3DSourceItf_ I3DSource_Itf = { 283a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetHeadRelative, 284a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetHeadRelative, 285a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetRolloffDistances, 286a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetRolloffDistances, 287a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetRolloffMaxDistanceMute, 288a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetRolloffMaxDistanceMute, 289a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetRolloffFactor, 290a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetRolloffFactor, 291a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetRoomRolloffFactor, 292a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetRoomRolloffFactor, 293a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetRolloffModel, 294a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetRolloffModel, 295a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_SetCone, 296a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DSource_GetCone 297a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}; 298a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 299a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid I3DSource_init(void *self) 300a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 301bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DSource *thiz = (I3DSource *) self; 302bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &I3DSource_Itf; 303bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mHeadRelative = SL_BOOLEAN_FALSE; 304bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mRolloffMaxDistanceMute = SL_BOOLEAN_FALSE; 305bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMaxDistance = SL_MILLIMETER_MAX; 306bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMinDistance = 1000; 307bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mConeInnerAngle = 360000; 308bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mConeOuterAngle = 360000; 309bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mConeOuterLevel = 0; 310bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mRolloffFactor = 1000; 311bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mRoomRolloffFactor = 0; 312bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDistanceModel = SL_ROLLOFFMODEL_EXPONENTIAL; 313a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 314