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