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