1b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten/*
2b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
3b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten *
4b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * you may not use this file except in compliance with the License.
6b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * You may obtain a copy of the License at
7b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten *
8b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten *
10b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * See the License for the specific language governing permissions and
14b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten * limitations under the License.
15b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten */
16b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
17b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten/* Classes vs. interfaces */
18b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
19b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#include "sles_allinclusive.h"
20b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
21c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
22c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if USE_PROFILES & USE_PROFILES_GAME
23c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
24b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// 3DGroup class
25b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
26510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const struct iid_vtable _3DGroup_interfaces[INTERFACES_3DGroup] = {
27104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_OBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(C3DGroup, mObject)},
28b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    {MPH_DYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
29b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(C3DGroup, mDynamicInterfaceManagement)},
307a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_3DLOCATION, INTERFACE_IMPLICIT, offsetof(C3DGroup, m3DLocation)},
317a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_3DDOPPLER, INTERFACE_DYNAMIC_GAME, offsetof(C3DGroup, m3DDoppler)},
32c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_3DSOURCE, INTERFACE_EXPLICIT_GAME, offsetof(C3DGroup, m3DSource)},
337a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_3DMACROSCOPIC, INTERFACE_OPTIONAL, offsetof(C3DGroup, m3DMacroscopic)},
34b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
35b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
36b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenstatic const ClassTable C3DGroup_class = {
37b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    _3DGroup_interfaces,
38510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    INTERFACES_3DGroup,
39b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MPH_to_3DGroup,
40b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    "3DGroup",
41b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    sizeof(C3DGroup),
42b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    SL_OBJECTID_3DGROUP,
438b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    0,      // OpenMAX AL object ID
44b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
45b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
46928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    NULL,
47f51dba65751107c930759938775b75531ec1f330Glenn Kasten    C3DGroup_PreDestroy
48b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
49b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
50c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
51c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
52c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
53b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// AudioPlayer class
54b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
55510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const struct iid_vtable AudioPlayer_interfaces[INTERFACES_AudioPlayer] = {
56104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_OBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(CAudioPlayer, mObject)},
57711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_DYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
58b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CAudioPlayer, mDynamicInterfaceManagement)},
597a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_PLAY, INTERFACE_IMPLICIT, offsetof(CAudioPlayer, mPlay)},
607a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_3DDOPPLER, INTERFACE_DYNAMIC_GAME, offsetof(CAudioPlayer, m3DDoppler)},
61c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_3DGROUPING, INTERFACE_EXPLICIT_GAME, offsetof(CAudioPlayer, m3DGrouping)},
62c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_3DLOCATION, INTERFACE_EXPLICIT_GAME, offsetof(CAudioPlayer, m3DLocation)},
63c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_3DSOURCE, INTERFACE_EXPLICIT_GAME, offsetof(CAudioPlayer, m3DSource)},
64711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_BUFFERQUEUE, INTERFACE_EXPLICIT, offsetof(CAudioPlayer, mBufferQueue)},
65711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_EFFECTSEND, INTERFACE_EXPLICIT, offsetof(CAudioPlayer, mEffectSend)},
66711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_MUTESOLO, INTERFACE_EXPLICIT, offsetof(CAudioPlayer, mMuteSolo)},
677f5cc1afe49395fefaad9b2bbd728a45d1bfda6aJean-Michel Trivi    {MPH_METADATAEXTRACTION, INTERFACE_DYNAMIC,
68fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        offsetof(CAudioPlayer, mMetadataExtraction)},
69fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    {MPH_METADATATRAVERSAL, INTERFACE_DYNAMIC_GAME_MUSIC,
70fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        offsetof(CAudioPlayer, mMetadataTraversal)},
717a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_PREFETCHSTATUS, INTERFACE_EXPLICIT, offsetof(CAudioPlayer, mPrefetchStatus)},
727a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_RATEPITCH, INTERFACE_DYNAMIC_GAME, offsetof(CAudioPlayer, mRatePitch)},
737a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_SEEK, INTERFACE_EXPLICIT, offsetof(CAudioPlayer, mSeek)},
74c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    // The base Volume interface is explicit, but portions are only for Game and Music profiles
75c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_VOLUME, INTERFACE_EXPLICIT, offsetof(CAudioPlayer, mVolume)},
767a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_3DMACROSCOPIC, INTERFACE_OPTIONAL, offsetof(CAudioPlayer, m3DMacroscopic)},
7724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    {MPH_BASSBOOST, INTERFACE_DYNAMIC, offsetof(CAudioPlayer, mBassBoost)},
787a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_DYNAMICSOURCE, INTERFACE_OPTIONAL, offsetof(CAudioPlayer, mDynamicSource)},
7924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    {MPH_ENVIRONMENTALREVERB, INTERFACE_DYNAMIC,
80fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        offsetof(CAudioPlayer, mEnvironmentalReverb)},
8124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    {MPH_EQUALIZER, INTERFACE_DYNAMIC, offsetof(CAudioPlayer, mEqualizer)},
82c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_PITCH, INTERFACE_DYNAMIC_OPTIONAL, offsetof(CAudioPlayer, mPitch)},
8324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    {MPH_PRESETREVERB, INTERFACE_DYNAMIC, offsetof(CAudioPlayer, mPresetReverb)},
8424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    {MPH_PLAYBACKRATE, INTERFACE_DYNAMIC, offsetof(CAudioPlayer, mPlaybackRate)},
8524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi    {MPH_VIRTUALIZER, INTERFACE_DYNAMIC, offsetof(CAudioPlayer, mVirtualizer)},
867a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_VISUALIZATION, INTERFACE_OPTIONAL, offsetof(CAudioPlayer, mVisualization)},
8705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID
885b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    {MPH_ANDROIDEFFECT, INTERFACE_EXPLICIT, offsetof(CAudioPlayer, mAndroidEffect)},
89fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi    {MPH_ANDROIDEFFECTSEND, INTERFACE_EXPLICIT, offsetof(CAudioPlayer, mAndroidEffectSend)},
905e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten    {MPH_ANDROIDCONFIGURATION, INTERFACE_EXPLICIT_PREREALIZE,
915e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten            offsetof(CAudioPlayer, mAndroidConfiguration)},
9260ca9f9ef02f6e486c3338cb811f603dd7825c05Glenn Kasten    {MPH_ANDROIDBUFFERQUEUESOURCE, INTERFACE_EXPLICIT, offsetof(CAudioPlayer, mAndroidBufferQueue)},
9305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif
94b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
95b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
96b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenstatic const ClassTable CAudioPlayer_class = {
97b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    AudioPlayer_interfaces,
98510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    INTERFACES_AudioPlayer,
99b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MPH_to_AudioPlayer,
100b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    "AudioPlayer",
101b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    sizeof(CAudioPlayer),
102b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    SL_OBJECTID_AUDIOPLAYER,
1038b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    0,      // OpenMAX AL object ID
104b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    CAudioPlayer_Realize,
105928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    CAudioPlayer_Resume,
106928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    CAudioPlayer_Destroy,
107928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    CAudioPlayer_PreDestroy
108b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
109b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
110c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
111c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if (USE_PROFILES & USE_PROFILES_OPTIONAL) || defined(ANDROID)
112c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
113b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// AudioRecorder class
114b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
115510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const struct iid_vtable AudioRecorder_interfaces[INTERFACES_AudioRecorder] = {
116104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_OBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(CAudioRecorder, mObject)},
117711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_DYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
118b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CAudioRecorder, mDynamicInterfaceManagement)},
1197a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_RECORD, INTERFACE_IMPLICIT, offsetof(CAudioRecorder, mRecord)},
120c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_AUDIOENCODER, INTERFACE_EXPLICIT, offsetof(CAudioRecorder, mAudioEncoder)},
121c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_BASSBOOST, INTERFACE_DYNAMIC_OPTIONAL, offsetof(CAudioRecorder, mBassBoost)},
1227a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_DYNAMICSOURCE, INTERFACE_OPTIONAL, offsetof(CAudioRecorder, mDynamicSource)},
123c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_EQUALIZER, INTERFACE_DYNAMIC_OPTIONAL, offsetof(CAudioRecorder, mEqualizer)},
1247a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_VISUALIZATION, INTERFACE_OPTIONAL, offsetof(CAudioRecorder, mVisualization)},
1255e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten    {MPH_VOLUME, INTERFACE_OPTIONAL, offsetof(CAudioRecorder, mVolume)},
1263af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID
1275e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten    {MPH_ANDROIDSIMPLEBUFFERQUEUE, INTERFACE_EXPLICIT, offsetof(CAudioRecorder, mBufferQueue)},
1285e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten    {MPH_ANDROIDCONFIGURATION, INTERFACE_EXPLICIT_PREREALIZE,
1295e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten            offsetof(CAudioRecorder, mAndroidConfiguration)},
1303af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif
131b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
132b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
133b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenstatic const ClassTable CAudioRecorder_class = {
134b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    AudioRecorder_interfaces,
135510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    INTERFACES_AudioRecorder,
136b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MPH_to_AudioRecorder,
137b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    "AudioRecorder",
138b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    sizeof(CAudioRecorder),
139b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    SL_OBJECTID_AUDIORECORDER,
1408b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    0,      // OpenMAX AL object ID
1413af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    CAudioRecorder_Realize,
1423af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    CAudioRecorder_Resume,
143928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    CAudioRecorder_Destroy,
144928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    CAudioRecorder_PreDestroy
145b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
146b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
147c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
148c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
149c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
150b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// Engine class
151b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
152510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const struct iid_vtable Engine_interfaces[INTERFACES_Engine] = {
153104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_OBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(CEngine, mObject)},
154711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_DYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
155b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CEngine, mDynamicInterfaceManagement)},
1567a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_ENGINE, INTERFACE_IMPLICIT, offsetof(CEngine, mEngine)},
157c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_ENGINECAPABILITIES, INTERFACE_IMPLICIT_BASE, offsetof(CEngine, mEngineCapabilities)},
158c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_THREADSYNC, INTERFACE_IMPLICIT_BASE, offsetof(CEngine, mThreadSync)},
159c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_AUDIOIODEVICECAPABILITIES, INTERFACE_IMPLICIT_BASE,
160b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CEngine, mAudioIODeviceCapabilities)},
161c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_AUDIODECODERCAPABILITIES, INTERFACE_EXPLICIT_BASE,
162b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CEngine, mAudioDecoderCapabilities)},
163c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_AUDIOENCODERCAPABILITIES, INTERFACE_EXPLICIT_BASE,
164b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CEngine, mAudioEncoderCapabilities)},
165c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_3DCOMMIT, INTERFACE_EXPLICIT_GAME, offsetof(CEngine, m3DCommit)},
1665e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten    {MPH_DEVICEVOLUME, INTERFACE_OPTIONAL, offsetof(CEngine, mDeviceVolume)},
1678db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    {MPH_XAENGINE, INTERFACE_IMPLICIT, offsetof(CEngine, mXAEngine)},
168928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#ifdef ANDROID
1695e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten    {MPH_ANDROIDEFFECTCAPABILITIES, INTERFACE_EXPLICIT,
1705e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten        offsetof(CEngine, mAndroidEffectCapabilities)},
171928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#endif
1726e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi    {MPH_XAVIDEODECODERCAPABILITIES, INTERFACE_EXPLICIT,
1736e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi        offsetof(CEngine, mVideoDecoderCapabilities)},
174b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
175b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
176b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenstatic const ClassTable CEngine_class = {
177b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    Engine_interfaces,
178510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    INTERFACES_Engine,
179b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MPH_to_Engine,
180b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    "Engine",
181b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    sizeof(CEngine),
182b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    SL_OBJECTID_ENGINE,
1838b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    XA_OBJECTID_ENGINE,
184d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    CEngine_Realize,
185928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    CEngine_Resume,
186928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    CEngine_Destroy,
187928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    CEngine_PreDestroy
188b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
189b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
190c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
191c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if USE_PROFILES & USE_PROFILES_OPTIONAL
192c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
193b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// LEDDevice class
194b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
195510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const struct iid_vtable LEDDevice_interfaces[INTERFACES_LEDDevice] = {
196104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_OBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(CLEDDevice, mObject)},
197b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    {MPH_DYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
198b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CLEDDevice, mDynamicInterfaceManagement)},
1995e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten    {MPH_LED, INTERFACE_IMPLICIT, offsetof(CLEDDevice, mLEDArray)},
200b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
201b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
202b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenstatic const ClassTable CLEDDevice_class = {
203b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    LEDDevice_interfaces,
204510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    INTERFACES_LEDDevice,
205b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MPH_to_LEDDevice,
206b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    "LEDDevice",
207b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    sizeof(CLEDDevice),
208b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    SL_OBJECTID_LEDDEVICE,
2098b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    XA_OBJECTID_LEDDEVICE,
210b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
211b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
212928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    NULL,
213b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL
214b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
215b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
216c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
217c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
218c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
219c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if USE_PROFILES & USE_PROFILES_GAME
220c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
221b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// Listener class
222b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
223510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const struct iid_vtable Listener_interfaces[INTERFACES_Listener] = {
224104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_OBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(CListener, mObject)},
225b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    {MPH_DYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
226b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CListener, mDynamicInterfaceManagement)},
227f51dba65751107c930759938775b75531ec1f330Glenn Kasten    {MPH_3DDOPPLER, INTERFACE_DYNAMIC_GAME, offsetof(CListener, m3DDoppler)},
2285e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten    {MPH_3DLOCATION, INTERFACE_EXPLICIT_GAME, offsetof(CListener, m3DLocation)},
229b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
230b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
231b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenstatic const ClassTable CListener_class = {
232b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    Listener_interfaces,
233510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    INTERFACES_Listener,
234b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MPH_to_Listener,
235b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    "Listener",
236b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    sizeof(CListener),
237b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    SL_OBJECTID_LISTENER,
2388b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    0,      // OpenMAX AL object ID
239b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
240b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
241928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    NULL,
242b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL
243b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
244b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
245c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
246c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
247c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
248c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC)
249c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
250b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// MetadataExtractor class
251b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
252510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const struct iid_vtable MetadataExtractor_interfaces[INTERFACES_MetadataExtractor] = {
253104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_OBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(CMetadataExtractor, mObject)},
254b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    {MPH_DYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
255b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CMetadataExtractor, mDynamicInterfaceManagement)},
2567a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_DYNAMICSOURCE, INTERFACE_IMPLICIT, offsetof(CMetadataExtractor, mDynamicSource)},
2577a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_METADATAEXTRACTION, INTERFACE_IMPLICIT, offsetof(CMetadataExtractor, mMetadataExtraction)},
2585e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten    {MPH_METADATATRAVERSAL, INTERFACE_IMPLICIT, offsetof(CMetadataExtractor, mMetadataTraversal)},
259b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
260b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
261b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenstatic const ClassTable CMetadataExtractor_class = {
262b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MetadataExtractor_interfaces,
263510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    INTERFACES_MetadataExtractor,
264b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MPH_to_MetadataExtractor,
265b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    "MetadataExtractor",
266b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    sizeof(CMetadataExtractor),
267b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    SL_OBJECTID_METADATAEXTRACTOR,
2688b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    XA_OBJECTID_METADATAEXTRACTOR,
269b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
270b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
271928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    NULL,
272b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL
273b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
274b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
275c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
276c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
277c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
278c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if USE_PROFILES & USE_PROFILES_GAME
279c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
280b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// MidiPlayer class
281b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
282510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const struct iid_vtable MidiPlayer_interfaces[INTERFACES_MidiPlayer] = {
283104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_OBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(CMidiPlayer, mObject)},
284b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    {MPH_DYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
285b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CMidiPlayer, mDynamicInterfaceManagement)},
2867a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_PLAY, INTERFACE_IMPLICIT, offsetof(CMidiPlayer, mPlay)},
2877a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_3DDOPPLER, INTERFACE_DYNAMIC_GAME, offsetof(C3DGroup, m3DDoppler)},
288c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_3DGROUPING, INTERFACE_EXPLICIT_GAME, offsetof(CMidiPlayer, m3DGrouping)},
289c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_3DLOCATION, INTERFACE_EXPLICIT_GAME, offsetof(CMidiPlayer, m3DLocation)},
290c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_3DSOURCE, INTERFACE_EXPLICIT_GAME, offsetof(CMidiPlayer, m3DSource)},
291c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_BUFFERQUEUE, INTERFACE_EXPLICIT_GAME, offsetof(CMidiPlayer, mBufferQueue)},
292c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_EFFECTSEND, INTERFACE_EXPLICIT_GAME, offsetof(CMidiPlayer, mEffectSend)},
293c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_MUTESOLO, INTERFACE_EXPLICIT_GAME, offsetof(CMidiPlayer, mMuteSolo)},
294c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_METADATAEXTRACTION, INTERFACE_DYNAMIC_GAME, offsetof(CMidiPlayer, mMetadataExtraction)},
295c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_METADATATRAVERSAL, INTERFACE_DYNAMIC_GAME, offsetof(CMidiPlayer, mMetadataTraversal)},
296c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_MIDIMESSAGE, INTERFACE_EXPLICIT_GAME_PHONE, offsetof(CMidiPlayer, mMIDIMessage)},
297c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_MIDITIME, INTERFACE_EXPLICIT_GAME_PHONE, offsetof(CMidiPlayer, mMIDITime)},
298c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_MIDITEMPO, INTERFACE_EXPLICIT_GAME_PHONE, offsetof(CMidiPlayer, mMIDITempo)},
299c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_MIDIMUTESOLO, INTERFACE_EXPLICIT_GAME, offsetof(CMidiPlayer, mMIDIMuteSolo)},
300c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_PREFETCHSTATUS, INTERFACE_EXPLICIT_GAME_PHONE, offsetof(CMidiPlayer, mPrefetchStatus)},
301c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_SEEK, INTERFACE_EXPLICIT_GAME_PHONE, offsetof(CMidiPlayer, mSeek)},
302c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_VOLUME, INTERFACE_EXPLICIT_GAME_PHONE, offsetof(CMidiPlayer, mVolume)},
3037a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_3DMACROSCOPIC, INTERFACE_OPTIONAL, offsetof(CMidiPlayer, m3DMacroscopic)},
304c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_BASSBOOST, INTERFACE_DYNAMIC_OPTIONAL, offsetof(CMidiPlayer, mBassBoost)},
3057a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_DYNAMICSOURCE, INTERFACE_OPTIONAL, offsetof(CMidiPlayer, mDynamicSource)},
306fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten    {MPH_ENVIRONMENTALREVERB, INTERFACE_DYNAMIC_OPTIONAL,
307fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten        offsetof(CMidiPlayer, mEnvironmentalReverb)},
308c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_EQUALIZER, INTERFACE_DYNAMIC_OPTIONAL, offsetof(CMidiPlayer, mEqualizer)},
309c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_PITCH, INTERFACE_DYNAMIC_OPTIONAL, offsetof(CMidiPlayer, mPitch)},
310c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_PRESETREVERB, INTERFACE_DYNAMIC_OPTIONAL, offsetof(CMidiPlayer, mPresetReverb)},
311c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_PLAYBACKRATE, INTERFACE_DYNAMIC_OPTIONAL, offsetof(CMidiPlayer, mPlaybackRate)},
312c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    {MPH_VIRTUALIZER, INTERFACE_DYNAMIC_OPTIONAL, offsetof(CMidiPlayer, mVirtualizer)},
3137a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_VISUALIZATION, INTERFACE_OPTIONAL, offsetof(CMidiPlayer, mVisualization)},
314b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
315b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
316b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenstatic const ClassTable CMidiPlayer_class = {
317b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MidiPlayer_interfaces,
318510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    INTERFACES_MidiPlayer,
319b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MPH_to_MidiPlayer,
320b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    "MidiPlayer",
321b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    sizeof(CMidiPlayer),
322b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    SL_OBJECTID_MIDIPLAYER,
3238b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    0,      // OpenMAX AL object ID
324b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
325b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
326928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    NULL,
327b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL
328b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
329b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
330c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
331c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
332c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
333b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// OutputMix class
334b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
335510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const struct iid_vtable OutputMix_interfaces[INTERFACES_OutputMix] = {
336104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_OBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(COutputMix, mObject)},
337711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_DYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
338b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(COutputMix, mDynamicInterfaceManagement)},
3397a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten    {MPH_OUTPUTMIX, INTERFACE_IMPLICIT, offsetof(COutputMix, mOutputMix)},
340b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#ifdef USE_OUTPUTMIXEXT
341711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_OUTPUTMIXEXT, INTERFACE_UNAVAILABLE, offsetof(COutputMix, mOutputMixExt)},
342b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#else
343a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {MPH_OUTPUTMIXEXT, INTERFACE_UNAVAILABLE, 0},
344b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#endif
345711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_ENVIRONMENTALREVERB, INTERFACE_DYNAMIC,
346104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten        offsetof(COutputMix, mEnvironmentalReverb)},
347711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_EQUALIZER, INTERFACE_DYNAMIC, offsetof(COutputMix, mEqualizer)},
348711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_PRESETREVERB, INTERFACE_DYNAMIC, offsetof(COutputMix, mPresetReverb)},
349711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_VIRTUALIZER, INTERFACE_DYNAMIC, offsetof(COutputMix, mVirtualizer)},
350104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    // The overall Volume interface is explicit optional,
351c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten    // but portions of Volume are mandated only in Game and Music profiles
352104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_VOLUME, INTERFACE_OPTIONAL, offsetof(COutputMix, mVolume)},
353711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten    {MPH_BASSBOOST, INTERFACE_DYNAMIC, offsetof(COutputMix, mBassBoost)},
35449e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi    {MPH_VISUALIZATION, INTERFACE_OPTIONAL, offsetof(COutputMix, mVisualization)},
35549e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi#ifdef ANDROID
35649e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi    {MPH_ANDROIDEFFECT, INTERFACE_EXPLICIT, offsetof(COutputMix, mAndroidEffect)},
35749e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi#endif
358b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
359b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
360b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenstatic const ClassTable COutputMix_class = {
361b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    OutputMix_interfaces,
362510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    INTERFACES_OutputMix,
363b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MPH_to_OutputMix,
364b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    "OutputMix",
365b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    sizeof(COutputMix),
366b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    SL_OBJECTID_OUTPUTMIX,
3678b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    XA_OBJECTID_OUTPUTMIX,
3687e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    COutputMix_Realize,
3697e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    COutputMix_Resume,
370928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    COutputMix_Destroy,
371928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    COutputMix_PreDestroy
372b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
373b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
374c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
375c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if USE_PROFILES & USE_PROFILES_OPTIONAL
376c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
377b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten// Vibra class
378b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
379510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const struct iid_vtable VibraDevice_interfaces[INTERFACES_VibraDevice] = {
380104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    {MPH_OBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(CVibraDevice, mObject)},
381a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {MPH_DYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
382b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten        offsetof(CVibraDevice, mDynamicInterfaceManagement)},
3835e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten    {MPH_VIBRA, INTERFACE_IMPLICIT, offsetof(CVibraDevice, mVibra)},
384b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
385b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
386b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenstatic const ClassTable CVibraDevice_class = {
387b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    VibraDevice_interfaces,
388510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten    INTERFACES_VibraDevice,
389b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    MPH_to_Vibra,
390b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    "VibraDevice",
391b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    sizeof(CVibraDevice),
392b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    SL_OBJECTID_VIBRADEVICE,
3938b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    XA_OBJECTID_VIBRADEVICE,
394b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
395b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL,
396928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten    NULL,
397b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    NULL
398b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
399b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
400c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
401c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
402b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
4038b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten// Media player class
4048b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten
4058b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kastenstatic const struct iid_vtable MediaPlayer_interfaces[INTERFACES_MediaPlayer] = {
406a361b51914aeb5f8f65c7ecad719d1e01f90913bGlenn Kasten    {MPH_XAOBJECT, INTERFACE_IMPLICIT_PREREALIZE, offsetof(CMediaPlayer, mObject)},
407a361b51914aeb5f8f65c7ecad719d1e01f90913bGlenn Kasten    {MPH_XADYNAMICINTERFACEMANAGEMENT, INTERFACE_IMPLICIT,
4088b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten        offsetof(CMediaPlayer, mDynamicInterfaceManagement)},
40994a37e8117fb72790882dfb815f99e2365754c74Glenn Kasten    {MPH_XAPLAY, INTERFACE_IMPLICIT, offsetof(CMediaPlayer, mPlay)},
41037dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    {MPH_XASTREAMINFORMATION, INTERFACE_EXPLICIT, offsetof(CMediaPlayer, mStreamInfo)},
41137dc2fccf3f122b79ebd554de209d0a3c94ae161Jean-Michel Trivi    {MPH_XAVOLUME, INTERFACE_IMPLICIT, offsetof(CMediaPlayer, mVolume)},
41292b245bf8828db9e469febebbe8774c00570b5b9Jean-Michel Trivi    {MPH_XASEEK, INTERFACE_EXPLICIT, offsetof(CMediaPlayer, mSeek)},
413c623c89c0a32c5fc77c998f1742d58e7be69e8c1Glenn Kasten    {MPH_XAPREFETCHSTATUS, INTERFACE_EXPLICIT, offsetof(CMediaPlayer, mPrefetchStatus)},
414eba01e9626bb1801e0666f4e187ae09b5e649d70Glenn Kasten#ifdef ANDROID
41560ca9f9ef02f6e486c3338cb811f603dd7825c05Glenn Kasten    {MPH_ANDROIDBUFFERQUEUESOURCE, INTERFACE_EXPLICIT, offsetof(CMediaPlayer, mAndroidBufferQueue)},
416eba01e9626bb1801e0666f4e187ae09b5e649d70Glenn Kasten#endif
4178b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten};
4188b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten
4198b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kastenstatic const ClassTable CMediaPlayer_class = {
4208b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    MediaPlayer_interfaces,
4218b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    INTERFACES_MediaPlayer,
4228b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    MPH_to_MediaPlayer,
4238b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    "MediaPlayer",
4248b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    sizeof(CMediaPlayer),
4258b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    0,      // OpenSL ES object ID
4268b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    XA_OBJECTID_MEDIAPLAYER,
42794a37e8117fb72790882dfb815f99e2365754c74Glenn Kasten    CMediaPlayer_Realize,
42894a37e8117fb72790882dfb815f99e2365754c74Glenn Kasten    CMediaPlayer_Resume,
42994a37e8117fb72790882dfb815f99e2365754c74Glenn Kasten    CMediaPlayer_Destroy,
43094a37e8117fb72790882dfb815f99e2365754c74Glenn Kasten    CMediaPlayer_PreDestroy
4318b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten};
4328b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten
4338b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten
4348b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kastenstatic const ClassTable * const slClasses[] = {
435b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    // Do not change order of these entries; they are in numerical order
436b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    &CEngine_class,
437c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if USE_PROFILES & USE_PROFILES_OPTIONAL
438b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    &CLEDDevice_class,
439b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    &CVibraDevice_class,
440c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#else
441c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    NULL,
442c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    NULL,
443c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
444b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    &CAudioPlayer_class,
445c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if (USE_PROFILES & USE_PROFILES_OPTIONAL) || defined(ANDROID)
446b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    &CAudioRecorder_class,
447c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#else
448c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    NULL,
449c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
450c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_PHONE)
451b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    &CMidiPlayer_class,
452c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#else
453c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    NULL,
454c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
455c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if USE_PROFILES & USE_PROFILES_GAME
456b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    &CListener_class,
457b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    &C3DGroup_class,
458c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#else
459c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    NULL,
460c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    NULL,
461c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
462b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    &COutputMix_class,
463c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC)
464b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten    &CMetadataExtractor_class
465c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#else
466c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten    NULL
467c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten#endif
468b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten};
469b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten
470c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten
4718db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic const ClassTable * const xaClasses[] = {
4728db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    &CEngine_class,
4738db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#if USE_PROFILES & USE_PROFILES_OPTIONAL
4748db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    &CLEDDevice_class,
4758db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    &CVibraDevice_class,
4768db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#else
4778db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    NULL,
4788db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    NULL,
4798db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#endif
4808b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    &CMediaPlayer_class,
4818db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#if 1
4828db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    NULL,
4838db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    NULL,
4848db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#else
4858b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    &CMediaRecorder_class,
4868b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    &CRadioDevice_class,
4878db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#endif
4888db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    &COutputMix_class,
4898db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC)
4908db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    &CMetadataExtractor_class,
4918db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#else
4928db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    NULL,
4938db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#endif
4948db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#if 1
4958db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    NULL
4968db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#else
4978b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    &CCameraDevice_class
4988db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#endif
4998db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten};
5008db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
5018db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
5028b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten/* \brief Map SL_OBJECTID to class or NULL if object ID not supported */
5038db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
504527f8ca99f2938d6569fc25dcf3256985a54dec6Glenn KastenLI_API const ClassTable *objectIDtoClass(SLuint32 objectID)
5058db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{
5068db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    // object ID is the engine and always present
5078b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    assert(NULL != slClasses[0]);
5088b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    SLuint32 slObjectID0 = slClasses[0]->mSLObjectID;
5098b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    if ((slObjectID0 <= objectID) && ((slObjectID0 + sizeof(slClasses)/sizeof(slClasses[0])) >
5108b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten            objectID)) {
5118b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten        return slClasses[objectID - slObjectID0];
5128b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    }
5138db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    assert(NULL != xaClasses[0]);
5148b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    SLuint32 xaObjectID0 = xaClasses[0]->mXAObjectID;
5158b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten    if ((xaObjectID0 <= objectID) && ((xaObjectID0 + sizeof(xaClasses)/sizeof(xaClasses[0])) >
5168db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            objectID)) {
5178b8875067dd02b79361abb00c5d65b02a8ae72b0Glenn Kasten        return xaClasses[objectID - xaObjectID0];
5188db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    }
5198db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    return NULL;
5208db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
521