sles_allinclusive.h revision 711332800108ad6e0e594796e5f8db0da3eff402
1773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* 2773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 4773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * you may not use this file except in compliance with the License. 6773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * You may obtain a copy of the License at 7773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 8773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * 10773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * See the License for the specific language governing permissions and 14773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * limitations under the License. 15773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */ 16773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 17369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten/** \file sles_allinclusive.h Everything including the kitchen sink */ 18369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten 19ee21d26b4b66d0f19b826685b3070497523994d5Glenn Kasten#include "SLES/OpenSLES.h" 20a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#ifdef ANDROID 21a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#include "SLES/OpenSLES_Android.h" 22a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#endif 23773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stddef.h> // offsetof 24773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdlib.h> // malloc 25773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <string.h> // memcmp 26773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <stdio.h> // debugging 27773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <assert.h> // debugging 28773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <pthread.h> 2932918086b694fc383c8c2d590ac45492801676f7Glenn Kasten#include <unistd.h> // usleep 30d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include <errno.h> 31773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 32e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef __cplusplus 33e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastentypedef int bool; 34e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef false 35e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#define false 0 36e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif 37e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#ifndef true 38e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#define true 1 39e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif 40e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten#endif 41e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten 42a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// The OpenSLES.h definitions of SL_PROFILES_... have casts, so are unusable by preprocessor 43a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define USE_PROFILES_PHONE 0x1 // == SL_PROFILES_PHONE 44a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define USE_PROFILES_MUSIC 0x2 // == SL_PROFILES_MUSIC 45a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define USE_PROFILES_GAME 0x4 // == SL_PROFILES_GAME 46a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// Pseudo profiles, used to decide whether to include code for incomplete or untested features 47a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// Features that are not in union of all profiles: audio recorder, LED, Vibra 48a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define USE_PROFILES_OPTIONAL 0x8 49a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// Features that are in the intersection of all profiles: 50a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// object priorities, preemption, loss of control, device configuration 51a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define USE_PROFILES_BASE 0x10 52a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten 53773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH.h" 54773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "MPH_to.h" 55a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "devices.h" 565dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten#include "OpenSLESUT.h" 57d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include "ThreadPool.h" 58773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 59acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct CAudioPlayer_struct CAudioPlayer; 603af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivitypedef struct CAudioRecorder_struct CAudioRecorder; 616a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kastentypedef struct C3DGroup_struct C3DGroup; 62e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct COutputMix_struct COutputMix; 63acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 64773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 65773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <sndfile.h> 667324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#include "SLSndFile.h" 67773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 68773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 69773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SDL 70773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include <SDL/SDL_audio.h> 71773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SDL 72773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 73ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 747a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include <utils/Log.h> 755b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#include <utils/KeyedVector.h> 76b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi#include "SLES/OpenSLES_AndroidConfiguration.h" 77773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioSystem.h" 783af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/mediarecorder.h" 793af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "media/AudioRecord.h" 80773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/AudioTrack.h" 81773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "media/mediaplayer.h" 8214e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT 834be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/AudioEffect.h" 844be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectApi.h" 854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "media/EffectEqualizerApi.h" 869cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#include "media/EffectBassBoostApi.h" 87f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#include "media/EffectVirtualizerApi.h" 887e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "media/EffectPresetReverbApi.h" 89f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#include "media/EffectEnvironmentalReverbApi.h" 9014e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif 916fff2c605cdc46a10037e011d8fb47702ae70c37Jean-Michel Trivi#include <utils/String8.h> 92b6e3c1093dfbdec29e620e85d0d81cc39395a45fJean-Michel Trivi#define ANDROID_SL_MILLIBEL_MAX 0 93daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#include <binder/ProcessState.h> 94712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi#include "android_sles_conversions.h" 9514e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT 96de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi#include "android_SfPlayer.h" 977e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#include "android_OutputMix.h" 9814e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif 993af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#include "android_AudioRecorder.h" 100773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 101773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 102e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define STEREO_CHANNELS 2 103e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 104773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 105773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#include "OutputMixExt.h" 106773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 107773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 108a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten#include "sllog.h" 109a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten 110773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Hook functions 111773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 112773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivitypedef void (*VoidHook)(void *self); 113a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten//typedef SLresult (*ResultHook)(void *self); 1143d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivitypedef SLresult (*AsyncHook)(void *self, SLboolean async); 115928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastentypedef bool (*BoolHook)(void *self); 116b90cb3de9b67383be4e077d807464044f6f18f7aJean-Michel Trivi 1175e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten// Describes how an interface is related to a given class, used in iid_vtable::mInterface 118773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 1195e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#define INTERFACE_IMPLICIT 0 // no need for application to request prior to GetInterface 1205e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#define INTERFACE_EXPLICIT 1 // must be requested explicitly during object creation 1215e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#define INTERFACE_DYNAMIC 2 // can be requested after object creation 1225e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#define INTERFACE_UNAVAILABLE 3 // this interface is not available on objects of this class 123104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten#define INTERFACE_IMPLICIT_PREREALIZE 4 // implicit, and can call GetInterface before Realize 124104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten#define INTERFACE_EXPLICIT_PREREALIZE 5 // explicit, and can call GetInterface before Realize 125104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten// 6 and 7 are reserved for the meaningless DYNAMIC_PREREALIZE and UNAVAILABLE_PREREALIZE 126c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten// note that INTERFACE_OPTIONAL is always re-mapped to one of the above 127104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten#define INTERFACE_PREREALIZE 4 // bit-mask to test for calling GetInterface before Realize 128c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 129c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten// Profile-specific interfaces 130c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 131a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_BASE 132c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_IMPLICIT_BASE INTERFACE_IMPLICIT 133c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_BASE INTERFACE_EXPLICIT 134c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else 135c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_IMPLICIT_BASE INTERFACE_UNAVAILABLE 136c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_BASE INTERFACE_UNAVAILABLE 137c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif 138c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 139a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_GAME 140c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME INTERFACE_DYNAMIC 141c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME INTERFACE_EXPLICIT 142c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else 143c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME INTERFACE_OPTIONAL 144c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME INTERFACE_OPTIONAL 145c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif 146c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 147a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_MUSIC 148c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC INTERFACE_DYNAMIC 149c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else 150c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_MUSIC INTERFACE_OPTIONAL 151c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif 152c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 153a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC) 154c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC INTERFACE_DYNAMIC 155c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_EXPLICIT 156c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else 157c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_GAME_MUSIC INTERFACE_OPTIONAL 158c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_MUSIC INTERFACE_OPTIONAL 159c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif 160c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 161a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_PHONE) 162c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_EXPLICIT 163c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#else 164c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_EXPLICIT_GAME_PHONE INTERFACE_OPTIONAL 165c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#endif 166c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten 167a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_OPTIONAL 168c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_OPTIONAL INTERFACE_EXPLICIT 169c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL INTERFACE_DYNAMIC 1707a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 171c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_OPTIONAL INTERFACE_UNAVAILABLE 172c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten#define INTERFACE_DYNAMIC_OPTIONAL INTERFACE_UNAVAILABLE 1737a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 1747a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 175510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// Describes how an interface is related to a given object 176510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 177a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_UNINITIALIZED 0 ///< not available 178a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_INITIALIZED 1 ///< not requested at object creation time 179a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_EXPOSED 2 ///< requested at object creation time 180a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_ADDING_1 3 ///< part 1 of asynchronous AddInterface, pending 181a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_ADDING_2 4 ///< synchronous AddInterface, or part 2 of asynchronous 182a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_ADDED 5 ///< AddInterface has completed 183a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_REMOVING 6 ///< unlocked phase of (synchronous) RemoveInterface 184a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_SUSPENDING 7 ///< suspend in progress 185a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_SUSPENDED 8 ///< suspend has completed 186a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_RESUMING_1 9 ///< part 1 of asynchronous ResumeInterface, pending 187a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_RESUMING_2 10 ///< synchronous ResumeInterface, or part 2 of asynchronous 188a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_ADDING_1A 11 ///< part 1 of asynchronous AddInterface, aborted 189a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define INTERFACE_RESUMING_1A 12 ///< part 1 of asynchronous ResumeInterface, aborted 190510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 191b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi 192773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Maps an interface ID to its offset within the class that exposes it 193773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 194773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct iid_vtable { 19501e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten unsigned char mMPH; // primary MPH for this interface, does not include any aliases 19601e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten unsigned char mInterface; // relationship of interface to this class 197773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi /*size_t*/ unsigned short mOffset; 198773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 199773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 200773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// Per-class const data shared by all instances of the same class 201773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 20272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 20301e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten const struct iid_vtable *mInterfaces; // maps interface index to info about that interface 204510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint32 mInterfaceCount; // number of possible interfaces 205773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const signed char *mMPH_to_index; 20676dde6cd71bdb39459f38218e8aa2b7c19e790dbGlenn Kasten const char * const mName; 207773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi size_t mSize; 208773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mObjectID; 209510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten // hooks 2103d146e0a31f5ee2a7d9807c4e99994084fdd3283Jean-Michel Trivi AsyncHook mRealize; 211510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten AsyncHook mResume; 212773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi VoidHook mDestroy; 213928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten BoolHook mPreDestroy; 21472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ClassTable; 215773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 216773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// BufferHeader describes each element of a BufferQueue, other than the data 217773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 218d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastentypedef struct { 219773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mBuffer; 220773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSize; 221d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten} BufferHeader; 222773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 2237324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#ifdef __cplusplus 2247324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#define this this_ 2257324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten#endif 2267324a5ab12cc734e2feb4cef8baeda26566d3c92Glenn Kasten 227773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 228773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 2296a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_BUFSIZE 512 // in 16-bit samples 2306a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten#define SndFile_NUMBUFS 2 2316a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten 232773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct SndFile { 233773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // save URI also? 234773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLchar *mPathname; 235773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SNDFILE *mSNDFILE; 2364b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SF_INFO mSfInfo; 237e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten pthread_mutex_t mMutex; // protects mSNDFILE only 238e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean mEOF; // sf_read returned zero sample frames 2398c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten SLuint32 mWhich; // which buffer to use next 2406a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten short mBuffer[SndFile_BUFSIZE * SndFile_NUMBUFS]; 241773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 242773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 243773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 244773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 245acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/* Our own merged version of SLDataSource and SLDataSink */ 246acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 247acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union { 248acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLuint32 mLocatorType; 249acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_Address mAddress; 250acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_BufferQueue mBufferQueue; 251acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_IODevice mIODevice; 252acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_MIDIBufferQueue mMIDIBufferQueue; 253acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_OutputMix mOutputMix; 254acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataLocator_URI mURI; 255989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#ifdef ANDROID 256989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLDataLocator_AndroidFD mFD; 257989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#endif 258acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocator; 259acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 260acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef union { 261acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLuint32 mFormatType; 262acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataFormat_PCM mPCM; 263acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataFormat_MIME mMIME; 264acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataFormat; 265acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 266acd88797a1d3b8225bab888d29036e245f275be5Glenn Kastentypedef struct { 267acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten union { 268acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataSource mSource; 269acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten SLDataSink mSink; 270acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten struct { 271acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocator *pLocator; 272acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataFormat *pFormat; 273acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten } mNeutral; 274acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten } u; 275acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocator mLocator; 276acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataFormat mFormat; 277acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} DataLocatorFormat; 278acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 279773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Interface structures */ 280773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 28172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Object_interface { 282e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten const struct SLObjectItf_ *mItf; // const 283d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten // field mThis would be redundant within an IObject, so we substitute mEngine 284e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten struct Engine_interface *mEngine; // const 285e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten const ClassTable *mClass; // const 286f51dba65751107c930759938775b75531ec1f330Glenn Kasten SLuint32 mInstanceID; // const for debugger and for RPC, 0 means unpublished 28772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten slObjectCallback mCallback; 28872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten void *mContext; 289e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten unsigned mGottenMask; ///< bit-mask of interfaces exposed or added, then gotten 29072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten unsigned mLossOfControlMask; // interfaces with loss of control enabled 291e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten unsigned mAttributesMask; // attributes which have changed since last sync 292a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_BASE 29372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLint32 mPriority; 2947a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 29572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten pthread_mutex_t mMutex; 296fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#ifdef USE_DEBUG 297fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten pthread_t mOwner; 298fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten const char *mFile; 299fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten int mLine; 300fe96fa06360516c60490c7a697e1148017b4c1b2Glenn Kasten#endif 30172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten pthread_cond_t mCond; 302510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mState; // really SLuint32, but SLuint8 to save space 303a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_BASE 304510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mPreemptable; // really SLboolean, but SLuint8 to save space 3057a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 3067a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten SLuint8 mPadding; 3077a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 308928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten SLuint8 mStrongRefCount; // number of strong references to this object 309928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten // (object cannot be destroyed as long as > 0, and referrers _prefer_ it stay in Realized state) 310510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten // for best alignment, do not add any fields here 311928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#define INTERFACES_Default 1 312510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates[INTERFACES_Default]; // state of each of interface 313e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // do not add any fields here 31472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IObject; 31572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 316a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "locks.h" 317a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 31872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 31972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten const struct SL3DCommitItf_ *mItf; 32072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 321773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mDeferred; 32232918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLuint32 mGeneration; // incremented each master clock cycle 323a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten SLuint32 mWaiting; // number of threads waiting in Commit 32472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DCommit; 325773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 3267754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum CartesianSphericalActive { 3277754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_COMPUTED_SPHERICAL_SET, 3287754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_REQUESTED_SPHERICAL_SET, 3297754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_UNKNOWN_SPHERICAL_SET, 3307754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 3317754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 3327754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten CARTESIAN_SET_SPHERICAL_UNKNOWN 3337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten}; 3347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten 33572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 336773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DDopplerItf_ *mItf; 33772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3387754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // The API allows client to specify either Cartesian and spherical velocities. 3397754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // But an implementation will likely prefer one or the other. So for 3407754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // maximum portablity, we maintain both units and an indication of which 3417754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // unit was set most recently. In addition, we keep a flag saying whether 3427754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // the other unit has been derived yet. It can take significant time 3437754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // to compute the other unit, so this may be deferred to another thread. 3447754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // For this reason we also keep an indication of whether the secondary 3457754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // has been computed yet, and its accuracy. 3467754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Though only one unit is primary at a time, a union is inappropriate: 3477754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // the application might read in both units (not in 1.0.1), 3487754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // and due to multi-threading concerns. 3497754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mVelocityCartesian; 35032918086b694fc383c8c2d590ac45492801676f7Glenn Kasten struct { 35132918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mAzimuth; 35232918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mElevation; 35332918086b694fc383c8c2d590ac45492801676f7Glenn Kasten SLmillidegree mSpeed; 3547754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mVelocitySpherical; 3557754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum CartesianSphericalActive mVelocityActive; 356773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mDopplerFactor; 35772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DDoppler; 358773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 35972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 360773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DGroupingItf_ *mItf; 36172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 362f51dba65751107c930759938775b75531ec1f330Glenn Kasten C3DGroup *mGroup; // strong reference to associated group or NULL 36372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DGrouping; 364773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 3657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kastenenum AnglesVectorsActive { 3667754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 3677754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 3687754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_UNKNOWN_VECTORS_SET, 3697754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_COMPUTED, 3707754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_REQUESTED, 3717754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten ANGLES_SET_VECTORS_UNKNOWN 3727754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten}; 3737754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten 37472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 375773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DLocationItf_ *mItf; 37672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 3777754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mLocationCartesian; 3787754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 3797754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mAzimuth; 3807754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mElevation; 3817754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillimeter mDistance; 3827754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mLocationSpherical; 3837754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum CartesianSphericalActive mLocationActive; 3847754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 3857754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mHeading; 3867754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mPitch; 3877754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mRoll; 3887754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mOrientationAngles; 3897754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten struct { 3907754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mFront; 3917754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAbove; 3927754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mUp; 3937754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten } mOrientationVectors; 3947754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum AnglesVectorsActive mOrientationActive; 3957754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Rotations can be slow, so are deferred. 3967754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mTheta; 3977754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAxis; 3987754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLboolean mRotatePending; 39972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DLocation; 400773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 40172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 402773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DMacroscopicItf_ *mItf; 40372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 404773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 405773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mWidth; 406773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mHeight; 407773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mDepth; 408773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mSize; 409773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 410773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mHeading; 411773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mPitch; 412773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mRoll; 413773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mOrientationAngles; 414773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct { 415773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLVec3D mFront; 416ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLVec3D mAbove; 417773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLVec3D mUp; 418773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi } mOrientationVectors; 4197754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten enum AnglesVectorsActive mOrientationActive; 4207754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten // Rotations can be slow, so are deferred. 4217754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mTheta; 4227754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLVec3D mAxis; 4237754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLboolean mRotatePending; 42472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DMacroscopic; 425773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 42672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 427773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SL3DSourceItf_ *mItf; 42872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 429773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mHeadRelative; 430773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mRolloffMaxDistanceMute; 431773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mMaxDistance; 432773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillimeter mMinDistance; 4337754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mConeInnerAngle; 4347754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten SLmillidegree mConeOuterAngle; 435773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mConeOuterLevel; 436773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRolloffFactor; 437773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRoomRolloffFactor; 438773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mDistanceModel; 43972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} I3DSource; 440773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 44172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 442773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioDecoderCapabilitiesItf_ *mItf; 44372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 44472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioDecoderCapabilities; 445773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 44672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 447773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioEncoderItf_ *mItf; 44872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 449773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLAudioEncoderSettings mSettings; 45072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoder; 451773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 45272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 453773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioEncoderCapabilitiesItf_ *mItf; 45472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 45572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioEncoderCapabilities; 456773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 45772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 458773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLAudioIODeviceCapabilitiesItf_ *mItf; 45972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 4607754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; 4617754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mAvailableAudioInputsChangedContext; 4627754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; 4637754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mAvailableAudioOutputsChangedContext; 4647754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; 4657754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mDefaultDeviceIDMapChangedContext; 46672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IAudioIODeviceCapabilities; 467773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 46872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 469773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLBassBoostItf_ *mItf; 47072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 471773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 472773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStrength; 4739cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 4749cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi effect_descriptor_t mBassBoostDescriptor; 4759cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi android::sp<android::AudioEffect> mBassBoostEffect; 4769cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi#endif 47772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBassBoost; 478773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 47972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct BufferQueue_interface { 480773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLBufferQueueItf_ *mItf; 48172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 4823a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLBufferQueueState mState; 483773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slBufferQueueCallback mCallback; 484773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 4854b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // originally SLuint32, but range-checked down to SLuint16 4864b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLuint16 mNumBuffers; 4874b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten /*SLboolean*/ SLuint16 mClearRequested; 488d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader *mArray; 489d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader *mFront, *mRear; 4904b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID 4911ae30e37f39fcfe7937a707b789e49a7d68112baJean-Michel Trivi SLuint32 mSizeConsumed; 4924b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 493773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // saves a malloc in the typical case 494773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#define BUFFER_HEADER_TYPICAL 4 495d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; 49672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IBufferQueue; 497773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 498a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#define MAX_DEVICE 2 // hard-coded array size for default in/out 49940d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten 50072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 501773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDeviceVolumeItf_ *mItf; 50272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 5037a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten SLint32 mVolume[MAX_DEVICE]; 50472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDeviceVolume; 505773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 50672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 507773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDynamicInterfaceManagementItf_ *mItf; 50872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 509773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slDynamicInterfaceManagementCallback mCallback; 510773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 51172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicInterfaceManagement; 512773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 51372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 514773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLDynamicSourceItf_ *mItf; 51572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 516773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLDataSource *mDataSource; 51772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IDynamicSource; 518773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 519773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi// private 520773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 521773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EnableLevel { 522773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnable; 523773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mSendLevel; 524773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 525773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 526510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten// indexes into IEffectSend.mEnableLevels 527510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 528510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_ENVIRONMENTALREVERB 0 529510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_PRESETREVERB 1 530510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define AUX_MAX 2 531510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 53272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 533773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEffectSendItf_ *mItf; 53472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 535e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten struct EnableLevel mEnableLevels[AUX_MAX]; // wet enable and volume per effect type 53672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEffectSend; 53772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 538ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kastentypedef struct Engine_interface { 539773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEngineItf_ *mItf; 54072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 541773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mLossOfControlGlobal; 54200d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL 543e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt 54400d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif 545773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // Each engine is its own universe. 54672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten SLuint32 mInstanceCount; 547d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten unsigned mInstanceMask; // 1 bit per active object 548e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten unsigned mChangedMask; // objects which have changed since last sync 549a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#define MAX_INSTANCE 32 // maximum active objects per engine, see mInstanceMask 550d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten IObject *mInstances[MAX_INSTANCE]; 551d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLboolean mShutdown; 552e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean mShutdownAck; 553d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten ThreadPool mThreadPool; // for asynchronous operations 55414e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 5557e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi // FIXME number of presets will only be saved in IEqualizer, preset names will not be stored 5564be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi SLuint32 mEqNumPresets; 5574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi char** mEqPresetNames; 5584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif 55972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngine; 560773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 56172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 562773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEngineCapabilitiesItf_ *mItf; 56372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 564773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mThreadSafe; 56540d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten // const 56640d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten SLuint32 mMaxIndexLED; 56740d1c40832a448e23d0bb37512aee53222575c2eGlenn Kasten SLuint32 mMaxIndexVibra; 56872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEngineCapabilities; 569773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 57072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 571773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEnvironmentalReverbItf_ *mItf; 57272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 573773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLEnvironmentalReverbSettings mProperties; 574172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 575172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi effect_descriptor_t mEnvironmentalReverbDescriptor; 576172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi android::sp<android::AudioEffect> mEnvironmentalReverbEffect; 577172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#endif 57872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEnvironmentalReverb; 579773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 580773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivistruct EqualizerBand { 581773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mMin; 582773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mCenter; 5830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmilliHertz mMax; 584773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 585773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 58614e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 5874be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#define MAX_EQ_BANDS 0 5884be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#else 5893a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_EQ_BANDS 4 // compile-time limit, runtime limit may be smaller 5904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif 5913a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten 59272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 593773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLEqualizerItf_ *mItf; 59472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 595773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 596773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mPreset; 597a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#if 0 < MAX_EQ_BANDS 5983a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLmillibel mLevels[MAX_EQ_BANDS]; 599a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif 6003a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten // const to end of struct 601773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mNumPresets; 602773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mNumBands; 603a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#if !defined(ANDROID) || defined(USE_BACKPORT) 6040b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const struct EqualizerBand *mBands; 6053a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten const struct EqualizerPreset *mPresets; 606a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif 6070b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel mBandLevelRangeMin; 6080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLmillibel mBandLevelRangeMax; 60914e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#if defined(ANDROID) && !defined(USE_BACKPORT) 6104be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi effect_descriptor_t mEqDescriptor; 6114be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi android::sp<android::AudioEffect> mEqEffect; 6124be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif 61372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IEqualizer; 614773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 6153a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten#define MAX_LED_COUNT 32 6163a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten 61772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 618773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLLEDArrayItf_ *mItf; 61972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 620773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mLightMask; 6213a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLHSL mColors[MAX_LED_COUNT]; 622773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 623773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mCount; 62472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ILEDArray; 625773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 62672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 627773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMetadataExtractionItf_ *mItf; 62872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 629773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mKeySize; 630773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const void *mKey; 631773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mKeyEncoding; 632773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const SLchar *mValueLangCountry; 633773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mValueEncoding; 634773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint8 mFilterMask; 6356a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten int mKeyFilter; 63672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataExtraction; 637773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 63872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 639773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMetadataTraversalItf_ *mItf; 64072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 641773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mIndex; 642773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMode; 643773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCount; 644773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mSize; 64572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMetadataTraversal; 646773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 64772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 648773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDIMessageItf_ *mItf; 64972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 650773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slMetaEventCallback mMetaEventCallback; 651773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mMetaEventContext; 652773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slMIDIMessageCallback mMessageCallback; 653773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mMessageContext; 6540b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint8 mMessageTypes; 65572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMessage; 656773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 65772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 658773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDIMuteSoloItf_ *mItf; 65972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 660773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mChannelMuteMask; 661773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mChannelSoloMask; 662773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTrackMuteMask; 663773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTrackSoloMask; 664d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const 665773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mTrackCount; 66672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDIMuteSolo; 667773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 66872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 669773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDITempoItf_ *mItf; 67072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 671773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mTicksPerQuarterNote; 672773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mMicrosecondsPerQuarterNote; 67372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITempo; 674773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 67572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 676773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMIDITimeItf_ *mItf; 67772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 678773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDuration; 679773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mPosition; 680773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mStartTick; 681773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mNumTicks; 68272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMIDITime; 683773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 68472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 685773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLMuteSoloItf_ *mItf; 68672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 687b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten // fields that were formerly here are now at CAudioPlayer 68872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IMuteSolo; 689773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 690d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define MAX_TRACK 32 // see mActiveMask 691d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 69272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 693773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLOutputMixItf_ *mItf; 69472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 6957754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten slMixDeviceChangeCallback mCallback; 6967754b1c33590dbb03531f59e6f108818bc303f4fGlenn Kasten void *mContext; 69772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMix; 698773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 699773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 70072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 701773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLOutputMixExtItf_ *mItf; 70272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 703928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten unsigned mActiveMask; // 1 bit per active track 704928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten Track mTracks[MAX_TRACK]; 705f51dba65751107c930759938775b75531ec1f330Glenn Kasten SLboolean mDestroyRequested; ///< Mixer to acknowledge application's call to Object::Destroy 70672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IOutputMixExt; 707773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 708773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 70972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 710773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPitchItf_ *mItf; 71172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 712773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mPitch; 713773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // const 714773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinPitch; 715773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxPitch; 71672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPitch; 717773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 71872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct Play_interface { 719773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPlayItf_ *mItf; 72072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 7213a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kasten SLuint32 mState; 722e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // next 2 fields are read-only to application 723773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mDuration; 724773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPosition; 725773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slPlayCallback mCallback; 726773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 727773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mEventFlags; 728e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // the ISeek trick of using a distinct value doesn't work here because it's readable by app 729773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mMarkerPosition; 7308c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten SLmillisecond mPositionUpdatePeriod; // Zero means do not do position updates (FIXME ~0) 7318c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten#ifdef USE_OUTPUTMIXEXT 7328c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten SLuint32 mFrameUpdatePeriod; // mPositionUpdatePeriod in frame units 7338c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten SLmillisecond mLastSeekPosition; // Last known accurate position, set at Seek 7348c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten SLuint32 mFramesSinceLastSeek; // Frames mixed since last known accurate position 7358c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten SLuint32 mFramesSincePositionUpdate; // Frames mixed since last position update callback 7368c065779232fdd89abace68d2fc7bea786a010d7Glenn Kasten#endif 73772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlay; 738773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 73972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 740773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPlaybackRateItf_ *mItf; 74172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 742773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRate; 743773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mProperties; 7440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // const 745773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinRate; 746773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxRate; 747773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStepSize; 748773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCapabilities; 74972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPlaybackRate; 750773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 75172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 752773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPrefetchStatusItf_ *mItf; 75372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 754773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mStatus; 755773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mLevel; 756773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slPrefetchCallback mCallback; 757773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 758773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCallbackEventsMask; 759773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mFillUpdatePeriod; 76072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPrefetchStatus; 761773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 76272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 763773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLPresetReverbItf_ *mItf; 76472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 765773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint16 mPreset; 766172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 767172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi effect_descriptor_t mPresetReverbDescriptor; 768172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi android::sp<android::AudioEffect> mPresetReverbEffect; 769172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi#endif 77072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IPresetReverb; 771773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 77272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 773773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLRatePitchItf_ *mItf; 77472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 775773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mRate; 7760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // const 777773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMinRate; 778773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mMaxRate; 77972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRatePitch; 780773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 78172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 782773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLRecordItf_ *mItf; 78372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 784773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mState; 785773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mDurationLimit; 786773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPosition; 787773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slRecordCallback mCallback; 788773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 789773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mCallbackEventsMask; 790773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mMarkerPosition; 791773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mPositionUpdatePeriod; 79272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IRecord; 793773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 79472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 795773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLSeekItf_ *mItf; 79672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 797e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLmillisecond mPos; // mPos != SL_TIME_UNKNOWN means pending seek request 798773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mLoopEnabled; 799773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mStartPos; 800773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillisecond mEndPos; 80172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} ISeek; 802773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 80372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 804773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLThreadSyncItf_ *mItf; 80572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 806773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mInCriticalSection; 807e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint32 mWaiting; // number of threads waiting 808773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi pthread_t mOwner; 80972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IThreadSync; 810773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 81172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 812773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVibraItf_ *mItf; 81372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 814773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mVibrate; 815773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mFrequency; 816773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mIntensity; 81772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVibra; 818773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 81972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 820773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVirtualizerItf_ *mItf; 82172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 822773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLboolean mEnabled; 823773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStrength; 824f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 825f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi effect_descriptor_t mVirtualizerDescriptor; 826f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi android::sp<android::AudioEffect> mVirtualizerEffect; 827f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi#endif 82872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVirtualizer; 829773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 83072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 831773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVisualizationItf_ *mItf; 83272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 833773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi slVisualizationCallback mCallback; 834773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi void *mContext; 835773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmilliHertz mRate; 83672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVisualization; 837773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 838e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastentypedef struct /*Volume_interface*/ { 839773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi const struct SLVolumeItf_ *mItf; 84072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject *mThis; 841e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // Values as specified by the application 842773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLmillibel mLevel; 843773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLpermille mStereoPosition; 8447a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten SLuint8 /*SLboolean*/ mMute; 845e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint8 /*SLboolean*/ mEnableStereoPosition; 84672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} IVolume; 847773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 848773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* Class structures */ 849773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 8506a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten/*typedef*/ struct C3DGroup_struct { 85172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 852510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces 853510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default]; 85472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 85572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 85672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 85772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 85872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 859a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // remaining are per-instance private fields not associated with an interface 8606a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten unsigned mMemberMask; // set of member objects 8616a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten} /*C3DGroup*/; 862773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 86380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID 86405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi 865a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten// FIXME Move these into the I... section above 866a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten 86767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivitypedef struct { 8685b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi const struct SLAndroidEffectItf_ *mItf; 86967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi IObject *mThis; 870ca533f4e1c67e9136044f25ca84b65102c8892fdEric Laurent android::KeyedVector<SLuint32, android::AudioEffect* > *mEffects; 8715b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi} IAndroidEffect; 8725b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 8735b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivitypedef struct { 8745b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi const struct SLAndroidEffectCapabilitiesItf_ *mItf; 8755b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi IObject *mThis; 8765b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi SLuint32 mNumFx; 8775b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi effect_descriptor_t* mFxDescriptors; 8785b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi} IAndroidEffectCapabilities; 8795b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 880fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivitypedef struct { 881fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi const struct SLAndroidEffectSendItf_ *mItf; 882fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IObject *mThis; 883fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // only one send per interface for now (1 bus) 884fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLboolean mEnabled; 885fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLmillibel mSendLevel; //android::KeyedVector<SLuint32, SLmillibel> mSendLevels; 886fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} IAndroidEffectSend; 887fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 88842309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivitypedef struct { 88942309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi const struct SLAndroidConfigurationItf_ *mItf; 89042309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi IObject *mThis; 89142309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi} IAndroidConfiguration; 89242309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi 8935b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#if defined(ANDROID) && !defined(USE_BACKPORT) 8945b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi// FIXME this include is done here so the effect structures have been defined. Messy. 8955b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#include "android_Effect.h" 8965b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#endif 8975b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 89867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 899773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi/* 900773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * Used to define the mapping from an OpenSL ES audio player to an Android 901773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi * media framework object 902773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi */ 903773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivienum AndroidObject_type { 904c116ab2a033ee7dc78cfd458defe38d4528383a8Jean-Michel Trivi INVALID_TYPE =-1, 905773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi MEDIAPLAYER = 0, 906b2838f652722e4f26269aeb7db258f5d1eec7814Jean-Michel Trivi AUDIOTRACK_PULL = 1, 907773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi NUM_AUDIOPLAYER_MAP_TYPES 908773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi}; 909f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivi 91080ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivienum AndroidObject_state { 91180ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_UNINITIALIZED = -1, 91280ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_PREPARING, 91380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi ANDROID_READY, 91480ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi NUM_ANDROID_STATES 91580ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi}; 916a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten 917a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#endif // ANDROID 91805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi 919773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 920acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten/*typedef*/ struct CAudioPlayer_struct { 92172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 92205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID 923fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi#define INTERFACES_AudioPlayer 29 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 92405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#else 925510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_AudioPlayer 26 // see MPH_to_AudioPlayer in MPH_to.c for list of interfaces 92605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif 927510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_AudioPlayer - INTERFACES_Default]; 92872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 92972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlay mPlay; 93072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 93172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DGrouping m3DGrouping; 93272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 93372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 93472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBufferQueue mBufferQueue; 93572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEffectSend mEffectSend; 93672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 93772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 93872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPrefetchStatus mPrefetchStatus; 93972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IRatePitch mRatePitch; 94072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ISeek mSeek; 94172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 942e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IMuteSolo mMuteSolo; 94305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#ifdef ANDROID 9445b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi IAndroidEffect mAndroidEffect; 945fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend mAndroidEffectSend; 946453dd564a81fe98b7a947ae4a9844a53fa957c2bJean-Michel Trivi IAndroidConfiguration mAndroidConfiguration; 94705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#endif 948773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 94972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 95072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 95172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 95272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 95372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 95472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPitch mPitch; 95572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 95672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlaybackRate mPlaybackRate; 95772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 95872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 959a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // remaining are per-instance private fields not associated with an interface 960acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocatorFormat mDataSource; 961acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten DataLocatorFormat mDataSink; 9621fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // cached data for this instance 963e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint8 /*SLboolean*/ mMute; 964b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten // Formerly at IMuteSolo 965b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten SLuint8 mMuteMask; // Mask for which channels are muted: bit 0=left, 1=right 966b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten SLuint8 mSoloMask; // Mask for which channels are soloed: bit 0=left, 1=right 967b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 968a50f5208eb9022a9d1a51288e25553cfe6828b3aJean-Michel Trivi SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known 969928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten // Formerly at IEffectSend 970928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten /** 971928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten * Dry volume modified by effect send interfaces: SLEffectSendItf and SLAndroidEffectSendItf 972928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten */ 973928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten SLmillibel mDirectLevel; 9741fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi // implementation-specific data for this instance 975e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef USE_OUTPUTMIXEXT 976369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kasten Track *mTrack; 977928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten float mGains[STEREO_CHANNELS]; ///< Computed gain based on volume, mute, solo, stereo position 978928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten SLboolean mDestroyRequested; ///< Mixer to acknowledge application's call to Object::Destroy 979e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif 980773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_SNDFILE 981773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi struct SndFile mSndFile; 982773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif // USE_SNDFILE 98380ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi#ifdef ANDROID 98406a1b91fb42d3ecc9da725e673b56ca849b9b9a4Jean-Michel Trivi android::Mutex *mpLock; 985773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi enum AndroidObject_type mAndroidObjType; 98680ed979fd2aef1d6bcaeb1bb2be5b220ac04fe9dJean-Michel Trivi enum AndroidObject_state mAndroidObjState; 9873d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi /** identifies which group of effects ("session") this player belongs to */ 9883d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi int mSessionId; 98975e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi /** identifies the Android stream type playback will occur on */ 99075e22870e41386cdc597bd29c76744d74d4c22adJean-Michel Trivi int mStreamType; 9913d15cfe1b1723e87ff1d04065d2d5e631abf257bJean-Michel Trivi /** plays the PCM data for this player */ 9924614bf6ff570bc1593e07f796d2d8d28c6424c50Jean-Michel Trivi android::AudioTrack *mAudioTrack; 99314e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#ifndef USE_BACKPORT 994de16b4c2bc71c163c7c821a475a53a3b567789b2Jean-Michel Trivi android::sp<android::SfPlayer> mSfPlayer; 99514e903028c4abfc1b2fbfab6560e3b864086f895Glenn Kasten#endif 996e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten /** 997e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Amplification (can be attenuation) factor derived for the VolumeLevel 998e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten */ 999e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten float mAmplFromVolLevel; 1000e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten /** 1001e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten * Left/right amplification (can be attenuations) factors derived for the StereoPosition 1002e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten */ 1003e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten float mAmplFromStereoPos[STEREO_CHANNELS]; 1004172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi /** 1005fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * Attenuation factor derived from direct level 1006172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi */ 1007172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi float mAmplFromDirectLevel; 1008773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 1009acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten} /*CAudioPlayer*/; 1010773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 10113af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 10123af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi/*typedef*/ struct CAudioRecorder_struct { 1013773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 101472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 10153af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 101642309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi#define INTERFACES_AudioRecorder 11 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 10173af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#else 10183af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define INTERFACES_AudioRecorder 9 // see MPH_to_AudioRecorder in MPH_to.c for list of interfaces 10193af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 1020a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten SLuint8 mInterfaceStates2[INTERFACES_AudioRecorder - INTERFACES_Default]; 102172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 102272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IRecord mRecord; 102372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioEncoder mAudioEncoder; 1024773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 102572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 102672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 102772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 102872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 102972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 10303af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 10313af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi IBufferQueue mBufferQueue; 103242309377d1ed17b557fab30f1bf26b8ba31a96fdJean-Michel Trivi IAndroidConfiguration mAndroidConfiguration; 10333af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 1034a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // remaining are per-instance private fields not associated with an interface 1035ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten DataLocatorFormat mDataSource; 1036ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten DataLocatorFormat mDataSink; 1037712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi // cached data for this instance 1038712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi SLuint8 mNumChannels; // 0 means unknown, then const once it is known, range 1 <= x <= 8 1039712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi SLuint32 mSampleRateMilliHz;// 0 means unknown, then const once it is known 10403af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi // implementation-specific data for this instance 10413af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 10423af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi android::AudioRecord *mAudioRecord; 1043b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi int mRecordSource; 10443af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 10453af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi} /*CAudioRecorder*/; 10463af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 1047773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 104872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1049773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated implicit interfaces 105072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 10515b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#ifdef ANDROID 10525b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#define INTERFACES_Engine 11 // see MPH_to_Engine in MPH_to.c for list of interfaces 10535b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#else 1054510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Engine 10 // see MPH_to_Engine in MPH_to.c for list of interfaces 10555b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#endif 1056510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Engine - INTERFACES_Default]; 105772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 105872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEngine mEngine; 105972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEngineCapabilities mEngineCapabilities; 106072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IThreadSync mThreadSync; 1061773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated explicit interfaces 106272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioIODeviceCapabilities mAudioIODeviceCapabilities; 106372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioDecoderCapabilities mAudioDecoderCapabilities; 106472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IAudioEncoderCapabilities mAudioEncoderCapabilities; 106572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DCommit m3DCommit; 1066928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#ifdef ANDROID 10675b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi IAndroidEffectCapabilities mAndroidEffectCapabilities; 1068928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#endif 1069773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 107072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDeviceVolume mDeviceVolume; 1071a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // remaining are per-instance private fields not associated with an interface 1072b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten pthread_t mSyncThread; 107372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CEngine; 1074773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 107572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1076773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 107772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1078510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_LEDDevice 3 // see MPH_to_LEDDevice in MPH_to.c for list of interfaces 1079510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_LEDDevice - INTERFACES_Default]; 108072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 108172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ILEDArray mLEDArray; 1082a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // remaining are per-instance private fields not associated with an interface 1083773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDeviceID; 108472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CLEDDevice; 1085773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 108672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1087773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 108872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1089510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_Listener 4 // see MPH_to_Listener in MPH_to.c for list of interfaces 1090510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_Listener - INTERFACES_Default]; 109172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 109272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 109372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 1094a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // remaining are per-instance private fields not associated with an interface 109572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CListener; 1096773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 109772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1098773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 109972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1100e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#define INTERFACES_MetadataExtractor 5 // see MPH_to_MetadataExtractor in MPH_to.c for list of 1101e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // interfaces 1102510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MetadataExtractor - INTERFACES_Default]; 110372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 110472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 110572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 110672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 1107a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // remaining are per-instance private fields not associated with an interface 110872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMetadataExtractor; 1109773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 111072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1111773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 111272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1113453dd564a81fe98b7a947ae4a9844a53fa957c2bJean-Michel Trivi 1114510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_MidiPlayer 29 // see MPH_to_MidiPlayer in MPH_to.c for list of interfaces 1115510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_MidiPlayer - INTERFACES_Default]; 111672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 111772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlay mPlay; 111872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DDoppler m3DDoppler; 111972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DGrouping m3DGrouping; 112072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DLocation m3DLocation; 112172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DSource m3DSource; 112272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBufferQueue mBufferQueue; 112372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEffectSend mEffectSend; 112472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataExtraction mMetadataExtraction; 112572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMetadataTraversal mMetadataTraversal; 112672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDIMessage mMIDIMessage; 112772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDITime mMIDITime; 112872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDITempo mMIDITempo; 112972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IMIDIMuteSolo mMIDIMuteSolo; 113072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPrefetchStatus mPrefetchStatus; 113172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten ISeek mSeek; 113272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 1133e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IMuteSolo mMuteSolo; 1134773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 113572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten I3DMacroscopic m3DMacroscopic; 113672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 113772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicSource mDynamicSource; 113872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 113972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 114072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPitch mPitch; 114172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 114272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPlaybackRate mPlaybackRate; 114372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 114472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 1145a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // remaining are per-instance private fields not associated with an interface 114672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CMidiPlayer; 114772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten 1148e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten/*typedef*/ struct COutputMix_struct { 1149773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 115072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 115149e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi#ifdef ANDROID 115249e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi#define INTERFACES_OutputMix 12 // see MPH_to_OutputMix in MPH_to.c for list of interfaces 115349e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi#else 1154510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_OutputMix 11 // see MPH_to_OutputMix in MPH_to.c for list of interfaces 115549e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi#endif 1156510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_OutputMix - INTERFACES_Default]; 115772a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 115872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IOutputMix mOutputMix; 1159773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#ifdef USE_OUTPUTMIXEXT 116072a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IOutputMixExt mOutputMixExt; 1161773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi#endif 116272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEnvironmentalReverb mEnvironmentalReverb; 116372a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IEqualizer mEqualizer; 116472a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IPresetReverb mPresetReverb; 116572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVirtualizer mVirtualizer; 116672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVolume mVolume; 1167773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // optional interfaces 116872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IBassBoost mBassBoost; 116972a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVisualization mVisualization; 11707e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#ifdef ANDROID 117149e4cfeedc0f8e571d301384084397054b4922f8Jean-Michel Trivi IAndroidEffect mAndroidEffect; 11727e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi#endif 1173a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // remaining are per-instance private fields not associated with an interface 1174e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} /*COutputMix*/; 1175773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi 117672a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kastentypedef struct { 1177773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi // mandated interfaces 117872a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IObject mObject; 1179510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define INTERFACES_VibraDevice 3 // see MPH_to_VibraDevice in MPH_to.c for list of interfaces 1180510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint8 mInterfaceStates2[INTERFACES_VibraDevice - INTERFACES_Default]; 118172a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IDynamicInterfaceManagement mDynamicInterfaceManagement; 118272a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten IVibra mVibra; 1183a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // remaining are per-instance private fields not associated with an interface 1184773e0429cbb9e85b4f1c6eb5a095ccd7b57f5ba4Jean-Michel Trivi SLuint32 mDeviceID; 118572a04d8e9e059dad969d166a6a70491fe1e65970Glenn Kasten} CVibraDevice; 1186a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 118761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstruct MPH_init { 1188a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten VoidHook mInit; // called first to initialize the interface, right after object is allocated 1189a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // Each interface is initialized regardless whether it is exposed to application. 1190a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten VoidHook mResume; // called to resume interface after suspension, not currently used 1191a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten VoidHook mDeinit; // called last when object is about to be destroyed 1192a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten BoolHook mExpose; // called after initialization, only if interface is exposed to application 1193711332800108ad6e0e594796e5f8db0da3eff402Glenn Kasten VoidHook mRemove; // called by DynamicInterfaceManager::RemoveInterface, and prior to mDeinit 1194a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // will need a suspend hook when suspend is implemented 119561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 119661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 119761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ int IID_to_MPH(const SLInterfaceID iid); 119861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenextern /*static*/ const struct MPH_init MPH_init_table[MPH_MAX]; 1199979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern SLresult checkInterfaces(const ClassTable *class__, 1200979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 1201979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten const SLboolean *pInterfaceRequired, unsigned *pExposedMask); 1202979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern IObject *construct(const ClassTable *class__, 1203979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten unsigned exposedMask, SLEngineItf engine); 1204979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const ClassTable *objectIDtoClass(SLuint32 objectID); 1205979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenextern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; 1206b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kastenextern SLuint32 IObjectToObjectID(IObject *object); 1207f51dba65751107c930759938775b75531ec1f330Glenn Kastenextern void IObject_Publish(IObject *this); 1208f51dba65751107c930759938775b75531ec1f330Glenn Kastenextern void IObject_Destroy(SLObjectItf self); 1209b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 1210d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's "object ID" (which is really a class ID). 1211d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 1212d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then use IObjectToObjectID directly. 1213b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten 1214b7154f2324c8ae44b820c07c69aaa80a4bb9e418Glenn Kasten#define InterfaceToObjectID(this) IObjectToObjectID((this)->mThis) 1215daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 1216d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Map an interface to it's corresponding IObject. 1217d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// Note: this operation is undefined on IObject, as it lacks an mThis. 1218d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten// If you have an IObject, then you're done -- you already have what you need. 1219d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 1220d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define InterfaceToIObject(this) ((this)->mThis) 1221d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten 12221fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi#define InterfaceToCAudioPlayer(this) (((CAudioPlayer*)InterfaceToIObject(this))) 12231fec6cc920db52e63c67eafd2034e52b8eb5780dJean-Michel Trivi 12243af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#define InterfaceToCAudioRecorder(this) (((CAudioRecorder*)InterfaceToIObject(this))) 12253af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 1226ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 1227d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi#include "android_AudioPlayer.h" 1228daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif 1229daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 1230e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenextern SLresult checkDataSource(const SLDataSource *pDataSrc, 12313af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi DataLocatorFormat *myDataSourceLocator); 1232712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Triviextern SLresult checkDataSink(const SLDataSink *pDataSink, DataLocatorFormat *myDataSinkLocator, 1233712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi SLuint32 objType); 12343c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Triviextern SLresult checkSourceFormatVsInterfacesCompatibility( 1235104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten const DataLocatorFormat *pDataLocatorFormat, const ClassTable *class__, 1236104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten unsigned exposedMask); 1237daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenextern void freeDataLocatorFormat(DataLocatorFormat *dlf); 12383af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 1239f51dba65751107c930759938775b75531ec1f330Glenn Kastenextern bool C3DGroup_PreDestroy(void *self); 1240f51dba65751107c930759938775b75531ec1f330Glenn Kasten 12413a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern SLresult CAudioPlayer_Realize(void *self, SLboolean async); 1242928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern SLresult CAudioPlayer_Resume(void *self, SLboolean async); 12433a413f1863daa026ed2b9fc9eac01e1341116cdbGlenn Kastenextern void CAudioPlayer_Destroy(void *self); 1244928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern bool CAudioPlayer_PreDestroy(void *self); 12453af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 12463af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Realize(void *self, SLboolean async); 12473af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern SLresult CAudioRecorder_Resume(void *self, SLboolean async); 12483af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviextern void CAudioRecorder_Destroy(void *self); 1249928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern bool CAudioRecorder_PreDestroy(void *self); 12503af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 1251d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult CEngine_Realize(void *self, SLboolean async); 1252928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern SLresult CEngine_Resume(void *self, SLboolean async); 1253d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void CEngine_Destroy(void *self); 1254928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern bool CEngine_PreDestroy(void *self); 1255711332800108ad6e0e594796e5f8db0da3eff402Glenn Kastenextern void CEngine_Destroyed(CEngine *self); 12563af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 12577e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern SLresult COutputMix_Realize(void *self, SLboolean async); 12587e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern SLresult COutputMix_Resume(void *self, SLboolean async); 12597e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Triviextern void COutputMix_Destroy(void *self); 1260928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern bool COutputMix_PreDestroy(void *self); 12617e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi 126200d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL 1263768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kastenextern void SDL_open(IEngine *thisEngine); 1264768edbc2a8e7f197548cf1141689dd237d19c455Glenn Kastenextern void SDL_close(void); 126500d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif 1266510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1 ((SLuint32) 0x4) // async realize on work queue 1267510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_2 ((SLuint32) 0x5) // sync realize, or async realize hook 1268510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1 ((SLuint32) 0x6) // async resume on work queue 1269510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_2 ((SLuint32) 0x7) // sync resume, or async resume hook 1270510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_SUSPENDING ((SLuint32) 0x8) // suspend in progress 1271510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_REALIZING_1A ((SLuint32) 0x9) // abort while async realize on work queue 1272510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten#define SL_OBJECT_STATE_RESUMING_1A ((SLuint32) 0xA) // abort while async resume on work queue 1273928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten#define SL_OBJECT_STATE_DESTROYING ((SLuint32) 0xB) // destroy object when no strong references 1274d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern void *sync_start(void *arg); 1275d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenextern SLresult err_to_result(int err); 12767245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten 12777245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#ifdef __GNUC__ 1278d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten#define ctz __builtin_ctz 12797245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#else 12807245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kastenextern unsigned ctz(unsigned); 12817245a5b0889fec8996e3a9d270e551cc1bf940abGlenn Kasten#endif 128240d1c40832a448e23d0bb37512aee53222575c2eGlenn Kastenextern const char * const interface_names[MPH_MAX]; 1283e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#include "platform.h" 1284e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 1285e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten// Attributes 1286e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 12873c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_NONE ((unsigned) 0x0) // none 12883c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_GAIN ((unsigned) 0x1 << 0) // player volume, channel mute, channel solo, 12893c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi // player stereo position, player mute 12903c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_TRANSPORT ((unsigned) 0x1 << 1) // play state, looping 12913c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#define ATTR_POSITION ((unsigned) 0x1 << 2) // requested position (a.k.a. seek position) 1292343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten#define ATTR_ENQUEUE ((unsigned) 0x1 << 3) // buffer queue became non-empty and in playing state 1293a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten 1294a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATALOCATOR_NULL 0 // application specified a NULL value for pLocator 1295a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten#define SL_DATAFORMAT_NULL 0 // application specified a NULL or undefined value for pFormat 1296ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 12977a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// Trace debugging 12987a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 12994c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten// Always defined, but may be a no-op if trace support is disabled at compile-time 13004c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceSetEnabled(unsigned enabled); 13014c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten 13024c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_ENTER 0x1 13034c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_LEAVE_FAILURE 0x2 13044c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_LEAVE_VOID 0x4 13054597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_LEAVE_SUCCESS 0x8 13064597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_LEAVE (SL_TRACE_LEAVE_FAILURE | SL_TRACE_LEAVE_VOID | \ 13074597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten SL_TRACE_LEAVE_SUCCESS) 13084597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten#define SL_TRACE_ALL (SL_TRACE_ENTER | SL_TRACE_LEAVE) 13095e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#ifndef SL_TRACE_DEFAULT 13104c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_TRACE_DEFAULT (SL_TRACE_LEAVE_FAILURE) 13115e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten#endif 13124c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten 13137a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifndef USE_TRACE 13147a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 1315486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_GLOBAL SLresult result; 1316486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_GLOBAL return result; 1317486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE SLresult result; 1318486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE return result; 1319486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_ENTER_INTERFACE_VOID 1320486fb358beddd0967037ad8ca9151c9dff89da8dJean-Michel Trivi#define SL_LEAVE_INTERFACE_VOID return; 13217a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 1322ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#else 13237a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 13244c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterGlobal(const char *function); 13254c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveGlobal(const char *function, SLresult result); 13264c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterInterface(const char *function); 13274c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveInterface(const char *function, SLresult result); 13284c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceEnterInterfaceVoid(const char *function); 13294c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenextern void slTraceLeaveInterfaceVoid(const char *function); 13304c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_GLOBAL SLresult result; slTraceEnterGlobal(__FUNCTION__); 13314c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_GLOBAL slTraceLeaveGlobal(__FUNCTION__, result); return result; 13324c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_INTERFACE SLresult result; slTraceEnterInterface(__FUNCTION__); 13334c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_INTERFACE slTraceLeaveInterface(__FUNCTION__, result); return result; 13344c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_ENTER_INTERFACE_VOID slTraceEnterInterfaceVoid(__FUNCTION__); 13354c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#define SL_LEAVE_INTERFACE_VOID slTraceLeaveInterfaceVoid(__FUNCTION__); return; 13367a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 1337ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#endif 13380b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten 13394b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_OUTPUTMIXEXT 13404b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 13414b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SL_PLAYSTATE_STOPPING ((SLuint32) 0x4) // Play::Stop while PLAYING 13424b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// If we needed it, could have PLAYING mean mixer is currently reading from front buffer, 13434b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten// while PLAYABLE would mean application requested PLAYING, but buffer queue is empty 13444b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 13454b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 13464b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 13474b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef USE_SNDFILE 13484b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenextern void audioPlayerTransportUpdate(CAudioPlayer *audioPlayer); 13494b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 1350e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten 1351e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_Enqueue(SLBufferQueueItf self, const void *pBuffer, SLuint32 size); 1352e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_Clear(SLBufferQueueItf self); 1353e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern SLresult IBufferQueue_RegisterCallback(SLBufferQueueItf self, 1354e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten slBufferQueueCallback callback, void *pContext); 1355e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten 1356e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kastenextern bool IsInterfaceInitialized(IObject *this, unsigned MPH); 1357928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern SLresult AcquireStrongRef(IObject *object, SLuint32 expectedObjectID); 1358928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern void ReleaseStrongRef(IObject *object); 1359928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kastenextern void ReleaseStrongRefAndUnlockExclusive(IObject *object); 1360f51dba65751107c930759938775b75531ec1f330Glenn Kasten 1361f51dba65751107c930759938775b75531ec1f330Glenn Kastenextern COutputMix *CAudioPlayer_GetOutputMix(CAudioPlayer *audioPlayer); 1362