1 /* 2 * Copyright (C) 2017 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_AAUDIO_SERVICE_STREAM_SHARED_H 18 #define AAUDIO_AAUDIO_SERVICE_STREAM_SHARED_H 19 20 #include "fifo/FifoBuffer.h" 21 #include "binding/AAudioServiceMessage.h" 22 #include "binding/AAudioStreamRequest.h" 23 #include "binding/AAudioStreamConfiguration.h" 24 25 #include "AAudioService.h" 26 #include "AAudioServiceStreamBase.h" 27 28 namespace aaudio { 29 30 // We expect the queue to only have a few commands. 31 // This should be way more than we need. 32 #define QUEUE_UP_CAPACITY_COMMANDS (128) 33 34 class AAudioEndpointManager; 35 class AAudioServiceEndpoint; 36 class SharedRingBuffer; 37 38 /** 39 * One of these is created for every MODE_SHARED stream in the AAudioService. 40 * 41 * Each Shared stream will register itself with an AAudioServiceEndpoint when it is opened. 42 */ 43 class AAudioServiceStreamShared : public AAudioServiceStreamBase { 44 45 public: 46 AAudioServiceStreamShared(android::AAudioService &aAudioService); 47 virtual ~AAudioServiceStreamShared() = default; 48 49 static std::string dumpHeader(); 50 51 std::string dump() const override; 52 53 aaudio_result_t open(const aaudio::AAudioStreamRequest &request) override; 54 55 aaudio_result_t close() override; 56 57 /** 58 * This must be locked when calling getAudioDataFifoBuffer_l() and while 59 * using the FifoBuffer it returns. 60 */ getAudioDataQueueLock()61 std::mutex &getAudioDataQueueLock() { 62 return mAudioDataQueueLock; 63 } 64 65 /** 66 * This must only be call under getAudioDataQueueLock(). 67 * @return 68 */ getAudioDataFifoBuffer_l()69 android::FifoBuffer *getAudioDataFifoBuffer_l() { return (mAudioDataQueue == nullptr) 70 ? nullptr 71 : mAudioDataQueue->getFifoBuffer(); } 72 73 /* Keep a record of when a buffer transfer completed. 74 * This allows for a more accurate timing model. 75 */ 76 void markTransferTime(Timestamp ×tamp); 77 setTimestampPositionOffset(int64_t deltaFrames)78 void setTimestampPositionOffset(int64_t deltaFrames) { 79 mTimestampPositionOffset.store(deltaFrames); 80 } 81 incrementXRunCount()82 void incrementXRunCount() { 83 mXRunCount++; 84 } 85 getXRunCount()86 int32_t getXRunCount() const { 87 return mXRunCount.load(); 88 } 89 90 protected: 91 92 aaudio_result_t getAudioDataDescription(AudioEndpointParcelable &parcelable) override; 93 94 aaudio_result_t getFreeRunningPosition(int64_t *positionFrames, int64_t *timeNanos) override; 95 96 aaudio_result_t getHardwareTimestamp(int64_t *positionFrames, int64_t *timeNanos) override; 97 98 /** 99 * @param requestedCapacityFrames 100 * @param framesPerBurst 101 * @return capacity or negative error 102 */ 103 static int32_t calculateBufferCapacity(int32_t requestedCapacityFrames, 104 int32_t framesPerBurst); 105 106 private: 107 SharedRingBuffer *mAudioDataQueue = nullptr; // protected by mAudioDataQueueLock 108 std::mutex mAudioDataQueueLock; 109 110 std::atomic<int64_t> mTimestampPositionOffset; 111 std::atomic<int32_t> mXRunCount; 112 113 }; 114 115 } /* namespace aaudio */ 116 117 #endif //AAUDIO_AAUDIO_SERVICE_STREAM_SHARED_H 118