xref: /aosp_15_r20/external/oboe/src/aaudio/AudioStreamAAudio.h (revision 05767d913155b055644481607e6fa1e35e2fe72c)
1*05767d91SRobert Wu /*
2*05767d91SRobert Wu  * Copyright 2016 The Android Open Source Project
3*05767d91SRobert Wu  *
4*05767d91SRobert Wu  * Licensed under the Apache License, Version 2.0 (the "License");
5*05767d91SRobert Wu  * you may not use this file except in compliance with the License.
6*05767d91SRobert Wu  * You may obtain a copy of the License at
7*05767d91SRobert Wu  *
8*05767d91SRobert Wu  *      http://www.apache.org/licenses/LICENSE-2.0
9*05767d91SRobert Wu  *
10*05767d91SRobert Wu  * Unless required by applicable law or agreed to in writing, software
11*05767d91SRobert Wu  * distributed under the License is distributed on an "AS IS" BASIS,
12*05767d91SRobert Wu  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*05767d91SRobert Wu  * See the License for the specific language governing permissions and
14*05767d91SRobert Wu  * limitations under the License.
15*05767d91SRobert Wu  */
16*05767d91SRobert Wu 
17*05767d91SRobert Wu #ifndef OBOE_STREAM_AAUDIO_H_
18*05767d91SRobert Wu #define OBOE_STREAM_AAUDIO_H_
19*05767d91SRobert Wu 
20*05767d91SRobert Wu #include <atomic>
21*05767d91SRobert Wu #include <shared_mutex>
22*05767d91SRobert Wu #include <mutex>
23*05767d91SRobert Wu #include <thread>
24*05767d91SRobert Wu 
25*05767d91SRobert Wu #include <common/AdpfWrapper.h>
26*05767d91SRobert Wu #include "oboe/AudioStreamBuilder.h"
27*05767d91SRobert Wu #include "oboe/AudioStream.h"
28*05767d91SRobert Wu #include "oboe/Definitions.h"
29*05767d91SRobert Wu #include "AAudioLoader.h"
30*05767d91SRobert Wu 
31*05767d91SRobert Wu namespace oboe {
32*05767d91SRobert Wu 
33*05767d91SRobert Wu /**
34*05767d91SRobert Wu  * Implementation of OboeStream that uses AAudio.
35*05767d91SRobert Wu  *
36*05767d91SRobert Wu  * Do not create this class directly.
37*05767d91SRobert Wu  * Use an OboeStreamBuilder to create one.
38*05767d91SRobert Wu  */
39*05767d91SRobert Wu class AudioStreamAAudio : public AudioStream {
40*05767d91SRobert Wu public:
41*05767d91SRobert Wu     AudioStreamAAudio();
42*05767d91SRobert Wu     explicit AudioStreamAAudio(const AudioStreamBuilder &builder);
43*05767d91SRobert Wu 
44*05767d91SRobert Wu     virtual ~AudioStreamAAudio() = default;
45*05767d91SRobert Wu 
46*05767d91SRobert Wu     /**
47*05767d91SRobert Wu      *
48*05767d91SRobert Wu      * @return true if AAudio is supported on this device.
49*05767d91SRobert Wu      */
50*05767d91SRobert Wu     static bool isSupported();
51*05767d91SRobert Wu 
52*05767d91SRobert Wu     // These functions override methods in AudioStream.
53*05767d91SRobert Wu     // See AudioStream for documentation.
54*05767d91SRobert Wu     Result open() override;
55*05767d91SRobert Wu     Result release() override;
56*05767d91SRobert Wu     Result close() override;
57*05767d91SRobert Wu 
58*05767d91SRobert Wu     Result requestStart() override;
59*05767d91SRobert Wu     Result requestPause() override;
60*05767d91SRobert Wu     Result requestFlush() override;
61*05767d91SRobert Wu     Result requestStop() override;
62*05767d91SRobert Wu 
63*05767d91SRobert Wu     ResultWithValue<int32_t> write(const void *buffer,
64*05767d91SRobert Wu                   int32_t numFrames,
65*05767d91SRobert Wu                   int64_t timeoutNanoseconds) override;
66*05767d91SRobert Wu 
67*05767d91SRobert Wu     ResultWithValue<int32_t> read(void *buffer,
68*05767d91SRobert Wu                  int32_t numFrames,
69*05767d91SRobert Wu                  int64_t timeoutNanoseconds) override;
70*05767d91SRobert Wu 
71*05767d91SRobert Wu     ResultWithValue<int32_t> setBufferSizeInFrames(int32_t requestedFrames) override;
72*05767d91SRobert Wu     int32_t getBufferSizeInFrames() override;
73*05767d91SRobert Wu     ResultWithValue<int32_t> getXRunCount()  override;
isXRunCountSupported()74*05767d91SRobert Wu     bool isXRunCountSupported() const override { return true; }
75*05767d91SRobert Wu 
76*05767d91SRobert Wu     ResultWithValue<double> calculateLatencyMillis() override;
77*05767d91SRobert Wu 
78*05767d91SRobert Wu     Result waitForStateChange(StreamState currentState,
79*05767d91SRobert Wu                               StreamState *nextState,
80*05767d91SRobert Wu                               int64_t timeoutNanoseconds) override;
81*05767d91SRobert Wu 
82*05767d91SRobert Wu     Result getTimestamp(clockid_t clockId,
83*05767d91SRobert Wu                                        int64_t *framePosition,
84*05767d91SRobert Wu                                        int64_t *timeNanoseconds) override;
85*05767d91SRobert Wu 
86*05767d91SRobert Wu     StreamState getState() override;
87*05767d91SRobert Wu 
getAudioApi()88*05767d91SRobert Wu     AudioApi getAudioApi() const override {
89*05767d91SRobert Wu         return AudioApi::AAudio;
90*05767d91SRobert Wu     }
91*05767d91SRobert Wu 
92*05767d91SRobert Wu     DataCallbackResult callOnAudioReady(AAudioStream *stream,
93*05767d91SRobert Wu                                                    void *audioData,
94*05767d91SRobert Wu                                                    int32_t numFrames);
95*05767d91SRobert Wu 
96*05767d91SRobert Wu     bool isMMapUsed();
97*05767d91SRobert Wu 
closePerformanceHint()98*05767d91SRobert Wu     void closePerformanceHint() override {
99*05767d91SRobert Wu         mAdpfWrapper.close();
100*05767d91SRobert Wu         mAdpfOpenAttempted = false;
101*05767d91SRobert Wu     }
102*05767d91SRobert Wu 
103*05767d91SRobert Wu protected:
104*05767d91SRobert Wu     static void internalErrorCallback(
105*05767d91SRobert Wu             AAudioStream *stream,
106*05767d91SRobert Wu             void *userData,
107*05767d91SRobert Wu             aaudio_result_t error);
108*05767d91SRobert Wu 
getUnderlyingStream()109*05767d91SRobert Wu     void *getUnderlyingStream() const override {
110*05767d91SRobert Wu         return mAAudioStream.load();
111*05767d91SRobert Wu     }
112*05767d91SRobert Wu 
113*05767d91SRobert Wu     void updateFramesRead() override;
114*05767d91SRobert Wu     void updateFramesWritten() override;
115*05767d91SRobert Wu 
116*05767d91SRobert Wu     void logUnsupportedAttributes();
117*05767d91SRobert Wu 
118*05767d91SRobert Wu     void beginPerformanceHintInCallback() override;
119*05767d91SRobert Wu 
120*05767d91SRobert Wu     void endPerformanceHintInCallback(int32_t numFrames) override;
121*05767d91SRobert Wu 
122*05767d91SRobert Wu     // set by callback (or app when idle)
123*05767d91SRobert Wu     std::atomic<bool>    mAdpfOpenAttempted{false};
124*05767d91SRobert Wu     AdpfWrapper          mAdpfWrapper;
125*05767d91SRobert Wu 
126*05767d91SRobert Wu private:
127*05767d91SRobert Wu     // Must call under mLock. And stream must NOT be nullptr.
128*05767d91SRobert Wu     Result requestStop_l(AAudioStream *stream);
129*05767d91SRobert Wu 
130*05767d91SRobert Wu     /**
131*05767d91SRobert Wu      * Launch a thread that will stop the stream.
132*05767d91SRobert Wu      */
133*05767d91SRobert Wu     void launchStopThread();
134*05767d91SRobert Wu 
135*05767d91SRobert Wu private:
136*05767d91SRobert Wu 
137*05767d91SRobert Wu     std::atomic<bool>    mCallbackThreadEnabled;
138*05767d91SRobert Wu     std::atomic<bool>    mStopThreadAllowed{false};
139*05767d91SRobert Wu 
140*05767d91SRobert Wu     // pointer to the underlying 'C' AAudio stream, valid if open, null if closed
141*05767d91SRobert Wu     std::atomic<AAudioStream *> mAAudioStream{nullptr};
142*05767d91SRobert Wu     std::shared_mutex           mAAudioStreamLock; // to protect mAAudioStream while closing
143*05767d91SRobert Wu 
144*05767d91SRobert Wu     static AAudioLoader *mLibLoader;
145*05767d91SRobert Wu 
146*05767d91SRobert Wu     // We may not use this but it is so small that it is not worth allocating dynamically.
147*05767d91SRobert Wu     AudioStreamErrorCallback mDefaultErrorCallback;
148*05767d91SRobert Wu };
149*05767d91SRobert Wu 
150*05767d91SRobert Wu } // namespace oboe
151*05767d91SRobert Wu 
152*05767d91SRobert Wu #endif // OBOE_STREAM_AAUDIO_H_
153