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