1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef OPENSL_ES_ANDROID_H_
18 #define OPENSL_ES_ANDROID_H_
19 
20 #include "OpenSLES_AndroidConfiguration.h"
21 #include "OpenSLES_AndroidMetadata.h"
22 #include <jni.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /*---------------------------------------------------------------------------*/
29 /* Android common types                                                      */
30 /*---------------------------------------------------------------------------*/
31 
32 typedef sl_int64_t             SLAint64;          /* 64 bit signed integer   */
33 
34 typedef sl_uint64_t            SLAuint64;         /* 64 bit unsigned integer */
35 
36 /*---------------------------------------------------------------------------*/
37 /* Android PCM Data Format                                                   */
38 /*---------------------------------------------------------------------------*/
39 
40 /* The following pcm representations and data formats map to those in OpenSLES 1.1 */
41 #define SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT       ((SLuint32) 0x00000001)
42 #define SL_ANDROID_PCM_REPRESENTATION_UNSIGNED_INT     ((SLuint32) 0x00000002)
43 #define SL_ANDROID_PCM_REPRESENTATION_FLOAT            ((SLuint32) 0x00000003)
44 
45 #define SL_ANDROID_DATAFORMAT_PCM_EX    ((SLuint32) 0x00000004)
46 
47 typedef struct SLAndroidDataFormat_PCM_EX_ {
48     SLuint32         formatType;
49     SLuint32         numChannels;
50     SLuint32         sampleRate;
51     SLuint32         bitsPerSample;
52     SLuint32         containerSize;
53     SLuint32         channelMask;
54     SLuint32         endianness;
55     SLuint32         representation;
56 } SLAndroidDataFormat_PCM_EX;
57 
58 #define SL_ANDROID_SPEAKER_NON_POSITIONAL       ((SLuint32) 0x80000000)
59 
60 // Make an indexed channel mask from a bitfield.
61 //
62 // Each bit in the bitfield corresponds to a channel index,
63 // from least-significant bit (channel 0) up to the bit
64 // corresponding to the maximum channel count (currently FCC_8).
65 // A '1' in the bitfield indicates that the channel should be
66 // included in the stream, while a '0' indicates that it
67 // should be excluded. For instance, a bitfield of 0x0A (binary 00001010)
68 // would define a stream that contains channels 1 and 3. (The corresponding
69 // indexed mask, after setting the SL_ANDROID_NON_POSITIONAL bit,
70 // would be 0x8000000A.)
71 #define SL_ANDROID_MAKE_INDEXED_CHANNEL_MASK(bitfield) \
72         ((bitfield) | SL_ANDROID_SPEAKER_NON_POSITIONAL)
73 
74 // Specifying SL_ANDROID_SPEAKER_USE_DEFAULT as a channel mask in
75 // SLAndroidDataFormat_PCM_EX causes OpenSL ES to assign a default
76 // channel mask based on the number of channels requested. This
77 // value cannot be combined with SL_ANDROID_SPEAKER_NON_POSITIONAL.
78 #define SL_ANDROID_SPEAKER_USE_DEFAULT ((SLuint32)0)
79 
80 /*---------------------------------------------------------------------------*/
81 /* Android Effect interface                                                  */
82 /*---------------------------------------------------------------------------*/
83 
84 extern SL_API const SLInterfaceID SL_IID_ANDROIDEFFECT;
85 
86 /** Android Effect interface methods */
87 
88 struct SLAndroidEffectItf_;
89 typedef const struct SLAndroidEffectItf_ * const * SLAndroidEffectItf;
90 
91 struct SLAndroidEffectItf_ {
92 
93     SLresult (*CreateEffect) (SLAndroidEffectItf self,
94             SLInterfaceID effectImplementationId);
95 
96     SLresult (*ReleaseEffect) (SLAndroidEffectItf self,
97             SLInterfaceID effectImplementationId);
98 
99     SLresult (*SetEnabled) (SLAndroidEffectItf self,
100             SLInterfaceID effectImplementationId,
101             SLboolean enabled);
102 
103     SLresult (*IsEnabled) (SLAndroidEffectItf self,
104             SLInterfaceID effectImplementationId,
105             SLboolean *pEnabled);
106 
107     SLresult (*SendCommand) (SLAndroidEffectItf self,
108             SLInterfaceID effectImplementationId,
109             SLuint32 command,
110             SLuint32 commandSize,
111             void *pCommandData,
112             SLuint32 *replySize,
113             void *pReplyData);
114 };
115 
116 
117 /*---------------------------------------------------------------------------*/
118 /* Android Effect Send interface                                             */
119 /*---------------------------------------------------------------------------*/
120 
121 extern SL_API const SLInterfaceID SL_IID_ANDROIDEFFECTSEND;
122 
123 /** Android Effect Send interface methods */
124 
125 struct SLAndroidEffectSendItf_;
126 typedef const struct SLAndroidEffectSendItf_ * const * SLAndroidEffectSendItf;
127 
128 struct SLAndroidEffectSendItf_ {
129     SLresult (*EnableEffectSend) (
130         SLAndroidEffectSendItf self,
131         SLInterfaceID effectImplementationId,
132         SLboolean enable,
133         SLmillibel initialLevel
134     );
135     SLresult (*IsEnabled) (
136         SLAndroidEffectSendItf self,
137         SLInterfaceID effectImplementationId,
138         SLboolean *pEnable
139     );
140     SLresult (*SetDirectLevel) (
141         SLAndroidEffectSendItf self,
142         SLmillibel directLevel
143     );
144     SLresult (*GetDirectLevel) (
145         SLAndroidEffectSendItf self,
146         SLmillibel *pDirectLevel
147     );
148     SLresult (*SetSendLevel) (
149         SLAndroidEffectSendItf self,
150         SLInterfaceID effectImplementationId,
151         SLmillibel sendLevel
152     );
153     SLresult (*GetSendLevel)(
154         SLAndroidEffectSendItf self,
155         SLInterfaceID effectImplementationId,
156         SLmillibel *pSendLevel
157     );
158 };
159 
160 
161 /*---------------------------------------------------------------------------*/
162 /* Android Effect Capabilities interface                                     */
163 /*---------------------------------------------------------------------------*/
164 
165 extern SL_API const SLInterfaceID SL_IID_ANDROIDEFFECTCAPABILITIES;
166 
167 /** Android Effect Capabilities interface methods */
168 
169 struct SLAndroidEffectCapabilitiesItf_;
170 typedef const struct SLAndroidEffectCapabilitiesItf_ * const * SLAndroidEffectCapabilitiesItf;
171 
172 struct SLAndroidEffectCapabilitiesItf_ {
173 
174     SLresult (*QueryNumEffects) (SLAndroidEffectCapabilitiesItf self,
175             SLuint32 *pNumSupportedEffects);
176 
177 
178     SLresult (*QueryEffect) (SLAndroidEffectCapabilitiesItf self,
179             SLuint32 index,
180             SLInterfaceID *pEffectType,
181             SLInterfaceID *pEffectImplementation,
182             SLchar *pName,
183             SLuint16 *pNameSize);
184 };
185 
186 
187 /*---------------------------------------------------------------------------*/
188 /* Android Configuration interface                                           */
189 /*---------------------------------------------------------------------------*/
190 extern SL_API const SLInterfaceID SL_IID_ANDROIDCONFIGURATION;
191 
192 /** Android Configuration interface methods */
193 
194 struct SLAndroidConfigurationItf_;
195 typedef const struct SLAndroidConfigurationItf_ * const * SLAndroidConfigurationItf;
196 
197 /*
198  * Java Proxy Type IDs
199  */
200 #define SL_ANDROID_JAVA_PROXY_ROUTING   0x0001
201 
202 struct SLAndroidConfigurationItf_ {
203 
204     SLresult (*SetConfiguration) (SLAndroidConfigurationItf self,
205             const SLchar *configKey,
206             const void *pConfigValue,
207             SLuint32 valueSize);
208 
209     SLresult (*GetConfiguration) (SLAndroidConfigurationItf self,
210            const SLchar *configKey,
211            SLuint32 *pValueSize,
212            void *pConfigValue
213        );
214 
215     SLresult (*AcquireJavaProxy) (SLAndroidConfigurationItf self,
216             SLuint32 proxyType,
217             jobject *pProxyObj);
218 
219     SLresult (*ReleaseJavaProxy) (SLAndroidConfigurationItf self,
220             SLuint32 proxyType);
221 };
222 
223 
224 /*---------------------------------------------------------------------------*/
225 /* Android Simple Buffer Queue Interface                                     */
226 /*---------------------------------------------------------------------------*/
227 
228 extern SL_API const SLInterfaceID SL_IID_ANDROIDSIMPLEBUFFERQUEUE;
229 
230 struct SLAndroidSimpleBufferQueueItf_;
231 typedef const struct SLAndroidSimpleBufferQueueItf_ * const * SLAndroidSimpleBufferQueueItf;
232 
233 typedef void (SLAPIENTRY *slAndroidSimpleBufferQueueCallback)(
234 	SLAndroidSimpleBufferQueueItf caller,
235 	void *pContext
236 );
237 
238 /** Android simple buffer queue state **/
239 
240 typedef struct SLAndroidSimpleBufferQueueState_ {
241 	SLuint32	count;
242 	SLuint32	index;
243 } SLAndroidSimpleBufferQueueState;
244 
245 
246 struct SLAndroidSimpleBufferQueueItf_ {
247 	SLresult (*Enqueue) (
248 		SLAndroidSimpleBufferQueueItf self,
249 		const void *pBuffer,
250 		SLuint32 size
251 	);
252 	SLresult (*Clear) (
253 		SLAndroidSimpleBufferQueueItf self
254 	);
255 	SLresult (*GetState) (
256 		SLAndroidSimpleBufferQueueItf self,
257 		SLAndroidSimpleBufferQueueState *pState
258 	);
259 	SLresult (*RegisterCallback) (
260 		SLAndroidSimpleBufferQueueItf self,
261 		slAndroidSimpleBufferQueueCallback callback,
262 		void* pContext
263 	);
264 };
265 
266 
267 /*---------------------------------------------------------------------------*/
268 /* Android Buffer Queue Interface                                            */
269 /*---------------------------------------------------------------------------*/
270 
271 extern SL_API const SLInterfaceID SL_IID_ANDROIDBUFFERQUEUESOURCE;
272 
273 struct SLAndroidBufferQueueItf_;
274 typedef const struct SLAndroidBufferQueueItf_ * const * SLAndroidBufferQueueItf;
275 
276 #define SL_ANDROID_ITEMKEY_NONE             ((SLuint32) 0x00000000)
277 #define SL_ANDROID_ITEMKEY_EOS              ((SLuint32) 0x00000001)
278 #define SL_ANDROID_ITEMKEY_DISCONTINUITY    ((SLuint32) 0x00000002)
279 #define SL_ANDROID_ITEMKEY_BUFFERQUEUEEVENT ((SLuint32) 0x00000003)
280 #define SL_ANDROID_ITEMKEY_FORMAT_CHANGE    ((SLuint32) 0x00000004)
281 
282 #define SL_ANDROIDBUFFERQUEUEEVENT_NONE        ((SLuint32) 0x00000000)
283 #define SL_ANDROIDBUFFERQUEUEEVENT_PROCESSED   ((SLuint32) 0x00000001)
284 #if 0   // reserved for future use
285 #define SL_ANDROIDBUFFERQUEUEEVENT_UNREALIZED  ((SLuint32) 0x00000002)
286 #define SL_ANDROIDBUFFERQUEUEEVENT_CLEARED     ((SLuint32) 0x00000004)
287 #define SL_ANDROIDBUFFERQUEUEEVENT_STOPPED     ((SLuint32) 0x00000008)
288 #define SL_ANDROIDBUFFERQUEUEEVENT_ERROR       ((SLuint32) 0x00000010)
289 #define SL_ANDROIDBUFFERQUEUEEVENT_CONTENT_END ((SLuint32) 0x00000020)
290 #endif
291 
292 typedef struct SLAndroidBufferItem_ {
293     SLuint32 itemKey;  // identifies the item
294     SLuint32 itemSize;
295     SLuint8  itemData[0];
296 } SLAndroidBufferItem;
297 
298 typedef SLresult (SLAPIENTRY *slAndroidBufferQueueCallback)(
299     SLAndroidBufferQueueItf caller,/* input */
300     void *pCallbackContext,        /* input */
301     void *pBufferContext,          /* input */
302     void *pBufferData,             /* input */
303     SLuint32 dataSize,             /* input */
304     SLuint32 dataUsed,             /* input */
305     const SLAndroidBufferItem *pItems,/* input */
306     SLuint32 itemsLength           /* input */
307 );
308 
309 typedef struct SLAndroidBufferQueueState_ {
310     SLuint32    count;
311     SLuint32    index;
312 } SLAndroidBufferQueueState;
313 
314 struct SLAndroidBufferQueueItf_ {
315     SLresult (*RegisterCallback) (
316         SLAndroidBufferQueueItf self,
317         slAndroidBufferQueueCallback callback,
318         void* pCallbackContext
319     );
320 
321     SLresult (*Clear) (
322         SLAndroidBufferQueueItf self
323     );
324 
325     SLresult (*Enqueue) (
326         SLAndroidBufferQueueItf self,
327         void *pBufferContext,
328         void *pData,
329         SLuint32 dataLength,
330         const SLAndroidBufferItem *pItems,
331         SLuint32 itemsLength
332     );
333 
334     SLresult (*GetState) (
335         SLAndroidBufferQueueItf self,
336         SLAndroidBufferQueueState *pState
337     );
338 
339     SLresult (*SetCallbackEventsMask) (
340             SLAndroidBufferQueueItf self,
341             SLuint32 eventFlags
342     );
343 
344     SLresult (*GetCallbackEventsMask) (
345             SLAndroidBufferQueueItf self,
346             SLuint32 *pEventFlags
347     );
348 };
349 
350 
351 /*---------------------------------------------------------------------------*/
352 /* Android File Descriptor Data Locator                                      */
353 /*---------------------------------------------------------------------------*/
354 
355 /** Addendum to Data locator macros  */
356 #define SL_DATALOCATOR_ANDROIDFD                ((SLuint32) 0x800007BC)
357 
358 #define SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ((SLAint64) 0xFFFFFFFFFFFFFFFFll)
359 
360 /** File Descriptor-based data locator definition, locatorType must be SL_DATALOCATOR_ANDROIDFD */
361 typedef struct SLDataLocator_AndroidFD_ {
362     SLuint32        locatorType;
363     SLint32         fd;
364     SLAint64        offset;
365     SLAint64        length;
366 } SLDataLocator_AndroidFD;
367 
368 
369 /*---------------------------------------------------------------------------*/
370 /* Android Android Simple Buffer Queue Data Locator                          */
371 /*---------------------------------------------------------------------------*/
372 
373 /** Addendum to Data locator macros  */
374 #define SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE ((SLuint32) 0x800007BD)
375 
376 /** BufferQueue-based data locator definition where locatorType must be SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE*/
377 typedef struct SLDataLocator_AndroidSimpleBufferQueue {
378 	SLuint32	locatorType;
379 	SLuint32	numBuffers;
380 } SLDataLocator_AndroidSimpleBufferQueue;
381 
382 
383 /*---------------------------------------------------------------------------*/
384 /* Android Buffer Queue Data Locator                                         */
385 /*---------------------------------------------------------------------------*/
386 
387 /** Addendum to Data locator macros  */
388 #define SL_DATALOCATOR_ANDROIDBUFFERQUEUE       ((SLuint32) 0x800007BE)
389 
390 /** Android Buffer Queue-based data locator definition,
391  *  locatorType must be SL_DATALOCATOR_ANDROIDBUFFERQUEUE */
392 typedef struct SLDataLocator_AndroidBufferQueue_ {
393     SLuint32    locatorType;
394     SLuint32    numBuffers;
395 } SLDataLocator_AndroidBufferQueue;
396 
397 /**
398  * MIME types required for data in Android Buffer Queues
399  */
400 #define SL_ANDROID_MIME_AACADTS            ((SLchar *) "audio/vnd.android.aac-adts")
401 
402 /*---------------------------------------------------------------------------*/
403 /* Acoustic Echo Cancellation (AEC) Interface                                */
404 /* --------------------------------------------------------------------------*/
405 extern SL_API const SLInterfaceID SL_IID_ANDROIDACOUSTICECHOCANCELLATION;
406 
407 struct SLAndroidAcousticEchoCancellationItf_;
408 typedef const struct SLAndroidAcousticEchoCancellationItf_ * const *
409         SLAndroidAcousticEchoCancellationItf;
410 
411 struct SLAndroidAcousticEchoCancellationItf_ {
412     SLresult (*SetEnabled)(
413         SLAndroidAcousticEchoCancellationItf self,
414         SLboolean enabled
415     );
416     SLresult (*IsEnabled)(
417         SLAndroidAcousticEchoCancellationItf self,
418         SLboolean *pEnabled
419     );
420     SLresult (*IsAvailable)(
421         SLAndroidAcousticEchoCancellationItf self,
422         SLboolean *pEnabled
423     );
424 };
425 
426 /*---------------------------------------------------------------------------*/
427 /* Automatic Gain Control (ACC) Interface                                    */
428 /* --------------------------------------------------------------------------*/
429 extern SL_API const SLInterfaceID SL_IID_ANDROIDAUTOMATICGAINCONTROL;
430 
431 struct SLAndroidAutomaticGainControlItf_;
432 typedef const struct SLAndroidAutomaticGainControlItf_ * const * SLAndroidAutomaticGainControlItf;
433 
434 struct SLAndroidAutomaticGainControlItf_ {
435     SLresult (*SetEnabled)(
436         SLAndroidAutomaticGainControlItf self,
437         SLboolean enabled
438     );
439     SLresult (*IsEnabled)(
440         SLAndroidAutomaticGainControlItf self,
441         SLboolean *pEnabled
442     );
443     SLresult (*IsAvailable)(
444         SLAndroidAutomaticGainControlItf self,
445         SLboolean *pEnabled
446     );
447 };
448 
449 /*---------------------------------------------------------------------------*/
450 /* Noise Suppression Interface                                               */
451 /* --------------------------------------------------------------------------*/
452 extern SL_API const SLInterfaceID SL_IID_ANDROIDNOISESUPPRESSION;
453 
454 struct SLAndroidNoiseSuppressionItf_;
455 typedef const struct SLAndroidNoiseSuppressionItf_ * const * SLAndroidNoiseSuppressionItf;
456 
457 struct SLAndroidNoiseSuppressionItf_ {
458     SLresult (*SetEnabled)(
459         SLAndroidNoiseSuppressionItf self,
460         SLboolean enabled
461     );
462     SLresult (*IsEnabled)(
463         SLAndroidNoiseSuppressionItf self,
464         SLboolean *pEnabled
465     );
466     SLresult (*IsAvailable)(
467         SLAndroidNoiseSuppressionItf self,
468         SLboolean *pEnabled
469     );
470 };
471 
472 #ifdef __cplusplus
473 }
474 #endif /* __cplusplus */
475 
476 #endif /* OPENSL_ES_ANDROID_H_ */
477