| /* | |
| * Copyright (C) 2010 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| /* 3DSource implementation */ | |
| #include "sles_allinclusive.h" | |
| static SLresult I3DSource_SetHeadRelative(SL3DSourceItf self, SLboolean headRelative) | |
| { | |
| SL_ENTER_INTERFACE | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_poke(thiz); | |
| thiz->mHeadRelative = SL_BOOLEAN_FALSE != headRelative; // normalize | |
| interface_unlock_poke(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_GetHeadRelative(SL3DSourceItf self, SLboolean *pHeadRelative) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (NULL == pHeadRelative) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_peek(thiz); | |
| SLboolean headRelative = thiz->mHeadRelative; | |
| interface_unlock_peek(thiz); | |
| *pHeadRelative = headRelative; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_SetRolloffDistances(SL3DSourceItf self, | |
| SLmillimeter minDistance, SLmillimeter maxDistance) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (!((0 < minDistance) && (minDistance <= SL_MILLIMETER_MAX) && | |
| (minDistance <= maxDistance) && (maxDistance <= SL_MILLIMETER_MAX))) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_exclusive(thiz); | |
| thiz->mMinDistance = minDistance; | |
| thiz->mMaxDistance = maxDistance; | |
| interface_unlock_exclusive(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_GetRolloffDistances(SL3DSourceItf self, | |
| SLmillimeter *pMinDistance, SLmillimeter *pMaxDistance) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (NULL == pMinDistance || NULL == pMaxDistance) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| I3DSource *thiz = (I3DSource *) self; interface_lock_shared(thiz); | |
| SLmillimeter minDistance = thiz->mMinDistance; | |
| SLmillimeter maxDistance = thiz->mMaxDistance; | |
| interface_unlock_shared(thiz); | |
| *pMinDistance = minDistance; | |
| *pMaxDistance = maxDistance; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_SetRolloffMaxDistanceMute(SL3DSourceItf self, SLboolean mute) | |
| { | |
| SL_ENTER_INTERFACE | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_poke(thiz); | |
| thiz->mRolloffMaxDistanceMute = SL_BOOLEAN_FALSE != mute; // normalize | |
| interface_unlock_poke(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_GetRolloffMaxDistanceMute(SL3DSourceItf self, SLboolean *pMute) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (NULL == pMute) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_peek(thiz); | |
| SLboolean mute = thiz->mRolloffMaxDistanceMute; | |
| interface_unlock_peek(thiz); | |
| *pMute = mute; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_SetRolloffFactor(SL3DSourceItf self, SLpermille rolloffFactor) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (!((0 <= rolloffFactor) && (rolloffFactor <= 10000))) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_poke(thiz); | |
| thiz->mRolloffFactor = rolloffFactor; | |
| interface_unlock_poke(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_GetRolloffFactor(SL3DSourceItf self, SLpermille *pRolloffFactor) | |
| { | |
| SL_ENTER_INTERFACE | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_peek(thiz); | |
| SLpermille rolloffFactor = thiz->mRolloffFactor; | |
| interface_unlock_peek(thiz); | |
| *pRolloffFactor = rolloffFactor; | |
| result = SL_RESULT_SUCCESS; | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_SetRoomRolloffFactor(SL3DSourceItf self, SLpermille roomRolloffFactor) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (!((0 <= roomRolloffFactor) && (roomRolloffFactor <= 10000))) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_poke(thiz); | |
| thiz->mRoomRolloffFactor = roomRolloffFactor; | |
| interface_unlock_poke(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_GetRoomRolloffFactor(SL3DSourceItf self, SLpermille *pRoomRolloffFactor) | |
| { | |
| SL_ENTER_INTERFACE | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_peek(thiz); | |
| SLpermille roomRolloffFactor = thiz->mRoomRolloffFactor; | |
| interface_unlock_peek(thiz); | |
| *pRoomRolloffFactor = roomRolloffFactor; | |
| result = SL_RESULT_SUCCESS; | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_SetRolloffModel(SL3DSourceItf self, SLuint8 model) | |
| { | |
| SL_ENTER_INTERFACE | |
| switch (model) { | |
| case SL_ROLLOFFMODEL_LINEAR: | |
| case SL_ROLLOFFMODEL_EXPONENTIAL: | |
| { | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_poke(thiz); | |
| thiz->mDistanceModel = model; | |
| interface_unlock_poke(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| break; | |
| default: | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| break; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_GetRolloffModel(SL3DSourceItf self, SLuint8 *pModel) | |
| { | |
| SL_ENTER_INTERFACE | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_peek(thiz); | |
| SLuint8 model = thiz->mDistanceModel; | |
| interface_unlock_peek(thiz); | |
| *pModel = model; | |
| result = SL_RESULT_SUCCESS; | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_SetCone(SL3DSourceItf self, SLmillidegree innerAngle, | |
| SLmillidegree outerAngle, SLmillibel outerLevel) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (!((0 <= innerAngle) && (innerAngle <= 360000) && | |
| (0 <= outerAngle) && (outerAngle <= 360000) && | |
| (SL_MILLIBEL_MIN <= outerLevel) && (outerLevel <= 0))) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_exclusive(thiz); | |
| thiz->mConeInnerAngle = innerAngle; | |
| thiz->mConeOuterAngle = outerAngle; | |
| thiz->mConeOuterLevel = outerLevel; | |
| interface_unlock_exclusive(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult I3DSource_GetCone(SL3DSourceItf self, SLmillidegree *pInnerAngle, | |
| SLmillidegree *pOuterAngle, SLmillibel *pOuterLevel) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (NULL == pInnerAngle || NULL == pOuterAngle || NULL == pOuterLevel) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| I3DSource *thiz = (I3DSource *) self; | |
| interface_lock_shared(thiz); | |
| SLmillidegree innerAngle = thiz->mConeInnerAngle; | |
| SLmillidegree outerAngle = thiz->mConeOuterAngle; | |
| SLmillibel outerLevel = thiz->mConeOuterLevel; | |
| interface_unlock_shared(thiz); | |
| *pInnerAngle = innerAngle; | |
| *pOuterAngle = outerAngle; | |
| *pOuterLevel = outerLevel; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static const struct SL3DSourceItf_ I3DSource_Itf = { | |
| I3DSource_SetHeadRelative, | |
| I3DSource_GetHeadRelative, | |
| I3DSource_SetRolloffDistances, | |
| I3DSource_GetRolloffDistances, | |
| I3DSource_SetRolloffMaxDistanceMute, | |
| I3DSource_GetRolloffMaxDistanceMute, | |
| I3DSource_SetRolloffFactor, | |
| I3DSource_GetRolloffFactor, | |
| I3DSource_SetRoomRolloffFactor, | |
| I3DSource_GetRoomRolloffFactor, | |
| I3DSource_SetRolloffModel, | |
| I3DSource_GetRolloffModel, | |
| I3DSource_SetCone, | |
| I3DSource_GetCone | |
| }; | |
| void I3DSource_init(void *self) | |
| { | |
| I3DSource *thiz = (I3DSource *) self; | |
| thiz->mItf = &I3DSource_Itf; | |
| thiz->mHeadRelative = SL_BOOLEAN_FALSE; | |
| thiz->mRolloffMaxDistanceMute = SL_BOOLEAN_FALSE; | |
| thiz->mMaxDistance = SL_MILLIMETER_MAX; | |
| thiz->mMinDistance = 1000; | |
| thiz->mConeInnerAngle = 360000; | |
| thiz->mConeOuterAngle = 360000; | |
| thiz->mConeOuterLevel = 0; | |
| thiz->mRolloffFactor = 1000; | |
| thiz->mRoomRolloffFactor = 0; | |
| thiz->mDistanceModel = SL_ROLLOFFMODEL_EXPONENTIAL; | |
| } |