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