1c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk/* 2c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Copyright (C) 2017 The Android Open Source Project 3c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 4c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Licensed under the Apache License, Version 2.0 (the "License"); 5c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * you may not use this file except in compliance with the License. 6c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * You may obtain a copy of the License at 7c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 8c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * http://www.apache.org/licenses/LICENSE-2.0 9c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 10c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Unless required by applicable law or agreed to in writing, software 11c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * distributed under the License is distributed on an "AS IS" BASIS, 12c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * See the License for the specific language governing permissions and 14c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * limitations under the License. 15c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 16c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 17c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#ifndef AAUDIO_AAUDIO_SERVICE_STREAM_SHARED_H 18c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#define AAUDIO_AAUDIO_SERVICE_STREAM_SHARED_H 19c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 20c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "fifo/FifoBuffer.h" 21c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "binding/AAudioServiceMessage.h" 22c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "binding/AAudioStreamRequest.h" 23c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "binding/AAudioStreamConfiguration.h" 24c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 25c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "AAudioService.h" 26c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "AAudioServiceStreamBase.h" 27c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 28c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burknamespace aaudio { 29c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 30c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk// We expect the queue to only have a few commands. 31c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk// This should be way more than we need. 32c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#define QUEUE_UP_CAPACITY_COMMANDS (128) 33c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 34c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkclass AAudioEndpointManager; 35c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkclass AAudioServiceEndpoint; 36c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkclass SharedRingBuffer; 37c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 38c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk/** 39c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * One of these is created for every MODE_SHARED stream in the AAudioService. 40c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 41c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Each Shared stream will register itself with an AAudioServiceEndpoint when it is opened. 42c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 43c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkclass AAudioServiceStreamShared : public AAudioServiceStreamBase { 44c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 45c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkpublic: 46c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk AAudioServiceStreamShared(android::AAudioService &aAudioService); 4798d6d9227f6599a5aa7b023217c02a01cc4536cbPhil Burk virtual ~AAudioServiceStreamShared() = default; 48c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 49a5222e298c294781067950a7cc319d3278fa845aPhil Burk static std::string dumpHeader(); 50a5222e298c294781067950a7cc319d3278fa845aPhil Burk 51a5222e298c294781067950a7cc319d3278fa845aPhil Burk std::string dump() const override; 52a5222e298c294781067950a7cc319d3278fa845aPhil Burk 5339f02ddfbfd9313370d862a6c4727826379a319aPhil Burk aaudio_result_t open(const aaudio::AAudioStreamRequest &request) override; 54c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 55c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t close() override; 56c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 57523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk /** 58523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk * This must be locked when calling getAudioDataFifoBuffer_l() and while 59523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk * using the FifoBuffer it returns. 60523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk */ 61523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk std::mutex &getAudioDataQueueLock() { 62523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk return mAudioDataQueueLock; 63523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk } 64523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk 65523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk /** 66523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk * This must only be call under getAudioDataQueueLock(). 67523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk * @return 68523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk */ 69523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk android::FifoBuffer *getAudioDataFifoBuffer_l() { return (mAudioDataQueue == nullptr) 70523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk ? nullptr 71523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk : mAudioDataQueue->getFifoBuffer(); } 72c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 7371f35bb687476694882a617ba4a810a0bb56fe23Phil Burk /* Keep a record of when a buffer transfer completed. 7471f35bb687476694882a617ba4a810a0bb56fe23Phil Burk * This allows for a more accurate timing model. 7571f35bb687476694882a617ba4a810a0bb56fe23Phil Burk */ 7697350f9df7252c881f011a410fcd9e6d766d2beePhil Burk void markTransferTime(Timestamp ×tamp); 7797350f9df7252c881f011a410fcd9e6d766d2beePhil Burk 7897350f9df7252c881f011a410fcd9e6d766d2beePhil Burk void setTimestampPositionOffset(int64_t deltaFrames) { 7997350f9df7252c881f011a410fcd9e6d766d2beePhil Burk mTimestampPositionOffset.store(deltaFrames); 8097350f9df7252c881f011a410fcd9e6d766d2beePhil Burk } 8171f35bb687476694882a617ba4a810a0bb56fe23Phil Burk 82a5222e298c294781067950a7cc319d3278fa845aPhil Burk void incrementXRunCount() { 83a5222e298c294781067950a7cc319d3278fa845aPhil Burk mXRunCount++; 84a5222e298c294781067950a7cc319d3278fa845aPhil Burk } 85a5222e298c294781067950a7cc319d3278fa845aPhil Burk 86a5222e298c294781067950a7cc319d3278fa845aPhil Burk int32_t getXRunCount() const { 87a5222e298c294781067950a7cc319d3278fa845aPhil Burk return mXRunCount.load(); 88a5222e298c294781067950a7cc319d3278fa845aPhil Burk } 89a5222e298c294781067950a7cc319d3278fa845aPhil Burk 90c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkprotected: 91c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 92523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk aaudio_result_t getAudioDataDescription(AudioEndpointParcelable &parcelable) override; 93c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 94c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t getFreeRunningPosition(int64_t *positionFrames, int64_t *timeNanos) override; 95c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 9639f02ddfbfd9313370d862a6c4727826379a319aPhil Burk aaudio_result_t getHardwareTimestamp(int64_t *positionFrames, int64_t *timeNanos) override; 9797350f9df7252c881f011a410fcd9e6d766d2beePhil Burk 98ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk /** 99ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk * @param requestedCapacityFrames 100ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk * @param framesPerBurst 101ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk * @return capacity or negative error 102ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk */ 103ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk static int32_t calculateBufferCapacity(int32_t requestedCapacityFrames, 104ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk int32_t framesPerBurst); 105ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk 106c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkprivate: 107523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk SharedRingBuffer *mAudioDataQueue = nullptr; // protected by mAudioDataQueueLock 108523b3047af443d0a51141ddabd328d52be5a23b0Phil Burk std::mutex mAudioDataQueueLock; 10971f35bb687476694882a617ba4a810a0bb56fe23Phil Burk 11097350f9df7252c881f011a410fcd9e6d766d2beePhil Burk std::atomic<int64_t> mTimestampPositionOffset; 111a5222e298c294781067950a7cc319d3278fa845aPhil Burk std::atomic<int32_t> mXRunCount; 11239f02ddfbfd9313370d862a6c4727826379a319aPhil Burk 113c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk}; 114c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 115c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} /* namespace aaudio */ 116c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 117c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#endif //AAUDIO_AAUDIO_SERVICE_STREAM_SHARED_H 118