I3DSource.c revision d2a7f0d6883a6d3835642e7b282f05ed1c54fe63
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/* 3DSource implementation */
18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h"
20a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
21d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetHeadRelative(SL3DSourceItf self, SLboolean headRelative)
22a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
24a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_poke(this);
25d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    this->mHeadRelative = SL_BOOLEAN_FALSE != headRelative; // normalize
26a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_poke(this);
27a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
28a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
29a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
30d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetHeadRelative(SL3DSourceItf self, SLboolean *pHeadRelative)
31a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
32a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pHeadRelative)
33a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
34a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
35a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_peek(this);
36a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLboolean headRelative = this->mHeadRelative;
37a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_peek(this);
38a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pHeadRelative = headRelative;
39a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
40a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
41a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
42a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetRolloffDistances(SL3DSourceItf self,
43a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillimeter minDistance, SLmillimeter maxDistance)
44a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
45d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    if (!((0 < minDistance) && (minDistance <= SL_MILLIMETER_MAX) &&
46d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        (minDistance <= maxDistance) && (maxDistance <= SL_MILLIMETER_MAX)))
47d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
48a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
49a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_exclusive(this);
50a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mMinDistance = minDistance;
51a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mMaxDistance = maxDistance;
52a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_exclusive(this);
53a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
54a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
55a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
56a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_GetRolloffDistances(SL3DSourceItf self,
57a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillimeter *pMinDistance, SLmillimeter *pMaxDistance)
58a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
59a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pMinDistance || NULL == pMaxDistance)
60a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
61a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
62a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_shared(this);
63a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillimeter minDistance = this->mMinDistance;
64a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillimeter maxDistance = this->mMaxDistance;
65a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_shared(this);
66a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pMinDistance = minDistance;
67a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pMaxDistance = maxDistance;
68a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
69a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
70a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
71d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRolloffMaxDistanceMute(SL3DSourceItf self, SLboolean mute)
72a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
73a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
74a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_poke(this);
75d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    this->mRolloffMaxDistanceMute = SL_BOOLEAN_FALSE != mute; // normalize
76a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_poke(this);
77a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
78a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
79a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
80d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRolloffMaxDistanceMute(SL3DSourceItf self, SLboolean *pMute)
81a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
82a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pMute)
83a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
84a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
85a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_peek(this);
86a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLboolean mute = this->mRolloffMaxDistanceMute;
87a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_peek(this);
88a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pMute = mute;
89a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
90a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
91a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
92d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRolloffFactor(SL3DSourceItf self, SLpermille rolloffFactor)
93a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
94d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    if (!((0 <= rolloffFactor) && (rolloffFactor <= 10000)))
95d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
96a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
97a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_poke(this);
98a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mRolloffFactor = rolloffFactor;
99a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_poke(this);
100a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
101a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
102a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
103d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRolloffFactor(SL3DSourceItf self, SLpermille *pRolloffFactor)
104a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
105a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
106a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_peek(this);
107a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLpermille rolloffFactor = this->mRolloffFactor;
108a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_peek(this);
109a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pRolloffFactor = rolloffFactor;
110a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
111a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
112a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
113d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRoomRolloffFactor(SL3DSourceItf self, SLpermille roomRolloffFactor)
114a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
115d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    if (!((0 <= roomRolloffFactor) && (roomRolloffFactor <= 10000)))
116d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
117a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
118a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_poke(this);
119a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mRoomRolloffFactor = roomRolloffFactor;
120a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_poke(this);
121a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
122a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
123a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
124d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRoomRolloffFactor(SL3DSourceItf self, SLpermille *pRoomRolloffFactor)
125a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
126a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
127a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_peek(this);
128a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLpermille roomRolloffFactor = this->mRoomRolloffFactor;
129a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_peek(this);
130a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pRoomRolloffFactor = roomRolloffFactor;
131a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
132a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
133a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
134a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetRolloffModel(SL3DSourceItf self, SLuint8 model)
135a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
136d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    switch (model) {
137d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    case SL_ROLLOFFMODEL_LINEAR:
138d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    case SL_ROLLOFFMODEL_EXPONENTIAL:
139d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        break;
140d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    default:
141d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
142d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    }
143a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
144a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_poke(this);
145a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mDistanceModel = model;
146a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_poke(this);
147a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
148a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
149a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
150a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_GetRolloffModel(SL3DSourceItf self, SLuint8 *pModel)
151a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
152a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
153a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_peek(this);
154a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLuint8 model = this->mDistanceModel;
155a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_peek(this);
156a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pModel = model;
157a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
158a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
159a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
160a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetCone(SL3DSourceItf self, SLmillidegree innerAngle,
161a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillidegree outerAngle, SLmillibel outerLevel)
162a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
163d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // FIXME spec does not say anything about relationship between innerAngle and outerAngle
164d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    if (!((0 <= innerAngle) && (innerAngle <= 360000) &&
165d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        (0 <= outerAngle) && (outerAngle <= 360000) &&
166d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        (SL_MILLIBEL_MIN <= outerLevel) && (outerLevel <= 0)))
167d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
168a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
169a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_exclusive(this);
170a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mConeInnerAngle = innerAngle;
171a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mConeOuterAngle = outerAngle;
172a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mConeOuterLevel = outerLevel;
173a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_exclusive(this);
174a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
175a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
176a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
177d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetCone(SL3DSourceItf self, SLmillidegree *pInnerAngle,
178d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLmillidegree *pOuterAngle, SLmillibel *pOuterLevel)
179a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
180a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    if (NULL == pInnerAngle || NULL == pOuterAngle || NULL == pOuterLevel)
181a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten        return SL_RESULT_PARAMETER_INVALID;
182a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
183a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_lock_shared(this);
184a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillidegree innerAngle = this->mConeInnerAngle;
185a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillidegree outerAngle = this->mConeOuterAngle;
186a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillibel outerLevel = this->mConeOuterLevel;
187a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    interface_unlock_shared(this);
188a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pInnerAngle = innerAngle;
189a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pOuterAngle = outerAngle;
190a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pOuterLevel = outerLevel;
191a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    return SL_RESULT_SUCCESS;
192a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
193a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
194a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SL3DSourceItf_ I3DSource_Itf = {
195a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetHeadRelative,
196a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetHeadRelative,
197a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetRolloffDistances,
198a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetRolloffDistances,
199a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetRolloffMaxDistanceMute,
200a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetRolloffMaxDistanceMute,
201a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetRolloffFactor,
202a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetRolloffFactor,
203a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetRoomRolloffFactor,
204a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetRoomRolloffFactor,
205a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetRolloffModel,
206a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetRolloffModel,
207a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetCone,
208a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetCone
209a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
210a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
211a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid I3DSource_init(void *self)
212a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
213a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource *this = (I3DSource *) self;
214a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mItf = &I3DSource_Itf;
215a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mHeadRelative = SL_BOOLEAN_FALSE;
216a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mRolloffMaxDistanceMute = SL_BOOLEAN_FALSE;
217a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mMaxDistance = SL_MILLIMETER_MAX;
218a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mMinDistance = 1000;
219a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mConeInnerAngle = 360000;
220a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mConeOuterAngle = 360000;
221d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    this->mConeOuterLevel = 0;
222a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mRolloffFactor = 1000;
223d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    this->mRoomRolloffFactor = 0;
224a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    this->mDistanceModel = SL_ROLLOFFMODEL_EXPONENTIAL;
225a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
226