1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #pragma once 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #include <atomic> 20*ec779b8eSAndroid Build Coastguard Worker #include <memory> 21*ec779b8eSAndroid Build Coastguard Worker #include <mutex> 22*ec779b8eSAndroid Build Coastguard Worker #include <string_view> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/common/AudioOffloadMetadata.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/core/BpStreamCommon.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/core/BpStreamIn.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/core/BpStreamOut.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/core/MmapBufferDescriptor.h> 29*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/audio/IHalAdapterVendorExtension.h> 30*ec779b8eSAndroid Build Coastguard Worker #include <fmq/AidlMessageQueue.h> 31*ec779b8eSAndroid Build Coastguard Worker #include <media/audiohal/EffectHalInterface.h> 32*ec779b8eSAndroid Build Coastguard Worker #include <media/audiohal/StreamHalInterface.h> 33*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversionUtil.h> 34*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioParameter.h> 35*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/Synchronization.h> 36*ec779b8eSAndroid Build Coastguard Worker 37*ec779b8eSAndroid Build Coastguard Worker #include "ConversionHelperAidl.h" 38*ec779b8eSAndroid Build Coastguard Worker #include "StreamPowerLog.h" 39*ec779b8eSAndroid Build Coastguard Worker 40*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::common::AudioOffloadMetadata; 41*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::core::MmapBufferDescriptor; 42*ec779b8eSAndroid Build Coastguard Worker 43*ec779b8eSAndroid Build Coastguard Worker namespace android { 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard Worker class StreamContextAidl { 46*ec779b8eSAndroid Build Coastguard Worker public: 47*ec779b8eSAndroid Build Coastguard Worker typedef AidlMessageQueue<::aidl::android::hardware::audio::core::StreamDescriptor::Command, 48*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::common::fmq::SynchronizedReadWrite> CommandMQ; 49*ec779b8eSAndroid Build Coastguard Worker typedef AidlMessageQueue<::aidl::android::hardware::audio::core::StreamDescriptor::Reply, 50*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::common::fmq::SynchronizedReadWrite> ReplyMQ; 51*ec779b8eSAndroid Build Coastguard Worker typedef AidlMessageQueue<int8_t, 52*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::common::fmq::SynchronizedReadWrite> DataMQ; 53*ec779b8eSAndroid Build Coastguard Worker StreamContextAidl(::aidl::android::hardware::audio::core::StreamDescriptor & descriptor,bool isAsynchronous,int ioHandle)54*ec779b8eSAndroid Build Coastguard Worker StreamContextAidl( 55*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor& descriptor, 56*ec779b8eSAndroid Build Coastguard Worker bool isAsynchronous, int ioHandle) 57*ec779b8eSAndroid Build Coastguard Worker : mFrameSizeBytes(descriptor.frameSizeBytes), 58*ec779b8eSAndroid Build Coastguard Worker mCommandMQ(new CommandMQ(descriptor.command)), 59*ec779b8eSAndroid Build Coastguard Worker mReplyMQ(new ReplyMQ(descriptor.reply)), 60*ec779b8eSAndroid Build Coastguard Worker mBufferSizeFrames(descriptor.bufferSizeFrames), 61*ec779b8eSAndroid Build Coastguard Worker mDataMQ(maybeCreateDataMQ(descriptor)), 62*ec779b8eSAndroid Build Coastguard Worker mIsAsynchronous(isAsynchronous), 63*ec779b8eSAndroid Build Coastguard Worker mIsMmapped(isMmapped(descriptor)), 64*ec779b8eSAndroid Build Coastguard Worker mMmapBufferDescriptor(maybeGetMmapBuffer(descriptor)), 65*ec779b8eSAndroid Build Coastguard Worker mIoHandle(ioHandle) {} StreamContextAidl(StreamContextAidl && other)66*ec779b8eSAndroid Build Coastguard Worker StreamContextAidl(StreamContextAidl&& other) : 67*ec779b8eSAndroid Build Coastguard Worker mFrameSizeBytes(other.mFrameSizeBytes), 68*ec779b8eSAndroid Build Coastguard Worker mCommandMQ(std::move(other.mCommandMQ)), 69*ec779b8eSAndroid Build Coastguard Worker mReplyMQ(std::move(other.mReplyMQ)), 70*ec779b8eSAndroid Build Coastguard Worker mBufferSizeFrames(other.mBufferSizeFrames), 71*ec779b8eSAndroid Build Coastguard Worker mDataMQ(std::move(other.mDataMQ)), 72*ec779b8eSAndroid Build Coastguard Worker mIsAsynchronous(other.mIsAsynchronous), 73*ec779b8eSAndroid Build Coastguard Worker mIsMmapped(other.mIsMmapped), 74*ec779b8eSAndroid Build Coastguard Worker mMmapBufferDescriptor(std::move(other.mMmapBufferDescriptor)), 75*ec779b8eSAndroid Build Coastguard Worker mIoHandle(other.mIoHandle) {} 76*ec779b8eSAndroid Build Coastguard Worker StreamContextAidl& operator=(StreamContextAidl&& other) { 77*ec779b8eSAndroid Build Coastguard Worker mFrameSizeBytes = other.mFrameSizeBytes; 78*ec779b8eSAndroid Build Coastguard Worker mCommandMQ = std::move(other.mCommandMQ); 79*ec779b8eSAndroid Build Coastguard Worker mReplyMQ = std::move(other.mReplyMQ); 80*ec779b8eSAndroid Build Coastguard Worker mBufferSizeFrames = other.mBufferSizeFrames; 81*ec779b8eSAndroid Build Coastguard Worker mDataMQ = std::move(other.mDataMQ); 82*ec779b8eSAndroid Build Coastguard Worker mIsAsynchronous = other.mIsAsynchronous; 83*ec779b8eSAndroid Build Coastguard Worker mIsMmapped = other.mIsMmapped; 84*ec779b8eSAndroid Build Coastguard Worker mMmapBufferDescriptor = std::move(other.mMmapBufferDescriptor); 85*ec779b8eSAndroid Build Coastguard Worker mIoHandle = other.mIoHandle; 86*ec779b8eSAndroid Build Coastguard Worker return *this; 87*ec779b8eSAndroid Build Coastguard Worker } isValid()88*ec779b8eSAndroid Build Coastguard Worker bool isValid() const { 89*ec779b8eSAndroid Build Coastguard Worker return mFrameSizeBytes != 0 && 90*ec779b8eSAndroid Build Coastguard Worker mCommandMQ != nullptr && mCommandMQ->isValid() && 91*ec779b8eSAndroid Build Coastguard Worker mReplyMQ != nullptr && mReplyMQ->isValid() && 92*ec779b8eSAndroid Build Coastguard Worker (mDataMQ == nullptr || ( 93*ec779b8eSAndroid Build Coastguard Worker mDataMQ->isValid() && 94*ec779b8eSAndroid Build Coastguard Worker mDataMQ->getQuantumCount() * mDataMQ->getQuantumSize() >= 95*ec779b8eSAndroid Build Coastguard Worker mFrameSizeBytes * mBufferSizeFrames)) && 96*ec779b8eSAndroid Build Coastguard Worker (!mIsMmapped || mMmapBufferDescriptor.sharedMemory.fd.get() >= 0); 97*ec779b8eSAndroid Build Coastguard Worker } getBufferSizeBytes()98*ec779b8eSAndroid Build Coastguard Worker size_t getBufferSizeBytes() const { return mFrameSizeBytes * mBufferSizeFrames; } getBufferSizeFrames()99*ec779b8eSAndroid Build Coastguard Worker size_t getBufferSizeFrames() const { return mBufferSizeFrames; } getBufferDurationMs(int32_t sampleRate)100*ec779b8eSAndroid Build Coastguard Worker size_t getBufferDurationMs(int32_t sampleRate) const { 101*ec779b8eSAndroid Build Coastguard Worker auto bufferSize = mIsMmapped ? getMmapBurstSize() : mBufferSizeFrames; 102*ec779b8eSAndroid Build Coastguard Worker return sampleRate != 0 ? bufferSize * MILLIS_PER_SECOND / sampleRate : 0; 103*ec779b8eSAndroid Build Coastguard Worker } getCommandMQ()104*ec779b8eSAndroid Build Coastguard Worker CommandMQ* getCommandMQ() const { return mCommandMQ.get(); } getDataMQ()105*ec779b8eSAndroid Build Coastguard Worker DataMQ* getDataMQ() const { return mDataMQ.get(); } getFrameSizeBytes()106*ec779b8eSAndroid Build Coastguard Worker size_t getFrameSizeBytes() const { return mFrameSizeBytes; } getReplyMQ()107*ec779b8eSAndroid Build Coastguard Worker ReplyMQ* getReplyMQ() const { return mReplyMQ.get(); } isAsynchronous()108*ec779b8eSAndroid Build Coastguard Worker bool isAsynchronous() const { return mIsAsynchronous; } isMmapped()109*ec779b8eSAndroid Build Coastguard Worker bool isMmapped() const { return mIsMmapped; } getMmapBufferDescriptor()110*ec779b8eSAndroid Build Coastguard Worker const MmapBufferDescriptor& getMmapBufferDescriptor() const { return mMmapBufferDescriptor; } getMmapBurstSize()111*ec779b8eSAndroid Build Coastguard Worker size_t getMmapBurstSize() const { return mMmapBufferDescriptor.burstSizeFrames; } getIoHandle()112*ec779b8eSAndroid Build Coastguard Worker int getIoHandle() const { return mIoHandle; } 113*ec779b8eSAndroid Build Coastguard Worker 114*ec779b8eSAndroid Build Coastguard Worker private: maybeCreateDataMQ(const::aidl::android::hardware::audio::core::StreamDescriptor & descriptor)115*ec779b8eSAndroid Build Coastguard Worker static std::unique_ptr<DataMQ> maybeCreateDataMQ( 116*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::audio::core::StreamDescriptor& descriptor) { 117*ec779b8eSAndroid Build Coastguard Worker using Tag = ::aidl::android::hardware::audio::core::StreamDescriptor::AudioBuffer::Tag; 118*ec779b8eSAndroid Build Coastguard Worker if (descriptor.audio.getTag() == Tag::fmq) { 119*ec779b8eSAndroid Build Coastguard Worker return std::make_unique<DataMQ>(descriptor.audio.get<Tag::fmq>()); 120*ec779b8eSAndroid Build Coastguard Worker } 121*ec779b8eSAndroid Build Coastguard Worker return nullptr; 122*ec779b8eSAndroid Build Coastguard Worker } isMmapped(const::aidl::android::hardware::audio::core::StreamDescriptor & descriptor)123*ec779b8eSAndroid Build Coastguard Worker static bool isMmapped( 124*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::audio::core::StreamDescriptor& descriptor) { 125*ec779b8eSAndroid Build Coastguard Worker using Tag = ::aidl::android::hardware::audio::core::StreamDescriptor::AudioBuffer::Tag; 126*ec779b8eSAndroid Build Coastguard Worker return descriptor.audio.getTag() == Tag::mmap; 127*ec779b8eSAndroid Build Coastguard Worker } maybeGetMmapBuffer(::aidl::android::hardware::audio::core::StreamDescriptor & descriptor)128*ec779b8eSAndroid Build Coastguard Worker static MmapBufferDescriptor maybeGetMmapBuffer( 129*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor& descriptor) { 130*ec779b8eSAndroid Build Coastguard Worker using Tag = ::aidl::android::hardware::audio::core::StreamDescriptor::AudioBuffer::Tag; 131*ec779b8eSAndroid Build Coastguard Worker if (descriptor.audio.getTag() == Tag::mmap) { 132*ec779b8eSAndroid Build Coastguard Worker return std::move(descriptor.audio.get<Tag::mmap>()); 133*ec779b8eSAndroid Build Coastguard Worker } 134*ec779b8eSAndroid Build Coastguard Worker return {}; 135*ec779b8eSAndroid Build Coastguard Worker } 136*ec779b8eSAndroid Build Coastguard Worker 137*ec779b8eSAndroid Build Coastguard Worker size_t mFrameSizeBytes; 138*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<CommandMQ> mCommandMQ; 139*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<ReplyMQ> mReplyMQ; 140*ec779b8eSAndroid Build Coastguard Worker size_t mBufferSizeFrames; 141*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<DataMQ> mDataMQ; 142*ec779b8eSAndroid Build Coastguard Worker bool mIsAsynchronous; 143*ec779b8eSAndroid Build Coastguard Worker bool mIsMmapped; 144*ec779b8eSAndroid Build Coastguard Worker MmapBufferDescriptor mMmapBufferDescriptor; 145*ec779b8eSAndroid Build Coastguard Worker int mIoHandle; 146*ec779b8eSAndroid Build Coastguard Worker }; 147*ec779b8eSAndroid Build Coastguard Worker 148*ec779b8eSAndroid Build Coastguard Worker class StreamHalAidl : public virtual StreamHalInterface, public ConversionHelperAidl { 149*ec779b8eSAndroid Build Coastguard Worker public: 150*ec779b8eSAndroid Build Coastguard Worker // Return size of input/output buffer in bytes for this stream - eg. 4800. 151*ec779b8eSAndroid Build Coastguard Worker status_t getBufferSize(size_t *size) override; 152*ec779b8eSAndroid Build Coastguard Worker 153*ec779b8eSAndroid Build Coastguard Worker // Return the base configuration of the stream: 154*ec779b8eSAndroid Build Coastguard Worker // - channel mask; 155*ec779b8eSAndroid Build Coastguard Worker // - format - e.g. AUDIO_FORMAT_PCM_16_BIT; 156*ec779b8eSAndroid Build Coastguard Worker // - sampling rate in Hz - eg. 44100. 157*ec779b8eSAndroid Build Coastguard Worker status_t getAudioProperties(audio_config_base_t *configBase) override; 158*ec779b8eSAndroid Build Coastguard Worker 159*ec779b8eSAndroid Build Coastguard Worker // Set audio stream parameters. 160*ec779b8eSAndroid Build Coastguard Worker status_t setParameters(const String8& kvPairs) override; 161*ec779b8eSAndroid Build Coastguard Worker 162*ec779b8eSAndroid Build Coastguard Worker // Get audio stream parameters. 163*ec779b8eSAndroid Build Coastguard Worker status_t getParameters(const String8& keys, String8 *values) override; 164*ec779b8eSAndroid Build Coastguard Worker 165*ec779b8eSAndroid Build Coastguard Worker // Return the frame size (number of bytes per sample) of a stream. 166*ec779b8eSAndroid Build Coastguard Worker status_t getFrameSize(size_t *size) override; 167*ec779b8eSAndroid Build Coastguard Worker 168*ec779b8eSAndroid Build Coastguard Worker // Add or remove the effect on the stream. 169*ec779b8eSAndroid Build Coastguard Worker status_t addEffect(sp<EffectHalInterface> effect) override; 170*ec779b8eSAndroid Build Coastguard Worker status_t removeEffect(sp<EffectHalInterface> effect) override; 171*ec779b8eSAndroid Build Coastguard Worker 172*ec779b8eSAndroid Build Coastguard Worker // Put the audio hardware input/output into standby mode. 173*ec779b8eSAndroid Build Coastguard Worker status_t standby() override; 174*ec779b8eSAndroid Build Coastguard Worker 175*ec779b8eSAndroid Build Coastguard Worker status_t dump(int fd, const Vector<String16>& args) override; 176*ec779b8eSAndroid Build Coastguard Worker 177*ec779b8eSAndroid Build Coastguard Worker // Start a stream operating in mmap mode. 178*ec779b8eSAndroid Build Coastguard Worker status_t start() override; 179*ec779b8eSAndroid Build Coastguard Worker 180*ec779b8eSAndroid Build Coastguard Worker // Stop a stream operating in mmap mode. 181*ec779b8eSAndroid Build Coastguard Worker status_t stop() override; 182*ec779b8eSAndroid Build Coastguard Worker 183*ec779b8eSAndroid Build Coastguard Worker // Retrieve information on the data buffer in mmap mode. 184*ec779b8eSAndroid Build Coastguard Worker status_t createMmapBuffer(int32_t minSizeFrames, 185*ec779b8eSAndroid Build Coastguard Worker struct audio_mmap_buffer_info *info) override; 186*ec779b8eSAndroid Build Coastguard Worker 187*ec779b8eSAndroid Build Coastguard Worker // Get current read/write position in the mmap buffer 188*ec779b8eSAndroid Build Coastguard Worker status_t getMmapPosition(struct audio_mmap_position *position) override; 189*ec779b8eSAndroid Build Coastguard Worker 190*ec779b8eSAndroid Build Coastguard Worker // Set the priority of the thread that interacts with the HAL 191*ec779b8eSAndroid Build Coastguard Worker // (must match the priority of the audioflinger's thread that calls 'read' / 'write') 192*ec779b8eSAndroid Build Coastguard Worker status_t setHalThreadPriority(int priority) override; 193*ec779b8eSAndroid Build Coastguard Worker 194*ec779b8eSAndroid Build Coastguard Worker status_t legacyCreateAudioPatch(const struct audio_port_config& port, 195*ec779b8eSAndroid Build Coastguard Worker std::optional<audio_source_t> source, 196*ec779b8eSAndroid Build Coastguard Worker audio_devices_t type) override; 197*ec779b8eSAndroid Build Coastguard Worker 198*ec779b8eSAndroid Build Coastguard Worker status_t legacyReleaseAudioPatch() override; 199*ec779b8eSAndroid Build Coastguard Worker 200*ec779b8eSAndroid Build Coastguard Worker protected: 201*ec779b8eSAndroid Build Coastguard Worker // For tests. 202*ec779b8eSAndroid Build Coastguard Worker friend class sp<StreamHalAidl>; 203*ec779b8eSAndroid Build Coastguard Worker 204*ec779b8eSAndroid Build Coastguard Worker struct StatePositions { 205*ec779b8eSAndroid Build Coastguard Worker int64_t framesAtFlushOrDrain; 206*ec779b8eSAndroid Build Coastguard Worker int64_t framesAtStandby; 207*ec779b8eSAndroid Build Coastguard Worker }; 208*ec779b8eSAndroid Build Coastguard Worker 209*ec779b8eSAndroid Build Coastguard Worker template<class T> 210*ec779b8eSAndroid Build Coastguard Worker static std::shared_ptr<::aidl::android::hardware::audio::core::IStreamCommon> getStreamCommon( 211*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<T>& stream); 212*ec779b8eSAndroid Build Coastguard Worker 213*ec779b8eSAndroid Build Coastguard Worker // Subclasses can not be constructed directly by clients. 214*ec779b8eSAndroid Build Coastguard Worker StreamHalAidl(std::string_view className, 215*ec779b8eSAndroid Build Coastguard Worker bool isInput, 216*ec779b8eSAndroid Build Coastguard Worker const audio_config& config, 217*ec779b8eSAndroid Build Coastguard Worker int32_t nominalLatency, 218*ec779b8eSAndroid Build Coastguard Worker StreamContextAidl&& context, 219*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::core::IStreamCommon>& stream, 220*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension>& vext); 221*ec779b8eSAndroid Build Coastguard Worker 222*ec779b8eSAndroid Build Coastguard Worker ~StreamHalAidl() override; 223*ec779b8eSAndroid Build Coastguard Worker getState()224*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor::State getState() { 225*ec779b8eSAndroid Build Coastguard Worker std::lock_guard l(mLock); 226*ec779b8eSAndroid Build Coastguard Worker return mLastReply.state; 227*ec779b8eSAndroid Build Coastguard Worker } 228*ec779b8eSAndroid Build Coastguard Worker isInDrainedState(const::aidl::android::hardware::audio::core::StreamDescriptor::State state)229*ec779b8eSAndroid Build Coastguard Worker bool isInDrainedState( 230*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::audio::core::StreamDescriptor::State state) { 231*ec779b8eSAndroid Build Coastguard Worker if (state == ::aidl::android::hardware::audio::core::StreamDescriptor::State::IDLE || 232*ec779b8eSAndroid Build Coastguard Worker state == ::aidl::android::hardware::audio::core::StreamDescriptor::State::STANDBY) { 233*ec779b8eSAndroid Build Coastguard Worker // drain equivalent states 234*ec779b8eSAndroid Build Coastguard Worker return true; 235*ec779b8eSAndroid Build Coastguard Worker } 236*ec779b8eSAndroid Build Coastguard Worker return false; 237*ec779b8eSAndroid Build Coastguard Worker } 238*ec779b8eSAndroid Build Coastguard Worker isInPlayOrRecordState(const::aidl::android::hardware::audio::core::StreamDescriptor::State state)239*ec779b8eSAndroid Build Coastguard Worker bool isInPlayOrRecordState( 240*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::audio::core::StreamDescriptor::State state) { 241*ec779b8eSAndroid Build Coastguard Worker if (state == ::aidl::android::hardware::audio::core::StreamDescriptor::State::ACTIVE || 242*ec779b8eSAndroid Build Coastguard Worker state == 243*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor::State::TRANSFERRING || 244*ec779b8eSAndroid Build Coastguard Worker state == ::aidl::android::hardware::audio::core::StreamDescriptor::State::DRAINING) { 245*ec779b8eSAndroid Build Coastguard Worker // play or record equivalent states 246*ec779b8eSAndroid Build Coastguard Worker return true; 247*ec779b8eSAndroid Build Coastguard Worker } 248*ec779b8eSAndroid Build Coastguard Worker return false; 249*ec779b8eSAndroid Build Coastguard Worker } 250*ec779b8eSAndroid Build Coastguard Worker isInPausedState(const::aidl::android::hardware::audio::core::StreamDescriptor::State & state)251*ec779b8eSAndroid Build Coastguard Worker bool isInPausedState( 252*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::audio::core::StreamDescriptor::State& state) { 253*ec779b8eSAndroid Build Coastguard Worker if (state == ::aidl::android::hardware::audio::core::StreamDescriptor::State::PAUSED || 254*ec779b8eSAndroid Build Coastguard Worker state == 255*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor::State::DRAIN_PAUSED || 256*ec779b8eSAndroid Build Coastguard Worker state == ::aidl::android::hardware::audio::core::StreamDescriptor::State:: 257*ec779b8eSAndroid Build Coastguard Worker TRANSFER_PAUSED) { 258*ec779b8eSAndroid Build Coastguard Worker // pause equivalent states 259*ec779b8eSAndroid Build Coastguard Worker return true; 260*ec779b8eSAndroid Build Coastguard Worker } 261*ec779b8eSAndroid Build Coastguard Worker return false; 262*ec779b8eSAndroid Build Coastguard Worker } 263*ec779b8eSAndroid Build Coastguard Worker 264*ec779b8eSAndroid Build Coastguard Worker status_t getLatency(uint32_t *latency); 265*ec779b8eSAndroid Build Coastguard Worker 266*ec779b8eSAndroid Build Coastguard Worker // Always returns non-negative values. 267*ec779b8eSAndroid Build Coastguard Worker status_t getObservablePosition(int64_t* frames, int64_t* timestamp, 268*ec779b8eSAndroid Build Coastguard Worker StatePositions* statePositions = nullptr); 269*ec779b8eSAndroid Build Coastguard Worker 270*ec779b8eSAndroid Build Coastguard Worker // Always returns non-negative values. 271*ec779b8eSAndroid Build Coastguard Worker status_t getHardwarePosition(int64_t *frames, int64_t *timestamp); 272*ec779b8eSAndroid Build Coastguard Worker 273*ec779b8eSAndroid Build Coastguard Worker // Always returns non-negative values. 274*ec779b8eSAndroid Build Coastguard Worker status_t getXruns(int32_t *frames); 275*ec779b8eSAndroid Build Coastguard Worker 276*ec779b8eSAndroid Build Coastguard Worker status_t transfer(void *buffer, size_t bytes, size_t *transferred); 277*ec779b8eSAndroid Build Coastguard Worker 278*ec779b8eSAndroid Build Coastguard Worker status_t pause( 279*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor::Reply* reply = nullptr); 280*ec779b8eSAndroid Build Coastguard Worker 281*ec779b8eSAndroid Build Coastguard Worker status_t resume( 282*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor::Reply* reply = nullptr); 283*ec779b8eSAndroid Build Coastguard Worker 284*ec779b8eSAndroid Build Coastguard Worker status_t drain(bool earlyNotify, 285*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor::Reply* reply = nullptr); 286*ec779b8eSAndroid Build Coastguard Worker 287*ec779b8eSAndroid Build Coastguard Worker status_t flush( 288*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor::Reply* reply = nullptr); 289*ec779b8eSAndroid Build Coastguard Worker 290*ec779b8eSAndroid Build Coastguard Worker status_t exit(); 291*ec779b8eSAndroid Build Coastguard Worker 292*ec779b8eSAndroid Build Coastguard Worker void onAsyncTransferReady(); 293*ec779b8eSAndroid Build Coastguard Worker void onAsyncDrainReady(); 294*ec779b8eSAndroid Build Coastguard Worker void onAsyncError(); 295*ec779b8eSAndroid Build Coastguard Worker 296*ec779b8eSAndroid Build Coastguard Worker const bool mIsInput; 297*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t mConfig; 298*ec779b8eSAndroid Build Coastguard Worker const StreamContextAidl mContext; 299*ec779b8eSAndroid Build Coastguard Worker // This lock is used to make sending of a command and receiving a reply an atomic 300*ec779b8eSAndroid Build Coastguard Worker // operation. Otherwise, when two threads are trying to send a command, they may both advance to 301*ec779b8eSAndroid Build Coastguard Worker // reading of the reply once the HAL has consumed the command from the MQ, and that creates a 302*ec779b8eSAndroid Build Coastguard Worker // race condition between them. 303*ec779b8eSAndroid Build Coastguard Worker // 304*ec779b8eSAndroid Build Coastguard Worker // Note that only access to command and reply MQs needs to be protected because the data MQ is 305*ec779b8eSAndroid Build Coastguard Worker // only accessed by the I/O thread. Also, there is no need to protect lookup operations on the 306*ec779b8eSAndroid Build Coastguard Worker // queues as they are thread-safe, only send/receive operation must be protected. 307*ec779b8eSAndroid Build Coastguard Worker std::mutex mCommandReplyLock; 308*ec779b8eSAndroid Build Coastguard Worker 309*ec779b8eSAndroid Build Coastguard Worker private: configToBase(const audio_config & config)310*ec779b8eSAndroid Build Coastguard Worker static audio_config_base_t configToBase(const audio_config& config) { 311*ec779b8eSAndroid Build Coastguard Worker audio_config_base_t result = AUDIO_CONFIG_BASE_INITIALIZER; 312*ec779b8eSAndroid Build Coastguard Worker result.sample_rate = config.sample_rate; 313*ec779b8eSAndroid Build Coastguard Worker result.channel_mask = config.channel_mask; 314*ec779b8eSAndroid Build Coastguard Worker result.format = config.format; 315*ec779b8eSAndroid Build Coastguard Worker return result; 316*ec779b8eSAndroid Build Coastguard Worker } 317*ec779b8eSAndroid Build Coastguard Worker // Note: Since `sendCommand` takes mLock while holding mCommandReplyLock, never call 318*ec779b8eSAndroid Build Coastguard Worker // it with `mLock` being held. 319*ec779b8eSAndroid Build Coastguard Worker status_t sendCommand( 320*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::audio::core::StreamDescriptor::Command& command, 321*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor::Reply* reply = nullptr, 322*ec779b8eSAndroid Build Coastguard Worker bool safeFromNonWorkerThread = false, 323*ec779b8eSAndroid Build Coastguard Worker StatePositions* statePositions = nullptr); 324*ec779b8eSAndroid Build Coastguard Worker status_t updateCountersIfNeeded( 325*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor::Reply* reply = nullptr, 326*ec779b8eSAndroid Build Coastguard Worker StatePositions* statePositions = nullptr); 327*ec779b8eSAndroid Build Coastguard Worker 328*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::core::IStreamCommon> mStream; 329*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension> mVendorExt; 330*ec779b8eSAndroid Build Coastguard Worker const int64_t mLastReplyLifeTimeNs; 331*ec779b8eSAndroid Build Coastguard Worker std::mutex mLock; 332*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::audio::core::StreamDescriptor::Reply mLastReply GUARDED_BY(mLock); 333*ec779b8eSAndroid Build Coastguard Worker int64_t mLastReplyExpirationNs GUARDED_BY(mLock) = 0; 334*ec779b8eSAndroid Build Coastguard Worker // Cached values of observable positions when the stream last entered certain state. 335*ec779b8eSAndroid Build Coastguard Worker // Updated for output streams only. 336*ec779b8eSAndroid Build Coastguard Worker StatePositions mStatePositions GUARDED_BY(mLock) = {}; 337*ec779b8eSAndroid Build Coastguard Worker // mStreamPowerLog is used for audio signal power logging. 338*ec779b8eSAndroid Build Coastguard Worker StreamPowerLog mStreamPowerLog; 339*ec779b8eSAndroid Build Coastguard Worker std::atomic<pid_t> mWorkerTid = -1; 340*ec779b8eSAndroid Build Coastguard Worker }; 341*ec779b8eSAndroid Build Coastguard Worker 342*ec779b8eSAndroid Build Coastguard Worker class CallbackBroker; 343*ec779b8eSAndroid Build Coastguard Worker 344*ec779b8eSAndroid Build Coastguard Worker class StreamOutHalAidl : public virtual StreamOutHalInterface, 345*ec779b8eSAndroid Build Coastguard Worker public virtual StreamOutHalInterfaceCallback, 346*ec779b8eSAndroid Build Coastguard Worker public StreamHalAidl { 347*ec779b8eSAndroid Build Coastguard Worker public: 348*ec779b8eSAndroid Build Coastguard Worker // Extract the output stream parameters and set by AIDL APIs. 349*ec779b8eSAndroid Build Coastguard Worker status_t setParameters(const String8& kvPairs) override; 350*ec779b8eSAndroid Build Coastguard Worker 351*ec779b8eSAndroid Build Coastguard Worker // Return the audio hardware driver estimated latency in milliseconds. 352*ec779b8eSAndroid Build Coastguard Worker status_t getLatency(uint32_t *latency) override; 353*ec779b8eSAndroid Build Coastguard Worker 354*ec779b8eSAndroid Build Coastguard Worker // Use this method in situations where audio mixing is done in the hardware. 355*ec779b8eSAndroid Build Coastguard Worker status_t setVolume(float left, float right) override; 356*ec779b8eSAndroid Build Coastguard Worker 357*ec779b8eSAndroid Build Coastguard Worker // Selects the audio presentation (if available). 358*ec779b8eSAndroid Build Coastguard Worker status_t selectPresentation(int presentationId, int programId) override; 359*ec779b8eSAndroid Build Coastguard Worker 360*ec779b8eSAndroid Build Coastguard Worker // Write audio buffer to driver. 361*ec779b8eSAndroid Build Coastguard Worker status_t write(const void *buffer, size_t bytes, size_t *written) override; 362*ec779b8eSAndroid Build Coastguard Worker 363*ec779b8eSAndroid Build Coastguard Worker // Return the number of audio frames written by the audio dsp to DAC since 364*ec779b8eSAndroid Build Coastguard Worker // the output has exited standby. 365*ec779b8eSAndroid Build Coastguard Worker status_t getRenderPosition(uint64_t *dspFrames) override; 366*ec779b8eSAndroid Build Coastguard Worker 367*ec779b8eSAndroid Build Coastguard Worker // Set the callback for notifying completion of non-blocking write and drain. 368*ec779b8eSAndroid Build Coastguard Worker status_t setCallback(wp<StreamOutHalInterfaceCallback> callback) override; 369*ec779b8eSAndroid Build Coastguard Worker 370*ec779b8eSAndroid Build Coastguard Worker // Returns whether pause and resume operations are supported. 371*ec779b8eSAndroid Build Coastguard Worker status_t supportsPauseAndResume(bool *supportsPause, bool *supportsResume) override; 372*ec779b8eSAndroid Build Coastguard Worker 373*ec779b8eSAndroid Build Coastguard Worker // Notifies to the audio driver to resume playback following a pause. 374*ec779b8eSAndroid Build Coastguard Worker status_t pause() override; 375*ec779b8eSAndroid Build Coastguard Worker 376*ec779b8eSAndroid Build Coastguard Worker // Notifies to the audio driver to resume playback following a pause. 377*ec779b8eSAndroid Build Coastguard Worker status_t resume() override; 378*ec779b8eSAndroid Build Coastguard Worker 379*ec779b8eSAndroid Build Coastguard Worker // Returns whether drain operation is supported. 380*ec779b8eSAndroid Build Coastguard Worker status_t supportsDrain(bool *supportsDrain) override; 381*ec779b8eSAndroid Build Coastguard Worker 382*ec779b8eSAndroid Build Coastguard Worker // Requests notification when data buffered by the driver/hardware has been played. 383*ec779b8eSAndroid Build Coastguard Worker status_t drain(bool earlyNotify) override; 384*ec779b8eSAndroid Build Coastguard Worker 385*ec779b8eSAndroid Build Coastguard Worker // Notifies to the audio driver to flush (that is, drop) the queued data. Stream must 386*ec779b8eSAndroid Build Coastguard Worker // already be paused before calling 'flush'. 387*ec779b8eSAndroid Build Coastguard Worker status_t flush() override; 388*ec779b8eSAndroid Build Coastguard Worker 389*ec779b8eSAndroid Build Coastguard Worker // Return a recent count of the number of audio frames presented to an external observer. 390*ec779b8eSAndroid Build Coastguard Worker // This excludes frames which have been written but are still in the pipeline. See the 391*ec779b8eSAndroid Build Coastguard Worker // table at the start of the 'StreamOutHalInterface' for the specification of the frame 392*ec779b8eSAndroid Build Coastguard Worker // count behavior w.r.t. 'flush', 'drain' and 'standby' operations. 393*ec779b8eSAndroid Build Coastguard Worker status_t getPresentationPosition(uint64_t *frames, struct timespec *timestamp) override; 394*ec779b8eSAndroid Build Coastguard Worker 395*ec779b8eSAndroid Build Coastguard Worker // Notifies the HAL layer that the framework considers the current playback as completed. 396*ec779b8eSAndroid Build Coastguard Worker status_t presentationComplete() override; 397*ec779b8eSAndroid Build Coastguard Worker 398*ec779b8eSAndroid Build Coastguard Worker // Called when the metadata of the stream's source has been changed. 399*ec779b8eSAndroid Build Coastguard Worker status_t updateSourceMetadata(const SourceMetadata& sourceMetadata) override; 400*ec779b8eSAndroid Build Coastguard Worker 401*ec779b8eSAndroid Build Coastguard Worker // Returns the Dual Mono mode presentation setting. 402*ec779b8eSAndroid Build Coastguard Worker status_t getDualMonoMode(audio_dual_mono_mode_t* mode) override; 403*ec779b8eSAndroid Build Coastguard Worker 404*ec779b8eSAndroid Build Coastguard Worker // Sets the Dual Mono mode presentation on the output device. 405*ec779b8eSAndroid Build Coastguard Worker status_t setDualMonoMode(audio_dual_mono_mode_t mode) override; 406*ec779b8eSAndroid Build Coastguard Worker 407*ec779b8eSAndroid Build Coastguard Worker // Returns the Audio Description Mix level in dB. 408*ec779b8eSAndroid Build Coastguard Worker status_t getAudioDescriptionMixLevel(float* leveldB) override; 409*ec779b8eSAndroid Build Coastguard Worker 410*ec779b8eSAndroid Build Coastguard Worker // Sets the Audio Description Mix level in dB. 411*ec779b8eSAndroid Build Coastguard Worker status_t setAudioDescriptionMixLevel(float leveldB) override; 412*ec779b8eSAndroid Build Coastguard Worker 413*ec779b8eSAndroid Build Coastguard Worker // Retrieves current playback rate parameters. 414*ec779b8eSAndroid Build Coastguard Worker status_t getPlaybackRateParameters(audio_playback_rate_t* playbackRate) override; 415*ec779b8eSAndroid Build Coastguard Worker 416*ec779b8eSAndroid Build Coastguard Worker // Sets the playback rate parameters that control playback behavior. 417*ec779b8eSAndroid Build Coastguard Worker status_t setPlaybackRateParameters(const audio_playback_rate_t& playbackRate) override; 418*ec779b8eSAndroid Build Coastguard Worker 419*ec779b8eSAndroid Build Coastguard Worker status_t setEventCallback(const sp<StreamOutHalInterfaceEventCallback>& callback) override; 420*ec779b8eSAndroid Build Coastguard Worker 421*ec779b8eSAndroid Build Coastguard Worker status_t setLatencyMode(audio_latency_mode_t mode) override; 422*ec779b8eSAndroid Build Coastguard Worker status_t getRecommendedLatencyModes(std::vector<audio_latency_mode_t> *modes) override; 423*ec779b8eSAndroid Build Coastguard Worker status_t setLatencyModeCallback( 424*ec779b8eSAndroid Build Coastguard Worker const sp<StreamOutHalInterfaceLatencyModeCallback>& callback) override; 425*ec779b8eSAndroid Build Coastguard Worker 426*ec779b8eSAndroid Build Coastguard Worker status_t exit() override; 427*ec779b8eSAndroid Build Coastguard Worker 428*ec779b8eSAndroid Build Coastguard Worker // StreamOutHalInterfaceCallback 429*ec779b8eSAndroid Build Coastguard Worker void onWriteReady() override; 430*ec779b8eSAndroid Build Coastguard Worker void onDrainReady() override; 431*ec779b8eSAndroid Build Coastguard Worker void onError(bool isHardError) override; 432*ec779b8eSAndroid Build Coastguard Worker 433*ec779b8eSAndroid Build Coastguard Worker private: 434*ec779b8eSAndroid Build Coastguard Worker friend class sp<StreamOutHalAidl>; 435*ec779b8eSAndroid Build Coastguard Worker 436*ec779b8eSAndroid Build Coastguard Worker static ConversionResult<::aidl::android::hardware::audio::common::SourceMetadata> 437*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_SourceMetadata(const StreamOutHalInterface::SourceMetadata& legacy); 438*ec779b8eSAndroid Build Coastguard Worker 439*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::core::IStreamOut> mStream; 440*ec779b8eSAndroid Build Coastguard Worker const wp<CallbackBroker> mCallbackBroker; 441*ec779b8eSAndroid Build Coastguard Worker mediautils::atomic_wp<StreamOutHalInterfaceCallback> mClientCallback; 442*ec779b8eSAndroid Build Coastguard Worker 443*ec779b8eSAndroid Build Coastguard Worker AudioOffloadMetadata mOffloadMetadata; 444*ec779b8eSAndroid Build Coastguard Worker 445*ec779b8eSAndroid Build Coastguard Worker // Can not be constructed directly by clients. 446*ec779b8eSAndroid Build Coastguard Worker StreamOutHalAidl( 447*ec779b8eSAndroid Build Coastguard Worker const audio_config& config, StreamContextAidl&& context, int32_t nominalLatency, 448*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::core::IStreamOut>& stream, 449*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension>& vext, 450*ec779b8eSAndroid Build Coastguard Worker const sp<CallbackBroker>& callbackBroker); 451*ec779b8eSAndroid Build Coastguard Worker 452*ec779b8eSAndroid Build Coastguard Worker ~StreamOutHalAidl() override; 453*ec779b8eSAndroid Build Coastguard Worker 454*ec779b8eSAndroid Build Coastguard Worker // Filter and update the offload metadata. The parameters which are related to the offload 455*ec779b8eSAndroid Build Coastguard Worker // metadata will be removed after filtering. 456*ec779b8eSAndroid Build Coastguard Worker status_t filterAndUpdateOffloadMetadata(AudioParameter ¶meters); 457*ec779b8eSAndroid Build Coastguard Worker }; 458*ec779b8eSAndroid Build Coastguard Worker 459*ec779b8eSAndroid Build Coastguard Worker class MicrophoneInfoProvider; 460*ec779b8eSAndroid Build Coastguard Worker 461*ec779b8eSAndroid Build Coastguard Worker class StreamInHalAidl : public StreamInHalInterface, public StreamHalAidl { 462*ec779b8eSAndroid Build Coastguard Worker public: 463*ec779b8eSAndroid Build Coastguard Worker // Set the input gain for the audio driver. 464*ec779b8eSAndroid Build Coastguard Worker status_t setGain(float gain) override; 465*ec779b8eSAndroid Build Coastguard Worker 466*ec779b8eSAndroid Build Coastguard Worker // Read audio buffer in from driver. 467*ec779b8eSAndroid Build Coastguard Worker status_t read(void *buffer, size_t bytes, size_t *read) override; 468*ec779b8eSAndroid Build Coastguard Worker 469*ec779b8eSAndroid Build Coastguard Worker // Return the amount of input frames lost in the audio driver. 470*ec779b8eSAndroid Build Coastguard Worker status_t getInputFramesLost(uint32_t *framesLost) override; 471*ec779b8eSAndroid Build Coastguard Worker 472*ec779b8eSAndroid Build Coastguard Worker // Return a recent count of the number of audio frames received and 473*ec779b8eSAndroid Build Coastguard Worker // the clock time associated with that frame count. 474*ec779b8eSAndroid Build Coastguard Worker // The count must not reset to zero when a PCM input enters standby. 475*ec779b8eSAndroid Build Coastguard Worker status_t getCapturePosition(int64_t *frames, int64_t *time) override; 476*ec779b8eSAndroid Build Coastguard Worker 477*ec779b8eSAndroid Build Coastguard Worker // Get active microphones 478*ec779b8eSAndroid Build Coastguard Worker status_t getActiveMicrophones(std::vector<media::MicrophoneInfoFw> *microphones) override; 479*ec779b8eSAndroid Build Coastguard Worker 480*ec779b8eSAndroid Build Coastguard Worker // Set microphone direction (for processing) 481*ec779b8eSAndroid Build Coastguard Worker status_t setPreferredMicrophoneDirection( 482*ec779b8eSAndroid Build Coastguard Worker audio_microphone_direction_t direction) override; 483*ec779b8eSAndroid Build Coastguard Worker 484*ec779b8eSAndroid Build Coastguard Worker // Set microphone zoom (for processing) 485*ec779b8eSAndroid Build Coastguard Worker status_t setPreferredMicrophoneFieldDimension(float zoom) override; 486*ec779b8eSAndroid Build Coastguard Worker 487*ec779b8eSAndroid Build Coastguard Worker // Called when the metadata of the stream's sink has been changed. 488*ec779b8eSAndroid Build Coastguard Worker status_t updateSinkMetadata(const SinkMetadata& sinkMetadata) override; 489*ec779b8eSAndroid Build Coastguard Worker 490*ec779b8eSAndroid Build Coastguard Worker private: 491*ec779b8eSAndroid Build Coastguard Worker friend class sp<StreamInHalAidl>; 492*ec779b8eSAndroid Build Coastguard Worker 493*ec779b8eSAndroid Build Coastguard Worker static ConversionResult<::aidl::android::hardware::audio::common::SinkMetadata> 494*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_SinkMetadata(const StreamInHalInterface::SinkMetadata& legacy); 495*ec779b8eSAndroid Build Coastguard Worker 496*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::core::IStreamIn> mStream; 497*ec779b8eSAndroid Build Coastguard Worker const wp<MicrophoneInfoProvider> mMicInfoProvider; 498*ec779b8eSAndroid Build Coastguard Worker 499*ec779b8eSAndroid Build Coastguard Worker // Can not be constructed directly by clients. 500*ec779b8eSAndroid Build Coastguard Worker StreamInHalAidl( 501*ec779b8eSAndroid Build Coastguard Worker const audio_config& config, StreamContextAidl&& context, int32_t nominalLatency, 502*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::hardware::audio::core::IStreamIn>& stream, 503*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension>& vext, 504*ec779b8eSAndroid Build Coastguard Worker const sp<MicrophoneInfoProvider>& micInfoProvider); 505*ec779b8eSAndroid Build Coastguard Worker 506*ec779b8eSAndroid Build Coastguard Worker ~StreamInHalAidl() override = default; 507*ec779b8eSAndroid Build Coastguard Worker }; 508*ec779b8eSAndroid Build Coastguard Worker 509*ec779b8eSAndroid Build Coastguard Worker } // namespace android 510