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
21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
22d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetHeadRelative(SL3DSourceItf self, SLboolean headRelative)
23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
26bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    I3DSource *thiz = (I3DSource *) self;
27bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_poke(thiz);
28bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mHeadRelative = SL_BOOLEAN_FALSE != headRelative; // normalize
29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_poke(thiz);
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
33a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
34a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
36d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetHeadRelative(SL3DSourceItf self, SLboolean *pHeadRelative)
37a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pHeadRelative) {
41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
43bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        I3DSource *thiz = (I3DSource *) self;
44bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
45bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLboolean headRelative = thiz->mHeadRelative;
46bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(thiz);
47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pHeadRelative = headRelative;
48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
52a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
53a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
55a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetRolloffDistances(SL3DSourceItf self,
56a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillimeter minDistance, SLmillimeter maxDistance)
57a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
60d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    if (!((0 < minDistance) && (minDistance <= SL_MILLIMETER_MAX) &&
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        (minDistance <= maxDistance) && (maxDistance <= SL_MILLIMETER_MAX))) {
62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
64bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        I3DSource *thiz = (I3DSource *) self;
65bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
66bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mMinDistance = minDistance;
67bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mMaxDistance = maxDistance;
68bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
73a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
74a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
76a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_GetRolloffDistances(SL3DSourceItf self,
77a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillimeter *pMinDistance, SLmillimeter *pMaxDistance)
78a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pMinDistance || NULL == pMaxDistance) {
82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
84bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        I3DSource *thiz = (I3DSource *) self; interface_lock_shared(thiz);
85bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLmillimeter minDistance = thiz->mMinDistance;
86bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLmillimeter maxDistance = thiz->mMaxDistance;
87bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_shared(thiz);
88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMinDistance = minDistance;
89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMaxDistance = maxDistance;
90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
94a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
95a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
97d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRolloffMaxDistanceMute(SL3DSourceItf self, SLboolean mute)
98a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
101bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    I3DSource *thiz = (I3DSource *) self;
102bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_poke(thiz);
103bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mRolloffMaxDistanceMute = SL_BOOLEAN_FALSE != mute; // normalize
104bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_poke(thiz);
105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
108a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
109a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
111d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRolloffMaxDistanceMute(SL3DSourceItf self, SLboolean *pMute)
112a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pMute) {
116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
118bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        I3DSource *thiz = (I3DSource *) self;
119bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
120bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLboolean mute = thiz->mRolloffMaxDistanceMute;
121bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(thiz);
122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMute = mute;
123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
127a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
128a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
130d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRolloffFactor(SL3DSourceItf self, SLpermille rolloffFactor)
131a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!((0 <= rolloffFactor) && (rolloffFactor <= 10000))) {
135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
137bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        I3DSource *thiz = (I3DSource *) self;
138bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_poke(thiz);
139bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mRolloffFactor = rolloffFactor;
140bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_poke(thiz);
141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
145a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
146a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
147ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
148d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRolloffFactor(SL3DSourceItf self, SLpermille *pRolloffFactor)
149a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
152bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    I3DSource *thiz = (I3DSource *) self;
153bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_peek(thiz);
154bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    SLpermille rolloffFactor = thiz->mRolloffFactor;
155bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_peek(thiz);
156a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pRolloffFactor = rolloffFactor;
157ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
158ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
159ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
160a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
161a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
163d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_SetRoomRolloffFactor(SL3DSourceItf self, SLpermille roomRolloffFactor)
164a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
165ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
166ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
167ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!((0 <= roomRolloffFactor) && (roomRolloffFactor <= 10000))) {
168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
170bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        I3DSource *thiz = (I3DSource *) self;
171bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_poke(thiz);
172bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mRoomRolloffFactor = roomRolloffFactor;
173bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_poke(thiz);
174ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
175ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
177ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
178a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
179a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
180ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
181d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetRoomRolloffFactor(SL3DSourceItf self, SLpermille *pRoomRolloffFactor)
182a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
183ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
185bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    I3DSource *thiz = (I3DSource *) self;
186bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_peek(thiz);
187bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    SLpermille roomRolloffFactor = thiz->mRoomRolloffFactor;
188bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_peek(thiz);
189a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pRoomRolloffFactor = roomRolloffFactor;
190ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
191ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
192ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
193a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
194a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
195ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
196a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetRolloffModel(SL3DSourceItf self, SLuint8 model)
197a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
198ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
199ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
200d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    switch (model) {
201d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    case SL_ROLLOFFMODEL_LINEAR:
202d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    case SL_ROLLOFFMODEL_EXPONENTIAL:
203ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        {
204bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        I3DSource *thiz = (I3DSource *) self;
205bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_poke(thiz);
206bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mDistanceModel = model;
207bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_poke(thiz);
208ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
209ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
210d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        break;
211d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    default:
212ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
213ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        break;
214d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    }
215ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
216ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
217a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
218a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
219ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
220a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_GetRolloffModel(SL3DSourceItf self, SLuint8 *pModel)
221a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
222ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
223ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
224bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    I3DSource *thiz = (I3DSource *) self;
225bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_peek(thiz);
226bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    SLuint8 model = thiz->mDistanceModel;
227bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_peek(thiz);
228a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    *pModel = model;
229ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
230ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
231ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
232a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
233a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
234ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
235a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult I3DSource_SetCone(SL3DSourceItf self, SLmillidegree innerAngle,
236a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLmillidegree outerAngle, SLmillibel outerLevel)
237a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
238ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
239ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
240d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    if (!((0 <= innerAngle) && (innerAngle <= 360000) &&
241d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        (0 <= outerAngle) && (outerAngle <= 360000) &&
242ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        (SL_MILLIBEL_MIN <= outerLevel) && (outerLevel <= 0))) {
243ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
244ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
245bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        I3DSource *thiz = (I3DSource *) self;
246bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
247bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mConeInnerAngle = innerAngle;
248bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mConeOuterAngle = outerAngle;
249bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mConeOuterLevel = outerLevel;
250bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
251ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
252ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
253ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
254ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
255a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
256a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
257ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
258d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult I3DSource_GetCone(SL3DSourceItf self, SLmillidegree *pInnerAngle,
259d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLmillidegree *pOuterAngle, SLmillibel *pOuterLevel)
260a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
261ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
262ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
263ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pInnerAngle || NULL == pOuterAngle || NULL == pOuterLevel) {
264ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
265ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
266bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        I3DSource *thiz = (I3DSource *) self;
267bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_shared(thiz);
268bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLmillidegree innerAngle = thiz->mConeInnerAngle;
269bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLmillidegree outerAngle = thiz->mConeOuterAngle;
270bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLmillibel outerLevel = thiz->mConeOuterLevel;
271bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_shared(thiz);
272ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pInnerAngle = innerAngle;
273ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pOuterAngle = outerAngle;
274ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pOuterLevel = outerLevel;
275ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
276ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
277ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
278ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
279a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
280a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
281ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
282a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SL3DSourceItf_ I3DSource_Itf = {
283a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetHeadRelative,
284a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetHeadRelative,
285a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetRolloffDistances,
286a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetRolloffDistances,
287a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetRolloffMaxDistanceMute,
288a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetRolloffMaxDistanceMute,
289a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetRolloffFactor,
290a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetRolloffFactor,
291a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetRoomRolloffFactor,
292a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetRoomRolloffFactor,
293a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetRolloffModel,
294a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetRolloffModel,
295a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_SetCone,
296a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    I3DSource_GetCone
297a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
298a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
299a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid I3DSource_init(void *self)
300a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
301bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    I3DSource *thiz = (I3DSource *) self;
302bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &I3DSource_Itf;
303bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mHeadRelative = SL_BOOLEAN_FALSE;
304bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mRolloffMaxDistanceMute = SL_BOOLEAN_FALSE;
305bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mMaxDistance = SL_MILLIMETER_MAX;
306bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mMinDistance = 1000;
307bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mConeInnerAngle = 360000;
308bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mConeOuterAngle = 360000;
309bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mConeOuterLevel = 0;
310bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mRolloffFactor = 1000;
311bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mRoomRolloffFactor = 0;
312bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mDistanceModel = SL_ROLLOFFMODEL_EXPONENTIAL;
313a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
314