xref: /aosp_15_r20/frameworks/av/services/audioflinger/fastpath/FastMixerDumpState.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2014 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 <stdint.h>
20*ec779b8eSAndroid Build Coastguard Worker #include <type_traits>
21*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/TimestampVerifier.h>
22*ec779b8eSAndroid Build Coastguard Worker #include "Configuration.h"
23*ec779b8eSAndroid Build Coastguard Worker #include "FastThreadDumpState.h"
24*ec779b8eSAndroid Build Coastguard Worker #include "FastMixerState.h"
25*ec779b8eSAndroid Build Coastguard Worker 
26*ec779b8eSAndroid Build Coastguard Worker namespace android {
27*ec779b8eSAndroid Build Coastguard Worker 
28*ec779b8eSAndroid Build Coastguard Worker // Describes the underrun status for a single "pull" attempt
29*ec779b8eSAndroid Build Coastguard Worker enum FastTrackUnderrunStatus {
30*ec779b8eSAndroid Build Coastguard Worker     UNDERRUN_FULL,      // framesReady() is full frame count, no underrun
31*ec779b8eSAndroid Build Coastguard Worker     UNDERRUN_PARTIAL,   // framesReady() is non-zero but < full frame count, partial underrun
32*ec779b8eSAndroid Build Coastguard Worker     UNDERRUN_EMPTY,     // framesReady() is zero, total underrun
33*ec779b8eSAndroid Build Coastguard Worker };
34*ec779b8eSAndroid Build Coastguard Worker 
35*ec779b8eSAndroid Build Coastguard Worker // Underrun counters are not reset to zero for new tracks or if track generation changes.
36*ec779b8eSAndroid Build Coastguard Worker // This packed representation is used to keep the information atomic.
37*ec779b8eSAndroid Build Coastguard Worker union FastTrackUnderruns {
FastTrackUnderruns()38*ec779b8eSAndroid Build Coastguard Worker     FastTrackUnderruns() { mAtomic = 0;
39*ec779b8eSAndroid Build Coastguard Worker             static_assert(sizeof(FastTrackUnderruns) == sizeof(uint32_t), "FastTrackUnderrun"); }
FastTrackUnderruns(const FastTrackUnderruns & copyFrom)40*ec779b8eSAndroid Build Coastguard Worker     FastTrackUnderruns(const FastTrackUnderruns& copyFrom) : mAtomic(copyFrom.mAtomic) { }
41*ec779b8eSAndroid Build Coastguard Worker     FastTrackUnderruns& operator=(const FastTrackUnderruns& rhs)
42*ec779b8eSAndroid Build Coastguard Worker             { if (this != &rhs) mAtomic = rhs.mAtomic; return *this; }
43*ec779b8eSAndroid Build Coastguard Worker     struct {
44*ec779b8eSAndroid Build Coastguard Worker #define UNDERRUN_BITS 10
45*ec779b8eSAndroid Build Coastguard Worker #define UNDERRUN_MASK ((1 << UNDERRUN_BITS) - 1)
46*ec779b8eSAndroid Build Coastguard Worker         uint32_t mFull    : UNDERRUN_BITS; // framesReady() is full frame count
47*ec779b8eSAndroid Build Coastguard Worker         uint32_t mPartial : UNDERRUN_BITS; // framesReady() is non-zero but < full frame count
48*ec779b8eSAndroid Build Coastguard Worker         uint32_t mEmpty   : UNDERRUN_BITS; // framesReady() is zero
49*ec779b8eSAndroid Build Coastguard Worker         FastTrackUnderrunStatus mMostRecent : 2;    // status of most recent framesReady()
50*ec779b8eSAndroid Build Coastguard Worker     }        mBitFields;
51*ec779b8eSAndroid Build Coastguard Worker private:
52*ec779b8eSAndroid Build Coastguard Worker     uint32_t mAtomic;
53*ec779b8eSAndroid Build Coastguard Worker };
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker // Represents the dump state of a fast track
56*ec779b8eSAndroid Build Coastguard Worker struct FastTrackDump {
57*ec779b8eSAndroid Build Coastguard Worker     FastTrackUnderruns  mUnderruns;
58*ec779b8eSAndroid Build Coastguard Worker     size_t              mFramesReady = 0;    // most recent value only; no long-term statistics kept
59*ec779b8eSAndroid Build Coastguard Worker     int64_t             mFramesWritten = 0;  // last value from track
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<FastTrackDump>);
64*ec779b8eSAndroid Build Coastguard Worker 
65*ec779b8eSAndroid Build Coastguard Worker struct FastMixerDumpState : FastThreadDumpState {
66*ec779b8eSAndroid Build Coastguard Worker     void dump(int fd) const;    // should only be called on a stable copy, not the original
67*ec779b8eSAndroid Build Coastguard Worker 
68*ec779b8eSAndroid Build Coastguard Worker     double   mLatencyMs = 0.;     // measured latency, default of 0 if no valid timestamp read.
69*ec779b8eSAndroid Build Coastguard Worker     uint32_t mWriteSequence = 0;  // incremented before and after each write()
70*ec779b8eSAndroid Build Coastguard Worker     uint32_t mFramesWritten = 0;  // total number of frames written successfully
71*ec779b8eSAndroid Build Coastguard Worker     uint32_t mNumTracks = 0;      // total number of active fast tracks
72*ec779b8eSAndroid Build Coastguard Worker     uint32_t mWriteErrors = 0;    // total number of write() errors
73*ec779b8eSAndroid Build Coastguard Worker     uint32_t mSampleRate = 0;
74*ec779b8eSAndroid Build Coastguard Worker     size_t   mFrameCount = 0;
75*ec779b8eSAndroid Build Coastguard Worker     uint32_t mTrackMask = 0;      // mask of active tracks
76*ec779b8eSAndroid Build Coastguard Worker     FastTrackDump   mTracks[FastMixerState::kMaxFastTracks];
77*ec779b8eSAndroid Build Coastguard Worker 
78*ec779b8eSAndroid Build Coastguard Worker     // For timestamp statistics.
79*ec779b8eSAndroid Build Coastguard Worker     TimestampVerifier<int64_t /* frame count */, int64_t /* time ns */> mTimestampVerifier;
80*ec779b8eSAndroid Build Coastguard Worker };
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker // No virtuals.
83*ec779b8eSAndroid Build Coastguard Worker static_assert(!std::is_polymorphic_v<FastMixerDumpState>);
84*ec779b8eSAndroid Build Coastguard Worker 
85*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
86