• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 ANDROID_AAUDIO_ISOCHRONOUS_CLOCK_MODEL_H
18 #define ANDROID_AAUDIO_ISOCHRONOUS_CLOCK_MODEL_H
19 
20 #include <stdint.h>
21 
22 namespace aaudio {
23 
24 /**
25  * Model an isochronous data stream using occasional timestamps as input.
26  * This can be used to predict the position of the stream at a given time.
27  *
28  * This class is not thread safe and should only be called from one thread.
29  */
30 class IsochronousClockModel {
31 
32 public:
33     IsochronousClockModel();
34     virtual ~IsochronousClockModel();
35 
36     void start(int64_t nanoTime);
37     void stop(int64_t nanoTime);
38 
39     /**
40      * @return true if the model is starting up
41      */
42     bool isStarting() const;
43 
44     /**
45      * @return true if the model is running and producing valid results
46      */
47     bool isRunning() const;
48 
49     void processTimestamp(int64_t framePosition, int64_t nanoTime);
50 
51     /**
52      * @param sampleRate rate of the stream in frames per second
53      */
54     void setSampleRate(int32_t sampleRate);
55 
56     void setPositionAndTime(int64_t framePosition, int64_t nanoTime);
57 
getSampleRate()58     int32_t getSampleRate() const {
59         return mSampleRate;
60     }
61 
62     /**
63      * This must be set accurately in order to track the isochronous stream.
64      *
65      * @param framesPerBurst number of frames that stream advance at one time.
66      */
67     void setFramesPerBurst(int32_t framesPerBurst);
68 
getFramesPerBurst()69     int32_t getFramesPerBurst() const {
70         return mFramesPerBurst;
71     }
72 
73     /**
74      * Calculate an estimated time when the stream will be at that position.
75      *
76      * @param framePosition position of the stream in frames
77      * @return time in nanoseconds
78      */
79     int64_t convertPositionToTime(int64_t framePosition) const;
80 
81     /**
82      * Calculate an estimated position where the stream will be at the specified time.
83      *
84      * @param nanoTime time of interest
85      * @return position in frames
86      */
87     int64_t convertTimeToPosition(int64_t nanoTime) const;
88 
89     /**
90      * @param framesDelta difference in frames
91      * @return duration in nanoseconds
92      */
93     int64_t convertDeltaPositionToTime(int64_t framesDelta) const;
94 
95     /**
96      * @param nanosDelta duration in nanoseconds
97      * @return frames that stream will advance in that time
98      */
99     int64_t convertDeltaTimeToPosition(int64_t nanosDelta) const;
100 
101     void dump() const;
102 
103 private:
104     enum clock_model_state_t {
105         STATE_STOPPED,
106         STATE_STARTING,
107         STATE_SYNCING,
108         STATE_RUNNING
109     };
110 
111     int64_t             mMarkerFramePosition;
112     int64_t             mMarkerNanoTime;
113     int32_t             mSampleRate;
114     int32_t             mFramesPerBurst;
115     int32_t             mMaxLatenessInNanos;
116     clock_model_state_t mState;
117 
118     void update();
119 };
120 
121 } /* namespace aaudio */
122 
123 #endif //ANDROID_AAUDIO_ISOCHRONOUS_CLOCK_MODEL_H
124