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/* 3DDoppler implementation */ 18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h" 20a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 22d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DDoppler_SetVelocityCartesian(SL3DDopplerItf self, const SLVec3D *pVelocity) 23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pVelocity) { 27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLVec3D velocityCartesian = *pVelocity; 31bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocityCartesian = velocityCartesian; 33bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocityActive = CARTESIAN_SET_SPHERICAL_UNKNOWN; 34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 39a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 40a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 42a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DDoppler_SetVelocitySpherical(SL3DDopplerItf self, 43a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten SLmillidegree azimuth, SLmillidegree elevation, SLmillimeter speed) 44a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 47bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 48bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 49bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocitySpherical.mAzimuth = azimuth; 50bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocitySpherical.mElevation = elevation; 51bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocitySpherical.mSpeed = speed; 52bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocityActive = CARTESIAN_UNKNOWN_SPHERICAL_SET; 53bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 57a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 58a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 60d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DDoppler_GetVelocityCartesian(SL3DDopplerItf self, SLVec3D *pVelocity) 61a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pVelocity) { 65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 67bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 68bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten for (;;) { 70bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten enum CartesianSphericalActive velocityActive = thiz->mVelocityActive; 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten switch (velocityActive) { 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case CARTESIAN_COMPUTED_SPHERICAL_SET: 73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case CARTESIAN_SET_SPHERICAL_COMPUTED: // not in 1.0.1 74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case CARTESIAN_SET_SPHERICAL_REQUESTED: // not in 1.0.1 75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case CARTESIAN_SET_SPHERICAL_UNKNOWN: 76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten { 77bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLVec3D velocityCartesian = thiz->mVelocityCartesian; 78bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pVelocity = velocityCartesian; 80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case CARTESIAN_UNKNOWN_SPHERICAL_SET: 83bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocityActive = CARTESIAN_REQUESTED_SPHERICAL_SET; 84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // fall through 85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case CARTESIAN_REQUESTED_SPHERICAL_SET: 86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // matched by cond_broadcast in case multiple requesters 87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#if 0 88bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_cond_wait(thiz); 89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else 90bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocityActive = CARTESIAN_COMPUTED_SPHERICAL_SET; 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#endif 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten continue; 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten default: 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten assert(SL_BOOLEAN_FALSE); 95bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pVelocity->x = 0; 97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pVelocity->y = 0; 98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pVelocity->z = 0; 99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 100a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten } 101a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten break; 102a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten } 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 104a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten } 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 107a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 108a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 110d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DDoppler_SetDopplerFactor(SL3DDopplerItf self, SLpermille dopplerFactor) 111a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 114bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 115bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 116bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDopplerFactor = dopplerFactor; 117bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 121a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 122a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 124d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DDoppler_GetDopplerFactor(SL3DDopplerItf self, SLpermille *pDopplerFactor) 125a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 127ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pDopplerFactor) { 129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 131bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 132bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 133bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille dopplerFactor = thiz->mDopplerFactor; 134bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDopplerFactor = dopplerFactor; 136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 137ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 138ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 140a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 141a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 143a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SL3DDopplerItf_ I3DDoppler_Itf = { 144a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DDoppler_SetVelocityCartesian, 145a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DDoppler_SetVelocitySpherical, 146a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DDoppler_GetVelocityCartesian, 147a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DDoppler_SetDopplerFactor, 148a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten I3DDoppler_GetDopplerFactor 149a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}; 150a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 151a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid I3DDoppler_init(void *self) 152a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 153bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten I3DDoppler *thiz = (I3DDoppler *) self; 154bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &I3DDoppler_Itf; 155bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocityCartesian.x = 0; 156bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocityCartesian.y = 0; 157bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocityCartesian.z = 0; 158bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten memset(&thiz->mVelocitySpherical, 0x55, sizeof(thiz->mVelocitySpherical)); 159bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVelocityActive = CARTESIAN_SET_SPHERICAL_UNKNOWN; 160bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDopplerFactor = 1000; 161a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 162