1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "Configuration.h" 18 #ifdef ANDROID 19 #include <jni.h> 20 21 #include "media/AudioEffect.h" 22 #include "hardware/audio_effect.h" 23 #endif 24 25 /* Interface structures */ 26 27 typedef struct Object_interface { 28 const struct SLObjectItf_ *mItf; // const 29 // field mThis would be redundant within an IObject, so we substitute mEngine 30 CEngine *mEngine; // const 31 const ClassTable *mClass; // const 32 SLuint32 mInstanceID; // const for debugger and for RPC, 0 means unpublished 33 slObjectCallback mCallback; 34 void *mContext; 35 unsigned mGottenMask; ///< bit-mask of interfaces exposed or added, then gotten 36 unsigned mLossOfControlMask; // interfaces with loss of control enabled 37 unsigned mAttributesMask; // attributes which have changed since last sync 38 #if USE_PROFILES & USE_PROFILES_BASE 39 SLint32 mPriority; 40 #endif 41 pthread_mutex_t mMutex; 42 #ifdef USE_DEBUG 43 // Only keep the pthread_t, not the kernel tid, because pthread_self() is very fast 44 // (typically just arithmetic on the stack pointer). But a gettid() is a kernel call 45 // and so too slow to do every time a mutex is acquired. However, we can determine 46 // the kernel tid from the pthread_t. 47 pthread_t mOwner; 48 const char *mFile; 49 int mLine; 50 volatile int32_t mGeneration; // read without a lock, incremented with a lock 51 #endif 52 pthread_cond_t mCond; 53 SLuint8 mState; // really SLuint32, but SLuint8 to save space 54 #if USE_PROFILES & USE_PROFILES_BASE 55 SLuint8 mPreemptable; // really SLboolean, but SLuint8 to save space 56 #else 57 SLuint8 mPadding; 58 #endif 59 SLuint8 mStrongRefCount; // number of strong references to this object 60 // (object cannot be destroyed as long as > 0, and referrers _prefer_ it stay in Realized state) 61 // for best alignment, do not add any fields here 62 #define INTERFACES_Default 1 63 SLuint8 mInterfaceStates[INTERFACES_Default]; // state of each of interface 64 // do not add any fields here 65 } IObject; 66 67 #include "locks.h" 68 69 typedef struct { 70 const struct SL3DCommitItf_ *mItf; 71 IObject *mThis; 72 SLboolean mDeferred; 73 SLuint32 mGeneration; // incremented each master clock cycle 74 SLuint32 mWaiting; // number of threads waiting in Commit 75 } I3DCommit; 76 77 enum CartesianSphericalActive { 78 CARTESIAN_COMPUTED_SPHERICAL_SET, 79 CARTESIAN_REQUESTED_SPHERICAL_SET, 80 CARTESIAN_UNKNOWN_SPHERICAL_SET, 81 CARTESIAN_SET_SPHERICAL_COMPUTED, // not in 1.0.1 82 CARTESIAN_SET_SPHERICAL_REQUESTED, // not in 1.0.1 83 CARTESIAN_SET_SPHERICAL_UNKNOWN 84 }; 85 86 typedef struct { 87 const struct SL3DDopplerItf_ *mItf; 88 IObject *mThis; 89 // The API allows client to specify either Cartesian and spherical velocities. 90 // But an implementation will likely prefer one or the other. So for 91 // maximum portablity, we maintain both units and an indication of which 92 // unit was set most recently. In addition, we keep a flag saying whether 93 // the other unit has been derived yet. It can take significant time 94 // to compute the other unit, so this may be deferred to another thread. 95 // For this reason we also keep an indication of whether the secondary 96 // has been computed yet, and its accuracy. 97 // Though only one unit is primary at a time, a union is inappropriate: 98 // the application might read in both units (not in 1.0.1), 99 // and due to multi-threading concerns. 100 SLVec3D mVelocityCartesian; 101 struct { 102 SLmillidegree mAzimuth; 103 SLmillidegree mElevation; 104 SLmillidegree mSpeed; 105 } mVelocitySpherical; 106 enum CartesianSphericalActive mVelocityActive; 107 SLpermille mDopplerFactor; 108 } I3DDoppler; 109 110 typedef struct { 111 const struct SL3DGroupingItf_ *mItf; 112 IObject *mThis; 113 C3DGroup *mGroup; // strong reference to associated group or NULL 114 } I3DGrouping; 115 116 enum AnglesVectorsActive { 117 ANGLES_COMPUTED_VECTORS_SET, // not in 1.0.1 118 ANGLES_REQUESTED_VECTORS_SET, // not in 1.0.1 119 ANGLES_UNKNOWN_VECTORS_SET, 120 ANGLES_SET_VECTORS_COMPUTED, 121 ANGLES_SET_VECTORS_REQUESTED, 122 ANGLES_SET_VECTORS_UNKNOWN 123 }; 124 125 typedef struct { 126 const struct SL3DLocationItf_ *mItf; 127 IObject *mThis; 128 SLVec3D mLocationCartesian; 129 struct { 130 SLmillidegree mAzimuth; 131 SLmillidegree mElevation; 132 SLmillimeter mDistance; 133 } mLocationSpherical; 134 enum CartesianSphericalActive mLocationActive; 135 struct { 136 SLmillidegree mHeading; 137 SLmillidegree mPitch; 138 SLmillidegree mRoll; 139 } mOrientationAngles; 140 struct { 141 SLVec3D mFront; 142 SLVec3D mAbove; 143 SLVec3D mUp; 144 } mOrientationVectors; 145 enum AnglesVectorsActive mOrientationActive; 146 // Rotations can be slow, so are deferred. 147 SLmillidegree mTheta; 148 SLVec3D mAxis; 149 SLboolean mRotatePending; 150 } I3DLocation; 151 152 typedef struct { 153 const struct SL3DMacroscopicItf_ *mItf; 154 IObject *mThis; 155 struct { 156 SLmillimeter mWidth; 157 SLmillimeter mHeight; 158 SLmillimeter mDepth; 159 } mSize; 160 struct { 161 SLmillimeter mHeading; 162 SLmillimeter mPitch; 163 SLmillimeter mRoll; 164 } mOrientationAngles; 165 struct { 166 SLVec3D mFront; 167 SLVec3D mAbove; 168 SLVec3D mUp; 169 } mOrientationVectors; 170 enum AnglesVectorsActive mOrientationActive; 171 // Rotations can be slow, so are deferred. 172 SLmillidegree mTheta; 173 SLVec3D mAxis; 174 SLboolean mRotatePending; 175 } I3DMacroscopic; 176 177 typedef struct { 178 const struct SL3DSourceItf_ *mItf; 179 IObject *mThis; 180 SLboolean mHeadRelative; 181 SLboolean mRolloffMaxDistanceMute; 182 SLmillimeter mMaxDistance; 183 SLmillimeter mMinDistance; 184 SLmillidegree mConeInnerAngle; 185 SLmillidegree mConeOuterAngle; 186 SLmillibel mConeOuterLevel; 187 SLpermille mRolloffFactor; 188 SLpermille mRoomRolloffFactor; 189 SLuint8 mDistanceModel; 190 } I3DSource; 191 192 typedef struct { 193 const struct SLAudioDecoderCapabilitiesItf_ *mItf; 194 IObject *mThis; 195 } IAudioDecoderCapabilities; 196 197 typedef struct { 198 const struct SLAudioEncoderItf_ *mItf; 199 IObject *mThis; 200 SLAudioEncoderSettings mSettings; 201 } IAudioEncoder; 202 203 typedef struct { 204 const struct SLAudioEncoderCapabilitiesItf_ *mItf; 205 IObject *mThis; 206 } IAudioEncoderCapabilities; 207 208 typedef struct { 209 const struct SLAudioIODeviceCapabilitiesItf_ *mItf; 210 IObject *mThis; 211 slAvailableAudioInputsChangedCallback mAvailableAudioInputsChangedCallback; 212 void *mAvailableAudioInputsChangedContext; 213 slAvailableAudioOutputsChangedCallback mAvailableAudioOutputsChangedCallback; 214 void *mAvailableAudioOutputsChangedContext; 215 slDefaultDeviceIDMapChangedCallback mDefaultDeviceIDMapChangedCallback; 216 void *mDefaultDeviceIDMapChangedContext; 217 } IAudioIODeviceCapabilities; 218 219 typedef struct { 220 const struct SLBassBoostItf_ *mItf; 221 IObject *mThis; 222 SLboolean mEnabled; 223 SLpermille mStrength; 224 #if defined(ANDROID) 225 effect_descriptor_t mBassBoostDescriptor; 226 android::sp<android::AudioEffect> mBassBoostEffect; 227 #endif 228 } IBassBoost; 229 230 typedef struct BufferQueue_interface { 231 const struct SLBufferQueueItf_ *mItf; 232 IObject *mThis; 233 SLBufferQueueState mState; 234 slBufferQueueCallback mCallback; 235 void *mContext; 236 // originally SLuint32, but range-checked down to SLuint16 237 SLuint16 mNumBuffers; 238 /*SLboolean*/ SLuint16 mClearRequested; 239 BufferHeader *mArray; 240 BufferHeader *mFront, *mRear; 241 #ifdef ANDROID 242 SLuint32 mSizeConsumed; 243 bool mCallbackPending; 244 #endif 245 // saves a malloc in the typical case 246 #define BUFFER_HEADER_TYPICAL 4 247 BufferHeader mTypical[BUFFER_HEADER_TYPICAL+1]; 248 } IBufferQueue; 249 250 #define MAX_DEVICE 2 // hard-coded array size for default in/out 251 252 typedef struct { 253 const struct SLDeviceVolumeItf_ *mItf; 254 IObject *mThis; 255 SLint32 mVolume[MAX_DEVICE]; 256 } IDeviceVolume; 257 258 typedef struct { 259 const struct SLDynamicInterfaceManagementItf_ *mItf; 260 IObject *mThis; 261 slDynamicInterfaceManagementCallback mCallback; 262 void *mContext; 263 } IDynamicInterfaceManagement; 264 265 typedef struct { 266 const struct SLDynamicSourceItf_ *mItf; 267 IObject *mThis; 268 SLDataSource *mDataSource; 269 } IDynamicSource; 270 271 // private 272 273 struct EnableLevel { 274 SLboolean mEnable; 275 SLmillibel mSendLevel; 276 }; 277 278 // indexes into IEffectSend.mEnableLevels 279 280 #define AUX_ENVIRONMENTALREVERB 0 281 #define AUX_PRESETREVERB 1 282 #define AUX_MAX 2 283 284 typedef struct { 285 const struct SLEffectSendItf_ *mItf; 286 IObject *mThis; 287 struct EnableLevel mEnableLevels[AUX_MAX]; // wet enable and volume per effect type 288 } IEffectSend; 289 290 typedef struct Engine_interface { 291 const struct SLEngineItf_ *mItf; 292 IObject *mThis; 293 SLboolean mLossOfControlGlobal; 294 #ifdef USE_SDL 295 COutputMix *mOutputMix; // SDL pulls PCM from an arbitrary IOutputMixExt 296 #endif 297 // Each engine is its own universe. 298 SLuint32 mInstanceCount; 299 unsigned mInstanceMask; // 1 bit per active object 300 unsigned mChangedMask; // objects which have changed since last sync 301 #define MAX_INSTANCE 32 // maximum active objects per engine, see mInstanceMask 302 IObject *mInstances[MAX_INSTANCE]; 303 SLboolean mShutdown; 304 SLboolean mShutdownAck; 305 // SLuint32 mVersion; // 0xXXYYZZ where XX=major, YY=minor, ZZ=step 306 SLuint32 mNativeEndianness; // one of SL_BYTEORDER_LITTLEENDIAN or SL_BYTEORDER_BIGENDIAN 307 } IEngine; 308 309 typedef struct { 310 const struct SLEngineCapabilitiesItf_ *mItf; 311 IObject *mThis; 312 SLboolean mThreadSafe; 313 // const 314 SLuint32 mMaxIndexLED; 315 SLuint32 mMaxIndexVibra; 316 } IEngineCapabilities; 317 318 typedef struct { 319 const struct SLEnvironmentalReverbItf_ *mItf; 320 IObject *mThis; 321 SLEnvironmentalReverbSettings mProperties; 322 #if defined(ANDROID) 323 effect_descriptor_t mEnvironmentalReverbDescriptor; 324 android::sp<android::AudioEffect> mEnvironmentalReverbEffect; 325 #endif 326 } IEnvironmentalReverb; 327 328 struct EqualizerBand { 329 SLmilliHertz mMin; 330 SLmilliHertz mCenter; 331 SLmilliHertz mMax; 332 }; 333 334 #if defined(ANDROID) 335 #define MAX_EQ_BANDS 0 336 #else 337 #define MAX_EQ_BANDS 4 // compile-time limit, runtime limit may be smaller 338 #endif 339 340 typedef struct { 341 const struct SLEqualizerItf_ *mItf; 342 IObject *mThis; 343 SLboolean mEnabled; 344 SLuint16 mPreset; 345 #if 0 < MAX_EQ_BANDS 346 SLmillibel mLevels[MAX_EQ_BANDS]; 347 #endif 348 // const to end of struct 349 SLuint16 mNumPresets; 350 SLuint16 mNumBands; 351 #if !defined(ANDROID) 352 const struct EqualizerBand *mBands; 353 const struct EqualizerPreset *mPresets; 354 #endif 355 SLmillibel mBandLevelRangeMin; 356 SLmillibel mBandLevelRangeMax; 357 #if defined(ANDROID) 358 effect_descriptor_t mEqDescriptor; 359 android::sp<android::AudioEffect> mEqEffect; 360 #endif 361 } IEqualizer; 362 363 #define MAX_LED_COUNT 32 364 365 typedef struct { 366 const struct SLLEDArrayItf_ *mItf; 367 IObject *mThis; 368 SLuint32 mLightMask; 369 SLHSL mColors[MAX_LED_COUNT]; 370 // const 371 SLuint8 mCount; 372 } ILEDArray; 373 374 typedef struct { 375 const struct SLMetadataExtractionItf_ *mItf; 376 IObject *mThis; 377 SLuint32 mKeySize; 378 const void *mKey; 379 SLuint32 mKeyEncoding; 380 const SLchar *mValueLangCountry; 381 SLuint32 mValueEncoding; 382 SLuint8 mFilterMask; 383 int mKeyFilter; 384 } IMetadataExtraction; 385 386 typedef struct { 387 const struct SLMetadataTraversalItf_ *mItf; 388 IObject *mThis; 389 SLuint32 mIndex; 390 SLuint32 mMode; 391 SLuint32 mCount; 392 SLuint32 mSize; 393 } IMetadataTraversal; 394 395 typedef struct { 396 const struct SLMIDIMessageItf_ *mItf; 397 IObject *mThis; 398 slMetaEventCallback mMetaEventCallback; 399 void *mMetaEventContext; 400 slMIDIMessageCallback mMessageCallback; 401 void *mMessageContext; 402 SLuint8 mMessageTypes; 403 } IMIDIMessage; 404 405 typedef struct { 406 const struct SLMIDIMuteSoloItf_ *mItf; 407 IObject *mThis; 408 SLuint16 mChannelMuteMask; 409 SLuint16 mChannelSoloMask; 410 SLuint32 mTrackMuteMask; 411 SLuint32 mTrackSoloMask; 412 // const 413 SLuint16 mTrackCount; 414 } IMIDIMuteSolo; 415 416 typedef struct { 417 const struct SLMIDITempoItf_ *mItf; 418 IObject *mThis; 419 SLuint32 mTicksPerQuarterNote; 420 SLuint32 mMicrosecondsPerQuarterNote; 421 } IMIDITempo; 422 423 typedef struct { 424 const struct SLMIDITimeItf_ *mItf; 425 IObject *mThis; 426 SLuint32 mDuration; 427 SLuint32 mPosition; 428 SLuint32 mStartTick; 429 SLuint32 mNumTicks; 430 } IMIDITime; 431 432 typedef struct { 433 const struct SLMuteSoloItf_ *mItf; 434 IObject *mThis; 435 // fields that were formerly here are now at CAudioPlayer 436 } IMuteSolo; 437 438 #define MAX_TRACK 32 // see mActiveMask 439 440 typedef struct { 441 const struct SLOutputMixItf_ *mItf; 442 IObject *mThis; 443 slMixDeviceChangeCallback mCallback; 444 void *mContext; 445 } IOutputMix; 446 447 #ifdef USE_OUTPUTMIXEXT 448 typedef struct { 449 const struct SLOutputMixExtItf_ *mItf; 450 IObject *mThis; 451 unsigned mActiveMask; // 1 bit per active track 452 Track mTracks[MAX_TRACK]; 453 SLboolean mDestroyRequested; ///< Mixer to acknowledge application's call to Object::Destroy 454 } IOutputMixExt; 455 #endif 456 457 typedef struct { 458 const struct SLPitchItf_ *mItf; 459 IObject *mThis; 460 SLpermille mPitch; 461 // const 462 SLpermille mMinPitch; 463 SLpermille mMaxPitch; 464 } IPitch; 465 466 typedef struct Play_interface { 467 const struct SLPlayItf_ *mItf; 468 IObject *mThis; 469 SLuint32 mState; 470 // next 2 fields are read-only to application 471 SLmillisecond mDuration; 472 SLmillisecond mPosition; 473 slPlayCallback mCallback; 474 void *mContext; 475 SLuint32 mEventFlags; 476 // the ISeek trick of using a distinct value doesn't work here because it's readable by app 477 SLmillisecond mMarkerPosition; 478 SLmillisecond mPositionUpdatePeriod; // Zero means do not do position updates (FIXME ~0) 479 #ifdef USE_OUTPUTMIXEXT 480 SLuint32 mFrameUpdatePeriod; // mPositionUpdatePeriod in frame units 481 SLmillisecond mLastSeekPosition; // Last known accurate position, set at Seek 482 SLuint32 mFramesSinceLastSeek; // Frames mixed since last known accurate position 483 SLuint32 mFramesSincePositionUpdate; // Frames mixed since last position update callback 484 #endif 485 } IPlay; 486 487 typedef struct { 488 const struct SLPlaybackRateItf_ *mItf; 489 IObject *mThis; 490 SLpermille mRate; 491 SLuint32 mProperties; 492 // const after initialization 493 SLpermille mMinRate; 494 SLpermille mMaxRate; 495 SLpermille mStepSize; 496 SLuint32 mCapabilities; 497 } IPlaybackRate; 498 499 typedef struct { 500 const struct SLPrefetchStatusItf_ *mItf; 501 IObject *mThis; 502 SLuint32 mStatus; 503 SLpermille mLevel; 504 slPrefetchCallback mCallback; 505 void *mContext; 506 SLuint32 mCallbackEventsMask; 507 SLpermille mFillUpdatePeriod; 508 #ifdef ANDROID 509 /** FIXME used to call PrefetchStatus callback with object unlocked prior to return from API */ 510 slPrefetchCallback mDeferredPrefetchCallback; 511 void *mDeferredPrefetchContext; 512 SLuint32 mDeferredPrefetchEvents; 513 #endif 514 } IPrefetchStatus; 515 516 typedef struct { 517 const struct SLPresetReverbItf_ *mItf; 518 IObject *mThis; 519 SLuint16 mPreset; 520 #if defined(ANDROID) 521 effect_descriptor_t mPresetReverbDescriptor; 522 android::sp<android::AudioEffect> mPresetReverbEffect; 523 #endif 524 } IPresetReverb; 525 526 typedef struct { 527 const struct SLRatePitchItf_ *mItf; 528 IObject *mThis; 529 SLpermille mRate; 530 // const 531 SLpermille mMinRate; 532 SLpermille mMaxRate; 533 } IRatePitch; 534 535 typedef struct { 536 const struct SLRecordItf_ *mItf; 537 IObject *mThis; 538 SLuint32 mState; 539 SLmillisecond mDurationLimit; 540 SLmillisecond mPosition; 541 slRecordCallback mCallback; 542 void *mContext; 543 SLuint32 mCallbackEventsMask; 544 SLmillisecond mMarkerPosition; 545 SLmillisecond mPositionUpdatePeriod; 546 } IRecord; 547 548 typedef struct { 549 const struct SLSeekItf_ *mItf; 550 IObject *mThis; 551 SLmillisecond mPos; // mPos != SL_TIME_UNKNOWN means pending seek request 552 SLboolean mLoopEnabled; 553 SLmillisecond mStartPos; 554 SLmillisecond mEndPos; 555 } ISeek; 556 557 typedef struct { 558 const struct SLThreadSyncItf_ *mItf; 559 IObject *mThis; 560 SLboolean mInCriticalSection; 561 SLuint32 mWaiting; // number of threads waiting 562 pthread_t mOwner; 563 } IThreadSync; 564 565 typedef struct { 566 const struct SLVibraItf_ *mItf; 567 IObject *mThis; 568 SLboolean mVibrate; 569 SLmilliHertz mFrequency; 570 SLpermille mIntensity; 571 } IVibra; 572 573 typedef struct { 574 const struct SLVirtualizerItf_ *mItf; 575 IObject *mThis; 576 SLboolean mEnabled; 577 SLpermille mStrength; 578 #if defined(ANDROID) 579 effect_descriptor_t mVirtualizerDescriptor; 580 android::sp<android::AudioEffect> mVirtualizerEffect; 581 #endif 582 } IVirtualizer; 583 584 typedef struct { 585 const struct SLVisualizationItf_ *mItf; 586 IObject *mThis; 587 slVisualizationCallback mCallback; 588 void *mContext; 589 SLmilliHertz mRate; 590 } IVisualization; 591 592 typedef struct /*Volume_interface*/ { 593 const struct SLVolumeItf_ *mItf; 594 IObject *mThis; 595 // Values as specified by the application 596 SLmillibel mLevel; 597 SLpermille mStereoPosition; 598 SLuint8 /*SLboolean*/ mMute; 599 SLuint8 /*SLboolean*/ mEnableStereoPosition; 600 } IVolume; 601 602 typedef struct { 603 const struct XAEngineItf_ *mItf; 604 IObject *mThis; 605 } IXAEngine; 606 607 #define NB_SUPPORTED_STREAMS 1 // only one (video) stream supported in this implementation 608 typedef struct { 609 const struct XAStreamInformationItf_ *mItf; 610 IObject *mThis; 611 xaStreamEventChangeCallback mCallback; 612 void *mContext; 613 XAboolean mActiveStreams[NB_SUPPORTED_STREAMS]; 614 #ifdef ANDROID 615 android::Vector<StreamInfo> mStreamInfoTable; 616 #endif 617 } IStreamInformation; 618 619 typedef struct { 620 const struct XAVideoDecoderCapabilitiesItf_ *mItf; 621 IObject *mThis; 622 } IVideoDecoderCapabilities; 623 624 /* Class structures */ 625 626 /*typedef*/ struct C3DGroup_struct { 627 IObject mObject; 628 #define INTERFACES_3DGroup 6 // see MPH_to_3DGroup in MPH_to.c for list of interfaces 629 SLuint8 mInterfaceStates2[INTERFACES_3DGroup - INTERFACES_Default]; 630 IDynamicInterfaceManagement mDynamicInterfaceManagement; 631 I3DLocation m3DLocation; 632 I3DDoppler m3DDoppler; 633 I3DSource m3DSource; 634 I3DMacroscopic m3DMacroscopic; 635 // remaining are per-instance private fields not associated with an interface 636 unsigned mMemberMask; // set of member objects 637 } /*C3DGroup*/; 638 639 #ifdef ANDROID 640 641 // FIXME Move these into the I... section above 642 643 typedef struct { 644 const struct SLAndroidEffectItf_ *mItf; 645 IObject *mThis; 646 android::KeyedVector<SLuint32, android::sp<android::AudioEffect> > *mEffects; 647 } IAndroidEffect; 648 649 typedef struct { 650 const struct SLAndroidEffectCapabilitiesItf_ *mItf; 651 IObject *mThis; 652 SLuint32 mNumFx; 653 effect_descriptor_t* mFxDescriptors; 654 } IAndroidEffectCapabilities; 655 656 typedef struct { 657 const struct SLAndroidEffectSendItf_ *mItf; 658 IObject *mThis; 659 // only one send per interface for now (1 bus) 660 SLboolean mEnabled; 661 SLmillibel mSendLevel; //android::KeyedVector<SLuint32, SLmillibel> mSendLevels; 662 } IAndroidEffectSend; 663 664 typedef struct { 665 const struct SLAndroidConfigurationItf_ *mItf; 666 IObject *mThis; 667 // only 1 each. When we support other Proxy types, we will need to get more clever about this. 668 jobject mRoutingProxy; 669 } IAndroidConfiguration; 670 671 typedef struct { 672 const struct SLAndroidBufferQueueItf_ *mItf; 673 IObject *mThis; 674 SLAndroidBufferQueueState mState; 675 slAndroidBufferQueueCallback mCallback; 676 SLuint32 mCallbackEventsMask; 677 void *mContext; 678 SLuint16 mNumBuffers; 679 AndroidBufferType_type mBufferType; 680 AdvancedBufferHeader *mBufferArray; 681 AdvancedBufferHeader *mFront, *mRear; 682 bool mEOS; // whether EOS has been enqueued; never reset 683 } IAndroidBufferQueue; 684 685 typedef struct { 686 const struct SLAndroidAcousticEchoCancellationItf_ *mItf; 687 IObject *mThis; 688 SLboolean mEnabled; 689 effect_descriptor_t mAECDescriptor; 690 android::sp<android::AudioEffect> mAECEffect; 691 } IAndroidAcousticEchoCancellation; 692 693 typedef struct { 694 const struct SLAndroidAutomaticGainControlItf_ *mItf; 695 IObject *mThis; 696 SLboolean mEnabled; 697 effect_descriptor_t mAGCDescriptor; 698 android::sp<android::AudioEffect> mAGCEffect; 699 } IAndroidAutomaticGainControl; 700 701 typedef struct { 702 const struct SLAndroidNoiseSuppressionItf_ *mItf; 703 IObject *mThis; 704 SLboolean mEnabled; 705 effect_descriptor_t mNSDescriptor; 706 android::sp<android::AudioEffect> mNSEffect; 707 } IAndroidNoiseSuppression; 708 709 #endif 710