AudioStreamInternal.h revision e572f469de5dca1078a79d3d80e5b04f96ae7505
1204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/* 2204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Copyright (C) 2016 The Android Open Source Project 3204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * 4204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Licensed under the Apache License, Version 2.0 (the "License"); 5204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * you may not use this file except in compliance with the License. 6204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * You may obtain a copy of the License at 7204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * 8204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * http://www.apache.org/licenses/LICENSE-2.0 9204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * 10204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Unless required by applicable law or agreed to in writing, software 11204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * distributed under the License is distributed on an "AS IS" BASIS, 12204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * See the License for the specific language governing permissions and 14204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * limitations under the License. 15204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */ 16204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 175ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#ifndef AAUDIO_AUDIOSTREAMINTERNAL_H 185ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#define AAUDIO_AUDIOSTREAMINTERNAL_H 19204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 20204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include <stdint.h> 215ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include <aaudio/AAudio.h> 22204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 235ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include "binding/IAAudioService.h" 24204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/AudioEndpointParcelable.h" 25e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk#include "binding/AAudioServiceInterface.h" 26204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "client/IsochronousClockModel.h" 27204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "client/AudioEndpoint.h" 28204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "core/AudioStream.h" 29e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk#include "utility/LinearRamp.h" 30c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 31204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkusing android::sp; 325ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkusing android::IAAudioService; 33204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 345ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burknamespace aaudio { 35204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 365ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk// A stream that talks to the AAudioService or directly to a HAL. 37204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkclass AudioStreamInternal : public AudioStream { 38204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 39204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkpublic: 40c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk AudioStreamInternal(AAudioServiceInterface &serviceInterface, bool inService = false); 41204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk virtual ~AudioStreamInternal(); 42204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 43204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk // =========== Begin ABSTRACT methods =========================== 44c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t requestStart() override; 45204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 46c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t requestPause() override; 47204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 48c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t requestFlush() override; 49204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 50c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t requestStop() override; 51204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 525ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk // TODO use aaudio_clockid_t all the way down to AudioClock 53c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t getTimestamp(clockid_t clockId, 543316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t *framePosition, 553316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t *timeNanoseconds) override; 56204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 57204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 58c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 59e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk virtual aaudio_result_t updateStateWhileWaiting() override; 60c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 61204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk // =========== End ABSTRACT methods =========================== 62204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 63c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t open(const AudioStreamBuilder &builder) override; 64204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 65c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t close() override; 66204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 67c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t write(const void *buffer, 68204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk int32_t numFrames, 693316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk int64_t timeoutNanoseconds) override; 70204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 71c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t setBufferSize(int32_t requestedFrames) override; 72204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 73c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t getBufferSize() const override; 74204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 75c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t getBufferCapacity() const override; 76204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 77c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t getFramesPerBurst() const override; 78204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 79c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int64_t getFramesRead() override; 80204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 81c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t getXRunCount() const override { 82204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk return mXRunCount; 83204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk } 84204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 85c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t registerThread() override; 86204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 87c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t unregisterThread() override; 88204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 89e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk // Called internally from 'C' 90e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk void *callbackLoop(); 91e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 92204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkprotected: 93204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 945ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk aaudio_result_t processCommands(); 95204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 96e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t requestPauseInternal(); 9771f35bb687476694882a617ba4a810a0bb56fe23Phil Burk aaudio_result_t requestStopInternal(); 98e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 99e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk aaudio_result_t stopCallback(); 100e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 101204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/** 102204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Low level write that will not block. It will just write as much as it can. 103204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * 104204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * It passed back a recommended time to wake up if wakeTimePtr is not NULL. 105204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * 106204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * @return the number of frames written or a negative error code. 107204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */ 108c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t writeNow(const void *buffer, 109c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t numFrames, 110c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int64_t currentTimeNanos, 111c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int64_t *wakeTimePtr); 112204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 113204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk void onFlushFromServer(); 114204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 1155ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk aaudio_result_t onEventFromServer(AAudioServiceMessage *message); 116204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 1175ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk aaudio_result_t onTimestampFromServer(AAudioServiceMessage *message); 118204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 119e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk // Calculate timeout for an operation involving framesPerOperation. 120e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk int64_t calculateReasonableTimeout(int32_t framesPerOperation); 121e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 122204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkprivate: 123c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk /* 124c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Asynchronous write with data conversion. 125c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * @param buffer 126c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * @param numFrames 127c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * @return fdrames written or negative error 128c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 129c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_result_t writeNowWithConversion(const void *buffer, 130c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t numFrames); 131c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk void processTimestamp(uint64_t position, int64_t time); 132c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 13371f35bb687476694882a617ba4a810a0bb56fe23Phil Burk 13471f35bb687476694882a617ba4a810a0bb56fe23Phil Burk const char *getLocationName() const { 13571f35bb687476694882a617ba4a810a0bb56fe23Phil Burk return mInService ? "SERVICE" : "CLIENT"; 13671f35bb687476694882a617ba4a810a0bb56fe23Phil Burk } 13771f35bb687476694882a617ba4a810a0bb56fe23Phil Burk 138c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // Adjust timing model based on timestamp from service. 139c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 140c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk IsochronousClockModel mClockModel; // timing model for chasing the HAL 141c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk AudioEndpoint mAudioEndpoint; // sink for writes 142c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_handle_t mServiceStreamHandle; // opaque handle returned from service 143c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 144c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk AudioEndpointParcelable mEndPointParcelable; // description of the buffers filled by service 145c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk EndpointDescriptor mEndpointDescriptor; // buffer description with resolved addresses 146c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 147c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk aaudio_audio_format_t mDeviceFormat = AAUDIO_FORMAT_UNSPECIFIED; 148c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 149e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk uint8_t *mCallbackBuffer = nullptr; 150e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk int32_t mCallbackFrames = 0; 151e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk 152204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk // Offset from underlying frame position. 153c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int64_t mFramesOffsetFromService = 0; // offset for timestamps 154c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int64_t mLastFramesRead = 0; // used to prevent retrograde motion 155c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t mFramesPerBurst; // frames per HAL transfer 156c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t mXRunCount = 0; // how many underrun events? 157e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk LinearRamp mVolumeRamp; 158c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 159c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk AAudioServiceInterface &mServiceInterface; // abstract interface to the service 160c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 161c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk // The service uses this for SHARED mode. 162c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk bool mInService = false; // Are running in the client or the service? 163204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk}; 164204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 1655ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk} /* namespace aaudio */ 166204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk 1675ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#endif //AAUDIO_AUDIOSTREAMINTERNAL_H 168