AAudioServiceStreamShared.cpp revision c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fb
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#define LOG_TAG "AAudioService" 18c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk//#define LOG_NDEBUG 0 19c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include <utils/Log.h> 20c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 21c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include <mutex> 22c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 23c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include <aaudio/AAudio.h> 24c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 25c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "binding/IAAudioService.h" 26c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 27c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "binding/AAudioServiceMessage.h" 28c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "AAudioServiceStreamBase.h" 29c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "AAudioServiceStreamShared.h" 30c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "AAudioEndpointManager.h" 31c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "AAudioService.h" 32c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "AAudioServiceEndpoint.h" 33c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 34c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkusing namespace android; 35c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkusing namespace aaudio; 36c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 37c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#define MIN_BURSTS_PER_BUFFER 2 38c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#define MAX_BURSTS_PER_BUFFER 32 39c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 40c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil BurkAAudioServiceStreamShared::AAudioServiceStreamShared(AAudioService &audioService) 41c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk : mAudioService(audioService) 42c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk { 43c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 44c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 45c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil BurkAAudioServiceStreamShared::~AAudioServiceStreamShared() { 46c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk close(); 47c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 48c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 49c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkaaudio_result_t AAudioServiceStreamShared::open(const aaudio::AAudioStreamRequest &request, 50c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio::AAudioStreamConfiguration &configurationOutput) { 51c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 52c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t result = AAudioServiceStreamBase::open(request, configurationOutput); 53c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (result != AAUDIO_OK) { 54c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk ALOGE("AAudioServiceStreamBase open returned %d", result); 55c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return result; 56c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } 57c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 58c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk const AAudioStreamConfiguration &configurationInput = request.getConstantConfiguration(); 59c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t deviceId = configurationInput.getDeviceId(); 60c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_direction_t direction = request.getDirection(); 61c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 62c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk ALOGD("AAudioServiceStreamShared::open(), direction = %d", direction); 63c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk AAudioEndpointManager &mEndpointManager = AAudioEndpointManager::getInstance(); 64c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mServiceEndpoint = mEndpointManager.findEndpoint(mAudioService, deviceId, direction); 65c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk ALOGD("AAudioServiceStreamShared::open(), mServiceEndPoint = %p", mServiceEndpoint); 66c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (mServiceEndpoint == nullptr) { 67c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAUDIO_ERROR_UNAVAILABLE; 68c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } 69c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 70c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // Is the request compatible with the shared endpoint? 71c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mAudioFormat = configurationInput.getAudioFormat(); 72c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (mAudioFormat == AAUDIO_FORMAT_UNSPECIFIED) { 73c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mAudioFormat = AAUDIO_FORMAT_PCM_FLOAT; 74c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } else if (mAudioFormat != AAUDIO_FORMAT_PCM_FLOAT) { 75c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAUDIO_ERROR_INVALID_FORMAT; 76c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } 77c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 78c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mSampleRate = configurationInput.getSampleRate(); 79c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (mSampleRate == AAUDIO_FORMAT_UNSPECIFIED) { 80c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mSampleRate = mServiceEndpoint->getSampleRate(); 81c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } else if (mSampleRate != mServiceEndpoint->getSampleRate()) { 82c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAUDIO_ERROR_INVALID_RATE; 83c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } 84c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 85c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mSamplesPerFrame = configurationInput.getSamplesPerFrame(); 86c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (mSamplesPerFrame == AAUDIO_FORMAT_UNSPECIFIED) { 87c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mSamplesPerFrame = mServiceEndpoint->getSamplesPerFrame(); 88c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } else if (mSamplesPerFrame != mServiceEndpoint->getSamplesPerFrame()) { 89c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAUDIO_ERROR_OUT_OF_RANGE; 90c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } 91c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 92c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // Determine this stream's shared memory buffer capacity. 93c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mFramesPerBurst = mServiceEndpoint->getFramesPerBurst(); 94c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t minCapacityFrames = configurationInput.getBufferCapacity(); 95c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t numBursts = (minCapacityFrames + mFramesPerBurst - 1) / mFramesPerBurst; 96c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (numBursts < MIN_BURSTS_PER_BUFFER) { 97c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk numBursts = MIN_BURSTS_PER_BUFFER; 98c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } else if (numBursts > MAX_BURSTS_PER_BUFFER) { 99c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk numBursts = MAX_BURSTS_PER_BUFFER; 100c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } 101c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mCapacityInFrames = numBursts * mFramesPerBurst; 102c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk ALOGD("AAudioServiceStreamShared::open(), mCapacityInFrames = %d", mCapacityInFrames); 103c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 104c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // Create audio data shared memory buffer for client. 105c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mAudioDataQueue = new SharedRingBuffer(); 106c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mAudioDataQueue->allocate(calculateBytesPerFrame(), mCapacityInFrames); 107c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 108c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // Fill in configuration for client. 109c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk configurationOutput.setSampleRate(mSampleRate); 110c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk configurationOutput.setSamplesPerFrame(mSamplesPerFrame); 111c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk configurationOutput.setAudioFormat(mAudioFormat); 112c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk configurationOutput.setDeviceId(deviceId); 113c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 114c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mServiceEndpoint->registerStream(this); 115c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 116c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAUDIO_OK; 117c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 118c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 119c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk/** 120c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Start the flow of audio data. 121c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 122c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * An AAUDIO_SERVICE_EVENT_STARTED will be sent to the client when complete. 123c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 124c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkaaudio_result_t AAudioServiceStreamShared::start() { 125c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // Add this stream to the mixer. 126c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t result = mServiceEndpoint->startStream(this); 127c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (result != AAUDIO_OK) { 128c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk ALOGE("AAudioServiceStreamShared::start() mServiceEndpoint returned %d", result); 129c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk processError(); 130c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } else { 131c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk result = AAudioServiceStreamBase::start(); 132c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } 133c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAUDIO_OK; 134c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 135c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 136c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk/** 137c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Stop the flow of data so that start() can resume without loss of data. 138c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 139c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * An AAUDIO_SERVICE_EVENT_PAUSED will be sent to the client when complete. 140c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk*/ 141c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkaaudio_result_t AAudioServiceStreamShared::pause() { 142c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // Add this stream to the mixer. 143c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t result = mServiceEndpoint->stopStream(this); 144c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk if (result != AAUDIO_OK) { 145c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk ALOGE("AAudioServiceStreamShared::stop() mServiceEndpoint returned %d", result); 146c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk processError(); 147c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } else { 148c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk result = AAudioServiceStreamBase::start(); 149c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk } 150c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAUDIO_OK; 151c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 152c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 153c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk/** 154c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Discard any data held by the underlying HAL or Service. 155c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 156c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * An AAUDIO_SERVICE_EVENT_FLUSHED will be sent to the client when complete. 157c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 158c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkaaudio_result_t AAudioServiceStreamShared::flush() { 159c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // TODO make sure we are paused 160c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAUDIO_OK; 161c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 162c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 163c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkaaudio_result_t AAudioServiceStreamShared::close() { 164c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk pause(); 165c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // TODO wait for pause() to synchronize 166c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mServiceEndpoint->unregisterStream(this); 167c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mServiceEndpoint->close(); 168c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mServiceEndpoint = nullptr; 169c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAudioServiceStreamBase::close(); 170c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 171c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 172c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk/** 173c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Get an immutable description of the data queue created by this service. 174c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 175c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkaaudio_result_t AAudioServiceStreamShared::getDownDataDescription(AudioEndpointParcelable &parcelable) 176c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk{ 177c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // Gather information on the data queue. 178c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mAudioDataQueue->fillParcelable(parcelable, 179c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk parcelable.mDownDataQueueParcelable); 180c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk parcelable.mDownDataQueueParcelable.setFramesPerBurst(getFramesPerBurst()); 181c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAUDIO_OK; 182c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 183c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 184c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkvoid AAudioServiceStreamShared::onStop() { 185c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 186c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 187c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkvoid AAudioServiceStreamShared::onDisconnect() { 188c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mServiceEndpoint->close(); 189c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk mServiceEndpoint = nullptr; 190c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 191c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 192c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 193c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkaaudio_result_t AAudioServiceStreamShared::getFreeRunningPosition(int64_t *positionFrames, 194c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int64_t *timeNanos) { 195c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk *positionFrames = mAudioDataQueue->getFifoBuffer()->getReadCounter(); 196c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk *timeNanos = AudioClock::getNanoseconds(); 197c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk return AAUDIO_OK; 198c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} 199