AAudioServiceStreamShared.h revision ec89b2e2f8c84a7d3936db1a888034f4a4b0df16
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); 47c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk virtual ~AAudioServiceStreamShared(); 48c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 49c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t open(const aaudio::AAudioStreamRequest &request, 50c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio::AAudioStreamConfiguration &configurationOutput) override; 51c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 52c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk /** 53c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Start the flow of audio data. 54c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 55c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * This is not guaranteed to be synchronous but it currently is. 56c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * An AAUDIO_SERVICE_EVENT_STARTED will be sent to the client when complete. 57c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 58c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t start() override; 59c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 60c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk /** 61c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Stop the flow of data so that start() can resume without loss of data. 62c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 63c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * This is not guaranteed to be synchronous but it currently is. 64c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * An AAUDIO_SERVICE_EVENT_PAUSED will be sent to the client when complete. 65c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 66c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t pause() override; 67c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 68c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk /** 6971f35bb687476694882a617ba4a810a0bb56fe23Phil Burk * Stop the flow of data after data in buffer has played. 7071f35bb687476694882a617ba4a810a0bb56fe23Phil Burk */ 7171f35bb687476694882a617ba4a810a0bb56fe23Phil Burk aaudio_result_t stop() override; 7271f35bb687476694882a617ba4a810a0bb56fe23Phil Burk 7371f35bb687476694882a617ba4a810a0bb56fe23Phil Burk /** 74c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Discard any data held by the underlying HAL or Service. 75c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 76c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * This is not guaranteed to be synchronous but it currently is. 77c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * An AAUDIO_SERVICE_EVENT_FLUSHED will be sent to the client when complete. 78c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 79c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t flush() override; 80c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 81c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t close() override; 82c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 83c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk android::FifoBuffer *getDataFifoBuffer() { return mAudioDataQueue->getFifoBuffer(); } 84c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 8571f35bb687476694882a617ba4a810a0bb56fe23Phil Burk /* Keep a record of when a buffer transfer completed. 8671f35bb687476694882a617ba4a810a0bb56fe23Phil Burk * This allows for a more accurate timing model. 8771f35bb687476694882a617ba4a810a0bb56fe23Phil Burk */ 8871f35bb687476694882a617ba4a810a0bb56fe23Phil Burk void markTransferTime(int64_t nanoseconds); 8971f35bb687476694882a617ba4a810a0bb56fe23Phil Burk 90c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk void onStop(); 91c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 92c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk void onDisconnect(); 93c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 94c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkprotected: 95c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 96c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t getDownDataDescription(AudioEndpointParcelable &parcelable) override; 97c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 98c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t getFreeRunningPosition(int64_t *positionFrames, int64_t *timeNanos) override; 99c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 100ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk /** 101ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk * @param requestedCapacityFrames 102ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk * @param framesPerBurst 103ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk * @return capacity or negative error 104ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk */ 105ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk static int32_t calculateBufferCapacity(int32_t requestedCapacityFrames, 106ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk int32_t framesPerBurst); 107ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk 108c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkprivate: 109c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk android::AAudioService &mAudioService; 110c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk AAudioServiceEndpoint *mServiceEndpoint = nullptr; 11187c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk SharedRingBuffer *mAudioDataQueue = nullptr; 11271f35bb687476694882a617ba4a810a0bb56fe23Phil Burk 11371f35bb687476694882a617ba4a810a0bb56fe23Phil Burk int64_t mMarkedPosition = 0; 11471f35bb687476694882a617ba4a810a0bb56fe23Phil Burk int64_t mMarkedTime = 0; 115c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk}; 116c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 117c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} /* namespace aaudio */ 118c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 119c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#endif //AAUDIO_AAUDIO_SERVICE_STREAM_SHARED_H 120