1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef AAUDIO_TIMESTAMP_SCHEDULER_H
18#define AAUDIO_TIMESTAMP_SCHEDULER_H
19
20#include <aaudio/AAudio.h>
21#include <utility/AudioClock.h>
22
23namespace aaudio {
24
25/**
26 * Schedule wakeup time for monitoring the position
27 * of an MMAP/NOIRQ buffer.
28 *
29 * Note that this object is not thread safe. Only call it from a single thread.
30 */
31class TimestampScheduler
32{
33public:
34    TimestampScheduler() {};
35    virtual ~TimestampScheduler() = default;
36
37    /**
38     * Start the schedule at the given time.
39     */
40    void start(int64_t startTime);
41
42    /**
43     * Calculate the next time that the read position should be measured.
44     */
45    int64_t nextAbsoluteTime();
46
47    void setBurstPeriod(int64_t burstPeriod) {
48        mBurstPeriod = burstPeriod;
49    }
50
51    void setBurstPeriod(int32_t framesPerBurst,
52                        int32_t sampleRate) {
53        mBurstPeriod = AAUDIO_NANOS_PER_SECOND * framesPerBurst / sampleRate;
54    }
55
56    int64_t getBurstPeriod() {
57        return mBurstPeriod;
58    }
59
60private:
61    // Start with an arbitrary default so we do not divide by zero.
62    int64_t mBurstPeriod = AAUDIO_NANOS_PER_MILLISECOND;
63    int64_t mStartTime = 0;
64    int64_t mLastTime = 0;
65};
66
67} /* namespace aaudio */
68
69#endif /* AAUDIO_TIMESTAMP_SCHEDULER_H */
70