1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2012 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #pragma once 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #include <math.h> 20*ec779b8eSAndroid Build Coastguard Worker #include <type_traits> 21*ec779b8eSAndroid Build Coastguard Worker 22*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/minifloat.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioMixer.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <media/ExtendedAudioBufferProvider.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <media/nbaio/NBAIO.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <media/nblog/NBLog.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <vibrator/ExternalVibrationUtils.h> 29*ec779b8eSAndroid Build Coastguard Worker #include "FastThreadState.h" 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker namespace android { 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker struct FastMixerDumpState; 34*ec779b8eSAndroid Build Coastguard Worker 35*ec779b8eSAndroid Build Coastguard Worker class VolumeProvider { 36*ec779b8eSAndroid Build Coastguard Worker public: 37*ec779b8eSAndroid Build Coastguard Worker // The provider implementation is responsible for validating that the return value is in range. 38*ec779b8eSAndroid Build Coastguard Worker virtual gain_minifloat_packed_t getVolumeLR() const = 0; 39*ec779b8eSAndroid Build Coastguard Worker protected: 40*ec779b8eSAndroid Build Coastguard Worker VolumeProvider() = default; 41*ec779b8eSAndroid Build Coastguard Worker virtual ~VolumeProvider() = default; 42*ec779b8eSAndroid Build Coastguard Worker }; 43*ec779b8eSAndroid Build Coastguard Worker 44*ec779b8eSAndroid Build Coastguard Worker // Represents the state of a fast track 45*ec779b8eSAndroid Build Coastguard Worker struct FastTrack { 46*ec779b8eSAndroid Build Coastguard Worker // must be nullptr if inactive, or non-nullptr if active 47*ec779b8eSAndroid Build Coastguard Worker ExtendedAudioBufferProvider* mBufferProvider = nullptr; 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard Worker // optional: if nullptr then full-scale 50*ec779b8eSAndroid Build Coastguard Worker VolumeProvider* mVolumeProvider = nullptr; 51*ec779b8eSAndroid Build Coastguard Worker 52*ec779b8eSAndroid Build Coastguard Worker // AUDIO_CHANNEL_OUT_MONO or AUDIO_CHANNEL_OUT_STEREO 53*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t mChannelMask = AUDIO_CHANNEL_OUT_STEREO; 54*ec779b8eSAndroid Build Coastguard Worker audio_format_t mFormat = AUDIO_FORMAT_INVALID; // track format 55*ec779b8eSAndroid Build Coastguard Worker int mGeneration = 0; // increment when any field is assigned 56*ec779b8eSAndroid Build Coastguard Worker bool mHapticPlaybackEnabled = false; // haptic playback is enabled or not 57*ec779b8eSAndroid Build Coastguard Worker os::HapticScale mHapticScale = os::HapticScale::mute(); // scale of haptic data 58*ec779b8eSAndroid Build Coastguard Worker float mHapticMaxAmplitude = NAN; // max amplitude allowed for haptic data 59*ec779b8eSAndroid Build Coastguard Worker char mTraceName[32]{}; 60*ec779b8eSAndroid Build Coastguard Worker }; 61*ec779b8eSAndroid Build Coastguard Worker 62*ec779b8eSAndroid Build Coastguard Worker // No virtuals. 63*ec779b8eSAndroid Build Coastguard Worker static_assert(!std::is_polymorphic_v<FastTrack>); 64*ec779b8eSAndroid Build Coastguard Worker 65*ec779b8eSAndroid Build Coastguard Worker // Represents a single state of the fast mixer 66*ec779b8eSAndroid Build Coastguard Worker struct FastMixerState : FastThreadState { 67*ec779b8eSAndroid Build Coastguard Worker FastMixerState(); 68*ec779b8eSAndroid Build Coastguard Worker 69*ec779b8eSAndroid Build Coastguard Worker // These are the minimum, maximum, and default values for maximum number of fast tracks 70*ec779b8eSAndroid Build Coastguard Worker static constexpr unsigned kMinFastTracks = 2; 71*ec779b8eSAndroid Build Coastguard Worker static constexpr unsigned kMaxFastTracks = 32; 72*ec779b8eSAndroid Build Coastguard Worker static constexpr unsigned kDefaultFastTracks = 8; 73*ec779b8eSAndroid Build Coastguard Worker 74*ec779b8eSAndroid Build Coastguard Worker static unsigned sMaxFastTracks; // Configured maximum number of fast tracks 75*ec779b8eSAndroid Build Coastguard Worker static pthread_once_t sMaxFastTracksOnce; // Protects initializer for sMaxFastTracks 76*ec779b8eSAndroid Build Coastguard Worker 77*ec779b8eSAndroid Build Coastguard Worker // all pointer fields use raw pointers; objects are owned and ref-counted by the normal mixer 78*ec779b8eSAndroid Build Coastguard Worker FastTrack mFastTracks[kMaxFastTracks]; 79*ec779b8eSAndroid Build Coastguard Worker int mFastTracksGen = 0; // increment when any 80*ec779b8eSAndroid Build Coastguard Worker // mFastTracks[i].mGeneration is incremented 81*ec779b8eSAndroid Build Coastguard Worker unsigned mTrackMask = 0; // bit i is set if and only if mFastTracks[i] is active 82*ec779b8eSAndroid Build Coastguard Worker NBAIO_Sink* mOutputSink = nullptr; // HAL output device, must already be negotiated 83*ec779b8eSAndroid Build Coastguard Worker int mOutputSinkGen = 0; // increment when mOutputSink is assigned 84*ec779b8eSAndroid Build Coastguard Worker size_t mFrameCount = 0; // number of frames per fast mix buffer 85*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t mSinkChannelMask; // If not AUDIO_CHANNEL_NONE, specifies sink channel 86*ec779b8eSAndroid Build Coastguard Worker // mask when it cannot be directly calculated from 87*ec779b8eSAndroid Build Coastguard Worker // channel count 88*ec779b8eSAndroid Build Coastguard Worker 89*ec779b8eSAndroid Build Coastguard Worker // Extends FastThreadState::Command 90*ec779b8eSAndroid Build Coastguard Worker static const Command 91*ec779b8eSAndroid Build Coastguard Worker // The following commands also process configuration changes, and can be "or"ed: 92*ec779b8eSAndroid Build Coastguard Worker MIX = 0x8, // mix tracks 93*ec779b8eSAndroid Build Coastguard Worker WRITE = 0x10, // write to output sink 94*ec779b8eSAndroid Build Coastguard Worker MIX_WRITE = 0x18; // mix tracks and write to output sink 95*ec779b8eSAndroid Build Coastguard Worker 96*ec779b8eSAndroid Build Coastguard Worker // never returns NULL; asserts if command is invalid 97*ec779b8eSAndroid Build Coastguard Worker static const char *commandToString(Command command); 98*ec779b8eSAndroid Build Coastguard Worker 99*ec779b8eSAndroid Build Coastguard Worker // initialize sMaxFastTracks 100*ec779b8eSAndroid Build Coastguard Worker static void sMaxFastTracksInit(); 101*ec779b8eSAndroid Build Coastguard Worker 102*ec779b8eSAndroid Build Coastguard Worker }; // struct FastMixerState 103*ec779b8eSAndroid Build Coastguard Worker 104*ec779b8eSAndroid Build Coastguard Worker // No virtuals. 105*ec779b8eSAndroid Build Coastguard Worker static_assert(!std::is_polymorphic_v<FastMixerState>); 106*ec779b8eSAndroid Build Coastguard Worker 107*ec779b8eSAndroid Build Coastguard Worker } // namespace android 108