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