/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include namespace android::audioflinger { /** * MonotonicFrameCounter * * Advances a monotonic frame count based on input timestamp pairs (frames, time). * It takes into account a possible flush, which will "reset" the frames to 0. * * This class is used to drive VolumeShaper volume automation. * * The timestamps provided in updateAndGetMonotonicFrameCount should * be of sufficient granularity for the purpose at hand. Currently no temporal * extrapolation is done. * * This class is not thread safe. */ class MonotonicFrameCounter { public: /** * Receives a new timestamp pair (frames, time) and returns a monotonic frameCount. * * \param newFrameCount the frameCount currently played. * \param newTime the time corresponding to the frameCount. * \return a monotonic frame count usable for automation timing. */ int64_t updateAndGetMonotonicFrameCount(int64_t newFrameCount, int64_t newTime); /** * Notifies when a flush occurs, whereupon the received frameCount sequence restarts at 0. * * \return the last reported frameCount. */ int64_t onFlush(); /** * Returns the received (input) frameCount to reported (output) frameCount offset. * * This offset is sufficient to ensure monotonicity after flush is called, * suitability for any other purpose is *not* guaranteed. */ [[nodiscard]] int64_t getOffsetFrameCount() const { return mOffsetFrameCount; } /** * Returns the last received frameCount. */ [[nodiscard]] int64_t getLastReceivedFrameCount() const { return mLastReceivedFrameCount; } /** * Returns the last reported frameCount from updateAndGetMonotonicFrameCount(). */ [[nodiscard]] int64_t getLastReportedFrameCount() const { // This is consistent after onFlush(). return mOffsetFrameCount + mLastReceivedFrameCount; } private: int64_t mOffsetFrameCount = 0; int64_t mLastReceivedFrameCount = 0; }; } // namespace android::audioflinger