182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten/* 282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * 482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * you may not use this file except in compliance with the License. 682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * You may obtain a copy of the License at 782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * 882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * 1082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Unless required by applicable law or agreed to in writing, software 1182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 1282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * See the License for the specific language governing permissions and 1482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * limitations under the License. 1582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten */ 1682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 1782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten/* 3DDoppler implementation */ 1882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 1982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "sles_allinclusive.h" 2082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 21f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 22437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult I3DDoppler_SetVelocityCartesian(SL3DDopplerItf self, const SLVec3D *pVelocity) 2382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 24f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_ENTER_INTERFACE 25f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 26f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten if (NULL == pVelocity) { 27f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 28f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } else { 2950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 30f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SLVec3D velocityCartesian = *pVelocity; 3150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_lock_exclusive(thiz); 3250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocityCartesian = velocityCartesian; 3350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocityActive = CARTESIAN_SET_SPHERICAL_UNKNOWN; 3450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_exclusive(thiz); 35f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_SUCCESS; 36f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } 37f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 38f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_LEAVE_INTERFACE 3982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 4082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 41f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 4282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult I3DDoppler_SetVelocitySpherical(SL3DDopplerItf self, 4382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten SLmillidegree azimuth, SLmillidegree elevation, SLmillimeter speed) 4482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 45f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_ENTER_INTERFACE 46f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 4750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 4850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_lock_exclusive(thiz); 4950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocitySpherical.mAzimuth = azimuth; 5050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocitySpherical.mElevation = elevation; 5150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocitySpherical.mSpeed = speed; 5250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocityActive = CARTESIAN_UNKNOWN_SPHERICAL_SET; 5350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_exclusive(thiz); 54f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_SUCCESS; 55f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 56f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_LEAVE_INTERFACE 5782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 5882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 59f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 60437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult I3DDoppler_GetVelocityCartesian(SL3DDopplerItf self, SLVec3D *pVelocity) 6182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 62f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_ENTER_INTERFACE 63f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 64f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten if (NULL == pVelocity) { 65f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 66f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } else { 6750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 6850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_lock_exclusive(thiz); 69f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten for (;;) { 7050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten enum CartesianSphericalActive velocityActive = thiz->mVelocityActive; 71f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten switch (velocityActive) { 72f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten case CARTESIAN_COMPUTED_SPHERICAL_SET: 73f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten case CARTESIAN_SET_SPHERICAL_COMPUTED: // not in 1.0.1 74f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten case CARTESIAN_SET_SPHERICAL_REQUESTED: // not in 1.0.1 75f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten case CARTESIAN_SET_SPHERICAL_UNKNOWN: 76f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten { 7750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten SLVec3D velocityCartesian = thiz->mVelocityCartesian; 7850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_exclusive(thiz); 79f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten *pVelocity = velocityCartesian; 80f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } 81f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten break; 82f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten case CARTESIAN_UNKNOWN_SPHERICAL_SET: 8350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocityActive = CARTESIAN_REQUESTED_SPHERICAL_SET; 84f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten // fall through 85f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten case CARTESIAN_REQUESTED_SPHERICAL_SET: 86f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten // matched by cond_broadcast in case multiple requesters 87f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#if 0 8850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_cond_wait(thiz); 89f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#else 9050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocityActive = CARTESIAN_COMPUTED_SPHERICAL_SET; 91f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten#endif 92f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten continue; 93f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten default: 94f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten assert(SL_BOOLEAN_FALSE); 9550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_exclusive(thiz); 96f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten pVelocity->x = 0; 97f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten pVelocity->y = 0; 98f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten pVelocity->z = 0; 99f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten break; 10082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten } 10182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten break; 10282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten } 103f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_SUCCESS; 10482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten } 105f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 106f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_LEAVE_INTERFACE 10782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 10882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 109f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 110437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult I3DDoppler_SetDopplerFactor(SL3DDopplerItf self, SLpermille dopplerFactor) 11182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 112f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_ENTER_INTERFACE 113f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 11450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 11550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_lock_poke(thiz); 11650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mDopplerFactor = dopplerFactor; 11750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_poke(thiz); 118f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_SUCCESS; 119f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 120f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_LEAVE_INTERFACE 12182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 12282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 123f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 124437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult I3DDoppler_GetDopplerFactor(SL3DDopplerItf self, SLpermille *pDopplerFactor) 12582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 126f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_ENTER_INTERFACE 127f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 128f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten if (NULL == pDopplerFactor) { 129f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 130f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } else { 13150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 13250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_lock_peek(thiz); 13350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten SLpermille dopplerFactor = thiz->mDopplerFactor; 13450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten interface_unlock_peek(thiz); 135f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten *pDopplerFactor = dopplerFactor; 136f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten result = SL_RESULT_SUCCESS; 137f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten } 138f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 139f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten SL_LEAVE_INTERFACE 14082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 14182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 142f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten 14382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic const struct SL3DDopplerItf_ I3DDoppler_Itf = { 14482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten I3DDoppler_SetVelocityCartesian, 14582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten I3DDoppler_SetVelocitySpherical, 14682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten I3DDoppler_GetVelocityCartesian, 14782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten I3DDoppler_SetDopplerFactor, 14882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten I3DDoppler_GetDopplerFactor 14982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}; 15082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten 15182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenvoid I3DDoppler_init(void *self) 15282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{ 15350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 15450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mItf = &I3DDoppler_Itf; 15550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocityCartesian.x = 0; 15650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocityCartesian.y = 0; 15750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocityCartesian.z = 0; 15850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten memset(&thiz->mVelocitySpherical, 0x55, sizeof(thiz->mVelocitySpherical)); 15950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mVelocityActive = CARTESIAN_SET_SPHERICAL_UNKNOWN; 16050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten thiz->mDopplerFactor = 1000; 16182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten} 162