xref: /aosp_15_r20/frameworks/wilhelm/src/sles_allinclusive.h (revision bebae9c0e76121f8312ccb50385c080b3a0b023c)
1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker  *
4*bebae9c0SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker  *
8*bebae9c0SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker  *
10*bebae9c0SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker  * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker  */
16*bebae9c0SAndroid Build Coastguard Worker 
17*bebae9c0SAndroid Build Coastguard Worker /** \file sles_allinclusive.h Everything including the kitchen sink */
18*bebae9c0SAndroid Build Coastguard Worker 
19*bebae9c0SAndroid Build Coastguard Worker #include "Configuration.h"
20*bebae9c0SAndroid Build Coastguard Worker #include <SLES/OpenSLES.h>
21*bebae9c0SAndroid Build Coastguard Worker #include <OMXAL/OpenMAXAL.h>
22*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
23*bebae9c0SAndroid Build Coastguard Worker #include <SLES/OpenSLES_Android.h>
24*bebae9c0SAndroid Build Coastguard Worker #include <OMXAL/OpenMAXAL_Android.h>
25*bebae9c0SAndroid Build Coastguard Worker #endif
26*bebae9c0SAndroid Build Coastguard Worker #include <stddef.h> // offsetof
27*bebae9c0SAndroid Build Coastguard Worker #include <stdlib.h> // malloc
28*bebae9c0SAndroid Build Coastguard Worker #include <string.h> // memcmp
29*bebae9c0SAndroid Build Coastguard Worker #include <strings.h>
30*bebae9c0SAndroid Build Coastguard Worker #include <stdio.h>  // debugging
31*bebae9c0SAndroid Build Coastguard Worker #include <assert.h> // debugging
32*bebae9c0SAndroid Build Coastguard Worker #include <pthread.h>
33*bebae9c0SAndroid Build Coastguard Worker #include <unistd.h> // usleep
34*bebae9c0SAndroid Build Coastguard Worker #include <errno.h>
35*bebae9c0SAndroid Build Coastguard Worker 
36*bebae9c0SAndroid Build Coastguard Worker #ifndef __cplusplus
37*bebae9c0SAndroid Build Coastguard Worker typedef int bool;
38*bebae9c0SAndroid Build Coastguard Worker #ifndef false
39*bebae9c0SAndroid Build Coastguard Worker #define false 0
40*bebae9c0SAndroid Build Coastguard Worker #endif
41*bebae9c0SAndroid Build Coastguard Worker #ifndef true
42*bebae9c0SAndroid Build Coastguard Worker #define true 1
43*bebae9c0SAndroid Build Coastguard Worker #endif
44*bebae9c0SAndroid Build Coastguard Worker #endif
45*bebae9c0SAndroid Build Coastguard Worker 
46*bebae9c0SAndroid Build Coastguard Worker // The OpenSLES.h definitions of SL_PROFILES_... have casts, so are unusable by preprocessor
47*bebae9c0SAndroid Build Coastguard Worker #define USE_PROFILES_PHONE    0x1   // == SL_PROFILES_PHONE
48*bebae9c0SAndroid Build Coastguard Worker #define USE_PROFILES_MUSIC    0x2   // == SL_PROFILES_MUSIC
49*bebae9c0SAndroid Build Coastguard Worker #define USE_PROFILES_GAME     0x4   // == SL_PROFILES_GAME
50*bebae9c0SAndroid Build Coastguard Worker // Pseudo profiles, used to decide whether to include code for incomplete or untested features
51*bebae9c0SAndroid Build Coastguard Worker // Features that are not in union of all profiles: audio recorder, LED, Vibra
52*bebae9c0SAndroid Build Coastguard Worker #define USE_PROFILES_OPTIONAL 0x8
53*bebae9c0SAndroid Build Coastguard Worker // Features that are in the intersection of all profiles:
54*bebae9c0SAndroid Build Coastguard Worker // object priorities, preemption, loss of control, device configuration
55*bebae9c0SAndroid Build Coastguard Worker #define USE_PROFILES_BASE     0x10
56*bebae9c0SAndroid Build Coastguard Worker 
57*bebae9c0SAndroid Build Coastguard Worker #include "MPH.h"
58*bebae9c0SAndroid Build Coastguard Worker #include "MPH_to.h"
59*bebae9c0SAndroid Build Coastguard Worker #include "devices.h"
60*bebae9c0SAndroid Build Coastguard Worker #include "ut/OpenSLESUT.h"
61*bebae9c0SAndroid Build Coastguard Worker #include "ThreadPool.h"
62*bebae9c0SAndroid Build Coastguard Worker 
63*bebae9c0SAndroid Build Coastguard Worker typedef struct CEngine_struct CEngine;
64*bebae9c0SAndroid Build Coastguard Worker typedef struct CAudioPlayer_struct CAudioPlayer;
65*bebae9c0SAndroid Build Coastguard Worker typedef struct CAudioRecorder_struct CAudioRecorder;
66*bebae9c0SAndroid Build Coastguard Worker typedef struct C3DGroup_struct C3DGroup;
67*bebae9c0SAndroid Build Coastguard Worker typedef struct COutputMix_struct COutputMix;
68*bebae9c0SAndroid Build Coastguard Worker 
69*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SNDFILE
70*bebae9c0SAndroid Build Coastguard Worker #include <sndfile.h>
71*bebae9c0SAndroid Build Coastguard Worker #include "desktop/SLSndFile.h"
72*bebae9c0SAndroid Build Coastguard Worker #endif // USE_SNDFILE
73*bebae9c0SAndroid Build Coastguard Worker 
74*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SDL
75*bebae9c0SAndroid Build Coastguard Worker #include <SDL/SDL_audio.h>
76*bebae9c0SAndroid Build Coastguard Worker #endif // USE_SDL
77*bebae9c0SAndroid Build Coastguard Worker 
78*bebae9c0SAndroid Build Coastguard Worker #define STEREO_CHANNELS 2
79*bebae9c0SAndroid Build Coastguard Worker 
80*bebae9c0SAndroid Build Coastguard Worker /**
81*bebae9c0SAndroid Build Coastguard Worker  * Constants to define unknown property values
82*bebae9c0SAndroid Build Coastguard Worker  */
83*bebae9c0SAndroid Build Coastguard Worker #define UNKNOWN_NUMCHANNELS 0
84*bebae9c0SAndroid Build Coastguard Worker #define UNKNOWN_SAMPLERATE  0
85*bebae9c0SAndroid Build Coastguard Worker 
86*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
87*bebae9c0SAndroid Build Coastguard Worker #include <utils/Log.h>
88*bebae9c0SAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
89*bebae9c0SAndroid Build Coastguard Worker #include "media/AudioSystem.h"
90*bebae9c0SAndroid Build Coastguard Worker #include "media/mediarecorder.h"
91*bebae9c0SAndroid Build Coastguard Worker #include "media/AudioRecord.h"
92*bebae9c0SAndroid Build Coastguard Worker #include "media/AudioTrack.h"
93*bebae9c0SAndroid Build Coastguard Worker #include "media/mediaplayer.h"
94*bebae9c0SAndroid Build Coastguard Worker #include <utils/String8.h>
95*bebae9c0SAndroid Build Coastguard Worker #define ANDROID_SL_MILLIBEL_MAX 0
96*bebae9c0SAndroid Build Coastguard Worker #include "android/android_sles_conversions.h"
97*bebae9c0SAndroid Build Coastguard Worker #include "android/android_defs.h"
98*bebae9c0SAndroid Build Coastguard Worker #endif
99*bebae9c0SAndroid Build Coastguard Worker 
100*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_OUTPUTMIXEXT
101*bebae9c0SAndroid Build Coastguard Worker #include "desktop/OutputMixExt.h"
102*bebae9c0SAndroid Build Coastguard Worker #endif
103*bebae9c0SAndroid Build Coastguard Worker 
104*bebae9c0SAndroid Build Coastguard Worker #include "sllog.h"
105*bebae9c0SAndroid Build Coastguard Worker 
106*bebae9c0SAndroid Build Coastguard Worker typedef enum {
107*bebae9c0SAndroid Build Coastguard Worker     predestroy_error,   // Application should not be calling destroy now
108*bebae9c0SAndroid Build Coastguard Worker     predestroy_ok,      // OK to destroy object now
109*bebae9c0SAndroid Build Coastguard Worker     predestroy_again    // Application did nothing wrong, but should destroy again to be effective
110*bebae9c0SAndroid Build Coastguard Worker } predestroy_t;
111*bebae9c0SAndroid Build Coastguard Worker 
112*bebae9c0SAndroid Build Coastguard Worker // Hook functions
113*bebae9c0SAndroid Build Coastguard Worker 
114*bebae9c0SAndroid Build Coastguard Worker typedef void (*VoidHook)(void *self);
115*bebae9c0SAndroid Build Coastguard Worker //typedef SLresult (*ResultHook)(void *self);
116*bebae9c0SAndroid Build Coastguard Worker typedef SLresult (*AsyncHook)(void *self, SLboolean async);
117*bebae9c0SAndroid Build Coastguard Worker typedef bool (*BoolHook)(void *self);
118*bebae9c0SAndroid Build Coastguard Worker typedef predestroy_t (*PreDestroyHook)(void *self);
119*bebae9c0SAndroid Build Coastguard Worker 
120*bebae9c0SAndroid Build Coastguard Worker // Describes how an interface is related to a given class, used in iid_vtable::mInterface
121*bebae9c0SAndroid Build Coastguard Worker 
122*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_IMPLICIT            0 // no need for application to request prior to GetInterface
123*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT            1 // must be requested explicitly during object creation
124*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC             2 // can be requested after object creation
125*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_UNAVAILABLE         3 // this interface is not available on objects of this class
126*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_IMPLICIT_PREREALIZE 4 // implicit, and can call GetInterface before Realize
127*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_PREREALIZE 5 // explicit, and can call GetInterface before Realize
128*bebae9c0SAndroid Build Coastguard Worker // 6 and 7 are reserved for the meaningless DYNAMIC_PREREALIZE and UNAVAILABLE_PREREALIZE
129*bebae9c0SAndroid Build Coastguard Worker // note that INTERFACE_OPTIONAL is always re-mapped to one of the above
130*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_PREREALIZE          4 // bit-mask to test for calling GetInterface before Realize
131*bebae9c0SAndroid Build Coastguard Worker 
132*bebae9c0SAndroid Build Coastguard Worker // Profile-specific interfaces
133*bebae9c0SAndroid Build Coastguard Worker 
134*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_BASE
135*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_IMPLICIT_BASE       INTERFACE_IMPLICIT
136*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_BASE       INTERFACE_EXPLICIT
137*bebae9c0SAndroid Build Coastguard Worker #else
138*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_IMPLICIT_BASE       INTERFACE_UNAVAILABLE
139*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_BASE       INTERFACE_UNAVAILABLE
140*bebae9c0SAndroid Build Coastguard Worker #endif
141*bebae9c0SAndroid Build Coastguard Worker 
142*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_GAME
143*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_GAME        INTERFACE_DYNAMIC
144*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME       INTERFACE_EXPLICIT
145*bebae9c0SAndroid Build Coastguard Worker #else
146*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_GAME        INTERFACE_OPTIONAL
147*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME       INTERFACE_OPTIONAL
148*bebae9c0SAndroid Build Coastguard Worker #endif
149*bebae9c0SAndroid Build Coastguard Worker 
150*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_MUSIC
151*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_MUSIC       INTERFACE_DYNAMIC
152*bebae9c0SAndroid Build Coastguard Worker #else
153*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_MUSIC       INTERFACE_OPTIONAL
154*bebae9c0SAndroid Build Coastguard Worker #endif
155*bebae9c0SAndroid Build Coastguard Worker 
156*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC)
157*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_GAME_MUSIC  INTERFACE_DYNAMIC
158*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_EXPLICIT
159*bebae9c0SAndroid Build Coastguard Worker #else
160*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_GAME_MUSIC  INTERFACE_OPTIONAL
161*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_OPTIONAL
162*bebae9c0SAndroid Build Coastguard Worker #endif
163*bebae9c0SAndroid Build Coastguard Worker 
164*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_PHONE)
165*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_EXPLICIT
166*bebae9c0SAndroid Build Coastguard Worker #else
167*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_OPTIONAL
168*bebae9c0SAndroid Build Coastguard Worker #endif
169*bebae9c0SAndroid Build Coastguard Worker 
170*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_OPTIONAL
171*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_OPTIONAL            INTERFACE_EXPLICIT
172*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_OPTIONAL    INTERFACE_DYNAMIC
173*bebae9c0SAndroid Build Coastguard Worker #else
174*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_OPTIONAL            INTERFACE_UNAVAILABLE
175*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_DYNAMIC_OPTIONAL    INTERFACE_UNAVAILABLE
176*bebae9c0SAndroid Build Coastguard Worker #endif
177*bebae9c0SAndroid Build Coastguard Worker 
178*bebae9c0SAndroid Build Coastguard Worker // Describes how an interface is related to a given object
179*bebae9c0SAndroid Build Coastguard Worker 
180*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_UNINITIALIZED 0  ///< not available
181*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_INITIALIZED   1  ///< not requested at object creation time
182*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_EXPOSED       2  ///< requested at object creation time
183*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_ADDING_1      3  ///< part 1 of asynchronous AddInterface, pending
184*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_ADDING_2      4  ///< synchronous AddInterface, or part 2 of asynchronous
185*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_ADDED         5  ///< AddInterface has completed
186*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_REMOVING      6  ///< unlocked phase of (synchronous) RemoveInterface
187*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_SUSPENDING    7  ///< suspend in progress
188*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_SUSPENDED     8  ///< suspend has completed
189*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_RESUMING_1    9  ///< part 1 of asynchronous ResumeInterface, pending
190*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_RESUMING_2   10  ///< synchronous ResumeInterface, or part 2 of asynchronous
191*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_ADDING_1A    11  ///< part 1 of asynchronous AddInterface, aborted
192*bebae9c0SAndroid Build Coastguard Worker #define INTERFACE_RESUMING_1A  12  ///< part 1 of asynchronous ResumeInterface, aborted
193*bebae9c0SAndroid Build Coastguard Worker 
194*bebae9c0SAndroid Build Coastguard Worker 
195*bebae9c0SAndroid Build Coastguard Worker // Maps an interface ID to its offset within the class that exposes it
196*bebae9c0SAndroid Build Coastguard Worker 
197*bebae9c0SAndroid Build Coastguard Worker struct iid_vtable {
198*bebae9c0SAndroid Build Coastguard Worker     unsigned char mMPH;         // primary MPH for this interface, does not include any aliases
199*bebae9c0SAndroid Build Coastguard Worker     unsigned char mInterface;   // relationship of interface to this class
200*bebae9c0SAndroid Build Coastguard Worker     /*size_t*/ unsigned short mOffset;
201*bebae9c0SAndroid Build Coastguard Worker };
202*bebae9c0SAndroid Build Coastguard Worker 
203*bebae9c0SAndroid Build Coastguard Worker // Per-class const data shared by all instances of the same class
204*bebae9c0SAndroid Build Coastguard Worker 
205*bebae9c0SAndroid Build Coastguard Worker typedef struct {
206*bebae9c0SAndroid Build Coastguard Worker     const struct iid_vtable *mInterfaces;   // maps interface index to info about that interface
207*bebae9c0SAndroid Build Coastguard Worker     SLuint32 mInterfaceCount;  // number of possible interfaces
208*bebae9c0SAndroid Build Coastguard Worker     const signed char *mMPH_to_index;
209*bebae9c0SAndroid Build Coastguard Worker     const char * const mName;
210*bebae9c0SAndroid Build Coastguard Worker     size_t mSize;
211*bebae9c0SAndroid Build Coastguard Worker     // OpenSL ES and OpenMAX AL object IDs come from different ranges, and some objects such as
212*bebae9c0SAndroid Build Coastguard Worker     // Engine, Output Mix, LED, and Vibra belong to both APIs, so we keep both object IDs
213*bebae9c0SAndroid Build Coastguard Worker     SLuint16 mSLObjectID;   // OpenSL ES object ID
214*bebae9c0SAndroid Build Coastguard Worker     XAuint16 mXAObjectID;   // OpenMAX AL object ID
215*bebae9c0SAndroid Build Coastguard Worker     // hooks
216*bebae9c0SAndroid Build Coastguard Worker     AsyncHook mRealize;     // called with mutex locked; can temporarily unlock mutex (for async)
217*bebae9c0SAndroid Build Coastguard Worker     AsyncHook mResume;      // called with mutex locked; can temporarily unlock mutex (for async)
218*bebae9c0SAndroid Build Coastguard Worker     VoidHook mDestroy;      // called with mutex locked and must keep mutex locked throughout
219*bebae9c0SAndroid Build Coastguard Worker     PreDestroyHook mPreDestroy; // called with mutex locked; can temporarily unlock mutex (for wait)
220*bebae9c0SAndroid Build Coastguard Worker } ClassTable;
221*bebae9c0SAndroid Build Coastguard Worker 
222*bebae9c0SAndroid Build Coastguard Worker // BufferHeader describes each element of a BufferQueue, other than the data
223*bebae9c0SAndroid Build Coastguard Worker typedef struct {
224*bebae9c0SAndroid Build Coastguard Worker     const void *mBuffer;
225*bebae9c0SAndroid Build Coastguard Worker     SLuint32 mSize;
226*bebae9c0SAndroid Build Coastguard Worker } BufferHeader;
227*bebae9c0SAndroid Build Coastguard Worker 
228*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
229*bebae9c0SAndroid Build Coastguard Worker // Holds information about all commands that can be passed alongside an MPEG-2 TS buffer
230*bebae9c0SAndroid Build Coastguard Worker // Is used with buffers of type kAndroidBufferTypeMpeg2Ts
231*bebae9c0SAndroid Build Coastguard Worker typedef struct {
232*bebae9c0SAndroid Build Coastguard Worker     SLuint32 mTsCmdCode;
233*bebae9c0SAndroid Build Coastguard Worker     SLAuint64 mPts;
234*bebae9c0SAndroid Build Coastguard Worker } Mpeg2TsCommands;
235*bebae9c0SAndroid Build Coastguard Worker 
236*bebae9c0SAndroid Build Coastguard Worker // Holds information about all commands that can be passed alongside an AAC ADTS buffer
237*bebae9c0SAndroid Build Coastguard Worker // Is used with buffers of type kAndroidBufferTypeAacadts
238*bebae9c0SAndroid Build Coastguard Worker typedef struct {
239*bebae9c0SAndroid Build Coastguard Worker     SLuint32 mAdtsCmdCode;
240*bebae9c0SAndroid Build Coastguard Worker } AdtsCommands;
241*bebae9c0SAndroid Build Coastguard Worker 
242*bebae9c0SAndroid Build Coastguard Worker // Union of the different structures to hold items stored in an AdvancedBufferHeader
243*bebae9c0SAndroid Build Coastguard Worker //   when an item comes from an AndroidBufferQueue as the data source, it's a command
244*bebae9c0SAndroid Build Coastguard Worker //   when an item is output to an AndroidBufferQueue as the data sink, it's a message (or metadata)
245*bebae9c0SAndroid Build Coastguard Worker typedef union {
246*bebae9c0SAndroid Build Coastguard Worker     Mpeg2TsCommands mTsCmdData;
247*bebae9c0SAndroid Build Coastguard Worker     AdtsCommands    mAdtsCmdData;
248*bebae9c0SAndroid Build Coastguard Worker } AdvancedBufferItems;
249*bebae9c0SAndroid Build Coastguard Worker 
250*bebae9c0SAndroid Build Coastguard Worker // AdvancedBufferHeader describes each element of an AndroidBufferQueue, other than the data
251*bebae9c0SAndroid Build Coastguard Worker //  and associated messages
252*bebae9c0SAndroid Build Coastguard Worker typedef struct {
253*bebae9c0SAndroid Build Coastguard Worker     const void *mDataBuffer;
254*bebae9c0SAndroid Build Coastguard Worker     SLuint32 mDataSize;
255*bebae9c0SAndroid Build Coastguard Worker     SLuint32 mDataSizeConsumed;
256*bebae9c0SAndroid Build Coastguard Worker     AdvancedBufferItems mItems;
257*bebae9c0SAndroid Build Coastguard Worker     const void *mBufferContext;
258*bebae9c0SAndroid Build Coastguard Worker     // mBufferState will be used for the other ABQ events we'll support in the future
259*bebae9c0SAndroid Build Coastguard Worker     // SLuint32 mBufferState;
260*bebae9c0SAndroid Build Coastguard Worker } AdvancedBufferHeader;
261*bebae9c0SAndroid Build Coastguard Worker #endif
262*bebae9c0SAndroid Build Coastguard Worker 
263*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SNDFILE
264*bebae9c0SAndroid Build Coastguard Worker 
265*bebae9c0SAndroid Build Coastguard Worker #define SndFile_BUFSIZE 512     // in 16-bit samples
266*bebae9c0SAndroid Build Coastguard Worker #define SndFile_NUMBUFS 2
267*bebae9c0SAndroid Build Coastguard Worker 
268*bebae9c0SAndroid Build Coastguard Worker struct SndFile {
269*bebae9c0SAndroid Build Coastguard Worker     // save URI also?
270*bebae9c0SAndroid Build Coastguard Worker     SLchar *mPathname;
271*bebae9c0SAndroid Build Coastguard Worker     SNDFILE *mSNDFILE;
272*bebae9c0SAndroid Build Coastguard Worker     SF_INFO mSfInfo;
273*bebae9c0SAndroid Build Coastguard Worker     pthread_mutex_t mMutex; // protects mSNDFILE only
274*bebae9c0SAndroid Build Coastguard Worker     SLboolean mEOF;         // sf_read returned zero sample frames
275*bebae9c0SAndroid Build Coastguard Worker     SLuint32 mWhich;        // which buffer to use next
276*bebae9c0SAndroid Build Coastguard Worker     short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS];
277*bebae9c0SAndroid Build Coastguard Worker };
278*bebae9c0SAndroid Build Coastguard Worker 
279*bebae9c0SAndroid Build Coastguard Worker #endif // USE_SNDFILE
280*bebae9c0SAndroid Build Coastguard Worker 
281*bebae9c0SAndroid Build Coastguard Worker #include "data.h"
282*bebae9c0SAndroid Build Coastguard Worker #include "itfstruct.h"
283*bebae9c0SAndroid Build Coastguard Worker #include "classes.h"
284*bebae9c0SAndroid Build Coastguard Worker 
285*bebae9c0SAndroid Build Coastguard Worker struct MPH_init {
286*bebae9c0SAndroid Build Coastguard Worker     VoidHook mInit;     // called first to initialize the interface, right after object is allocated
287*bebae9c0SAndroid Build Coastguard Worker     // Each interface is initialized regardless whether it is exposed to application.
288*bebae9c0SAndroid Build Coastguard Worker     VoidHook mResume;   // called to resume interface after suspension, not currently used
289*bebae9c0SAndroid Build Coastguard Worker     VoidHook mDeinit;   // called last when object is about to be destroyed
290*bebae9c0SAndroid Build Coastguard Worker     BoolHook mExpose;   // called after initialization, only if interface is exposed to application
291*bebae9c0SAndroid Build Coastguard Worker     VoidHook mRemove;   // called by DynamicInterfaceManager::RemoveInterface, and prior to mDeinit
292*bebae9c0SAndroid Build Coastguard Worker     // will need a suspend hook when suspend is implemented
293*bebae9c0SAndroid Build Coastguard Worker };
294*bebae9c0SAndroid Build Coastguard Worker 
295*bebae9c0SAndroid Build Coastguard Worker extern /*static*/ int IID_to_MPH(const SLInterfaceID iid);
296*bebae9c0SAndroid Build Coastguard Worker extern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX];
297*bebae9c0SAndroid Build Coastguard Worker extern SLresult checkInterfaces(const ClassTable *clazz,
298*bebae9c0SAndroid Build Coastguard Worker     SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
299*bebae9c0SAndroid Build Coastguard Worker     const SLboolean *pInterfaceRequired, unsigned *pExposedMask, unsigned *pRequiredMask);
300*bebae9c0SAndroid Build Coastguard Worker extern IObject *construct(const ClassTable *clazz,
301*bebae9c0SAndroid Build Coastguard Worker     unsigned exposedMask, SLEngineItf engine);
302*bebae9c0SAndroid Build Coastguard Worker extern const ClassTable *objectIDtoClass(SLuint32 objectID);
303*bebae9c0SAndroid Build Coastguard Worker extern const struct SLInterfaceID_ SL_IID_array[MPH_MAX];
304*bebae9c0SAndroid Build Coastguard Worker extern SLuint32 IObjectToObjectID(IObject *object);
305*bebae9c0SAndroid Build Coastguard Worker extern void IObject_Publish(IObject *thiz);
306*bebae9c0SAndroid Build Coastguard Worker extern void IObject_Destroy(SLObjectItf self);
307*bebae9c0SAndroid Build Coastguard Worker 
308*bebae9c0SAndroid Build Coastguard Worker // Map an interface to it's "object ID" (which is really a class ID).
309*bebae9c0SAndroid Build Coastguard Worker // Note: this operation is undefined on IObject, as it lacks an mThis.
310*bebae9c0SAndroid Build Coastguard Worker // If you have an IObject, then use IObjectToObjectID directly.
311*bebae9c0SAndroid Build Coastguard Worker 
312*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToObjectID(thiz) IObjectToObjectID((thiz)->mThis)
313*bebae9c0SAndroid Build Coastguard Worker 
314*bebae9c0SAndroid Build Coastguard Worker // Map an interface to it's corresponding IObject.
315*bebae9c0SAndroid Build Coastguard Worker // Note: this operation is undefined on IObject, as it lacks an mThis.
316*bebae9c0SAndroid Build Coastguard Worker // If you have an IObject, then you're done -- you already have what you need.
317*bebae9c0SAndroid Build Coastguard Worker 
318*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToIObject(thiz) ((thiz)->mThis)
319*bebae9c0SAndroid Build Coastguard Worker 
320*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToCAudioPlayer(thiz) (((CAudioPlayer*)InterfaceToIObject(thiz)))
321*bebae9c0SAndroid Build Coastguard Worker 
322*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToCAudioRecorder(thiz) (((CAudioRecorder*)InterfaceToIObject(thiz)))
323*bebae9c0SAndroid Build Coastguard Worker 
324*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToCAudioRecorder(thiz) (((CAudioRecorder*)InterfaceToIObject(thiz)))
325*bebae9c0SAndroid Build Coastguard Worker 
326*bebae9c0SAndroid Build Coastguard Worker #define InterfaceToCMediaPlayer(thiz) (((CMediaPlayer*)InterfaceToIObject(thiz)))
327*bebae9c0SAndroid Build Coastguard Worker 
328*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
329*bebae9c0SAndroid Build Coastguard Worker #include "android/MediaPlayer_to_android.h"
330*bebae9c0SAndroid Build Coastguard Worker #include "android/OutputMix_to_android.h"
331*bebae9c0SAndroid Build Coastguard Worker #include "android/AudioPlayer_to_android.h"
332*bebae9c0SAndroid Build Coastguard Worker #include "android/AudioRecorder_to_android.h"
333*bebae9c0SAndroid Build Coastguard Worker #endif
334*bebae9c0SAndroid Build Coastguard Worker 
335*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t C3DGroup_PreDestroy(void *self);
336*bebae9c0SAndroid Build Coastguard Worker 
337*bebae9c0SAndroid Build Coastguard Worker extern SLresult CAudioPlayer_Realize(void *self, SLboolean async);
338*bebae9c0SAndroid Build Coastguard Worker extern SLresult CAudioPlayer_Resume(void *self, SLboolean async);
339*bebae9c0SAndroid Build Coastguard Worker extern void CAudioPlayer_Destroy(void *self);
340*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t CAudioPlayer_PreDestroy(void *self);
341*bebae9c0SAndroid Build Coastguard Worker 
342*bebae9c0SAndroid Build Coastguard Worker extern SLresult CAudioRecorder_Realize(void *self, SLboolean async);
343*bebae9c0SAndroid Build Coastguard Worker extern SLresult CAudioRecorder_Resume(void *self, SLboolean async);
344*bebae9c0SAndroid Build Coastguard Worker extern void CAudioRecorder_Destroy(void *self);
345*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t CAudioRecorder_PreDestroy(void *self);
346*bebae9c0SAndroid Build Coastguard Worker 
347*bebae9c0SAndroid Build Coastguard Worker extern SLresult CEngine_Realize(void *self, SLboolean async);
348*bebae9c0SAndroid Build Coastguard Worker extern SLresult CEngine_Resume(void *self, SLboolean async);
349*bebae9c0SAndroid Build Coastguard Worker extern void CEngine_Destroy(void *self);
350*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t CEngine_PreDestroy(void *self);
351*bebae9c0SAndroid Build Coastguard Worker extern void CEngine_Destroyed(CEngine *self);
352*bebae9c0SAndroid Build Coastguard Worker 
353*bebae9c0SAndroid Build Coastguard Worker extern SLresult COutputMix_Realize(void *self, SLboolean async);
354*bebae9c0SAndroid Build Coastguard Worker extern SLresult COutputMix_Resume(void *self, SLboolean async);
355*bebae9c0SAndroid Build Coastguard Worker extern void COutputMix_Destroy(void *self);
356*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t COutputMix_PreDestroy(void *self);
357*bebae9c0SAndroid Build Coastguard Worker 
358*bebae9c0SAndroid Build Coastguard Worker extern SLresult CMediaPlayer_Realize(void *self, SLboolean async);
359*bebae9c0SAndroid Build Coastguard Worker extern SLresult CMediaPlayer_Resume(void *self, SLboolean async);
360*bebae9c0SAndroid Build Coastguard Worker extern void CMediaPlayer_Destroy(void *self);
361*bebae9c0SAndroid Build Coastguard Worker extern predestroy_t CMediaPlayer_PreDestroy(void *self);
362*bebae9c0SAndroid Build Coastguard Worker 
363*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SDL
364*bebae9c0SAndroid Build Coastguard Worker extern void SDL_open(IEngine *thisEngine);
365*bebae9c0SAndroid Build Coastguard Worker extern void SDL_close(void);
366*bebae9c0SAndroid Build Coastguard Worker #endif
367*bebae9c0SAndroid Build Coastguard Worker 
368*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_REALIZING_1  ((SLuint32) 0x4) // async realize on work queue
369*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_REALIZING_2  ((SLuint32) 0x5) // sync realize, or async realize hook
370*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_RESUMING_1   ((SLuint32) 0x6) // async resume on work queue
371*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_RESUMING_2   ((SLuint32) 0x7) // sync resume, or async resume hook
372*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_SUSPENDING   ((SLuint32) 0x8) // suspend in progress
373*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue
374*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_RESUMING_1A  ((SLuint32) 0xA) // abort while async resume on work queue
375*bebae9c0SAndroid Build Coastguard Worker #define SL_OBJECT_STATE_DESTROYING   ((SLuint32) 0xB) // destroy object when no strong references
376*bebae9c0SAndroid Build Coastguard Worker 
377*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_OUTPUTMIXEXT
378*bebae9c0SAndroid Build Coastguard Worker #define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING
379*bebae9c0SAndroid Build Coastguard Worker // If we needed it, could have PLAYING mean mixer is currently reading from front buffer,
380*bebae9c0SAndroid Build Coastguard Worker // while PLAYABLE would mean application requested PLAYING, but buffer queue is empty
381*bebae9c0SAndroid Build Coastguard Worker #endif
382*bebae9c0SAndroid Build Coastguard Worker 
383*bebae9c0SAndroid Build Coastguard Worker #ifndef ANDROID
384*bebae9c0SAndroid Build Coastguard Worker extern void *sync_start(void *arg);
385*bebae9c0SAndroid Build Coastguard Worker #endif
386*bebae9c0SAndroid Build Coastguard Worker extern SLresult err_to_result(int err);
387*bebae9c0SAndroid Build Coastguard Worker 
388*bebae9c0SAndroid Build Coastguard Worker #ifdef __GNUC__
389*bebae9c0SAndroid Build Coastguard Worker #define ctz __builtin_ctz
390*bebae9c0SAndroid Build Coastguard Worker #else
391*bebae9c0SAndroid Build Coastguard Worker extern unsigned ctz(unsigned);
392*bebae9c0SAndroid Build Coastguard Worker #endif
393*bebae9c0SAndroid Build Coastguard Worker extern const char * const interface_names[MPH_MAX];
394*bebae9c0SAndroid Build Coastguard Worker #include "platform.h"
395*bebae9c0SAndroid Build Coastguard Worker #include "attr.h"
396*bebae9c0SAndroid Build Coastguard Worker #include "handlers.h"
397*bebae9c0SAndroid Build Coastguard Worker #include "trace.h"
398*bebae9c0SAndroid Build Coastguard Worker 
399*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SNDFILE
400*bebae9c0SAndroid Build Coastguard Worker extern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer);
401*bebae9c0SAndroid Build Coastguard Worker #endif
402*bebae9c0SAndroid Build Coastguard Worker 
403*bebae9c0SAndroid Build Coastguard Worker #ifndef FALLTHROUGH_INTENDED
404*bebae9c0SAndroid Build Coastguard Worker #ifdef __clang__
405*bebae9c0SAndroid Build Coastguard Worker #define FALLTHROUGH_INTENDED [[clang::fallthrough]]
406*bebae9c0SAndroid Build Coastguard Worker #else
407*bebae9c0SAndroid Build Coastguard Worker #define FALLTHROUGH_INTENDED
408*bebae9c0SAndroid Build Coastguard Worker #endif // __clang__
409*bebae9c0SAndroid Build Coastguard Worker #endif // FALLTHROUGH_INTENDED
410*bebae9c0SAndroid Build Coastguard Worker 
411*bebae9c0SAndroid Build Coastguard Worker extern SLresult IBufferQueue_Enqueue(SLBufferQueueItf self, const void *pBuffer, SLuint32 size);
412*bebae9c0SAndroid Build Coastguard Worker extern SLresult IBufferQueue_Clear(SLBufferQueueItf self);
413*bebae9c0SAndroid Build Coastguard Worker extern SLresult IBufferQueue_RegisterCallback(SLBufferQueueItf self,
414*bebae9c0SAndroid Build Coastguard Worker     slBufferQueueCallback callback, void *pContext);
415*bebae9c0SAndroid Build Coastguard Worker 
416*bebae9c0SAndroid Build Coastguard Worker extern bool IsInterfaceInitialized(IObject *thiz, unsigned MPH);
417*bebae9c0SAndroid Build Coastguard Worker extern SLresult AcquireStrongRef(IObject *object, SLuint32 expectedObjectID);
418*bebae9c0SAndroid Build Coastguard Worker extern void ReleaseStrongRef(IObject *object);
419*bebae9c0SAndroid Build Coastguard Worker extern void ReleaseStrongRefAndUnlockExclusive(IObject *object);
420*bebae9c0SAndroid Build Coastguard Worker 
421*bebae9c0SAndroid Build Coastguard Worker extern COutputMix *CAudioPlayer_GetOutputMix(CAudioPlayer *audioPlayer);
422*bebae9c0SAndroid Build Coastguard Worker extern SLresult IEngineCapabilities_QueryLEDCapabilities(SLEngineCapabilitiesItf self,
423*bebae9c0SAndroid Build Coastguard Worker     SLuint32 *pIndex, SLuint32 *pLEDDeviceID, SLLEDDescriptor *pDescriptor);
424*bebae9c0SAndroid Build Coastguard Worker extern SLresult IEngineCapabilities_QueryVibraCapabilities(SLEngineCapabilitiesItf self,
425*bebae9c0SAndroid Build Coastguard Worker     SLuint32 *pIndex, SLuint32 *pVibraDeviceID, SLVibraDescriptor *pDescriptor);
426*bebae9c0SAndroid Build Coastguard Worker 
427*bebae9c0SAndroid Build Coastguard Worker extern CEngine *theOneTrueEngine;
428*bebae9c0SAndroid Build Coastguard Worker extern pthread_mutex_t theOneTrueMutex;
429*bebae9c0SAndroid Build Coastguard Worker extern unsigned theOneTrueRefCount;
430*bebae9c0SAndroid Build Coastguard Worker 
431*bebae9c0SAndroid Build Coastguard Worker extern LI_API SLresult liCreateEngine(SLObjectItf *pEngine, SLuint32 numOptions,
432*bebae9c0SAndroid Build Coastguard Worker     const SLEngineOption *pEngineOptions, SLuint32 numInterfaces,
433*bebae9c0SAndroid Build Coastguard Worker     const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired,
434*bebae9c0SAndroid Build Coastguard Worker     const ClassTable *pCEngine_class);
435*bebae9c0SAndroid Build Coastguard Worker extern LI_API SLresult liQueryNumSupportedInterfaces(SLuint32 *pNumSupportedInterfaces,
436*bebae9c0SAndroid Build Coastguard Worker         const ClassTable *clazz);
437*bebae9c0SAndroid Build Coastguard Worker extern LI_API SLresult liQuerySupportedInterfaces(SLuint32 index, SLInterfaceID *pInterfaceId,
438*bebae9c0SAndroid Build Coastguard Worker         const ClassTable *clazz);
439*bebae9c0SAndroid Build Coastguard Worker 
440*bebae9c0SAndroid Build Coastguard Worker // The EnqueueAsyncCallback macros provide a safe way to asynchronously call an application-level
441*bebae9c0SAndroid Build Coastguard Worker // callback handler that is permitted to do almost anything, including block.  This is intended
442*bebae9c0SAndroid Build Coastguard Worker // primarily for "notification" callbacks such as play head progress.  Do not use for callbacks
443*bebae9c0SAndroid Build Coastguard Worker // which must be synchronous, such as buffer queue completions.  The enqueue may fail if
444*bebae9c0SAndroid Build Coastguard Worker // the callback queue is full.  This almost always indicates an application error such as blocking
445*bebae9c0SAndroid Build Coastguard Worker // for an excessive time within a callback handler or requesting too frequent callbacks.  The
446*bebae9c0SAndroid Build Coastguard Worker // recommended recovery is to either retry later, or log a warning or error as appropriate.
447*bebae9c0SAndroid Build Coastguard Worker // If the callback absolutely must be called, then you should be calling it directly instead.
448*bebae9c0SAndroid Build Coastguard Worker // Example usage:
449*bebae9c0SAndroid Build Coastguard Worker //  CAudioPlayer *ap;
450*bebae9c0SAndroid Build Coastguard Worker //  SLresult result = EnqueueAsyncCallback_ppi(ap, playCallback, &ap->mPlay.mItf, playContext,
451*bebae9c0SAndroid Build Coastguard Worker //       SL_PLAYEVENT_HEADATEND);
452*bebae9c0SAndroid Build Coastguard Worker //  if (SL_RESULT_SUCCESS != result) {
453*bebae9c0SAndroid Build Coastguard Worker //    ALOGW("Callback %p(%p, %p, SL_PLAYEVENT_HEADATEND) dropped", playCallback, &ap->mPlay.mItf,
454*bebae9c0SAndroid Build Coastguard Worker //        playContext);
455*bebae9c0SAndroid Build Coastguard Worker //  }
456*bebae9c0SAndroid Build Coastguard Worker // which replaces:
457*bebae9c0SAndroid Build Coastguard Worker //  (*playCallback)(&ap->mPlay.mItf, playContext, SL_PLAYEVENT_HEADATEND);
458*bebae9c0SAndroid Build Coastguard Worker #define EnqueueAsyncCallback_ppi(object, handler, p1, p2, i1) \
459*bebae9c0SAndroid Build Coastguard Worker         ThreadPool_add_ppi(&(object)->mObject.mEngine->mThreadPool, \
460*bebae9c0SAndroid Build Coastguard Worker             (ClosureHandler_ppi) (handler), (p1), (p2), (i1))
461*bebae9c0SAndroid Build Coastguard Worker #define EnqueueAsyncCallback_ppii(object, handler, p1, p2, i1, i2) \
462*bebae9c0SAndroid Build Coastguard Worker         ThreadPool_add_ppii(&(object)->mObject.mEngine->mThreadPool, \
463*bebae9c0SAndroid Build Coastguard Worker             (ClosureHandler_ppii) (handler), (p1), (p2), (i1), (i2))
464*bebae9c0SAndroid Build Coastguard Worker #define EnqueueAsyncCallback_piipp(object, handler, p1, i1, i2, p2, p3) \
465*bebae9c0SAndroid Build Coastguard Worker         ThreadPool_add_piipp(&(object)->mObject.mEngine->mThreadPool, \
466*bebae9c0SAndroid Build Coastguard Worker             (ClosureHandler_piipp) (handler), (p1), (i1), (i2), (p2), (p3))
467*bebae9c0SAndroid Build Coastguard Worker 
468*bebae9c0SAndroid Build Coastguard Worker #define SL_PREFETCHEVENT_NONE ((SLuint32) 0)    // placeholder for non-existent SL_PREFETCHEVENT_*
469