xref: /aosp_15_r20/frameworks/av/services/audioflinger/fastpath/FastMixerState.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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