1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2022 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 <cstdint> 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker namespace android::audioflinger { 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker /** 24*ec779b8eSAndroid Build Coastguard Worker * MonotonicFrameCounter 25*ec779b8eSAndroid Build Coastguard Worker * 26*ec779b8eSAndroid Build Coastguard Worker * Advances a monotonic frame count based on input timestamp pairs (frames, time). 27*ec779b8eSAndroid Build Coastguard Worker * It takes into account a possible flush, which will "reset" the frames to 0. 28*ec779b8eSAndroid Build Coastguard Worker * 29*ec779b8eSAndroid Build Coastguard Worker * This class is used to drive VolumeShaper volume automation. 30*ec779b8eSAndroid Build Coastguard Worker * 31*ec779b8eSAndroid Build Coastguard Worker * The timestamps provided in updateAndGetMonotonicFrameCount should 32*ec779b8eSAndroid Build Coastguard Worker * be of sufficient granularity for the purpose at hand. Currently no temporal 33*ec779b8eSAndroid Build Coastguard Worker * extrapolation is done. 34*ec779b8eSAndroid Build Coastguard Worker * 35*ec779b8eSAndroid Build Coastguard Worker * This class is not thread safe. 36*ec779b8eSAndroid Build Coastguard Worker */ 37*ec779b8eSAndroid Build Coastguard Worker class MonotonicFrameCounter { 38*ec779b8eSAndroid Build Coastguard Worker public: 39*ec779b8eSAndroid Build Coastguard Worker /** 40*ec779b8eSAndroid Build Coastguard Worker * Receives a new timestamp pair (frames, time) and returns a monotonic frameCount. 41*ec779b8eSAndroid Build Coastguard Worker * 42*ec779b8eSAndroid Build Coastguard Worker * \param newFrameCount the frameCount currently played. 43*ec779b8eSAndroid Build Coastguard Worker * \param newTime the time corresponding to the frameCount. 44*ec779b8eSAndroid Build Coastguard Worker * \return a monotonic frame count usable for automation timing. 45*ec779b8eSAndroid Build Coastguard Worker */ 46*ec779b8eSAndroid Build Coastguard Worker int64_t updateAndGetMonotonicFrameCount(int64_t newFrameCount, int64_t newTime); 47*ec779b8eSAndroid Build Coastguard Worker 48*ec779b8eSAndroid Build Coastguard Worker /** 49*ec779b8eSAndroid Build Coastguard Worker * Notifies when a flush occurs, whereupon the received frameCount sequence restarts at 0. 50*ec779b8eSAndroid Build Coastguard Worker * 51*ec779b8eSAndroid Build Coastguard Worker * \return the last reported frameCount. 52*ec779b8eSAndroid Build Coastguard Worker */ 53*ec779b8eSAndroid Build Coastguard Worker int64_t onFlush(); 54*ec779b8eSAndroid Build Coastguard Worker 55*ec779b8eSAndroid Build Coastguard Worker /** 56*ec779b8eSAndroid Build Coastguard Worker * Returns the received (input) frameCount to reported (output) frameCount offset. 57*ec779b8eSAndroid Build Coastguard Worker * 58*ec779b8eSAndroid Build Coastguard Worker * This offset is sufficient to ensure monotonicity after flush is called, 59*ec779b8eSAndroid Build Coastguard Worker * suitability for any other purpose is *not* guaranteed. 60*ec779b8eSAndroid Build Coastguard Worker */ getOffsetFrameCount()61*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] int64_t getOffsetFrameCount() const { return mOffsetFrameCount; } 62*ec779b8eSAndroid Build Coastguard Worker 63*ec779b8eSAndroid Build Coastguard Worker /** 64*ec779b8eSAndroid Build Coastguard Worker * Returns the last received frameCount. 65*ec779b8eSAndroid Build Coastguard Worker */ getLastReceivedFrameCount()66*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] int64_t getLastReceivedFrameCount() const { 67*ec779b8eSAndroid Build Coastguard Worker return mLastReceivedFrameCount; 68*ec779b8eSAndroid Build Coastguard Worker } 69*ec779b8eSAndroid Build Coastguard Worker 70*ec779b8eSAndroid Build Coastguard Worker /** 71*ec779b8eSAndroid Build Coastguard Worker * Returns the last reported frameCount from updateAndGetMonotonicFrameCount(). 72*ec779b8eSAndroid Build Coastguard Worker */ getLastReportedFrameCount()73*ec779b8eSAndroid Build Coastguard Worker [[nodiscard]] int64_t getLastReportedFrameCount() const { 74*ec779b8eSAndroid Build Coastguard Worker // This is consistent after onFlush(). 75*ec779b8eSAndroid Build Coastguard Worker return mOffsetFrameCount + mLastReceivedFrameCount; 76*ec779b8eSAndroid Build Coastguard Worker } 77*ec779b8eSAndroid Build Coastguard Worker 78*ec779b8eSAndroid Build Coastguard Worker private: 79*ec779b8eSAndroid Build Coastguard Worker int64_t mOffsetFrameCount = 0; 80*ec779b8eSAndroid Build Coastguard Worker int64_t mLastReceivedFrameCount = 0; 81*ec779b8eSAndroid Build Coastguard Worker }; 82*ec779b8eSAndroid Build Coastguard Worker 83*ec779b8eSAndroid Build Coastguard Worker } // namespace android::audioflinger 84