| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "OpenSLES.h" |
| #include <stddef.h> // offsetof |
| #include <stdlib.h> // malloc |
| #include <string.h> // memcmp |
| #include <stdio.h> // debugging |
| #include <assert.h> // debugging |
| #include <pthread.h> |
| #include <unistd.h> // usleep |
| |
| #include "MPH.h" |
| #include "MPH_to.h" |
| #include "devices.h" |
| |
| typedef struct CAudioPlayer_struct CAudioPlayer; |
| |
| #ifdef USE_SNDFILE |
| #include <sndfile.h> |
| #include "SndFile.h" |
| #endif // USE_SNDFILE |
| |
| #ifdef USE_SDL |
| #include <SDL/SDL_audio.h> |
| #endif // USE_SDL |
| |
| #ifdef USE_ANDROID |
| #include "media/AudioSystem.h" |
| #include "media/AudioTrack.h" |
| #include "media/mediaplayer.h" |
| #include <utils/String8.h> |
| #define ANDROID_SL_MILLIBEL_MAX 0 |
| #include <binder/ProcessState.h> |
| #endif |
| |
| #ifdef USE_OUTPUTMIXEXT |
| #include "OutputMixExt.h" |
| #endif |
| |
| // Hook functions |
| |
| typedef void (*VoidHook)(void *self); |
| typedef SLresult (*StatusHook)(void *self); |
| typedef SLresult (*AsyncHook)(void *self, SLboolean async); |
| |
| // Describes how an interface is related to a given class |
| |
| #define INTERFACE_IMPLICIT 0 |
| #define INTERFACE_EXPLICIT 1 |
| #define INTERFACE_OPTIONAL 2 |
| #define INTERFACE_DYNAMIC 3 |
| #define INTERFACE_UNAVAILABLE 4 |
| #define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC |
| #define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC |
| #define INTERFACE_DYNAMIC_MUSIC_GAME INTERFACE_DYNAMIC |
| #define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT |
| #define INTERFACE_GAME INTERFACE_OPTIONAL |
| #define INTERFACE_GAME_MUSIC INTERFACE_OPTIONAL |
| #define INTERFACE_MUSIC_GAME INTERFACE_OPTIONAL |
| #define INTERFACE_OPTIONAL_DYNAMIC INTERFACE_DYNAMIC |
| #define INTERFACE_PHONE_GAME INTERFACE_OPTIONAL |
| #define INTERFACE_TBD INTERFACE_IMPLICIT |
| |
| // Maps an interface ID to its offset within the class that exposes it |
| |
| struct iid_vtable { |
| unsigned char mMPH; |
| unsigned char mInterface; // relationship |
| /*size_t*/ unsigned short mOffset; |
| }; |
| |
| // Per-class const data shared by all instances of the same class |
| |
| typedef struct { |
| // needed by all classes (class class, the superclass of all classes) |
| const struct iid_vtable *mInterfaces; |
| SLuint32 mInterfaceCount; |
| const signed char *mMPH_to_index; |
| // FIXME not yet used |
| const char * const mName; |
| size_t mSize; |
| SLuint32 mObjectID; |
| AsyncHook mRealize; |
| StatusHook mResume; |
| VoidHook mDestroy; |
| // append per-class data here |
| } ClassTable; |
| |
| // BufferHeader describes each element of a BufferQueue, other than the data |
| |
| struct BufferHeader { |
| const void *mBuffer; |
| SLuint32 mSize; |
| }; |
| |
| #ifdef USE_OUTPUTMIXEXT |
| |
| // stereo is a frame consisting of a pair of 16-bit PCM samples |
| |
| typedef struct { |
| short left; |
| short right; |
| } stereo; |
| |
| #endif |
| |
| #ifdef USE_SNDFILE |
| |
| struct SndFile { |
| // save URI also? |
| SLchar *mPathname; |
| SNDFILE *mSNDFILE; |
| // These are used when Enqueue returns SL_RESULT_BUFFER_INSUFFICIENT |
| const void *mRetryBuffer; |
| SLuint32 mRetrySize; |
| SLboolean mIs0; // which buffer to use next |
| // FIXME magic numbers |
| short mBuffer0[512]; |
| short mBuffer1[512]; |
| }; |
| |
| #endif // USE_SNDFILE |
| |
| #ifdef __cplusplus |
| #define this this_ |
| #endif |
| |
| /* Our own merged version of SLDataSource and SLDataSink */ |
| |
| typedef union { |
| SLuint32 mLocatorType; |
| SLDataLocator_Address mAddress; |
| SLDataLocator_BufferQueue mBufferQueue; |
| SLDataLocator_IODevice mIODevice; |
| SLDataLocator_MIDIBufferQueue mMIDIBufferQueue; |
| SLDataLocator_OutputMix mOutputMix; |
| SLDataLocator_URI mURI; |
| } DataLocator; |
| |
| typedef union { |
| SLuint32 mFormatType; |
| SLDataFormat_PCM mPCM; |
| SLDataFormat_MIME mMIME; |
| } DataFormat; |
| |
| typedef struct { |
| union { |
| SLDataSource mSource; |
| SLDataSink mSink; |
| struct { |
| DataLocator *pLocator; |
| DataFormat *pFormat; |
| } mNeutral; |
| } u; |
| DataLocator mLocator; |
| DataFormat mFormat; |
| } DataLocatorFormat; |
| |
| /* Interface structures */ |
| |
| typedef struct Object_interface { |
| const struct SLObjectItf_ *mItf; |
| // FIXME probably not needed for an Object, as it is always first, |
| // but look for lingering code that assumes it is here before deleting |
| struct Object_interface *mThis; |
| const ClassTable *mClass; |
| SLuint32 mState; |
| slObjectCallback mCallback; |
| void *mContext; |
| unsigned mExposedMask; // exposed interfaces |
| unsigned mLossOfControlMask; // interfaces with loss of control enabled |
| SLint32 mPriority; |
| SLboolean mPreemptable; |
| pthread_mutex_t mMutex; |
| pthread_cond_t mCond; |
| // FIXME also an object ID for RPC |
| // FIXME and a human-readable name for debugging |
| } IObject; |
| |
| #include "locks.h" |
| |
| typedef struct { |
| const struct SL3DCommitItf_ *mItf; |
| IObject *mThis; |
| SLboolean mDeferred; |
| SLuint32 mGeneration; // incremented each master clock cycle |
| } I3DCommit; |
| |
| // FIXME move |
| enum CartesianSphericalActive { |
| CARTESIAN_COMPUTED_SPHERICAL_SET, |
| CARTESIAN_REQUESTED_SPHERICAL_SET, |
| CARTESIAN_UNKNOWN_SPHERICAL_SET, |
| CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 |
| CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 |
| CARTESIAN_SET_SPHERICAL_UNKNOWN |
| }; |
| |
| typedef struct { |
| const struct SL3DDopplerItf_ *mItf; |
| IObject *mThis; |
| // The API allows client to specify either Cartesian and spherical velocities. |
| // But an implementation will likely prefer one or the other. So for |
| // maximum portablity, we maintain both units and an indication of which |
| // unit was set most recently. In addition, we keep a flag saying whether |
| // the other unit has been derived yet. It can take significant time |
| // to compute the other unit, so this may be deferred to another thread. |
| // For this reason we also keep an indication of whether the secondary |
| // has been computed yet, and its accuracy. |
| // Though only one unit is primary at a time, a union is inappropriate: |
| // the application might read in both units (not in 1.0.1), |
| // and due to multi-threading concerns. |
| SLVec3D mVelocityCartesian; |
| struct { |
| SLmillidegree mAzimuth; |
| SLmillidegree mElevation; |
| SLmillidegree mSpeed; |
| } mVelocitySpherical; |
| enum CartesianSphericalActive mVelocityActive; |
| SLpermille mDopplerFactor; |
| } I3DDoppler; |
| |
| typedef struct { |
| const struct SL3DGroupingItf_ *mItf; |
| IObject *mThis; |
| SLObjectItf mGroup; |
| // FIXME link to group's set |
| } I3DGrouping; |
| |
| // FIXME move |
| enum AnglesVectorsActive { |
| ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 |
| ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 |
| ANGLES_UNKNOWN_VECTORS_SET, |
| ANGLES_SET_VECTORS_COMPUTED, |
| ANGLES_SET_VECTORS_REQUESTED, |
| ANGLES_SET_VECTORS_UNKNOWN |
| }; |
| |
| typedef struct { |
| const struct SL3DLocationItf_ *mItf; |
| IObject *mThis; |
| SLVec3D mLocationCartesian; |
| struct { |
| SLmillidegree mAzimuth; |
| SLmillidegree mElevation; |
| SLmillimeter mDistance; |
| } mLocationSpherical; |
| enum CartesianSphericalActive mLocationActive; |
| struct { |
| SLmillidegree mHeading; |
| SLmillidegree mPitch; |
| SLmillidegree mRoll; |
| } mOrientationAngles; |
| struct { |
| SLVec3D mFront; |
| SLVec3D mAbove; |
| SLVec3D mUp; |
| } mOrientationVectors; |
| enum AnglesVectorsActive mOrientationActive; |
| // Rotations can be slow, so are deferred. |
| SLmillidegree mTheta; |
| SLVec3D mAxis; |
| SLboolean mRotatePending; |
| } I3DLocation; |
| |
| typedef struct { |
| const struct SL3DMacroscopicItf_ *mItf; |
| IObject *mThis; |
| struct { |
| SLmillimeter mWidth; |
| SLmillimeter mHeight; |
| SLmillimeter mDepth; |
| } mSize; |
| struct { |
| SLmillimeter mHeading; |
| SLmillimeter mPitch; |
| SLmillimeter mRoll; |
| } mOrientationAngles; |
| struct { |
| SLVec3D mFront; |
| SLVec3D mUp; |
| } mOrientationVectors; |
| enum AnglesVectorsActive mOrientationActive; |
| // FIXME no longer needed? was for optimization |
| // SLuint32 mGeneration; |
| // Rotations can be slow, so are deferred. |
| SLmillidegree mTheta; |
| SLVec3D mAxis; |
| SLboolean mRotatePending; |
| } I3DMacroscopic; |
| |
| typedef struct { |
| const struct SL3DSourceItf_ *mItf; |
| IObject *mThis; |
| SLboolean mHeadRelative; |
| SLboolean mRolloffMaxDistanceMute; |
| SLmillimeter mMaxDistance; |
| SLmillimeter mMinDistance; |
| SLmillidegree mConeInnerAngle; |
| SLmillidegree mConeOuterAngle; |
| SLmillibel mConeOuterLevel; |
| SLpermille mRolloffFactor; |
| SLpermille mRoomRolloffFactor; |
| SLuint8 mDistanceModel; |
| } I3DSource; |
| |
| typedef struct { |
| const struct SLAudioDecoderCapabilitiesItf_ *mItf; |
| IObject *mThis; |
| } IAudioDecoderCapabilities; |
| |
| typedef struct { |
| const struct SLAudioEncoderItf_ *mItf; |
| IObject *mThis; |
| SLAudioEncoderSettings mSettings; |
| } IAudioEncoder; |
| |
| typedef struct { |
| const struct SLAudioEncoderCapabilitiesItf_ *mItf; |
| IObject *mThis; |
| } IAudioEncoderCapabilities; |
| |
| typedef struct { |
| const struct SLAudioIODeviceCapabilitiesItf_ *mItf; |
| IObject *mThis; |
| slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; |
| void *mAvailableAudioInputsChangedContext; |
| slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; |
| void *mAvailableAudioOutputsChangedContext; |
| slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; |
| void *mDefaultDeviceIDMapChangedContext; |
| } IAudioIODeviceCapabilities; |
| |
| typedef struct { |
| const struct SLBassBoostItf_ *mItf; |
| IObject *mThis; |
| SLboolean mEnabled; |
| SLpermille mStrength; |
| } IBassBoost; |
| |
| typedef struct BufferQueue_interface { |
| const struct SLBufferQueueItf_ *mItf; |
| IObject *mThis; |
| SLBufferQueueState mState; |
| slBufferQueueCallback mCallback; |
| void *mContext; |
| SLuint32 mNumBuffers; |
| struct BufferHeader *mArray; |
| struct BufferHeader *mFront, *mRear; |
| SLuint32 mSizeConsumed; |
| // saves a malloc in the typical case |
| #define BUFFER_HEADER_TYPICAL 4 |
| struct BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; |
| } IBufferQueue; |
| |
| typedef struct { |
| const struct SLDeviceVolumeItf_ *mItf; |
| IObject *mThis; |
| SLint32 mVolume[2]; // FIXME Hard-coded for default in/out |
| } IDeviceVolume; |
| |
| typedef struct { |
| const struct SLDynamicInterfaceManagementItf_ *mItf; |
| IObject *mThis; |
| unsigned mAddedMask; // added interfaces, a subset of exposed interfaces |
| unsigned mSuspendedMask; // suspended interfaces, a subset of added interfaces |
| slDynamicInterfaceManagementCallback mCallback; |
| void *mContext; |
| } IDynamicInterfaceManagement; |
| |
| typedef struct { |
| const struct SLDynamicSourceItf_ *mItf; |
| IObject *mThis; |
| SLDataSource *mDataSource; |
| } IDynamicSource; |
| |
| // FIXME Move this elsewhere |
| |
| #define AUX_ENVIRONMENTALREVERB 0 |
| #define AUX_PRESETREVERB 1 |
| #define AUX_MAX 2 |
| |
| #if 0 |
| static const unsigned char AUX_to_MPH[AUX_MAX] = { |
| MPH_ENVIRONMENTALREVERB, |
| MPH_PRESETREVERB |
| }; |
| #endif |
| |
| // private |
| |
| struct EnableLevel { |
| SLboolean mEnable; |
| SLmillibel mSendLevel; |
| }; |
| |
| typedef struct { |
| const struct SLEffectSendItf_ *mItf; |
| IObject *mThis; |
| struct OutputMix_class *mOutputMix; |
| SLmillibel mDirectLevel; |
| struct EnableLevel mEnableLevels[AUX_MAX]; |
| } IEffectSend; |
| |
| // private |
| |
| typedef struct { |
| const struct SLEngineItf_ *mItf; |
| IObject *mThis; |
| SLboolean mLossOfControlGlobal; |
| // FIXME Per-class non-const data such as vector of created objects. |
| // Each engine is its own universe. |
| SLuint32 mInstanceCount; |
| // Vector<Type> instances; |
| // FIXME set of objects |
| #define INSTANCE_MAX 32 // FIXME no magic numbers |
| IObject *mInstances[INSTANCE_MAX]; |
| } IEngine; |
| |
| typedef struct { |
| const struct SLEngineCapabilitiesItf_ *mItf; |
| IObject *mThis; |
| SLboolean mThreadSafe; |
| } IEngineCapabilities; |
| |
| typedef struct { |
| const struct SLEnvironmentalReverbItf_ *mItf; |
| IObject *mThis; |
| SLEnvironmentalReverbSettings mProperties; |
| } IEnvironmentalReverb; |
| |
| // FIXME move |
| struct EqualizerBand { |
| SLmilliHertz mMin; |
| SLmilliHertz mCenter; |
| SLmilliHertz mMax; |
| }; |
| |
| #define MAX_EQ_BANDS 4 // compile-time limit, runtime limit may be smaller |
| |
| typedef struct { |
| const struct SLEqualizerItf_ *mItf; |
| IObject *mThis; |
| SLboolean mEnabled; |
| SLuint16 mPreset; |
| SLmillibel mLevels[MAX_EQ_BANDS]; |
| // const to end of struct |
| SLuint16 mNumPresets; |
| SLuint16 mNumBands; |
| const struct EqualizerBand *mBands; |
| const struct EqualizerPreset *mPresets; |
| SLmillibel mBandLevelRangeMin; |
| SLmillibel mBandLevelRangeMax; |
| } IEqualizer; |
| |
| #define MAX_LED_COUNT 32 |
| |
| typedef struct { |
| const struct SLLEDArrayItf_ *mItf; |
| IObject *mThis; |
| SLuint32 mLightMask; |
| SLHSL mColors[MAX_LED_COUNT]; |
| // const |
| SLuint8 mCount; |
| } ILEDArray; |
| |
| // FIXME sort: MIDI goes here |
| |
| typedef struct { |
| const struct SLMetadataExtractionItf_ *mItf; |
| IObject *mThis; |
| SLuint32 mKeySize; |
| const void *mKey; |
| SLuint32 mKeyEncoding; |
| const SLchar *mValueLangCountry; |
| SLuint32 mValueEncoding; |
| SLuint8 mFilterMask; |
| /*FIXME*/ int mKeyFilter; |
| } IMetadataExtraction; |
| |
| typedef struct { |
| const struct SLMetadataTraversalItf_ *mItf; |
| IObject *mThis; |
| SLuint32 mIndex; |
| SLuint32 mMode; |
| SLuint32 mCount; |
| SLuint32 mSize; |
| } IMetadataTraversal; |
| |
| typedef struct { |
| const struct SLMIDIMessageItf_ *mItf; |
| IObject *mThis; |
| slMetaEventCallback mMetaEventCallback; |
| void *mMetaEventContext; |
| slMIDIMessageCallback mMessageCallback; |
| void *mMessageContext; |
| SLuint8 mMessageTypes; |
| } IMIDIMessage; |
| |
| typedef struct { |
| const struct SLMIDIMuteSoloItf_ *mItf; |
| IObject *mThis; |
| SLuint16 mChannelMuteMask; |
| SLuint16 mChannelSoloMask; |
| SLuint32 mTrackMuteMask; |
| SLuint32 mTrackSoloMask; |
| // const ? |
| SLuint16 mTrackCount; |
| } IMIDIMuteSolo; |
| |
| typedef struct { |
| const struct SLMIDITempoItf_ *mItf; |
| IObject *mThis; |
| SLuint32 mTicksPerQuarterNote; |
| SLuint32 mMicrosecondsPerQuarterNote; |
| } IMIDITempo; |
| |
| typedef struct { |
| const struct SLMIDITimeItf_ *mItf; |
| IObject *mThis; |
| SLuint32 mDuration; |
| SLuint32 mPosition; |
| SLuint32 mStartTick; |
| SLuint32 mNumTicks; |
| } IMIDITime; |
| |
| typedef struct { |
| const struct SLMuteSoloItf_ *mItf; |
| IObject *mThis; |
| SLuint32 mMuteMask; |
| SLuint32 mSoloMask; |
| // const |
| SLuint8 mNumChannels; |
| } IMuteSolo; |
| |
| typedef struct { |
| const struct SLOutputMixItf_ *mItf; |
| IObject *mThis; |
| slMixDeviceChangeCallback mCallback; |
| void *mContext; |
| #ifdef USE_OUTPUTMIXEXT |
| unsigned mActiveMask; // 1 bit per active track |
| struct Track mTracks[32]; // FIXME magic |
| #endif |
| } IOutputMix; |
| |
| #ifdef USE_OUTPUTMIXEXT |
| typedef struct { |
| const struct SLOutputMixExtItf_ *mItf; |
| IObject *mThis; |
| } IOutputMixExt; |
| #endif |
| |
| typedef struct { |
| const struct SLPitchItf_ *mItf; |
| IObject *mThis; |
| SLpermille mPitch; |
| // const |
| SLpermille mMinPitch; |
| SLpermille mMaxPitch; |
| } IPitch; |
| |
| typedef struct Play_interface { |
| const struct SLPlayItf_ *mItf; |
| IObject *mThis; |
| SLuint32 mState; |
| SLmillisecond mDuration; |
| SLmillisecond mPosition; |
| // unsigned mPositionSamples; // position in sample units |
| slPlayCallback mCallback; |
| void *mContext; |
| SLuint32 mEventFlags; |
| SLmillisecond mMarkerPosition; |
| SLmillisecond mPositionUpdatePeriod; |
| } IPlay; |
| |
| typedef struct { |
| const struct SLPlaybackRateItf_ *mItf; |
| IObject *mThis; |
| SLpermille mRate; |
| SLuint32 mProperties; |
| // const |
| SLpermille mMinRate; |
| SLpermille mMaxRate; |
| SLpermille mStepSize; |
| SLuint32 mCapabilities; |
| } IPlaybackRate; |
| |
| typedef struct { |
| const struct SLPrefetchStatusItf_ *mItf; |
| IObject *mThis; |
| SLuint32 mStatus; |
| SLpermille mLevel; |
| slPrefetchCallback mCallback; |
| void *mContext; |
| SLuint32 mCallbackEventsMask; |
| SLpermille mFillUpdatePeriod; |
| } IPrefetchStatus; |
| |
| typedef struct { |
| const struct SLPresetReverbItf_ *mItf; |
| IObject *mThis; |
| SLuint16 mPreset; |
| } IPresetReverb; |
| |
| typedef struct { |
| const struct SLRatePitchItf_ *mItf; |
| IObject *mThis; |
| SLpermille mRate; |
| // const |
| SLpermille mMinRate; |
| SLpermille mMaxRate; |
| } IRatePitch; |
| |
| typedef struct { |
| const struct SLRecordItf_ *mItf; |
| IObject *mThis; |
| SLuint32 mState; |
| SLmillisecond mDurationLimit; |
| SLmillisecond mPosition; |
| slRecordCallback mCallback; |
| void *mContext; |
| SLuint32 mCallbackEventsMask; |
| SLmillisecond mMarkerPosition; |
| SLmillisecond mPositionUpdatePeriod; |
| } IRecord; |
| |
| typedef struct { |
| const struct SLSeekItf_ *mItf; |
| IObject *mThis; |
| SLmillisecond mPos; |
| SLboolean mLoopEnabled; |
| SLmillisecond mStartPos; |
| SLmillisecond mEndPos; |
| } ISeek; |
| |
| typedef struct { |
| const struct SLThreadSyncItf_ *mItf; |
| IObject *mThis; |
| SLboolean mInCriticalSection; |
| SLboolean mWaiting; |
| pthread_t mOwner; |
| } IThreadSync; |
| |
| typedef struct { |
| const struct SLVibraItf_ *mItf; |
| IObject *mThis; |
| SLboolean mVibrate; |
| SLmilliHertz mFrequency; |
| SLpermille mIntensity; |
| } IVibra; |
| |
| typedef struct { |
| const struct SLVirtualizerItf_ *mItf; |
| IObject *mThis; |
| SLboolean mEnabled; |
| SLpermille mStrength; |
| } IVirtualizer; |
| |
| typedef struct { |
| const struct SLVisualizationItf_ *mItf; |
| IObject *mThis; |
| slVisualizationCallback mCallback; |
| void *mContext; |
| SLmilliHertz mRate; |
| } IVisualization; |
| |
| typedef struct { |
| const struct SLVolumeItf_ *mItf; |
| IObject *mThis; |
| SLmillibel mLevel; |
| SLboolean mMute; |
| SLboolean mEnableStereoPosition; |
| SLpermille mStereoPosition; |
| #ifdef USE_ANDROID |
| /** |
| * Amplification (can be attenuation) factor derived for the VolumeLevel |
| */ |
| float mAmplFromVolLevel; |
| /** |
| * Left/right amplification (can be attenuations) factors derived for the StereoPosition |
| */ |
| float mAmplFromStereoPos[2]; |
| /** |
| * Channel mask for which channels are muted |
| */ |
| int mChannelMutes; |
| /** |
| * Channel mask for which channels are solo'ed |
| */ |
| int mChannelSolos; |
| #endif |
| } IVolume; |
| |
| /* Class structures */ |
| |
| typedef struct { |
| IObject mObject; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| I3DLocation m3DLocation; |
| I3DDoppler m3DDoppler; |
| I3DSource m3DSource; |
| I3DMacroscopic m3DMacroscopic; |
| // FIXME set of objects |
| } C3DGroup; |
| |
| #ifdef USE_ANDROID |
| /* |
| * Used to define the mapping from an OpenSL ES audio player to an Android |
| * media framework object |
| */ |
| enum AndroidObject_type { |
| INVALID_TYPE =-1, |
| MEDIAPLAYER = 0, |
| AUDIOTRACK_PUSH = 1, |
| AUDIOTRACK_PULL = 2, |
| NUM_AUDIOPLAYER_MAP_TYPES |
| }; |
| #endif |
| |
| /*typedef*/ struct CAudioPlayer_struct { |
| IObject mObject; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IPlay mPlay; |
| I3DDoppler m3DDoppler; |
| I3DGrouping m3DGrouping; |
| I3DLocation m3DLocation; |
| I3DSource m3DSource; |
| IBufferQueue mBufferQueue; |
| IEffectSend mEffectSend; |
| IMuteSolo mMuteSolo; |
| IMetadataExtraction mMetadataExtraction; |
| IMetadataTraversal mMetadataTraversal; |
| IPrefetchStatus mPrefetchStatus; |
| IRatePitch mRatePitch; |
| ISeek mSeek; |
| IVolume mVolume; |
| // optional interfaces |
| I3DMacroscopic m3DMacroscopic; |
| IBassBoost mBassBoost; |
| IDynamicSource mDynamicSource; |
| IEnvironmentalReverb mEnvironmentalReverb; |
| IEqualizer mEqualizer; |
| IPitch mPitch; |
| IPresetReverb mPresetReverb; |
| IPlaybackRate mPlaybackRate; |
| IVirtualizer mVirtualizer; |
| IVisualization mVisualization; |
| // rest of fields are not related to the interfaces |
| DataLocatorFormat mDataSource; |
| DataLocatorFormat mDataSink; |
| #ifdef USE_SNDFILE |
| struct SndFile mSndFile; |
| #endif // USE_SNDFILE |
| #ifdef USE_ANDROID |
| enum AndroidObject_type mAndroidObjType; |
| union { |
| android::AudioTrack *mAudioTrack; |
| android::MediaPlayer *mMediaPlayer; |
| }; |
| #endif |
| } /*CAudioPlayer*/; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IRecord mRecord; |
| IAudioEncoder mAudioEncoder; |
| // optional interfaces |
| IBassBoost mBassBoost; |
| IDynamicSource mDynamicSource; |
| IEqualizer mEqualizer; |
| IVisualization mVisualization; |
| IVolume mVolume; |
| } CAudioRecorder; |
| |
| typedef struct { |
| // mandated implicit interfaces |
| IObject mObject; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IEngine mEngine; |
| IEngineCapabilities mEngineCapabilities; |
| IThreadSync mThreadSync; |
| // mandated explicit interfaces |
| IAudioIODeviceCapabilities mAudioIODeviceCapabilities; |
| IAudioDecoderCapabilities mAudioDecoderCapabilities; |
| IAudioEncoderCapabilities mAudioEncoderCapabilities; |
| I3DCommit m3DCommit; |
| // optional interfaces |
| IDeviceVolume mDeviceVolume; |
| pthread_t mSyncThread; |
| } CEngine; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| ILEDArray mLEDArray; |
| SLuint32 mDeviceID; |
| } CLEDDevice; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| I3DDoppler m3DDoppler; |
| I3DLocation m3DLocation; |
| } CListener; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IDynamicSource mDynamicSource; |
| IMetadataExtraction mMetadataExtraction; |
| IMetadataTraversal mMetadataTraversal; |
| } CMetadataExtractor; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IPlay mPlay; |
| I3DDoppler m3DDoppler; |
| I3DGrouping m3DGrouping; |
| I3DLocation m3DLocation; |
| I3DSource m3DSource; |
| IBufferQueue mBufferQueue; |
| IEffectSend mEffectSend; |
| IMuteSolo mMuteSolo; |
| IMetadataExtraction mMetadataExtraction; |
| IMetadataTraversal mMetadataTraversal; |
| IMIDIMessage mMIDIMessage; |
| IMIDITime mMIDITime; |
| IMIDITempo mMIDITempo; |
| IMIDIMuteSolo mMIDIMuteSolo; |
| IPrefetchStatus mPrefetchStatus; |
| ISeek mSeek; |
| IVolume mVolume; |
| // optional interfaces |
| I3DMacroscopic m3DMacroscopic; |
| IBassBoost mBassBoost; |
| IDynamicSource mDynamicSource; |
| IEnvironmentalReverb mEnvironmentalReverb; |
| IEqualizer mEqualizer; |
| IPitch mPitch; |
| IPresetReverb mPresetReverb; |
| IPlaybackRate mPlaybackRate; |
| IVirtualizer mVirtualizer; |
| IVisualization mVisualization; |
| } CMidiPlayer; |
| |
| typedef struct OutputMix_class { |
| // mandated interfaces |
| IObject mObject; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IOutputMix mOutputMix; |
| #ifdef USE_OUTPUTMIXEXT |
| IOutputMixExt mOutputMixExt; |
| #endif |
| IEnvironmentalReverb mEnvironmentalReverb; |
| IEqualizer mEqualizer; |
| IPresetReverb mPresetReverb; |
| IVirtualizer mVirtualizer; |
| IVolume mVolume; |
| // optional interfaces |
| IBassBoost mBassBoost; |
| IVisualization mVisualization; |
| } COutputMix; |
| |
| typedef struct { |
| // mandated interfaces |
| IObject mObject; |
| IDynamicInterfaceManagement mDynamicInterfaceManagement; |
| IVibra mVibra; |
| // |
| SLuint32 mDeviceID; |
| } CVibraDevice; |
| |
| struct MPH_init { |
| // unsigned char mMPH; |
| VoidHook mInit; |
| VoidHook mDeinit; |
| }; |
| |
| extern /*static*/ int IID_to_MPH(const SLInterfaceID iid); |
| extern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; |
| extern SLresult checkInterfaces(const ClassTable *class__, |
| SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, |
| const SLboolean *pInterfaceRequired, unsigned *pExposedMask); |
| extern IObject *construct(const ClassTable *class__, |
| unsigned exposedMask, SLEngineItf engine); |
| extern const ClassTable *objectIDtoClass(SLuint32 objectID); |
| extern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; |
| extern SLuint32 IObjectToObjectID(IObject *object); |
| |
| // Map an interface to it's "object ID" (which is really a class ID) |
| |
| #define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis) |
| |
| #ifdef USE_ANDROID |
| #include "sles_to_android.h" |
| #endif |
| |
| extern SLresult checkDataSource(const SLDataSource *pDataSrc, DataLocatorFormat *myDataSourceLocator); |
| extern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator); |
| extern void freeDataLocatorFormat(DataLocatorFormat *dlf); |
| extern SLresult CAudioPlayer_Realize(void *self, SLboolean async); |
| extern void CAudioPlayer_Destroy(void *self); |