/*
 * Copyright (c) 2007-2009 The Khronos Group Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and /or associated documentation files (the "Materials "), to
 * deal in the Materials without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Materials, and to permit persons to whom the Materials are
 * furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Materials.
 *
 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE
 * MATERIALS.
 *
 * OpenSLES.h - OpenSL ES version 1.0.1
 *
 */

/****************************************************************************/
/* NOTE: This file is a standard OpenSL ES header file and should not be    */
/* modified in any way.                                                     */
/****************************************************************************/

#ifndef OPENSL_ES_H_
#define OPENSL_ES_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "OpenSLES_Platform.h"


/*****************************************************************************/
/* Common types, structures, and defines                                */
/*****************************************************************************/

#ifndef _KHRONOS_KEYS_
#define _KHRONOS_KEYS_

#define KHRONOS_TITLE "KhronosTitle"
#define KHRONOS_ALBUM "KhronosAlbum"
#define KHRONOS_TRACK_NUMBER "KhronosTrackNumber"
#define KHRONOS_ARTIST "KhronosArtist"
#define KHRONOS_GENRE "KhronosGenre"
#define KHRONOS_YEAR "KhronosYear"
#define KHRONOS_COMMENT "KhronosComment"
#define KHRONOS_ARTIST_URL "KhronosArtistURL"
#define KHRONOS_CONTENT_URL "KhronosContentURL"
#define KHRONOS_RATING "KhronosRating"
#define KHRONOS_ALBUM_ART "KhronosAlbumArt"
#define KHRONOS_COPYRIGHT "KhronosCopyright"

#endif


/* remap common types to SL types for clarity */
typedef sl_int8_t              SLint8;          /* 8 bit signed integer  */
typedef sl_uint8_t             SLuint8;         /* 8 bit unsigned integer */
typedef sl_int16_t             SLint16;         /* 16 bit signed integer */
typedef sl_uint16_t            SLuint16;        /* 16 bit unsigned integer */
typedef sl_int32_t             SLint32;           /* 32 bit signed integer */
typedef sl_uint32_t            SLuint32;          /* 32 bit unsigned integer */

typedef SLuint32                    SLboolean;
#define SL_BOOLEAN_FALSE            ((SLboolean) 0x00000000)
#define SL_BOOLEAN_TRUE             ((SLboolean) 0x00000001)

typedef SLuint8						SLchar;			/* UTF-8 is to be used */
typedef SLint16						SLmillibel;
typedef SLuint32					SLmillisecond;
typedef SLuint32					SLmilliHertz;
typedef SLint32						SLmillimeter;
typedef SLint32						SLmillidegree;
typedef SLint16						SLpermille;
typedef SLuint32					SLmicrosecond;
typedef SLuint32					SLresult;

#define SL_MILLIBEL_MAX 	((SLmillibel) 0x7FFF)
#define SL_MILLIBEL_MIN 	((SLmillibel) (-SL_MILLIBEL_MAX-1))

#define SL_MILLIHERTZ_MAX	((SLmilliHertz) 0xFFFFFFFF)
#define SL_MILLIMETER_MAX	((SLmillimeter) 0x7FFFFFFF)

/** Interface ID defined as a UUID */
typedef const struct SLInterfaceID_ {
    SLuint32 time_low;
    SLuint16 time_mid;
    SLuint16 time_hi_and_version;
    SLuint16 clock_seq;
    SLuint8  node[6];
} * SLInterfaceID;

/* Forward declaration for the object interface */
struct SLObjectItf_;

typedef const struct SLObjectItf_ * const * SLObjectItf;

/* Objects ID's */

#define SL_OBJECTID_ENGINE			((SLuint32) 0x00001001)
#define SL_OBJECTID_LEDDEVICE		((SLuint32) 0x00001002)
#define SL_OBJECTID_VIBRADEVICE		((SLuint32) 0x00001003)
#define SL_OBJECTID_AUDIOPLAYER		((SLuint32) 0x00001004)
#define SL_OBJECTID_AUDIORECORDER	((SLuint32) 0x00001005)
#define SL_OBJECTID_MIDIPLAYER		((SLuint32) 0x00001006)
#define SL_OBJECTID_LISTENER		((SLuint32) 0x00001007)
#define SL_OBJECTID_3DGROUP			((SLuint32) 0x00001008)
#define SL_OBJECTID_OUTPUTMIX		((SLuint32) 0x00001009)
#define SL_OBJECTID_METADATAEXTRACTOR	((SLuint32) 0x0000100A)


/* SL Profiles */

#define SL_PROFILES_PHONE	((SLuint16) 0x0001)
#define SL_PROFILES_MUSIC	((SLuint16) 0x0002)
#define SL_PROFILES_GAME	((SLuint16) 0x0004)

/* Types of voices supported by the system */

#define SL_VOICETYPE_2D_AUDIO		((SLuint16) 0x0001)
#define SL_VOICETYPE_MIDI			((SLuint16) 0x0002)
#define SL_VOICETYPE_3D_AUDIO 		((SLuint16) 0x0004)
#define SL_VOICETYPE_3D_MIDIOUTPUT 	((SLuint16) 0x0008)

/* Convenient macros representing various different priority levels, for use with the SetPriority method */

#define SL_PRIORITY_LOWEST		((SLint32) (-0x7FFFFFFF-1))
#define SL_PRIORITY_VERYLOW		((SLint32) -0x60000000)
#define SL_PRIORITY_LOW			((SLint32) -0x40000000)
#define SL_PRIORITY_BELOWNORMAL	((SLint32) -0x20000000)
#define SL_PRIORITY_NORMAL		((SLint32) 0x00000000)
#define SL_PRIORITY_ABOVENORMAL	((SLint32) 0x20000000)
#define SL_PRIORITY_HIGH		((SLint32) 0x40000000)
#define SL_PRIORITY_VERYHIGH	((SLint32) 0x60000000)
#define SL_PRIORITY_HIGHEST	((SLint32) 0x7FFFFFFF)


/** These macros list the various sample formats that are possible on audio input and output devices. */

#define SL_PCMSAMPLEFORMAT_FIXED_8	((SLuint16) 0x0008)
#define SL_PCMSAMPLEFORMAT_FIXED_16	((SLuint16) 0x0010)
#define SL_PCMSAMPLEFORMAT_FIXED_20 	((SLuint16) 0x0014)
#define SL_PCMSAMPLEFORMAT_FIXED_24	((SLuint16) 0x0018)
#define SL_PCMSAMPLEFORMAT_FIXED_28 	((SLuint16) 0x001C)
#define SL_PCMSAMPLEFORMAT_FIXED_32	((SLuint16) 0x0020)


/** These macros specify the commonly used sampling rates (in milliHertz) supported by most audio I/O devices. */

#define SL_SAMPLINGRATE_8		((SLuint32) 8000000)
#define SL_SAMPLINGRATE_11_025	((SLuint32) 11025000)
#define SL_SAMPLINGRATE_12		((SLuint32) 12000000)
#define SL_SAMPLINGRATE_16		((SLuint32) 16000000)
#define SL_SAMPLINGRATE_22_05	((SLuint32) 22050000)
#define SL_SAMPLINGRATE_24		((SLuint32) 24000000)
#define SL_SAMPLINGRATE_32		((SLuint32) 32000000)
#define SL_SAMPLINGRATE_44_1	((SLuint32) 44100000)
#define SL_SAMPLINGRATE_48		((SLuint32) 48000000)
#define SL_SAMPLINGRATE_64		((SLuint32) 64000000)
#define SL_SAMPLINGRATE_88_2	((SLuint32) 88200000)
#define SL_SAMPLINGRATE_96		((SLuint32) 96000000)
#define SL_SAMPLINGRATE_192	((SLuint32) 192000000)

#define SL_SPEAKER_FRONT_LEFT			((SLuint32) 0x00000001)
#define SL_SPEAKER_FRONT_RIGHT			((SLuint32) 0x00000002)
#define SL_SPEAKER_FRONT_CENTER			((SLuint32) 0x00000004)
#define SL_SPEAKER_LOW_FREQUENCY			((SLuint32) 0x00000008)
#define SL_SPEAKER_BACK_LEFT			((SLuint32) 0x00000010)
#define SL_SPEAKER_BACK_RIGHT			((SLuint32) 0x00000020)
#define SL_SPEAKER_FRONT_LEFT_OF_CENTER	((SLuint32) 0x00000040)
#define SL_SPEAKER_FRONT_RIGHT_OF_CENTER	((SLuint32) 0x00000080)
#define SL_SPEAKER_BACK_CENTER			((SLuint32) 0x00000100)
#define SL_SPEAKER_SIDE_LEFT			((SLuint32) 0x00000200)
#define SL_SPEAKER_SIDE_RIGHT			((SLuint32) 0x00000400)
#define SL_SPEAKER_TOP_CENTER			((SLuint32) 0x00000800)
#define SL_SPEAKER_TOP_FRONT_LEFT		((SLuint32) 0x00001000)
#define SL_SPEAKER_TOP_FRONT_CENTER		((SLuint32) 0x00002000)
#define SL_SPEAKER_TOP_FRONT_RIGHT		((SLuint32) 0x00004000)
#define SL_SPEAKER_TOP_BACK_LEFT			((SLuint32) 0x00008000)
#define SL_SPEAKER_TOP_BACK_CENTER		((SLuint32) 0x00010000)
#define SL_SPEAKER_TOP_BACK_RIGHT		((SLuint32) 0x00020000)


/*****************************************************************************/
/* Errors                                                                    */
/*                                                                           */
/*****************************************************************************/

#define SL_RESULT_SUCCESS				((SLuint32) 0x00000000)
#define SL_RESULT_PRECONDITIONS_VIOLATED	((SLuint32) 0x00000001)
#define SL_RESULT_PARAMETER_INVALID		((SLuint32) 0x00000002)
#define SL_RESULT_MEMORY_FAILURE			((SLuint32) 0x00000003)
#define SL_RESULT_RESOURCE_ERROR			((SLuint32) 0x00000004)
#define SL_RESULT_RESOURCE_LOST			((SLuint32) 0x00000005)
#define SL_RESULT_IO_ERROR				((SLuint32) 0x00000006)
#define SL_RESULT_BUFFER_INSUFFICIENT		((SLuint32) 0x00000007)
#define SL_RESULT_CONTENT_CORRUPTED		((SLuint32) 0x00000008)
#define SL_RESULT_CONTENT_UNSUPPORTED		((SLuint32) 0x00000009)
#define SL_RESULT_CONTENT_NOT_FOUND		((SLuint32) 0x0000000A)
#define SL_RESULT_PERMISSION_DENIED		((SLuint32) 0x0000000B)
#define SL_RESULT_FEATURE_UNSUPPORTED		((SLuint32) 0x0000000C)
#define SL_RESULT_INTERNAL_ERROR			((SLuint32) 0x0000000D)
#define SL_RESULT_UNKNOWN_ERROR			((SLuint32) 0x0000000E)
#define SL_RESULT_OPERATION_ABORTED		((SLuint32) 0x0000000F)
#define SL_RESULT_CONTROL_LOST			((SLuint32) 0x00000010)


/* Object state definitions */

#define SL_OBJECT_STATE_UNREALIZED	((SLuint32) 0x00000001)
#define SL_OBJECT_STATE_REALIZED		((SLuint32) 0x00000002)
#define SL_OBJECT_STATE_SUSPENDED	((SLuint32) 0x00000003)

/* Object event definitions */

#define SL_OBJECT_EVENT_RUNTIME_ERROR			((SLuint32) 0x00000001)
#define SL_OBJECT_EVENT_ASYNC_TERMINATION		((SLuint32) 0x00000002)
#define SL_OBJECT_EVENT_RESOURCES_LOST			((SLuint32) 0x00000003)
#define SL_OBJECT_EVENT_RESOURCES_AVAILABLE		((SLuint32) 0x00000004)
#define SL_OBJECT_EVENT_ITF_CONTROL_TAKEN		((SLuint32) 0x00000005)
#define SL_OBJECT_EVENT_ITF_CONTROL_RETURNED		((SLuint32) 0x00000006)
#define SL_OBJECT_EVENT_ITF_PARAMETERS_CHANGED	((SLuint32) 0x00000007)


/*****************************************************************************/
/* Interface definitions                                                     */
/*****************************************************************************/

/** NULL Interface */

extern SL_API const SLInterfaceID SL_IID_NULL;

/*---------------------------------------------------------------------------*/
/* Data Source and Data Sink Structures                                      */
/*---------------------------------------------------------------------------*/

/** Data locator macros  */
#define SL_DATALOCATOR_URI			((SLuint32) 0x00000001)
#define SL_DATALOCATOR_ADDRESS		((SLuint32) 0x00000002)
#define SL_DATALOCATOR_IODEVICE		((SLuint32) 0x00000003)
#define SL_DATALOCATOR_OUTPUTMIX		((SLuint32) 0x00000004)
#define SL_DATALOCATOR_RESERVED5		((SLuint32) 0x00000005)
#define SL_DATALOCATOR_BUFFERQUEUE	((SLuint32) 0x00000006)
#define SL_DATALOCATOR_MIDIBUFFERQUEUE	((SLuint32) 0x00000007)
#define SL_DATALOCATOR_RESERVED8		((SLuint32) 0x00000008)



/** URI-based data locator definition where locatorType must be SL_DATALOCATOR_URI*/
typedef struct SLDataLocator_URI_ {
	SLuint32 		locatorType;
	SLchar *		URI;
} SLDataLocator_URI;

/** Address-based data locator definition where locatorType must be SL_DATALOCATOR_ADDRESS*/
typedef struct SLDataLocator_Address_ {
	SLuint32 	locatorType;
	void 		*pAddress;
	SLuint32	length;
} SLDataLocator_Address;

/** IODevice-types */
#define SL_IODEVICE_AUDIOINPUT	((SLuint32) 0x00000001)
#define SL_IODEVICE_LEDARRAY	((SLuint32) 0x00000002)
#define SL_IODEVICE_VIBRA		((SLuint32) 0x00000003)
#define SL_IODEVICE_RESERVED4	((SLuint32) 0x00000004)
#define SL_IODEVICE_RESERVED5	((SLuint32) 0x00000005)

/** IODevice-based data locator definition where locatorType must be SL_DATALOCATOR_IODEVICE*/
typedef struct SLDataLocator_IODevice_ {
	SLuint32	locatorType;
	SLuint32	deviceType;
	SLuint32	deviceID;
	SLObjectItf	device;
} SLDataLocator_IODevice;

/** OutputMix-based data locator definition where locatorType must be SL_DATALOCATOR_OUTPUTMIX*/
typedef struct SLDataLocator_OutputMix {
	SLuint32 		locatorType;
	SLObjectItf		outputMix;
} SLDataLocator_OutputMix;


/** BufferQueue-based data locator definition where locatorType must be SL_DATALOCATOR_BUFFERQUEUE*/
typedef struct SLDataLocator_BufferQueue {
	SLuint32	locatorType;
	SLuint32	numBuffers;
} SLDataLocator_BufferQueue;

/** MidiBufferQueue-based data locator definition where locatorType must be SL_DATALOCATOR_MIDIBUFFERQUEUE*/
typedef struct SLDataLocator_MIDIBufferQueue {
	SLuint32	locatorType;
	SLuint32	tpqn;
	SLuint32	numBuffers;
} SLDataLocator_MIDIBufferQueue;

/** Data format defines */
#define SL_DATAFORMAT_MIME		((SLuint32) 0x00000001)
#define SL_DATAFORMAT_PCM		((SLuint32) 0x00000002)
#define SL_DATAFORMAT_RESERVED3	((SLuint32) 0x00000003)


/** MIME-type-based data format definition where formatType must be SL_DATAFORMAT_MIME*/
typedef struct SLDataFormat_MIME_ {
	SLuint32 		formatType;
	SLchar * 		mimeType;
	SLuint32		containerType;
} SLDataFormat_MIME;

/* Byte order of a block of 16- or 32-bit data */
#define SL_BYTEORDER_BIGENDIAN				((SLuint32) 0x00000001)
#define SL_BYTEORDER_LITTLEENDIAN			((SLuint32) 0x00000002)

/* Container type */
#define SL_CONTAINERTYPE_UNSPECIFIED	((SLuint32) 0x00000001)
#define SL_CONTAINERTYPE_RAW		((SLuint32) 0x00000002)
#define SL_CONTAINERTYPE_ASF		((SLuint32) 0x00000003)
#define SL_CONTAINERTYPE_AVI		((SLuint32) 0x00000004)
#define SL_CONTAINERTYPE_BMP		((SLuint32) 0x00000005)
#define SL_CONTAINERTYPE_JPG		((SLuint32) 0x00000006)
#define SL_CONTAINERTYPE_JPG2000		((SLuint32) 0x00000007)
#define SL_CONTAINERTYPE_M4A		((SLuint32) 0x00000008)
#define SL_CONTAINERTYPE_MP3		((SLuint32) 0x00000009)
#define SL_CONTAINERTYPE_MP4		((SLuint32) 0x0000000A)
#define SL_CONTAINERTYPE_MPEG_ES		((SLuint32) 0x0000000B)
#define SL_CONTAINERTYPE_MPEG_PS		((SLuint32) 0x0000000C)
#define SL_CONTAINERTYPE_MPEG_TS		((SLuint32) 0x0000000D)
#define SL_CONTAINERTYPE_QT		((SLuint32) 0x0000000E)
#define SL_CONTAINERTYPE_WAV		((SLuint32) 0x0000000F)
#define SL_CONTAINERTYPE_XMF_0		((SLuint32) 0x00000010)
#define SL_CONTAINERTYPE_XMF_1		((SLuint32) 0x00000011)
#define SL_CONTAINERTYPE_XMF_2		((SLuint32) 0x00000012)
#define SL_CONTAINERTYPE_XMF_3		((SLuint32) 0x00000013)
#define SL_CONTAINERTYPE_XMF_GENERIC	((SLuint32) 0x00000014)
#define SL_CONTAINERTYPE_AMR  		((SLuint32) 0x00000015)
#define SL_CONTAINERTYPE_AAC		((SLuint32) 0x00000016)
#define SL_CONTAINERTYPE_3GPP		((SLuint32) 0x00000017)
#define SL_CONTAINERTYPE_3GA		((SLuint32) 0x00000018)
#define SL_CONTAINERTYPE_RM		((SLuint32) 0x00000019)
#define SL_CONTAINERTYPE_DMF		((SLuint32) 0x0000001A)
#define SL_CONTAINERTYPE_SMF		((SLuint32) 0x0000001B)
#define SL_CONTAINERTYPE_MOBILE_DLS	((SLuint32) 0x0000001C)
#define SL_CONTAINERTYPE_OGG	((SLuint32) 0x0000001D)


/** PCM-type-based data format definition where formatType must be SL_DATAFORMAT_PCM*/
typedef struct SLDataFormat_PCM_ {
	SLuint32 		formatType;
	SLuint32 		numChannels;
	SLuint32 		samplesPerSec;
	SLuint32 		bitsPerSample;
	SLuint32 		containerSize;
	SLuint32 		channelMask;
	SLuint32		endianness;
} SLDataFormat_PCM;

typedef struct SLDataSource_ {
	void *pLocator;
	void *pFormat;
} SLDataSource;


typedef struct SLDataSink_ {
	void *pLocator;
	void *pFormat;
} SLDataSink;






/*---------------------------------------------------------------------------*/
/* Standard Object Interface                                                 */
/*---------------------------------------------------------------------------*/

extern SL_API const SLInterfaceID SL_IID_OBJECT;

/** Object callback */


typedef void (SLAPIENTRY *slObjectCallback) (
	SLObjectItf caller,
	const void * pContext,
	SLuint32 event,
	SLresult result,
    SLuint32 param,
    void *pInterface
);


struct SLObjectItf_ {
	SLresult (*Realize) (
		SLObjectItf self,
		SLboolean async
	);
	SLresult (*Resume) (
		SLObjectItf self,
		SLboolean async
	);
	SLresult (*GetState) (
		SLObjectItf self,
		SLuint32 * pState
	);
	SLresult (*GetInterface) (
		SLObjectItf self,
		const SLInterfaceID iid,
		void * pInterface
	);
	SLresult (*RegisterCallback) (
		SLObjectItf self,
		slObjectCallback callback,
		void * pContext
	);
	void (*AbortAsyncOperation) (
		SLObjectItf self
	);
	void (*Destroy) (
		SLObjectItf self
	);
	SLresult (*SetPriority) (
		SLObjectItf self,
		SLint32 priority,
		SLboolean preemptable
	);
	SLresult (*GetPriority) (
		SLObjectItf self,
		SLint32 *pPriority,
		SLboolean *pPreemptable
	);
	SLresult (*SetLossOfControlInterfaces) (
		SLObjectItf self,
		SLint16 numInterfaces,
		SLInterfaceID * pInterfaceIDs,
		SLboolean enabled
	);
};


/*---------------------------------------------------------------------------*/
/* Audio IO Device capabilities interface                                    */
/*---------------------------------------------------------------------------*/

#define SL_DEFAULTDEVICEID_AUDIOINPUT 	((SLuint32) 0xFFFFFFFF)
#define SL_DEFAULTDEVICEID_AUDIOOUTPUT 	((SLuint32) 0xFFFFFFFE)
#define SL_DEFAULTDEVICEID_LED          ((SLuint32) 0xFFFFFFFD)
#define SL_DEFAULTDEVICEID_VIBRA        ((SLuint32) 0xFFFFFFFC)
#define SL_DEFAULTDEVICEID_RESERVED1    ((SLuint32) 0xFFFFFFFB)


#define SL_DEVCONNECTION_INTEGRATED         ((SLint16) 0x0001)
#define SL_DEVCONNECTION_ATTACHED_WIRED     ((SLint16) 0x0100)
#define SL_DEVCONNECTION_ATTACHED_WIRELESS  ((SLint16) 0x0200)
#define SL_DEVCONNECTION_NETWORK 		    ((SLint16) 0x0400)


#define SL_DEVLOCATION_HANDSET 	((SLuint16) 0x0001)
#define SL_DEVLOCATION_HEADSET 	((SLuint16) 0x0002)
#define SL_DEVLOCATION_CARKIT 	((SLuint16) 0x0003)
#define SL_DEVLOCATION_DOCK 	((SLuint16) 0x0004)
#define SL_DEVLOCATION_REMOTE 	((SLuint16) 0x0005)
/* Note: SL_DEVLOCATION_RESLTE is deprecated, use SL_DEVLOCATION_REMOTE instead. */
#define SL_DEVLOCATION_RESLTE 	((SLuint16) 0x0005)


#define SL_DEVSCOPE_UNKNOWN     ((SLuint16) 0x0001)
#define SL_DEVSCOPE_ENVIRONMENT ((SLuint16) 0x0002)
#define SL_DEVSCOPE_USER        ((SLuint16) 0x0003)


typedef struct SLAudioInputDescriptor_ {
	SLchar *deviceName;
	SLint16 deviceConnection;
	SLint16 deviceScope;
	SLint16 deviceLocation;
	SLboolean isForTelephony;
	SLmilliHertz minSampleRate;
	SLmilliHertz maxSampleRate;
	SLboolean isFreqRangeContinuous;
	SLmilliHertz *samplingRatesSupported;
	SLint16 numOfSamplingRatesSupported;
	SLint16 maxChannels;
} SLAudioInputDescriptor;


typedef struct SLAudioOutputDescriptor_ {
	SLchar *pDeviceName;
	SLint16 deviceConnection;
	SLint16 deviceScope;
	SLint16 deviceLocation;
	SLboolean isForTelephony;
	SLmilliHertz minSampleRate;
	SLmilliHertz maxSampleRate;
	SLboolean isFreqRangeContinuous;
	SLmilliHertz *samplingRatesSupported;
	SLint16 numOfSamplingRatesSupported;
	SLint16 maxChannels;
} SLAudioOutputDescriptor;



extern SL_API const SLInterfaceID SL_IID_AUDIOIODEVICECAPABILITIES;

struct SLAudioIODeviceCapabilitiesItf_;
typedef const struct SLAudioIODeviceCapabilitiesItf_ * const * SLAudioIODeviceCapabilitiesItf;


typedef void (SLAPIENTRY *slAvailableAudioInputsChangedCallback) (
	SLAudioIODeviceCapabilitiesItf caller,
	void *pContext,
	SLuint32 deviceID,
	SLint32 numInputs,
	SLboolean isNew
);


typedef void (SLAPIENTRY *slAvailableAudioOutputsChangedCallback) (
	SLAudioIODeviceCapabilitiesItf caller,
	void *pContext,
	SLuint32 deviceID,
	SLint32 numOutputs,
	SLboolean isNew
);

typedef void (SLAPIENTRY *slDefaultDeviceIDMapChangedCallback) (
	SLAudioIODeviceCapabilitiesItf caller,
	void *pContext,
	SLboolean isOutput,
	SLint32 numDevices
);


struct SLAudioIODeviceCapabilitiesItf_ {
	SLresult (*GetAvailableAudioInputs)(
		SLAudioIODeviceCapabilitiesItf self,
		SLint32  *pNumInputs,
		SLuint32 *pInputDeviceIDs
	);
	SLresult (*QueryAudioInputCapabilities)(
		SLAudioIODeviceCapabilitiesItf self,
		SLuint32 deviceId,
		SLAudioInputDescriptor *pDescriptor
	);
	SLresult (*RegisterAvailableAudioInputsChangedCallback) (
		SLAudioIODeviceCapabilitiesItf self,
		slAvailableAudioInputsChangedCallback callback,
		void *pContext
	);
	SLresult (*GetAvailableAudioOutputs)(
		SLAudioIODeviceCapabilitiesItf self,
		SLint32 *pNumOutputs,
		SLuint32 *pOutputDeviceIDs
	);
	SLresult (*QueryAudioOutputCapabilities)(
		SLAudioIODeviceCapabilitiesItf self,
		SLuint32 deviceId,
		SLAudioOutputDescriptor *pDescriptor
	);
	SLresult (*RegisterAvailableAudioOutputsChangedCallback) (
		SLAudioIODeviceCapabilitiesItf self,
		slAvailableAudioOutputsChangedCallback callback,
		void *pContext
	);
	SLresult (*RegisterDefaultDeviceIDMapChangedCallback) (
		SLAudioIODeviceCapabilitiesItf self,
		slDefaultDeviceIDMapChangedCallback callback,
		void *pContext
	);
	SLresult (*GetAssociatedAudioInputs) (
		SLAudioIODeviceCapabilitiesItf self,
		SLuint32 deviceId,
		SLint32 *pNumAudioInputs,
		SLuint32 *pAudioInputDeviceIDs
	);
	SLresult (*GetAssociatedAudioOutputs) (
		SLAudioIODeviceCapabilitiesItf self,
		SLuint32 deviceId,
		SLint32 *pNumAudioOutputs,
		SLuint32 *pAudioOutputDeviceIDs
	);
	SLresult (*GetDefaultAudioDevices) (
		SLAudioIODeviceCapabilitiesItf self,
		SLuint32 defaultDeviceID,
		SLint32 *pNumAudioDevices,
		SLuint32 *pAudioDeviceIDs
	);
	SLresult (*QuerySampleFormatsSupported)(
		SLAudioIODeviceCapabilitiesItf self,
		SLuint32 deviceId,
		SLmilliHertz samplingRate,
		SLint32 *pSampleFormats,
		SLint32 *pNumOfSampleFormats
	);
};



/*---------------------------------------------------------------------------*/
/* Capabilities of the LED array IODevice                                    */
/*---------------------------------------------------------------------------*/

typedef struct SLLEDDescriptor_ {
	SLuint8   ledCount;
	SLuint8   primaryLED;
	SLuint32  colorMask;
} SLLEDDescriptor;


/*---------------------------------------------------------------------------*/
/* LED Array interface                                                       */
/*---------------------------------------------------------------------------*/

typedef struct SLHSL_ {
    SLmillidegree  hue;
    SLpermille     saturation;
    SLpermille     lightness;
} SLHSL;


extern SL_API const SLInterfaceID SL_IID_LED;

struct SLLEDArrayItf_;
typedef const struct SLLEDArrayItf_ * const * SLLEDArrayItf;

struct SLLEDArrayItf_ {
	SLresult (*ActivateLEDArray) (
		SLLEDArrayItf self,
		SLuint32 lightMask
	);
	SLresult (*IsLEDArrayActivated) (
		SLLEDArrayItf self,
		SLuint32 *lightMask
	);
	SLresult (*SetColor) (
		SLLEDArrayItf self,
		SLuint8 index,
		const SLHSL *color
	);
	SLresult (*GetColor) (
		SLLEDArrayItf self,
		SLuint8 index,
		SLHSL *color
	);
};

/*---------------------------------------------------------------------------*/
/* Capabilities of the Vibra IODevice                                        */
/*---------------------------------------------------------------------------*/

typedef struct SLVibraDescriptor_ {
	SLboolean supportsFrequency;
	SLboolean supportsIntensity;
	SLmilliHertz  minFrequency;
	SLmilliHertz  maxFrequency;
} SLVibraDescriptor;



/*---------------------------------------------------------------------------*/
/* Vibra interface                                                           */
/*---------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_VIBRA;


struct SLVibraItf_;
typedef const struct SLVibraItf_ * const * SLVibraItf;

struct SLVibraItf_ {
	SLresult (*Vibrate) (
		SLVibraItf self,
		SLboolean vibrate
	);
	SLresult (*IsVibrating) (
		SLVibraItf self,
		SLboolean *pVibrating
	);
	SLresult (*SetFrequency) (
		SLVibraItf self,
		SLmilliHertz frequency
	);
	SLresult (*GetFrequency) (
		SLVibraItf self,
		SLmilliHertz *pFrequency
	);
	SLresult (*SetIntensity) (
		SLVibraItf self,
		SLpermille intensity
	);
	SLresult (*GetIntensity) (
		SLVibraItf self,
		SLpermille *pIntensity
	);
};


/*---------------------------------------------------------------------------*/
/* Meta data extraction related types and interface                          */
/*---------------------------------------------------------------------------*/

#define SL_CHARACTERENCODING_UNKNOWN			((SLuint32) 0x00000000)
#define SL_CHARACTERENCODING_BINARY       ((SLuint32) 0x00000001)
#define SL_CHARACTERENCODING_ASCII        ((SLuint32) 0x00000002)
#define SL_CHARACTERENCODING_BIG5         ((SLuint32) 0x00000003)
#define SL_CHARACTERENCODING_CODEPAGE1252		((SLuint32) 0x00000004)
#define SL_CHARACTERENCODING_GB2312			((SLuint32) 0x00000005)
#define SL_CHARACTERENCODING_HZGB2312			((SLuint32) 0x00000006)
#define SL_CHARACTERENCODING_GB12345			((SLuint32) 0x00000007)
#define SL_CHARACTERENCODING_GB18030			((SLuint32) 0x00000008)
#define SL_CHARACTERENCODING_GBK				((SLuint32) 0x00000009)
#define SL_CHARACTERENCODING_IMAPUTF7			((SLuint32) 0x0000000A)
#define SL_CHARACTERENCODING_ISO2022JP			((SLuint32) 0x0000000B)
#define SL_CHARACTERENCODING_ISO2022JP1		((SLuint32) 0x0000000B)
#define SL_CHARACTERENCODING_ISO88591			((SLuint32) 0x0000000C)
#define SL_CHARACTERENCODING_ISO885910			((SLuint32) 0x0000000D)
#define SL_CHARACTERENCODING_ISO885913			((SLuint32) 0x0000000E)
#define SL_CHARACTERENCODING_ISO885914			((SLuint32) 0x0000000F)
#define SL_CHARACTERENCODING_ISO885915			((SLuint32) 0x00000010)
#define SL_CHARACTERENCODING_ISO88592			((SLuint32) 0x00000011)
#define SL_CHARACTERENCODING_ISO88593			((SLuint32) 0x00000012)
#define SL_CHARACTERENCODING_ISO88594			((SLuint32) 0x00000013)
#define SL_CHARACTERENCODING_ISO88595			((SLuint32) 0x00000014)
#define SL_CHARACTERENCODING_ISO88596			((SLuint32) 0x00000015)
#define SL_CHARACTERENCODING_ISO88597			((SLuint32) 0x00000016)
#define SL_CHARACTERENCODING_ISO88598			((SLuint32) 0x00000017)
#define SL_CHARACTERENCODING_ISO88599			((SLuint32) 0x00000018)
#define SL_CHARACTERENCODING_ISOEUCJP			((SLuint32) 0x00000019)
#define SL_CHARACTERENCODING_SHIFTJIS			((SLuint32) 0x0000001A)
#define SL_CHARACTERENCODING_SMS7BIT			((SLuint32) 0x0000001B)
#define SL_CHARACTERENCODING_UTF7			((SLuint32) 0x0000001C)
#define SL_CHARACTERENCODING_UTF8			((SLuint32) 0x0000001D)
#define SL_CHARACTERENCODING_JAVACONFORMANTUTF8	((SLuint32) 0x0000001E)
#define SL_CHARACTERENCODING_UTF16BE			((SLuint32) 0x0000001F)
#define SL_CHARACTERENCODING_UTF16LE			((SLuint32) 0x00000020)


#define SL_METADATA_FILTER_KEY		((SLuint8) 0x01)
#define SL_METADATA_FILTER_LANG		((SLuint8) 0x02)
#define SL_METADATA_FILTER_ENCODING	((SLuint8) 0x04)


typedef struct SLMetadataInfo_ {
    SLuint32     size;
    SLuint32     encoding;
    SLchar       langCountry[16];
    SLuint8      data[1];
} SLMetadataInfo;

extern SL_API const SLInterfaceID SL_IID_METADATAEXTRACTION;

struct SLMetadataExtractionItf_;
typedef const struct SLMetadataExtractionItf_ * const * SLMetadataExtractionItf;


struct SLMetadataExtractionItf_ {
	SLresult (*GetItemCount) (
		SLMetadataExtractionItf self,
		SLuint32 *pItemCount
	);
	SLresult (*GetKeySize) (
		SLMetadataExtractionItf self,
		SLuint32 index,
		SLuint32 *pKeySize
	);
	SLresult (*GetKey) (
		SLMetadataExtractionItf self,
		SLuint32 index,
		SLuint32 keySize,
		SLMetadataInfo *pKey
	);
	SLresult (*GetValueSize) (
		SLMetadataExtractionItf self,
		SLuint32 index,
		SLuint32 *pValueSize
	);
	SLresult (*GetValue) (
		SLMetadataExtractionItf self,
		SLuint32 index,
		SLuint32 valueSize,
		SLMetadataInfo *pValue
	);
	SLresult (*AddKeyFilter) (
		SLMetadataExtractionItf self,
		SLuint32 keySize,
		const void *pKey,
		SLuint32 keyEncoding,
		const SLchar *pValueLangCountry,
		SLuint32 valueEncoding,
		SLuint8 filterMask
	);
	SLresult (*ClearKeyFilter) (
		SLMetadataExtractionItf self
	);
};


/*---------------------------------------------------------------------------*/
/* Meta data traversal related types and interface                          */
/*---------------------------------------------------------------------------*/

#define SL_METADATATRAVERSALMODE_ALL	((SLuint32) 0x00000001)
#define SL_METADATATRAVERSALMODE_NODE	((SLuint32) 0x00000002)


#define SL_NODETYPE_UNSPECIFIED	((SLuint32) 0x00000001)
#define SL_NODETYPE_AUDIO		((SLuint32) 0x00000002)
#define SL_NODETYPE_VIDEO		((SLuint32) 0x00000003)
#define SL_NODETYPE_IMAGE		((SLuint32) 0x00000004)

#define SL_NODE_PARENT 0xFFFFFFFF

extern SL_API const SLInterfaceID SL_IID_METADATATRAVERSAL;

struct SLMetadataTraversalItf_;
typedef const struct SLMetadataTraversalItf_ * const * SLMetadataTraversalItf;

struct SLMetadataTraversalItf_ {
	SLresult (*SetMode) (
		SLMetadataTraversalItf self,
		SLuint32 mode
	);
	SLresult (*GetChildCount) (
		SLMetadataTraversalItf self,
		SLuint32 *pCount
	);
	SLresult (*GetChildMIMETypeSize) (
		SLMetadataTraversalItf self,
		SLuint32 index,
		SLuint32 *pSize
	);
	SLresult (*GetChildInfo) (
		SLMetadataTraversalItf self,
		SLuint32 index,
		SLint32 *pNodeID,
		SLuint32 *pType,
		SLuint32 size,
		SLchar *pMimeType
	);
	SLresult (*SetActiveNode) (
		SLMetadataTraversalItf self,
		SLuint32 index
	);
};

/*---------------------------------------------------------------------------*/
/* Dynamic Source types and interface                                        */
/*---------------------------------------------------------------------------*/

extern SL_API const SLInterfaceID SL_IID_DYNAMICSOURCE;

struct SLDynamicSourceItf_;
typedef const struct SLDynamicSourceItf_ * const * SLDynamicSourceItf;

struct SLDynamicSourceItf_ {
	SLresult (*SetSource) (
		SLDynamicSourceItf self,
		SLDataSource *pDataSource
	);
};

/*---------------------------------------------------------------------------*/
/* Output Mix interface                                                      */
/*---------------------------------------------------------------------------*/

extern SL_API const SLInterfaceID SL_IID_OUTPUTMIX;

struct SLOutputMixItf_;
typedef const struct SLOutputMixItf_ * const * SLOutputMixItf;

typedef void (SLAPIENTRY *slMixDeviceChangeCallback) (
	SLOutputMixItf caller,
    void *pContext
);


struct SLOutputMixItf_ {
	SLresult (*GetDestinationOutputDeviceIDs) (
		SLOutputMixItf self,
		SLint32 *pNumDevices,
		SLuint32 *pDeviceIDs
	);
	SLresult (*RegisterDeviceChangeCallback) (
		SLOutputMixItf self,
		slMixDeviceChangeCallback callback,
		void *pContext
    );
    SLresult (*ReRoute)(
        SLOutputMixItf self,
        SLint32 numOutputDevices,
        SLuint32 *pOutputDeviceIDs
    );
};


/*---------------------------------------------------------------------------*/
/* Playback interface                                                        */
/*---------------------------------------------------------------------------*/

/** Playback states */
#define SL_PLAYSTATE_STOPPED	((SLuint32) 0x00000001)
#define SL_PLAYSTATE_PAUSED	((SLuint32) 0x00000002)
#define SL_PLAYSTATE_PLAYING	((SLuint32) 0x00000003)

/** Play events **/
#define SL_PLAYEVENT_HEADATEND		((SLuint32) 0x00000001)
#define SL_PLAYEVENT_HEADATMARKER	((SLuint32) 0x00000002)
#define SL_PLAYEVENT_HEADATNEWPOS	((SLuint32) 0x00000004)
#define SL_PLAYEVENT_HEADMOVING		((SLuint32) 0x00000008)
#define SL_PLAYEVENT_HEADSTALLED	((SLuint32) 0x00000010)

#define SL_TIME_UNKNOWN	((SLuint32) 0xFFFFFFFF)


extern SL_API const SLInterfaceID SL_IID_PLAY;

/** Playback interface methods */

struct SLPlayItf_;
typedef const struct SLPlayItf_ * const * SLPlayItf;

typedef void (SLAPIENTRY *slPlayCallback) (
	SLPlayItf caller,
	void *pContext,
	SLuint32 event
);

struct SLPlayItf_ {
	SLresult (*SetPlayState) (
		SLPlayItf self,
		SLuint32 state
	);
	SLresult (*GetPlayState) (
		SLPlayItf self,
		SLuint32 *pState
	);
	SLresult (*GetDuration) (
		SLPlayItf self,
		SLmillisecond *pMsec
	);
	SLresult (*GetPosition) (
		SLPlayItf self,
		SLmillisecond *pMsec
	);
	SLresult (*RegisterCallback) (
		SLPlayItf self,
		slPlayCallback callback,
		void *pContext
	);
	SLresult (*SetCallbackEventsMask) (
		SLPlayItf self,
		SLuint32 eventFlags
	);
	SLresult (*GetCallbackEventsMask) (
		SLPlayItf self,
		SLuint32 *pEventFlags
	);
	SLresult (*SetMarkerPosition) (
		SLPlayItf self,
		SLmillisecond mSec
	);
	SLresult (*ClearMarkerPosition) (
		SLPlayItf self
	);
	SLresult (*GetMarkerPosition) (
		SLPlayItf self,
		SLmillisecond *pMsec
	);
	SLresult (*SetPositionUpdatePeriod) (
		SLPlayItf self,
		SLmillisecond mSec
	);
	SLresult (*GetPositionUpdatePeriod) (
		SLPlayItf self,
		SLmillisecond *pMsec
	);
};

/*---------------------------------------------------------------------------*/
/* Prefetch status interface                                                 */
/*---------------------------------------------------------------------------*/

#define SL_PREFETCHEVENT_STATUSCHANGE		((SLuint32) 0x00000001)
#define SL_PREFETCHEVENT_FILLLEVELCHANGE	((SLuint32) 0x00000002)

#define SL_PREFETCHSTATUS_UNDERFLOW		((SLuint32) 0x00000001)
#define SL_PREFETCHSTATUS_SUFFICIENTDATA	((SLuint32) 0x00000002)
#define SL_PREFETCHSTATUS_OVERFLOW		((SLuint32) 0x00000003)


extern SL_API const SLInterfaceID SL_IID_PREFETCHSTATUS;


/** Prefetch status interface methods */

struct SLPrefetchStatusItf_;
typedef const struct SLPrefetchStatusItf_ * const * SLPrefetchStatusItf;

typedef void (SLAPIENTRY *slPrefetchCallback) (
	SLPrefetchStatusItf caller,
	void *pContext,
	SLuint32 event
);

struct SLPrefetchStatusItf_ {
	SLresult (*GetPrefetchStatus) (
		SLPrefetchStatusItf self,
		SLuint32 *pStatus
	);
	SLresult (*GetFillLevel) (
		SLPrefetchStatusItf self,
		SLpermille *pLevel
	);
	SLresult (*RegisterCallback) (
		SLPrefetchStatusItf self,
		slPrefetchCallback callback,
		void *pContext
	);
	SLresult (*SetCallbackEventsMask) (
		SLPrefetchStatusItf self,
		SLuint32 eventFlags
	);
	SLresult (*GetCallbackEventsMask) (
		SLPrefetchStatusItf self,
		SLuint32 *pEventFlags
	);
	SLresult (*SetFillUpdatePeriod) (
		SLPrefetchStatusItf self,
		SLpermille period
	);
	SLresult (*GetFillUpdatePeriod) (
		SLPrefetchStatusItf self,
		SLpermille *pPeriod
	);
};

/*---------------------------------------------------------------------------*/
/* Playback Rate interface                                                   */
/*---------------------------------------------------------------------------*/

#define SL_RATEPROP_RESERVED1		  		((SLuint32) 0x00000001)
#define SL_RATEPROP_RESERVED2		  		((SLuint32) 0x00000002)
#define SL_RATEPROP_SILENTAUDIO				((SLuint32) 0x00000100)
#define SL_RATEPROP_STAGGEREDAUDIO	((SLuint32) 0x00000200)
#define SL_RATEPROP_NOPITCHCORAUDIO	((SLuint32) 0x00000400)
#define SL_RATEPROP_PITCHCORAUDIO	((SLuint32) 0x00000800)


extern SL_API const SLInterfaceID SL_IID_PLAYBACKRATE;

struct SLPlaybackRateItf_;
typedef const struct SLPlaybackRateItf_ * const * SLPlaybackRateItf;

struct SLPlaybackRateItf_ {
	SLresult (*SetRate)(
		SLPlaybackRateItf self,
		SLpermille rate
	);
	SLresult (*GetRate)(
		SLPlaybackRateItf self,
		SLpermille *pRate
	);
	SLresult (*SetPropertyConstraints)(
		SLPlaybackRateItf self,
		SLuint32 constraints
	);
	SLresult (*GetProperties)(
		SLPlaybackRateItf self,
		SLuint32 *pProperties
	);
	SLresult (*GetCapabilitiesOfRate)(
		SLPlaybackRateItf self,
		SLpermille rate,
		SLuint32 *pCapabilities
	);
	SLresult (*GetRateRange) (
		SLPlaybackRateItf self,
		SLuint8 index,
		SLpermille *pMinRate,
		SLpermille *pMaxRate,
		SLpermille *pStepSize,
		SLuint32 *pCapabilities
	);
};

/*---------------------------------------------------------------------------*/
/* Seek Interface                                                            */
/*---------------------------------------------------------------------------*/

#define SL_SEEKMODE_FAST		((SLuint32) 0x0001)
#define SL_SEEKMODE_ACCURATE	((SLuint32) 0x0002)

extern SL_API const SLInterfaceID SL_IID_SEEK;

struct SLSeekItf_;
typedef const struct SLSeekItf_ * const * SLSeekItf;

struct SLSeekItf_ {
	SLresult (*SetPosition)(
		SLSeekItf self,
		SLmillisecond pos,
		SLuint32 seekMode
	);
	SLresult (*SetLoop)(
		SLSeekItf self,
		SLboolean loopEnable,
		SLmillisecond startPos,
		SLmillisecond endPos
	);
	SLresult (*GetLoop)(
		SLSeekItf self,
		SLboolean *pLoopEnabled,
		SLmillisecond *pStartPos,
		SLmillisecond *pEndPos
	);
};

/*---------------------------------------------------------------------------*/
/* Standard Recording Interface                                              */
/*---------------------------------------------------------------------------*/

/** Recording states */
#define SL_RECORDSTATE_STOPPED 	((SLuint32) 0x00000001)
#define SL_RECORDSTATE_PAUSED	((SLuint32) 0x00000002)
#define SL_RECORDSTATE_RECORDING	((SLuint32) 0x00000003)


/** Record event **/
#define SL_RECORDEVENT_HEADATLIMIT	((SLuint32) 0x00000001)
#define SL_RECORDEVENT_HEADATMARKER	((SLuint32) 0x00000002)
#define SL_RECORDEVENT_HEADATNEWPOS	((SLuint32) 0x00000004)
#define SL_RECORDEVENT_HEADMOVING	((SLuint32) 0x00000008)
#define SL_RECORDEVENT_HEADSTALLED 	((SLuint32) 0x00000010)
/* Note: SL_RECORDEVENT_BUFFER_INSUFFICIENT is deprecated, use SL_RECORDEVENT_BUFFER_FULL instead. */
#define SL_RECORDEVENT_BUFFER_INSUFFICIENT      ((SLuint32) 0x00000020)
#define SL_RECORDEVENT_BUFFER_FULL	((SLuint32) 0x00000020)


extern SL_API const SLInterfaceID SL_IID_RECORD;

struct SLRecordItf_;
typedef const struct SLRecordItf_ * const * SLRecordItf;

typedef void (SLAPIENTRY *slRecordCallback) (
	SLRecordItf caller,
	void *pContext,
	SLuint32 event
);

/** Recording interface methods */
struct SLRecordItf_ {
	SLresult (*SetRecordState) (
		SLRecordItf self,
		SLuint32 state
	);
	SLresult (*GetRecordState) (
		SLRecordItf self,
		SLuint32 *pState
	);
	SLresult (*SetDurationLimit) (
		SLRecordItf self,
		SLmillisecond msec
	);
	SLresult (*GetPosition) (
		SLRecordItf self,
		SLmillisecond *pMsec
	);
	SLresult (*RegisterCallback) (
		SLRecordItf self,
		slRecordCallback callback,
		void *pContext
	);
	SLresult (*SetCallbackEventsMask) (
		SLRecordItf self,
		SLuint32 eventFlags
	);
	SLresult (*GetCallbackEventsMask) (
		SLRecordItf self,
		SLuint32 *pEventFlags
	);
	SLresult (*SetMarkerPosition) (
		SLRecordItf self,
		SLmillisecond mSec
	);
	SLresult (*ClearMarkerPosition) (
		SLRecordItf self
	);
	SLresult (*GetMarkerPosition) (
		SLRecordItf self,
		SLmillisecond *pMsec
	);
	SLresult (*SetPositionUpdatePeriod) (
		SLRecordItf self,
		SLmillisecond mSec
	);
	SLresult (*GetPositionUpdatePeriod) (
		SLRecordItf self,
		SLmillisecond *pMsec
	);
};

/*---------------------------------------------------------------------------*/
/* Equalizer interface                                                       */
/*---------------------------------------------------------------------------*/

#define SL_EQUALIZER_UNDEFINED				((SLuint16) 0xFFFF)

extern SL_API const SLInterfaceID SL_IID_EQUALIZER;

struct SLEqualizerItf_;
typedef const struct SLEqualizerItf_ * const * SLEqualizerItf;

struct SLEqualizerItf_ {
	SLresult (*SetEnabled)(
		SLEqualizerItf self,
		SLboolean enabled
	);
	SLresult (*IsEnabled)(
		SLEqualizerItf self,
		SLboolean *pEnabled
	);
	SLresult (*GetNumberOfBands)(
		SLEqualizerItf self,
		SLuint16 *pAmount
	);
	SLresult (*GetBandLevelRange)(
		SLEqualizerItf self,
		SLmillibel *pMin,
		SLmillibel *pMax
	);
	SLresult (*SetBandLevel)(
		SLEqualizerItf self,
		SLuint16 band,
		SLmillibel level
	);
	SLresult (*GetBandLevel)(
		SLEqualizerItf self,
		SLuint16 band,
		SLmillibel *pLevel
	);
	SLresult (*GetCenterFreq)(
		SLEqualizerItf self,
		SLuint16 band,
		SLmilliHertz *pCenter
	);
	SLresult (*GetBandFreqRange)(
		SLEqualizerItf self,
		SLuint16 band,
		SLmilliHertz *pMin,
		SLmilliHertz *pMax
	);
	SLresult (*GetBand)(
		SLEqualizerItf self,
		SLmilliHertz frequency,
		SLuint16 *pBand
	);
	SLresult (*GetCurrentPreset)(
		SLEqualizerItf self,
		SLuint16 *pPreset
	);
	SLresult (*UsePreset)(
		SLEqualizerItf self,
		SLuint16 index
	);
	SLresult (*GetNumberOfPresets)(
		SLEqualizerItf self,
		SLuint16 *pNumPresets
	);
	SLresult (*GetPresetName)(
		SLEqualizerItf self,
		SLuint16 index,
		const SLchar ** ppName
	);
};

/*---------------------------------------------------------------------------*/
/* Volume Interface                                                           */
/* --------------------------------------------------------------------------*/

extern SL_API const SLInterfaceID SL_IID_VOLUME;

struct SLVolumeItf_;
typedef const struct SLVolumeItf_ * const * SLVolumeItf;

struct SLVolumeItf_ {
	SLresult (*SetVolumeLevel) (
		SLVolumeItf self,
		SLmillibel level
	);
	SLresult (*GetVolumeLevel) (
		SLVolumeItf self,
		SLmillibel *pLevel
	);
	SLresult (*GetMaxVolumeLevel) (
		SLVolumeItf  self,
		SLmillibel *pMaxLevel
	);
	SLresult (*SetMute) (
		SLVolumeItf self,
		SLboolean mute
	);
	SLresult (*GetMute) (
		SLVolumeItf self,
		SLboolean *pMute
	);
	SLresult (*EnableStereoPosition) (
		SLVolumeItf self,
		SLboolean enable
	);
	SLresult (*IsEnabledStereoPosition) (
		SLVolumeItf self,
		SLboolean *pEnable
	);
	SLresult (*SetStereoPosition) (
		SLVolumeItf self,
		SLpermille stereoPosition
	);
	SLresult (*GetStereoPosition) (
		SLVolumeItf self,
		SLpermille *pStereoPosition
	);
};


/*---------------------------------------------------------------------------*/
/* Device Volume Interface                                                   */
/* --------------------------------------------------------------------------*/

extern SL_API const SLInterfaceID SL_IID_DEVICEVOLUME;

struct SLDeviceVolumeItf_;
typedef const struct SLDeviceVolumeItf_ * const * SLDeviceVolumeItf;

struct SLDeviceVolumeItf_ {
	SLresult (*GetVolumeScale) (
		SLDeviceVolumeItf self,
		SLuint32 deviceID,
		SLint32 *pMinValue,
		SLint32 *pMaxValue,
		SLboolean *pIsMillibelScale
	);
	SLresult (*SetVolume) (
		SLDeviceVolumeItf self,
		SLuint32 deviceID,
		SLint32 volume
	);
	SLresult (*GetVolume) (
		SLDeviceVolumeItf self,
		SLuint32 deviceID,
		SLint32 *pVolume
	);
};


/*---------------------------------------------------------------------------*/
/* Buffer Queue Interface                                                    */
/*---------------------------------------------------------------------------*/

extern SL_API const SLInterfaceID SL_IID_BUFFERQUEUE;

struct SLBufferQueueItf_;
typedef const struct SLBufferQueueItf_ * const * SLBufferQueueItf;

typedef void (SLAPIENTRY *slBufferQueueCallback)(
	SLBufferQueueItf caller,
	void *pContext
);

/** Buffer queue state **/

typedef struct SLBufferQueueState_ {
	SLuint32	count;
	SLuint32	playIndex;
} SLBufferQueueState;


struct SLBufferQueueItf_ {
	SLresult (*Enqueue) (
		SLBufferQueueItf self,
		const void *pBuffer,
		SLuint32 size
	);
	SLresult (*Clear) (
		SLBufferQueueItf self
	);
	SLresult (*GetState) (
		SLBufferQueueItf self,
		SLBufferQueueState *pState
	);
	SLresult (*RegisterCallback) (
		SLBufferQueueItf self,
		slBufferQueueCallback callback,
		void* pContext
	);
};


/*---------------------------------------------------------------------------*/
/* PresetReverb                                                              */
/*---------------------------------------------------------------------------*/

#define SL_REVERBPRESET_NONE		((SLuint16) 0x0000)
#define SL_REVERBPRESET_SMALLROOM	((SLuint16) 0x0001)
#define SL_REVERBPRESET_MEDIUMROOM	((SLuint16) 0x0002)
#define SL_REVERBPRESET_LARGEROOM	((SLuint16) 0x0003)
#define SL_REVERBPRESET_MEDIUMHALL	((SLuint16) 0x0004)
#define SL_REVERBPRESET_LARGEHALL	((SLuint16) 0x0005)
#define SL_REVERBPRESET_PLATE 		((SLuint16) 0x0006)


extern SL_API const SLInterfaceID SL_IID_PRESETREVERB;

struct SLPresetReverbItf_;
typedef const struct SLPresetReverbItf_ * const * SLPresetReverbItf;

struct SLPresetReverbItf_ {
	SLresult (*SetPreset) (
		SLPresetReverbItf self,
		SLuint16 preset
	);
	SLresult (*GetPreset) (
		SLPresetReverbItf self,
		SLuint16 *pPreset
	);
};


/*---------------------------------------------------------------------------*/
/* EnvironmentalReverb                                                       */
/*---------------------------------------------------------------------------*/

#define SL_I3DL2_ENVIRONMENT_PRESET_DEFAULT \
	{ SL_MILLIBEL_MIN,    0,  1000,   500, SL_MILLIBEL_MIN,  20, SL_MILLIBEL_MIN,  40, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_GENERIC \
	{ -1000, -100, 1490,  830, -2602,   7,   200,  11, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_PADDEDCELL \
	{ -1000,-6000,  170,  100, -1204,   1,   207,   2, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_ROOM \
	{ -1000, -454,  400,  830, -1646,   2,    53,   3, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_BATHROOM \
	{ -1000,-1200, 1490,  540,  -370,   7,  1030,  11, 1000, 600 }
#define SL_I3DL2_ENVIRONMENT_PRESET_LIVINGROOM \
	{ -1000,-6000,  500,  100, -1376,   3, -1104,   4, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_STONEROOM \
	{ -1000, -300, 2310,  640,  -711,  12,    83,  17, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_AUDITORIUM \
	{ -1000, -476, 4320,  590,  -789,  20,  -289,  30, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_CONCERTHALL \
	{ -1000, -500, 3920,  700, -1230,  20,    -2,  29, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_CAVE \
	{ -1000,    0, 2910, 1300,  -602,  15,  -302,  22, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_ARENA \
	{ -1000, -698, 7240,  330, -1166,  20,    16,  30, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_HANGAR \
	{ -1000,-1000, 10050,  230,  -602,  20,   198,  30, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY \
	{ -1000,-4000,  300,  100, -1831,   2, -1630,  30, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_HALLWAY \
	{ -1000, -300, 1490,  590, -1219,   7,   441,  11, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR \
	{ -1000, -237, 2700,  790, -1214,  13,   395,  20, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_ALLEY \
	{ -1000, -270, 1490,  860, -1204,   7,    -4,  11, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_FOREST \
	{ -1000,-3300, 1490,  540, -2560, 162,  -613,  88,  790,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_CITY \
	{ -1000, -800, 1490,  670, -2273,   7, -2217,  11,  500,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_MOUNTAINS \
	{ -1000,-2500, 1490,  210, -2780, 300, -2014, 100,  270,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_QUARRY \
	{ -1000,-1000, 1490,  830, SL_MILLIBEL_MIN,  61,   500,  25, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_PLAIN \
	{ -1000,-2000, 1490,  500, -2466, 179, -2514, 100,  210,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_PARKINGLOT \
	{ -1000,    0, 1650, 1500, -1363,   8, -1153,  12, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_SEWERPIPE \
	{ -1000,-1000, 2810,  140,   429,  14,   648,  21,  800, 600 }
#define SL_I3DL2_ENVIRONMENT_PRESET_UNDERWATER \
	{ -1000,-4000, 1490,  100,  -449,   7,  1700,  11, 1000,1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_SMALLROOM \
	{ -1000,-600, 1100, 830, -400, 5, 500, 10, 1000, 1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM \
	{ -1000,-600, 1300, 830, -1000, 20, -200, 20, 1000, 1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_LARGEROOM \
	{ -1000,-600, 1500, 830, -1600, 5, -1000, 40, 1000, 1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL \
	{ -1000,-600, 1800, 700, -1300, 15, -800, 30, 1000, 1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_LARGEHALL \
	{ -1000,-600, 1800, 700, -2000, 30, -1400, 60, 1000, 1000 }
#define SL_I3DL2_ENVIRONMENT_PRESET_PLATE \
	{ -1000,-200, 1300, 900, 0, 2, 0, 10, 1000, 750 }


typedef struct SLEnvironmentalReverbSettings_ {
	SLmillibel    roomLevel;
	SLmillibel    roomHFLevel;
	SLmillisecond decayTime;
	SLpermille    decayHFRatio;
	SLmillibel    reflectionsLevel;
	SLmillisecond reflectionsDelay;
	SLmillibel    reverbLevel;
	SLmillisecond reverbDelay;
	SLpermille    diffusion;
	SLpermille    density;
} SLEnvironmentalReverbSettings;




extern SL_API const SLInterfaceID SL_IID_ENVIRONMENTALREVERB;


struct SLEnvironmentalReverbItf_;
typedef const struct SLEnvironmentalReverbItf_ * const * SLEnvironmentalReverbItf;

struct SLEnvironmentalReverbItf_ {
	SLresult (*SetRoomLevel) (
		SLEnvironmentalReverbItf self,
		SLmillibel room
	);
	SLresult (*GetRoomLevel) (
		SLEnvironmentalReverbItf self,
		SLmillibel *pRoom
	);
	SLresult (*SetRoomHFLevel) (
		SLEnvironmentalReverbItf self,
		SLmillibel roomHF
	);
	SLresult (*GetRoomHFLevel) (
		SLEnvironmentalReverbItf self,
		SLmillibel *pRoomHF
	);
	SLresult (*SetDecayTime) (
		SLEnvironmentalReverbItf self,
		SLmillisecond decayTime
	);
	SLresult (*GetDecayTime) (
		SLEnvironmentalReverbItf self,
		SLmillisecond *pDecayTime
	);
	SLresult (*SetDecayHFRatio) (
		SLEnvironmentalReverbItf self,
		SLpermille decayHFRatio
	);
	SLresult (*GetDecayHFRatio) (
		SLEnvironmentalReverbItf self,
		SLpermille *pDecayHFRatio
	);
	SLresult (*SetReflectionsLevel) (
		SLEnvironmentalReverbItf self,
		SLmillibel reflectionsLevel
	);
	SLresult (*GetReflectionsLevel) (
		SLEnvironmentalReverbItf self,
		SLmillibel *pReflectionsLevel
	);
	SLresult (*SetReflectionsDelay) (
		SLEnvironmentalReverbItf self,
		SLmillisecond reflectionsDelay
	);
	SLresult (*GetReflectionsDelay) (
		SLEnvironmentalReverbItf self,
		SLmillisecond *pReflectionsDelay
	);
	SLresult (*SetReverbLevel) (
		SLEnvironmentalReverbItf self,
		SLmillibel reverbLevel
	);
	SLresult (*GetReverbLevel) (
		SLEnvironmentalReverbItf self,
		SLmillibel *pReverbLevel
	);
	SLresult (*SetReverbDelay) (
		SLEnvironmentalReverbItf self,
		SLmillisecond reverbDelay
	);
	SLresult (*GetReverbDelay) (
		SLEnvironmentalReverbItf self,
		SLmillisecond *pReverbDelay
	);
	SLresult (*SetDiffusion) (
		SLEnvironmentalReverbItf self,
		SLpermille diffusion
	);
	SLresult (*GetDiffusion) (
		SLEnvironmentalReverbItf self,
		SLpermille *pDiffusion
	);
	SLresult (*SetDensity) (
		SLEnvironmentalReverbItf self,
		SLpermille density
	);
	SLresult (*GetDensity) (
		SLEnvironmentalReverbItf self,
		SLpermille *pDensity
	);
	SLresult (*SetEnvironmentalReverbProperties) (
		SLEnvironmentalReverbItf self,
		const SLEnvironmentalReverbSettings *pProperties
	);
	SLresult (*GetEnvironmentalReverbProperties) (
		SLEnvironmentalReverbItf self,
		SLEnvironmentalReverbSettings *pProperties
	);
};

/*---------------------------------------------------------------------------*/
/* Effects Send Interface                                                    */
/*---------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_EFFECTSEND;

struct SLEffectSendItf_;
typedef const struct SLEffectSendItf_ * const * SLEffectSendItf;

struct SLEffectSendItf_ {
	SLresult (*EnableEffectSend) (
		SLEffectSendItf self,
		const void *pAuxEffect,
		SLboolean enable,
		SLmillibel initialLevel
	);
	SLresult (*IsEnabled) (
		SLEffectSendItf self,
		const void * pAuxEffect,
		SLboolean *pEnable
	);
	SLresult (*SetDirectLevel) (
		SLEffectSendItf self,
		SLmillibel directLevel
	);
	SLresult (*GetDirectLevel) (
		SLEffectSendItf self,
		SLmillibel *pDirectLevel
	);
	SLresult (*SetSendLevel) (
		SLEffectSendItf self,
		const void *pAuxEffect,
		SLmillibel sendLevel
	);
	SLresult (*GetSendLevel)(
		SLEffectSendItf self,
		const void *pAuxEffect,
		SLmillibel *pSendLevel
	);
};


/*---------------------------------------------------------------------------*/
/* 3D Grouping Interface                                                     */
/*---------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_3DGROUPING;


struct SL3DGroupingItf_ ;
typedef const struct SL3DGroupingItf_ * const * SL3DGroupingItf;

struct SL3DGroupingItf_ {
	SLresult (*Set3DGroup) (
		SL3DGroupingItf self,
		SLObjectItf group
	);
	SLresult (*Get3DGroup) (
		SL3DGroupingItf self,
		SLObjectItf *pGroup
	);
};


/*---------------------------------------------------------------------------*/
/* 3D Commit Interface                                                       */
/*---------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_3DCOMMIT;

struct SL3DCommitItf_;
typedef const struct SL3DCommitItf_* const * SL3DCommitItf;

struct SL3DCommitItf_ {
	SLresult (*Commit) (
		SL3DCommitItf self
	);
	SLresult (*SetDeferred) (
		SL3DCommitItf self,
		SLboolean deferred
	);
};


/*---------------------------------------------------------------------------*/
/* 3D Location Interface                                                     */
/*---------------------------------------------------------------------------*/

typedef struct SLVec3D_ {
	SLint32	x;
	SLint32	y;
	SLint32	z;
} SLVec3D;

extern SL_API const SLInterfaceID SL_IID_3DLOCATION;

struct SL3DLocationItf_;
typedef const struct SL3DLocationItf_ * const * SL3DLocationItf;

struct SL3DLocationItf_ {
	SLresult (*SetLocationCartesian) (
		SL3DLocationItf self,
		const SLVec3D *pLocation
	);
	SLresult (*SetLocationSpherical) (
		SL3DLocationItf self,
		SLmillidegree azimuth,
		SLmillidegree elevation,
		SLmillimeter distance
	);
	SLresult (*Move) (
		SL3DLocationItf self,
		const SLVec3D *pMovement
	);
	SLresult (*GetLocationCartesian) (
		SL3DLocationItf self,
		SLVec3D *pLocation
	);
	SLresult (*SetOrientationVectors) (
		SL3DLocationItf self,
		const SLVec3D *pFront,
		const SLVec3D *pAbove
	);
	SLresult (*SetOrientationAngles) (
		SL3DLocationItf self,
		SLmillidegree heading,
		SLmillidegree pitch,
		SLmillidegree roll
	);
	SLresult (*Rotate) (
		SL3DLocationItf self,
		SLmillidegree theta,
		const SLVec3D *pAxis
	);
	SLresult (*GetOrientationVectors) (
		SL3DLocationItf self,
		SLVec3D *pFront,
		SLVec3D *pUp
	);
};


/*---------------------------------------------------------------------------*/
/* 3D Doppler Interface                                                      */
/*---------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_3DDOPPLER;

struct SL3DDopplerItf_;
typedef const struct SL3DDopplerItf_ * const * SL3DDopplerItf;

struct SL3DDopplerItf_ {
	SLresult (*SetVelocityCartesian) (
		SL3DDopplerItf self,
		const SLVec3D *pVelocity
	);
	SLresult (*SetVelocitySpherical) (
		SL3DDopplerItf self,
		SLmillidegree azimuth,
		SLmillidegree elevation,
		SLmillimeter speed
	);
	SLresult (*GetVelocityCartesian) (
		SL3DDopplerItf self,
		SLVec3D *pVelocity
	);
	SLresult (*SetDopplerFactor) (
		SL3DDopplerItf self,
		SLpermille dopplerFactor
	);
	SLresult (*GetDopplerFactor) (
		SL3DDopplerItf self,
		SLpermille *pDopplerFactor
	);
};

/*---------------------------------------------------------------------------*/
/* 3D Source Interface and associated defines                                */
/* --------------------------------------------------------------------------*/

#define SL_ROLLOFFMODEL_EXPONENTIAL	((SLuint32) 0x00000000)
#define SL_ROLLOFFMODEL_LINEAR		((SLuint32) 0x00000001)


extern SL_API const SLInterfaceID SL_IID_3DSOURCE;

struct SL3DSourceItf_;
typedef const struct SL3DSourceItf_ * const * SL3DSourceItf;

struct SL3DSourceItf_ {
	SLresult (*SetHeadRelative) (
		SL3DSourceItf self,
		SLboolean headRelative
	);
	SLresult (*GetHeadRelative) (
		SL3DSourceItf self,
		SLboolean *pHeadRelative
	);
	SLresult (*SetRolloffDistances) (
		SL3DSourceItf self,
		SLmillimeter minDistance,
		SLmillimeter maxDistance
	);
	SLresult (*GetRolloffDistances) (
		SL3DSourceItf self,
		SLmillimeter *pMinDistance,
		SLmillimeter *pMaxDistance
	);
	SLresult (*SetRolloffMaxDistanceMute) (
		SL3DSourceItf self,
		SLboolean mute
	);
	SLresult (*GetRolloffMaxDistanceMute) (
		SL3DSourceItf self,
		SLboolean *pMute
	);
	SLresult (*SetRolloffFactor) (
		SL3DSourceItf self,
		SLpermille rolloffFactor
	);
	SLresult (*GetRolloffFactor) (
		SL3DSourceItf self,
		SLpermille *pRolloffFactor
	);
	SLresult (*SetRoomRolloffFactor) (
		SL3DSourceItf self,
		SLpermille roomRolloffFactor
	);
	SLresult (*GetRoomRolloffFactor) (
		SL3DSourceItf self,
		SLpermille *pRoomRolloffFactor
	);
	SLresult (*SetRolloffModel) (
		SL3DSourceItf self,
		SLuint8 model
	);
	SLresult (*GetRolloffModel) (
		SL3DSourceItf self,
		SLuint8 *pModel
	);
	SLresult (*SetCone) (
		SL3DSourceItf self,
		SLmillidegree innerAngle,
		SLmillidegree outerAngle,
		SLmillibel outerLevel
	);
	SLresult (*GetCone) (
		SL3DSourceItf self,
		SLmillidegree *pInnerAngle,
		SLmillidegree *pOuterAngle,
		SLmillibel *pOuterLevel
	);
};

/*---------------------------------------------------------------------------*/
/* 3D Macroscopic Interface                                                  */
/* --------------------------------------------------------------------------*/

extern SL_API const SLInterfaceID SL_IID_3DMACROSCOPIC;

struct SL3DMacroscopicItf_;
typedef const struct SL3DMacroscopicItf_ * const * SL3DMacroscopicItf;

struct SL3DMacroscopicItf_ {
	SLresult (*SetSize) (
		SL3DMacroscopicItf self,
		SLmillimeter width,
		SLmillimeter height,
		SLmillimeter depth
	);
	SLresult (*GetSize) (
		SL3DMacroscopicItf self,
		SLmillimeter *pWidth,
		SLmillimeter *pHeight,
		SLmillimeter *pDepth
	);
	SLresult (*SetOrientationAngles) (
		SL3DMacroscopicItf self,
		SLmillidegree heading,
		SLmillidegree pitch,
		SLmillidegree roll
	);
	SLresult (*SetOrientationVectors) (
		SL3DMacroscopicItf self,
		const SLVec3D *pFront,
		const SLVec3D *pAbove
	);
	SLresult (*Rotate) (
		SL3DMacroscopicItf self,
		SLmillidegree theta,
		const SLVec3D *pAxis
	);
	SLresult (*GetOrientationVectors) (
		SL3DMacroscopicItf self,
		SLVec3D *pFront,
		SLVec3D *pUp
	);
};

/*---------------------------------------------------------------------------*/
/* Mute Solo Interface                                                       */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_MUTESOLO;

struct SLMuteSoloItf_;
typedef const struct SLMuteSoloItf_ * const * SLMuteSoloItf;

struct SLMuteSoloItf_ {
	SLresult (*SetChannelMute) (
		SLMuteSoloItf self,
		SLuint8 chan,
		SLboolean mute
	);
	SLresult (*GetChannelMute) (
		SLMuteSoloItf self,
		SLuint8 chan,
		SLboolean *pMute
	);
	SLresult (*SetChannelSolo) (
		SLMuteSoloItf self,
		SLuint8 chan,
		SLboolean solo
	);
	SLresult (*GetChannelSolo) (
		SLMuteSoloItf self,
		SLuint8 chan,
		SLboolean *pSolo
	);
	SLresult (*GetNumChannels) (
		SLMuteSoloItf self,
		SLuint8 *pNumChannels
	);
};


/*---------------------------------------------------------------------------*/
/* Dynamic Interface Management Interface and associated types and macros    */
/* --------------------------------------------------------------------------*/

#define SL_DYNAMIC_ITF_EVENT_RUNTIME_ERROR			((SLuint32) 0x00000001)
#define SL_DYNAMIC_ITF_EVENT_ASYNC_TERMINATION		((SLuint32) 0x00000002)
#define SL_DYNAMIC_ITF_EVENT_RESOURCES_LOST			((SLuint32) 0x00000003)
#define SL_DYNAMIC_ITF_EVENT_RESOURCES_LOST_PERMANENTLY	((SLuint32) 0x00000004)
#define SL_DYNAMIC_ITF_EVENT_RESOURCES_AVAILABLE		((SLuint32) 0x00000005)




extern SL_API const SLInterfaceID SL_IID_DYNAMICINTERFACEMANAGEMENT;

struct SLDynamicInterfaceManagementItf_;
typedef const struct SLDynamicInterfaceManagementItf_ * const * SLDynamicInterfaceManagementItf;

typedef void (SLAPIENTRY *slDynamicInterfaceManagementCallback) (
	SLDynamicInterfaceManagementItf caller,
	void * pContext,
	SLuint32 event,
	SLresult result,
    const SLInterfaceID iid
);


struct SLDynamicInterfaceManagementItf_ {
	SLresult (*AddInterface) (
		SLDynamicInterfaceManagementItf self,
		const SLInterfaceID iid,
		SLboolean async
	);
	SLresult (*RemoveInterface) (
		SLDynamicInterfaceManagementItf self,
		const SLInterfaceID iid
	);
	SLresult (*ResumeInterface) (
		SLDynamicInterfaceManagementItf self,
		const SLInterfaceID iid,
		SLboolean async
	);
	SLresult (*RegisterCallback) (
		SLDynamicInterfaceManagementItf self,
		slDynamicInterfaceManagementCallback callback,
		void * pContext
	);
};

/*---------------------------------------------------------------------------*/
/* Midi Message Interface and associated types                               */
/* --------------------------------------------------------------------------*/

#define SL_MIDIMESSAGETYPE_NOTE_ON_OFF		((SLuint32) 0x00000001)
#define SL_MIDIMESSAGETYPE_POLY_PRESSURE	((SLuint32) 0x00000002)
#define SL_MIDIMESSAGETYPE_CONTROL_CHANGE	((SLuint32) 0x00000003)
#define SL_MIDIMESSAGETYPE_PROGRAM_CHANGE	((SLuint32) 0x00000004)
#define SL_MIDIMESSAGETYPE_CHANNEL_PRESSURE	((SLuint32) 0x00000005)
#define SL_MIDIMESSAGETYPE_PITCH_BEND		((SLuint32) 0x00000006)
#define SL_MIDIMESSAGETYPE_SYSTEM_MESSAGE	((SLuint32) 0x00000007)


extern SL_API const SLInterfaceID SL_IID_MIDIMESSAGE;

struct SLMIDIMessageItf_;
typedef const struct SLMIDIMessageItf_ * const * SLMIDIMessageItf;

typedef void (SLAPIENTRY *slMetaEventCallback) (
	SLMIDIMessageItf caller,
	void *pContext,
	SLuint8 type,
    SLuint32 length,
	const SLuint8 *pData,
	SLuint32 tick,
	SLuint16 track
);

typedef void (SLAPIENTRY *slMIDIMessageCallback) (
	SLMIDIMessageItf caller,
	void *pContext,
	SLuint8 statusByte,
	SLuint32 length,
	const SLuint8 *pData,
	SLuint32 tick,
	SLuint16 track
);

struct SLMIDIMessageItf_ {
	SLresult (*SendMessage) (
		SLMIDIMessageItf self,
		const SLuint8 *data,
		SLuint32 length
	);
	SLresult (*RegisterMetaEventCallback) (
		SLMIDIMessageItf self,
		slMetaEventCallback callback,
		void *pContext
	);
	SLresult (*RegisterMIDIMessageCallback) (
		SLMIDIMessageItf self,
		slMIDIMessageCallback callback,
		void *pContext
	);
	SLresult (*AddMIDIMessageCallbackFilter) (
		SLMIDIMessageItf self,
		SLuint32 messageType
	);
	SLresult (*ClearMIDIMessageCallbackFilter) (
		SLMIDIMessageItf self
	);
};


/*---------------------------------------------------------------------------*/
/* Midi Mute Solo interface                                                  */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_MIDIMUTESOLO;

struct SLMIDIMuteSoloItf_;
typedef const struct SLMIDIMuteSoloItf_ * const * SLMIDIMuteSoloItf;

struct SLMIDIMuteSoloItf_ {
	SLresult (*SetChannelMute) (
		SLMIDIMuteSoloItf self,
		SLuint8 channel,
		SLboolean mute
	);
	SLresult (*GetChannelMute) (
		SLMIDIMuteSoloItf self,
		SLuint8 channel,
		SLboolean *pMute
	);
	SLresult (*SetChannelSolo) (
		SLMIDIMuteSoloItf self,
		SLuint8 channel,
		SLboolean solo
	);
	SLresult (*GetChannelSolo) (
		SLMIDIMuteSoloItf self,
		SLuint8 channel,
		SLboolean *pSolo
	);
	SLresult (*GetTrackCount) (
		SLMIDIMuteSoloItf self,
		SLuint16 *pCount
	);
	SLresult (*SetTrackMute) (
		SLMIDIMuteSoloItf self,
		SLuint16 track,
		SLboolean mute
	);
	SLresult (*GetTrackMute) (
		SLMIDIMuteSoloItf self,
		SLuint16 track,
		SLboolean *pMute
	);
	SLresult (*SetTrackSolo) (
		SLMIDIMuteSoloItf self,
		SLuint16 track,
		SLboolean solo
	);
	SLresult (*GetTrackSolo) (
		SLMIDIMuteSoloItf self,
		SLuint16 track,
		SLboolean *pSolo
	);
};


/*---------------------------------------------------------------------------*/
/* Midi Tempo interface                                                      */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_MIDITEMPO;

struct SLMIDITempoItf_;
typedef const struct SLMIDITempoItf_ * const * SLMIDITempoItf;

struct SLMIDITempoItf_ {
	SLresult (*SetTicksPerQuarterNote) (
		SLMIDITempoItf self,
		SLuint32 tpqn
	);
	SLresult (*GetTicksPerQuarterNote) (
		SLMIDITempoItf self,
		SLuint32 *pTpqn
	);
	SLresult (*SetMicrosecondsPerQuarterNote) (
		SLMIDITempoItf self,
		SLmicrosecond uspqn
	);
	SLresult (*GetMicrosecondsPerQuarterNote) (
		SLMIDITempoItf self,
		SLmicrosecond *uspqn
	);
};


/*---------------------------------------------------------------------------*/
/* Midi Time interface                                                       */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_MIDITIME;

struct SLMIDITimeItf_;
typedef const struct SLMIDITimeItf_ * const * SLMIDITimeItf;

struct SLMIDITimeItf_ {
	SLresult (*GetDuration) (
		SLMIDITimeItf self,
		SLuint32 *pDuration
	);
	SLresult (*SetPosition) (
		SLMIDITimeItf self,
		SLuint32 position
	);
	SLresult (*GetPosition) (
		SLMIDITimeItf self,
		SLuint32 *pPosition
	);
	SLresult (*SetLoopPoints) (
		SLMIDITimeItf self,
		SLuint32 startTick,
		SLuint32 numTicks
	);
	SLresult (*GetLoopPoints) (
		SLMIDITimeItf self,
		SLuint32 *pStartTick,
		SLuint32 *pNumTicks
	);
};


/*---------------------------------------------------------------------------*/
/* Audio Decoder Capabilities Interface                                      */
/* --------------------------------------------------------------------------*/

/*Audio Codec related defines*/

#define SL_RATECONTROLMODE_CONSTANTBITRATE	((SLuint32) 0x00000001)
#define SL_RATECONTROLMODE_VARIABLEBITRATE	((SLuint32) 0x00000002)

#define SL_AUDIOCODEC_PCM         ((SLuint32) 0x00000001)
#define SL_AUDIOCODEC_MP3         ((SLuint32) 0x00000002)
#define SL_AUDIOCODEC_AMR         ((SLuint32) 0x00000003)
#define SL_AUDIOCODEC_AMRWB       ((SLuint32) 0x00000004)
#define SL_AUDIOCODEC_AMRWBPLUS   ((SLuint32) 0x00000005)
#define SL_AUDIOCODEC_AAC         ((SLuint32) 0x00000006)
#define SL_AUDIOCODEC_WMA         ((SLuint32) 0x00000007)
#define SL_AUDIOCODEC_REAL        ((SLuint32) 0x00000008)

#define SL_AUDIOPROFILE_PCM                   ((SLuint32) 0x00000001)

#define SL_AUDIOPROFILE_MPEG1_L3              ((SLuint32) 0x00000001)
#define SL_AUDIOPROFILE_MPEG2_L3              ((SLuint32) 0x00000002)
#define SL_AUDIOPROFILE_MPEG25_L3             ((SLuint32) 0x00000003)

#define SL_AUDIOCHANMODE_MP3_MONO             ((SLuint32) 0x00000001)
#define SL_AUDIOCHANMODE_MP3_STEREO           ((SLuint32) 0x00000002)
#define SL_AUDIOCHANMODE_MP3_JOINTSTEREO      ((SLuint32) 0x00000003)
#define SL_AUDIOCHANMODE_MP3_DUAL             ((SLuint32) 0x00000004)

#define SL_AUDIOPROFILE_AMR			((SLuint32) 0x00000001)

#define SL_AUDIOSTREAMFORMAT_CONFORMANCE	((SLuint32) 0x00000001)
#define SL_AUDIOSTREAMFORMAT_IF1			((SLuint32) 0x00000002)
#define SL_AUDIOSTREAMFORMAT_IF2			((SLuint32) 0x00000003)
#define SL_AUDIOSTREAMFORMAT_FSF			((SLuint32) 0x00000004)
#define SL_AUDIOSTREAMFORMAT_RTPPAYLOAD	((SLuint32) 0x00000005)
#define SL_AUDIOSTREAMFORMAT_ITU			((SLuint32) 0x00000006)

#define SL_AUDIOPROFILE_AMRWB			((SLuint32) 0x00000001)

#define SL_AUDIOPROFILE_AMRWBPLUS		((SLuint32) 0x00000001)

#define SL_AUDIOPROFILE_AAC_AAC			((SLuint32) 0x00000001)

#define SL_AUDIOMODE_AAC_MAIN			((SLuint32) 0x00000001)
#define SL_AUDIOMODE_AAC_LC			((SLuint32) 0x00000002)
#define SL_AUDIOMODE_AAC_SSR			((SLuint32) 0x00000003)
#define SL_AUDIOMODE_AAC_LTP			((SLuint32) 0x00000004)
#define SL_AUDIOMODE_AAC_HE			((SLuint32) 0x00000005)
#define SL_AUDIOMODE_AAC_SCALABLE		((SLuint32) 0x00000006)
#define SL_AUDIOMODE_AAC_ERLC			((SLuint32) 0x00000007)
#define SL_AUDIOMODE_AAC_LD			((SLuint32) 0x00000008)
#define SL_AUDIOMODE_AAC_HE_PS			((SLuint32) 0x00000009)
#define SL_AUDIOMODE_AAC_HE_MPS			((SLuint32) 0x0000000A)

#define SL_AUDIOSTREAMFORMAT_MP2ADTS		((SLuint32) 0x00000001)
#define SL_AUDIOSTREAMFORMAT_MP4ADTS		((SLuint32) 0x00000002)
#define SL_AUDIOSTREAMFORMAT_MP4LOAS		((SLuint32) 0x00000003)
#define SL_AUDIOSTREAMFORMAT_MP4LATM		((SLuint32) 0x00000004)
#define SL_AUDIOSTREAMFORMAT_ADIF		((SLuint32) 0x00000005)
#define SL_AUDIOSTREAMFORMAT_MP4FF		((SLuint32) 0x00000006)
#define SL_AUDIOSTREAMFORMAT_RAW			((SLuint32) 0x00000007)

#define SL_AUDIOPROFILE_WMA7		((SLuint32) 0x00000001)
#define SL_AUDIOPROFILE_WMA8		((SLuint32) 0x00000002)
#define SL_AUDIOPROFILE_WMA9		((SLuint32) 0x00000003)
#define SL_AUDIOPROFILE_WMA10		((SLuint32) 0x00000004)

#define SL_AUDIOMODE_WMA_LEVEL1		((SLuint32) 0x00000001)
#define SL_AUDIOMODE_WMA_LEVEL2		((SLuint32) 0x00000002)
#define SL_AUDIOMODE_WMA_LEVEL3		((SLuint32) 0x00000003)
#define SL_AUDIOMODE_WMA_LEVEL4		((SLuint32) 0x00000004)
#define SL_AUDIOMODE_WMAPRO_LEVELM0	((SLuint32) 0x00000005)
#define SL_AUDIOMODE_WMAPRO_LEVELM1	((SLuint32) 0x00000006)
#define SL_AUDIOMODE_WMAPRO_LEVELM2	((SLuint32) 0x00000007)
#define SL_AUDIOMODE_WMAPRO_LEVELM3	((SLuint32) 0x00000008)

#define SL_AUDIOPROFILE_REALAUDIO		((SLuint32) 0x00000001)

#define SL_AUDIOMODE_REALAUDIO_G2		((SLuint32) 0x00000001)
#define SL_AUDIOMODE_REALAUDIO_8			((SLuint32) 0x00000002)
#define SL_AUDIOMODE_REALAUDIO_10		((SLuint32) 0x00000003)
#define SL_AUDIOMODE_REALAUDIO_SURROUND	((SLuint32) 0x00000004)

typedef struct SLAudioCodecDescriptor_ {
    SLuint32      maxChannels;
    SLuint32      minBitsPerSample;
    SLuint32      maxBitsPerSample;
    SLmilliHertz  minSampleRate;
    SLmilliHertz  maxSampleRate;
    SLboolean     isFreqRangeContinuous;
    SLmilliHertz *pSampleRatesSupported;
    SLuint32      numSampleRatesSupported;
    SLuint32      minBitRate;
    SLuint32      maxBitRate;
    SLboolean     isBitrateRangeContinuous;
    SLuint32     *pBitratesSupported;
    SLuint32      numBitratesSupported;
    SLuint32	  profileSetting;
    SLuint32      modeSetting;
} SLAudioCodecDescriptor;

/*Structure used to retrieve the profile and level settings supported by an audio encoder */

typedef struct SLAudioCodecProfileMode_ {
    SLuint32 profileSetting;
    SLuint32 modeSetting;
} SLAudioCodecProfileMode;

extern SL_API const SLInterfaceID SL_IID_AUDIODECODERCAPABILITIES;

struct SLAudioDecoderCapabilitiesItf_;
typedef const struct SLAudioDecoderCapabilitiesItf_ * const * SLAudioDecoderCapabilitiesItf;

struct SLAudioDecoderCapabilitiesItf_ {
    SLresult (*GetAudioDecoders) (
        SLAudioDecoderCapabilitiesItf self,
        SLuint32 * pNumDecoders ,
        SLuint32 *pDecoderIds
    );
    SLresult (*GetAudioDecoderCapabilities) (
        SLAudioDecoderCapabilitiesItf self,
        SLuint32 decoderId,
        SLuint32 *pIndex,
        SLAudioCodecDescriptor *pDescriptor
    );
};




/*---------------------------------------------------------------------------*/
/* Audio Encoder Capabilities Interface                                      */
/* --------------------------------------------------------------------------*/

/* Structure used when setting audio encoding parameters */

typedef struct SLAudioEncoderSettings_ {
    SLuint32 encoderId;
    SLuint32 channelsIn;
    SLuint32 channelsOut;
    SLmilliHertz sampleRate;
    SLuint32 bitRate;
    SLuint32 bitsPerSample;
    SLuint32 rateControl;
    SLuint32 profileSetting;
    SLuint32 levelSetting;
    SLuint32 channelMode;
    SLuint32 streamFormat;
    SLuint32 encodeOptions;
    SLuint32 blockAlignment;
} SLAudioEncoderSettings;

extern SL_API const SLInterfaceID SL_IID_AUDIOENCODERCAPABILITIES;

struct SLAudioEncoderCapabilitiesItf_;
typedef const struct SLAudioEncoderCapabilitiesItf_ * const * SLAudioEncoderCapabilitiesItf;

struct SLAudioEncoderCapabilitiesItf_ {
    SLresult (*GetAudioEncoders) (
        SLAudioEncoderCapabilitiesItf self,
        SLuint32 *pNumEncoders ,
        SLuint32 *pEncoderIds
    );
    SLresult (*GetAudioEncoderCapabilities) (
        SLAudioEncoderCapabilitiesItf self,
        SLuint32 encoderId,
        SLuint32 *pIndex,
        SLAudioCodecDescriptor * pDescriptor
    );
};


/*---------------------------------------------------------------------------*/
/* Audio Encoder Interface                                                   */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_AUDIOENCODER;

struct SLAudioEncoderItf_;
typedef const struct SLAudioEncoderItf_ * const * SLAudioEncoderItf;

struct SLAudioEncoderItf_ {
    SLresult (*SetEncoderSettings) (
        SLAudioEncoderItf		self,
        SLAudioEncoderSettings 	*pSettings
    );
    SLresult (*GetEncoderSettings) (
        SLAudioEncoderItf		self,
        SLAudioEncoderSettings	*pSettings
    );
};


/*---------------------------------------------------------------------------*/
/* Bass Boost Interface                                                      */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_BASSBOOST;

struct SLBassBoostItf_;
typedef const struct SLBassBoostItf_ * const * SLBassBoostItf;

struct SLBassBoostItf_ {
	SLresult (*SetEnabled)(
		SLBassBoostItf self,
		SLboolean enabled
	);
	SLresult (*IsEnabled)(
		SLBassBoostItf self,
		SLboolean *pEnabled
	);
	SLresult (*SetStrength)(
		SLBassBoostItf self,
		SLpermille strength
	);
	SLresult (*GetRoundedStrength)(
		SLBassBoostItf self,
		SLpermille *pStrength
	);
	SLresult (*IsStrengthSupported)(
		SLBassBoostItf self,
		SLboolean *pSupported
	);
};

/*---------------------------------------------------------------------------*/
/* Pitch Interface                                                           */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_PITCH;

struct SLPitchItf_;
typedef const struct SLPitchItf_ * const * SLPitchItf;

struct SLPitchItf_ {
	SLresult (*SetPitch) (
		SLPitchItf self,
		SLpermille pitch
	);
	SLresult (*GetPitch) (
		SLPitchItf self,
		SLpermille *pPitch
	);
	SLresult (*GetPitchCapabilities) (
		SLPitchItf self,
		SLpermille *pMinPitch,
		SLpermille *pMaxPitch
	);
};


/*---------------------------------------------------------------------------*/
/* Rate Pitch Interface                                                      */
/* RatePitchItf is an interface for controlling the rate a sound is played   */
/* back. A change in rate will cause a change in pitch.                      */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_RATEPITCH;

struct SLRatePitchItf_;
typedef const struct SLRatePitchItf_ * const * SLRatePitchItf;

struct SLRatePitchItf_ {
	SLresult (*SetRate) (
		SLRatePitchItf self,
		SLpermille rate
	);
	SLresult (*GetRate) (
		SLRatePitchItf self,
		SLpermille *pRate
	);
	SLresult (*GetRatePitchCapabilities) (
		SLRatePitchItf self,
		SLpermille *pMinRate,
		SLpermille *pMaxRate
	);
};


/*---------------------------------------------------------------------------*/
/* Virtualizer Interface                                                      */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_VIRTUALIZER;

struct SLVirtualizerItf_;
typedef const struct SLVirtualizerItf_ * const * SLVirtualizerItf;

struct SLVirtualizerItf_ {
	SLresult (*SetEnabled)(
		SLVirtualizerItf self,
		SLboolean enabled
	);
	SLresult (*IsEnabled)(
		SLVirtualizerItf self,
		SLboolean *pEnabled
	);
	SLresult (*SetStrength)(
		SLVirtualizerItf self,
		SLpermille strength
	);
	SLresult (*GetRoundedStrength)(
		SLVirtualizerItf self,
		SLpermille *pStrength
	);
	SLresult (*IsStrengthSupported)(
		SLVirtualizerItf self,
		SLboolean *pSupported
	);
};

/*---------------------------------------------------------------------------*/
/* Visualization Interface                                                   */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_VISUALIZATION;

struct SLVisualizationItf_;
typedef const struct SLVisualizationItf_ * const * SLVisualizationItf;

typedef void (SLAPIENTRY *slVisualizationCallback) (
	void *pContext,
	const SLuint8 waveform[],
	const SLuint8 fft[],
	SLmilliHertz samplerate
);

struct SLVisualizationItf_{
	SLresult (*RegisterVisualizationCallback)(
		SLVisualizationItf self,
		slVisualizationCallback callback,
		void *pContext,
		SLmilliHertz rate
	);
	SLresult (*GetMaxRate)(
		SLVisualizationItf self,
		SLmilliHertz* pRate
	);
};


/*---------------------------------------------------------------------------*/
/* Engine Interface                                                          */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_ENGINE;

struct SLEngineItf_;
typedef const struct SLEngineItf_ * const * SLEngineItf;


struct SLEngineItf_ {

	SLresult (*CreateLEDDevice) (
		SLEngineItf self,
		SLObjectItf * pDevice,
		SLuint32 deviceID,
		SLuint32 numInterfaces,
		const SLInterfaceID * pInterfaceIds,
		const SLboolean * pInterfaceRequired
	);
	SLresult (*CreateVibraDevice) (
		SLEngineItf self,
		SLObjectItf * pDevice,
		SLuint32 deviceID,
		SLuint32 numInterfaces,
		const SLInterfaceID * pInterfaceIds,
		const SLboolean * pInterfaceRequired
	);
	SLresult (*CreateAudioPlayer) (
		SLEngineItf self,
		SLObjectItf * pPlayer,
		SLDataSource *pAudioSrc,
		SLDataSink *pAudioSnk,
		SLuint32 numInterfaces,
		const SLInterfaceID * pInterfaceIds,
		const SLboolean * pInterfaceRequired
	);
	SLresult (*CreateAudioRecorder) (
		SLEngineItf self,
		SLObjectItf * pRecorder,
		SLDataSource *pAudioSrc,
		SLDataSink *pAudioSnk,
		SLuint32 numInterfaces,
		const SLInterfaceID * pInterfaceIds,
		const SLboolean * pInterfaceRequired
	);
	SLresult (*CreateMidiPlayer) (
		SLEngineItf self,
		SLObjectItf * pPlayer,
		SLDataSource *pMIDISrc,
		SLDataSource *pBankSrc,
		SLDataSink *pAudioOutput,
		SLDataSink *pVibra,
		SLDataSink *pLEDArray,
		SLuint32 numInterfaces,
		const SLInterfaceID * pInterfaceIds,
		const SLboolean * pInterfaceRequired
	);
	SLresult (*CreateListener) (
		SLEngineItf self,
		SLObjectItf * pListener,
		SLuint32 numInterfaces,
		const SLInterfaceID * pInterfaceIds,
		const SLboolean * pInterfaceRequired
	);
	SLresult (*Create3DGroup) (
		SLEngineItf self,
		SLObjectItf * pGroup,
		SLuint32 numInterfaces,
		const SLInterfaceID * pInterfaceIds,
		const SLboolean * pInterfaceRequired
	);
	SLresult (*CreateOutputMix) (
		SLEngineItf self,
		SLObjectItf * pMix,
		SLuint32 numInterfaces,
		const SLInterfaceID * pInterfaceIds,
		const SLboolean * pInterfaceRequired
	);
	SLresult (*CreateMetadataExtractor) (
		SLEngineItf self,
		SLObjectItf * pMetadataExtractor,
		SLDataSource * pDataSource,
		SLuint32 numInterfaces,
		const SLInterfaceID * pInterfaceIds,
		const SLboolean * pInterfaceRequired
	);
    SLresult (*CreateExtensionObject) (
        SLEngineItf self,
        SLObjectItf * pObject,
        void * pParameters,
        SLuint32 objectID,
        SLuint32 numInterfaces,
        const SLInterfaceID * pInterfaceIds,
        const SLboolean * pInterfaceRequired
    );
	SLresult (*QueryNumSupportedInterfaces) (
		SLEngineItf self,
		SLuint32 objectID,
		SLuint32 * pNumSupportedInterfaces
	);
	SLresult (*QuerySupportedInterfaces) (
		SLEngineItf self,
		SLuint32 objectID,
		SLuint32 index,
		SLInterfaceID * pInterfaceId
	);
    SLresult (*QueryNumSupportedExtensions) (
        SLEngineItf self,
        SLuint32 * pNumExtensions
    );
    SLresult (*QuerySupportedExtension) (
        SLEngineItf self,
        SLuint32 index,
        SLchar * pExtensionName,
        SLint16 * pNameLength
    );
    SLresult (*IsExtensionSupported) (
        SLEngineItf self,
        const SLchar * pExtensionName,
        SLboolean * pSupported
    );
};


/*---------------------------------------------------------------------------*/
/* Engine Capabilities Interface                                             */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_ENGINECAPABILITIES;

struct SLEngineCapabilitiesItf_;
typedef const struct SLEngineCapabilitiesItf_ * const * SLEngineCapabilitiesItf;

struct SLEngineCapabilitiesItf_ {
	SLresult (*QuerySupportedProfiles) (
		SLEngineCapabilitiesItf self,
		SLuint16 *pProfilesSupported
	);
	SLresult (*QueryAvailableVoices) (
		SLEngineCapabilitiesItf self,
		SLuint16 voiceType,
		SLint16 *pNumMaxVoices,
		SLboolean *pIsAbsoluteMax,
		SLint16 *pNumFreeVoices
	);
	SLresult (*QueryNumberOfMIDISynthesizers) (
		SLEngineCapabilitiesItf self,
		SLint16 *pNumMIDIsynthesizers
	);
	SLresult (*QueryAPIVersion) (
		SLEngineCapabilitiesItf self,
		SLint16 *pMajor,
		SLint16 *pMinor,
		SLint16 *pStep
	);
	SLresult (*QueryLEDCapabilities) (
		SLEngineCapabilitiesItf self,
        SLuint32 *pIndex,
		SLuint32 *pLEDDeviceID,
		SLLEDDescriptor *pDescriptor
	);
	SLresult (*QueryVibraCapabilities) (
		SLEngineCapabilitiesItf self,
        SLuint32 *pIndex,
		SLuint32 *pVibraDeviceID,
		SLVibraDescriptor *pDescriptor
	);
	SLresult (*IsThreadSafe) (
		SLEngineCapabilitiesItf self,
		SLboolean *pIsThreadSafe
	);
};

/*---------------------------------------------------------------------------*/
/* Thread Sync Interface                                                     */
/* --------------------------------------------------------------------------*/


extern SL_API const SLInterfaceID SL_IID_THREADSYNC;

struct SLThreadSyncItf_;
typedef const struct SLThreadSyncItf_ * const * SLThreadSyncItf;


struct SLThreadSyncItf_ {
	SLresult (*EnterCriticalSection) (
		SLThreadSyncItf self
	);
	SLresult (*ExitCriticalSection) (
		SLThreadSyncItf self
	);
};


/*****************************************************************************/
/* SL engine constructor                                                     */
/*****************************************************************************/

#define SL_ENGINEOPTION_THREADSAFE	((SLuint32) 0x00000001)
#define SL_ENGINEOPTION_LOSSOFCONTROL	((SLuint32) 0x00000002)

typedef struct SLEngineOption_ {
	SLuint32 feature;
	SLuint32 data;
} SLEngineOption;


SL_API SLresult SLAPIENTRY slCreateEngine(
	SLObjectItf             *pEngine,
	SLuint32                numOptions,
	const SLEngineOption    *pEngineOptions,
	SLuint32                numInterfaces,
	const SLInterfaceID     *pInterfaceIds,
	const SLboolean         * pInterfaceRequired
);

SL_API SLresult SLAPIENTRY slQueryNumSupportedEngineInterfaces(
	SLuint32 * pNumSupportedInterfaces
);

SL_API SLresult SLAPIENTRY slQuerySupportedEngineInterfaces(
	SLuint32 index,
	SLInterfaceID * pInterfaceId
);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* OPENSL_ES_H_ */