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 <android/media/BnAudioRecord.h> 20*ec779b8eSAndroid Build Coastguard Worker #include <android/media/BnAudioTrack.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/mutex.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <audiomanager/IAudioManager.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <binder/IMemory.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <datapath/VolumePortInterface.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <fastpath/FastMixerDumpState.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioSystem.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <media/VolumeShaper.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <private/media/AudioTrackShared.h> 29*ec779b8eSAndroid Build Coastguard Worker #include <timing/SyncEvent.h> 30*ec779b8eSAndroid Build Coastguard Worker #include <timing/SynchronizedRecordState.h> 31*ec779b8eSAndroid Build Coastguard Worker #include <utils/RefBase.h> 32*ec779b8eSAndroid Build Coastguard Worker #include <vibrator/ExternalVibration.h> 33*ec779b8eSAndroid Build Coastguard Worker 34*ec779b8eSAndroid Build Coastguard Worker #include <vector> 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker namespace android { 37*ec779b8eSAndroid Build Coastguard Worker 38*ec779b8eSAndroid Build Coastguard Worker class Client; 39*ec779b8eSAndroid Build Coastguard Worker class ResamplerBufferProvider; 40*ec779b8eSAndroid Build Coastguard Worker struct Source; 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker class IAfDuplicatingThread; 43*ec779b8eSAndroid Build Coastguard Worker class IAfPatchRecord; 44*ec779b8eSAndroid Build Coastguard Worker class IAfPatchTrack; 45*ec779b8eSAndroid Build Coastguard Worker class IAfPlaybackThread; 46*ec779b8eSAndroid Build Coastguard Worker class IAfRecordThread; 47*ec779b8eSAndroid Build Coastguard Worker class IAfThreadBase; 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard Worker struct TeePatch { 50*ec779b8eSAndroid Build Coastguard Worker sp<IAfPatchRecord> patchRecord; 51*ec779b8eSAndroid Build Coastguard Worker sp<IAfPatchTrack> patchTrack; 52*ec779b8eSAndroid Build Coastguard Worker }; 53*ec779b8eSAndroid Build Coastguard Worker 54*ec779b8eSAndroid Build Coastguard Worker using TeePatches = std::vector<TeePatch>; 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker // Common interface to all Playback and Record tracks. 57*ec779b8eSAndroid Build Coastguard Worker class IAfTrackBase : public virtual RefBase { 58*ec779b8eSAndroid Build Coastguard Worker public: 59*ec779b8eSAndroid Build Coastguard Worker enum track_state : int32_t { 60*ec779b8eSAndroid Build Coastguard Worker IDLE, 61*ec779b8eSAndroid Build Coastguard Worker FLUSHED, // for PlaybackTracks only 62*ec779b8eSAndroid Build Coastguard Worker STOPPED, 63*ec779b8eSAndroid Build Coastguard Worker // next 2 states are currently used for fast tracks 64*ec779b8eSAndroid Build Coastguard Worker // and offloaded tracks only 65*ec779b8eSAndroid Build Coastguard Worker STOPPING_1, // waiting for first underrun 66*ec779b8eSAndroid Build Coastguard Worker STOPPING_2, // waiting for presentation complete 67*ec779b8eSAndroid Build Coastguard Worker RESUMING, // for PlaybackTracks only 68*ec779b8eSAndroid Build Coastguard Worker ACTIVE, 69*ec779b8eSAndroid Build Coastguard Worker PAUSING, 70*ec779b8eSAndroid Build Coastguard Worker PAUSED, 71*ec779b8eSAndroid Build Coastguard Worker STARTING_1, // for RecordTrack only 72*ec779b8eSAndroid Build Coastguard Worker STARTING_2, // for RecordTrack only 73*ec779b8eSAndroid Build Coastguard Worker }; 74*ec779b8eSAndroid Build Coastguard Worker 75*ec779b8eSAndroid Build Coastguard Worker // where to allocate the data buffer 76*ec779b8eSAndroid Build Coastguard Worker enum alloc_type { 77*ec779b8eSAndroid Build Coastguard Worker ALLOC_CBLK, // allocate immediately after control block 78*ec779b8eSAndroid Build Coastguard Worker ALLOC_READONLY, // allocate from a separate read-only heap per thread 79*ec779b8eSAndroid Build Coastguard Worker ALLOC_PIPE, // do not allocate; use the pipe buffer 80*ec779b8eSAndroid Build Coastguard Worker ALLOC_LOCAL, // allocate a local buffer 81*ec779b8eSAndroid Build Coastguard Worker ALLOC_NONE, // do not allocate:use the buffer passed to TrackBase constructor 82*ec779b8eSAndroid Build Coastguard Worker }; 83*ec779b8eSAndroid Build Coastguard Worker 84*ec779b8eSAndroid Build Coastguard Worker enum track_type { 85*ec779b8eSAndroid Build Coastguard Worker TYPE_DEFAULT, 86*ec779b8eSAndroid Build Coastguard Worker TYPE_OUTPUT, 87*ec779b8eSAndroid Build Coastguard Worker TYPE_PATCH, 88*ec779b8eSAndroid Build Coastguard Worker }; 89*ec779b8eSAndroid Build Coastguard Worker 90*ec779b8eSAndroid Build Coastguard Worker virtual status_t initCheck() const = 0; 91*ec779b8eSAndroid Build Coastguard Worker virtual status_t start( 92*ec779b8eSAndroid Build Coastguard Worker AudioSystem::sync_event_t event = AudioSystem::SYNC_EVENT_NONE, 93*ec779b8eSAndroid Build Coastguard Worker audio_session_t triggerSession = AUDIO_SESSION_NONE) = 0; 94*ec779b8eSAndroid Build Coastguard Worker virtual void stop() = 0; 95*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMemory> getCblk() const = 0; 96*ec779b8eSAndroid Build Coastguard Worker virtual audio_track_cblk_t* cblk() const = 0; 97*ec779b8eSAndroid Build Coastguard Worker virtual audio_session_t sessionId() const = 0; 98*ec779b8eSAndroid Build Coastguard Worker virtual uid_t uid() const = 0; 99*ec779b8eSAndroid Build Coastguard Worker virtual pid_t creatorPid() const = 0; 100*ec779b8eSAndroid Build Coastguard Worker virtual uint32_t sampleRate() const = 0; 101*ec779b8eSAndroid Build Coastguard Worker virtual size_t frameSize() const = 0; 102*ec779b8eSAndroid Build Coastguard Worker virtual audio_port_handle_t portId() const = 0; 103*ec779b8eSAndroid Build Coastguard Worker virtual status_t setSyncEvent(const sp<audioflinger::SyncEvent>& event) = 0; 104*ec779b8eSAndroid Build Coastguard Worker virtual track_state state() const = 0; 105*ec779b8eSAndroid Build Coastguard Worker virtual void setState(track_state state) = 0; 106*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMemory> getBuffers() const = 0; 107*ec779b8eSAndroid Build Coastguard Worker virtual void* buffer() const = 0; 108*ec779b8eSAndroid Build Coastguard Worker virtual size_t bufferSize() const = 0; 109*ec779b8eSAndroid Build Coastguard Worker virtual bool isFastTrack() const = 0; 110*ec779b8eSAndroid Build Coastguard Worker virtual bool isDirect() const = 0; 111*ec779b8eSAndroid Build Coastguard Worker virtual bool isOutputTrack() const = 0; 112*ec779b8eSAndroid Build Coastguard Worker virtual bool isPatchTrack() const = 0; 113*ec779b8eSAndroid Build Coastguard Worker virtual bool isExternalTrack() const = 0; 114*ec779b8eSAndroid Build Coastguard Worker 115*ec779b8eSAndroid Build Coastguard Worker virtual void invalidate() = 0; 116*ec779b8eSAndroid Build Coastguard Worker virtual bool isInvalid() const = 0; 117*ec779b8eSAndroid Build Coastguard Worker 118*ec779b8eSAndroid Build Coastguard Worker virtual void terminate() = 0; 119*ec779b8eSAndroid Build Coastguard Worker virtual bool isTerminated() const = 0; 120*ec779b8eSAndroid Build Coastguard Worker 121*ec779b8eSAndroid Build Coastguard Worker virtual audio_attributes_t attributes() const = 0; 122*ec779b8eSAndroid Build Coastguard Worker virtual bool isSpatialized() const = 0; 123*ec779b8eSAndroid Build Coastguard Worker virtual bool isBitPerfect() const = 0; 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker // not currently implemented in TrackBase, but overridden. destroy()126*ec779b8eSAndroid Build Coastguard Worker virtual void destroy() {}; // MmapTrack doesn't implement. 127*ec779b8eSAndroid Build Coastguard Worker virtual void appendDumpHeader(String8& result) const = 0; 128*ec779b8eSAndroid Build Coastguard Worker virtual void appendDump(String8& result, bool active) const = 0; 129*ec779b8eSAndroid Build Coastguard Worker 130*ec779b8eSAndroid Build Coastguard Worker // Dup with AudioBufferProvider interface 131*ec779b8eSAndroid Build Coastguard Worker virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0; 132*ec779b8eSAndroid Build Coastguard Worker virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer) = 0; 133*ec779b8eSAndroid Build Coastguard Worker 134*ec779b8eSAndroid Build Coastguard Worker // Added for RecordTrack and OutputTrack 135*ec779b8eSAndroid Build Coastguard Worker virtual wp<IAfThreadBase> thread() const = 0; 136*ec779b8eSAndroid Build Coastguard Worker virtual const sp<ServerProxy>& serverProxy() const = 0; 137*ec779b8eSAndroid Build Coastguard Worker 138*ec779b8eSAndroid Build Coastguard Worker // TEE_SINK dumpTee(int fd __unused,const std::string & reason __unused)139*ec779b8eSAndroid Build Coastguard Worker virtual void dumpTee(int fd __unused, const std::string& reason __unused) const {}; 140*ec779b8eSAndroid Build Coastguard Worker 141*ec779b8eSAndroid Build Coastguard Worker /** returns the buffer contents size converted to time in milliseconds 142*ec779b8eSAndroid Build Coastguard Worker * for PCM Playback or Record streaming tracks. The return value is zero for 143*ec779b8eSAndroid Build Coastguard Worker * PCM static tracks and not defined for non-PCM tracks. 144*ec779b8eSAndroid Build Coastguard Worker * 145*ec779b8eSAndroid Build Coastguard Worker * This may be called without the thread lock. 146*ec779b8eSAndroid Build Coastguard Worker */ 147*ec779b8eSAndroid Build Coastguard Worker virtual double bufferLatencyMs() const = 0; 148*ec779b8eSAndroid Build Coastguard Worker 149*ec779b8eSAndroid Build Coastguard Worker /** returns whether the track supports server latency computation. 150*ec779b8eSAndroid Build Coastguard Worker * This is set in the constructor and constant throughout the track lifetime. 151*ec779b8eSAndroid Build Coastguard Worker */ 152*ec779b8eSAndroid Build Coastguard Worker virtual bool isServerLatencySupported() const = 0; 153*ec779b8eSAndroid Build Coastguard Worker 154*ec779b8eSAndroid Build Coastguard Worker /** computes the server latency for PCM Playback or Record track 155*ec779b8eSAndroid Build Coastguard Worker * to the device sink/source. This is the time for the next frame in the track buffer 156*ec779b8eSAndroid Build Coastguard Worker * written or read from the server thread to the device source or sink. 157*ec779b8eSAndroid Build Coastguard Worker * 158*ec779b8eSAndroid Build Coastguard Worker * This may be called without the thread lock, but latencyMs and fromTrack 159*ec779b8eSAndroid Build Coastguard Worker * may be not be synchronized. For example PatchPanel may not obtain the 160*ec779b8eSAndroid Build Coastguard Worker * thread lock before calling. 161*ec779b8eSAndroid Build Coastguard Worker * 162*ec779b8eSAndroid Build Coastguard Worker * \param latencyMs on success is set to the latency in milliseconds of the 163*ec779b8eSAndroid Build Coastguard Worker * next frame written/read by the server thread to/from the track buffer 164*ec779b8eSAndroid Build Coastguard Worker * from the device source/sink. 165*ec779b8eSAndroid Build Coastguard Worker * \param fromTrack on success is set to true if latency was computed directly 166*ec779b8eSAndroid Build Coastguard Worker * from the track timestamp; otherwise set to false if latency was 167*ec779b8eSAndroid Build Coastguard Worker * estimated from the server timestamp. 168*ec779b8eSAndroid Build Coastguard Worker * fromTrack may be nullptr or omitted if not required. 169*ec779b8eSAndroid Build Coastguard Worker * 170*ec779b8eSAndroid Build Coastguard Worker * \returns OK or INVALID_OPERATION on failure. 171*ec779b8eSAndroid Build Coastguard Worker */ 172*ec779b8eSAndroid Build Coastguard Worker virtual status_t getServerLatencyMs(double* latencyMs, bool* fromTrack = nullptr) const = 0; 173*ec779b8eSAndroid Build Coastguard Worker 174*ec779b8eSAndroid Build Coastguard Worker /** computes the total client latency for PCM Playback or Record tracks 175*ec779b8eSAndroid Build Coastguard Worker * for the next client app access to the device sink/source; i.e. the 176*ec779b8eSAndroid Build Coastguard Worker * server latency plus the buffer latency. 177*ec779b8eSAndroid Build Coastguard Worker * 178*ec779b8eSAndroid Build Coastguard Worker * This may be called without the thread lock, but latencyMs and fromTrack 179*ec779b8eSAndroid Build Coastguard Worker * may be not be synchronized. For example PatchPanel may not obtain the 180*ec779b8eSAndroid Build Coastguard Worker * thread lock before calling. 181*ec779b8eSAndroid Build Coastguard Worker * 182*ec779b8eSAndroid Build Coastguard Worker * \param latencyMs on success is set to the latency in milliseconds of the 183*ec779b8eSAndroid Build Coastguard Worker * next frame written/read by the client app to/from the track buffer 184*ec779b8eSAndroid Build Coastguard Worker * from the device sink/source. 185*ec779b8eSAndroid Build Coastguard Worker * \param fromTrack on success is set to true if latency was computed directly 186*ec779b8eSAndroid Build Coastguard Worker * from the track timestamp; otherwise set to false if latency was 187*ec779b8eSAndroid Build Coastguard Worker * estimated from the server timestamp. 188*ec779b8eSAndroid Build Coastguard Worker * fromTrack may be nullptr or omitted if not required. 189*ec779b8eSAndroid Build Coastguard Worker * 190*ec779b8eSAndroid Build Coastguard Worker * \returns OK or INVALID_OPERATION on failure. 191*ec779b8eSAndroid Build Coastguard Worker */ 192*ec779b8eSAndroid Build Coastguard Worker virtual status_t getTrackLatencyMs(double* latencyMs, bool* fromTrack = nullptr) const = 0; 193*ec779b8eSAndroid Build Coastguard Worker 194*ec779b8eSAndroid Build Coastguard Worker // TODO: Consider making this external. 195*ec779b8eSAndroid Build Coastguard Worker struct FrameTime { 196*ec779b8eSAndroid Build Coastguard Worker int64_t frames; 197*ec779b8eSAndroid Build Coastguard Worker int64_t timeNs; 198*ec779b8eSAndroid Build Coastguard Worker }; 199*ec779b8eSAndroid Build Coastguard Worker 200*ec779b8eSAndroid Build Coastguard Worker // KernelFrameTime is updated per "mix" period even for non-pcm tracks. 201*ec779b8eSAndroid Build Coastguard Worker virtual void getKernelFrameTime(FrameTime* ft) const = 0; 202*ec779b8eSAndroid Build Coastguard Worker 203*ec779b8eSAndroid Build Coastguard Worker virtual audio_format_t format() const = 0; 204*ec779b8eSAndroid Build Coastguard Worker virtual int id() const = 0; 205*ec779b8eSAndroid Build Coastguard Worker 206*ec779b8eSAndroid Build Coastguard Worker virtual const char* getTrackStateAsString() const = 0; 207*ec779b8eSAndroid Build Coastguard Worker 208*ec779b8eSAndroid Build Coastguard Worker virtual const std::string& getTraceSuffix() const = 0; 209*ec779b8eSAndroid Build Coastguard Worker // Called by the PlaybackThread to indicate that the track is becoming active 210*ec779b8eSAndroid Build Coastguard Worker // and a new interval should start with a given device list. 211*ec779b8eSAndroid Build Coastguard Worker virtual void logBeginInterval(const std::string& devices) = 0; 212*ec779b8eSAndroid Build Coastguard Worker 213*ec779b8eSAndroid Build Coastguard Worker // Called by the PlaybackThread to indicate the track is no longer active. 214*ec779b8eSAndroid Build Coastguard Worker virtual void logEndInterval() = 0; 215*ec779b8eSAndroid Build Coastguard Worker 216*ec779b8eSAndroid Build Coastguard Worker // Called by the PlaybackThread when ATRACE is enabled. 217*ec779b8eSAndroid Build Coastguard Worker virtual void logRefreshInterval(const std::string& devices) = 0; 218*ec779b8eSAndroid Build Coastguard Worker 219*ec779b8eSAndroid Build Coastguard Worker // Called to tally underrun frames in playback. 220*ec779b8eSAndroid Build Coastguard Worker virtual void tallyUnderrunFrames(size_t frames) = 0; 221*ec779b8eSAndroid Build Coastguard Worker 222*ec779b8eSAndroid Build Coastguard Worker virtual audio_channel_mask_t channelMask() const = 0; 223*ec779b8eSAndroid Build Coastguard Worker 224*ec779b8eSAndroid Build Coastguard Worker /** @return true if the track has changed (metadata or volume) since 225*ec779b8eSAndroid Build Coastguard Worker * the last time this function was called, 226*ec779b8eSAndroid Build Coastguard Worker * true if this function was never called since the track creation, 227*ec779b8eSAndroid Build Coastguard Worker * false otherwise. 228*ec779b8eSAndroid Build Coastguard Worker * Thread safe. 229*ec779b8eSAndroid Build Coastguard Worker */ 230*ec779b8eSAndroid Build Coastguard Worker virtual bool readAndClearHasChanged() = 0; 231*ec779b8eSAndroid Build Coastguard Worker 232*ec779b8eSAndroid Build Coastguard Worker /** Set that a metadata has changed and needs to be notified to backend. Thread safe. */ 233*ec779b8eSAndroid Build Coastguard Worker virtual void setMetadataHasChanged() = 0; 234*ec779b8eSAndroid Build Coastguard Worker 235*ec779b8eSAndroid Build Coastguard Worker /** 236*ec779b8eSAndroid Build Coastguard Worker * Called when a track moves to active state to record its contribution to battery usage. 237*ec779b8eSAndroid Build Coastguard Worker * Track state transitions should eventually be handled within the track class. 238*ec779b8eSAndroid Build Coastguard Worker */ 239*ec779b8eSAndroid Build Coastguard Worker virtual void beginBatteryAttribution() = 0; 240*ec779b8eSAndroid Build Coastguard Worker 241*ec779b8eSAndroid Build Coastguard Worker /** 242*ec779b8eSAndroid Build Coastguard Worker * Called when a track moves out of the active state to record its contribution 243*ec779b8eSAndroid Build Coastguard Worker * to battery usage. 244*ec779b8eSAndroid Build Coastguard Worker */ 245*ec779b8eSAndroid Build Coastguard Worker virtual void endBatteryAttribution() = 0; 246*ec779b8eSAndroid Build Coastguard Worker 247*ec779b8eSAndroid Build Coastguard Worker /** 248*ec779b8eSAndroid Build Coastguard Worker * For RecordTrack 249*ec779b8eSAndroid Build Coastguard Worker * TODO(b/291317964) either use this or add asRecordTrack or asTrack etc. 250*ec779b8eSAndroid Build Coastguard Worker */ handleSyncStartEvent(const sp<audioflinger::SyncEvent> & event __unused)251*ec779b8eSAndroid Build Coastguard Worker virtual void handleSyncStartEvent(const sp<audioflinger::SyncEvent>& event __unused){}; 252*ec779b8eSAndroid Build Coastguard Worker 253*ec779b8eSAndroid Build Coastguard Worker // For Thread use, fast tracks and offloaded tracks only 254*ec779b8eSAndroid Build Coastguard Worker // TODO(b/291317964) rearrange to IAfTrack. 255*ec779b8eSAndroid Build Coastguard Worker virtual bool isStopped() const = 0; 256*ec779b8eSAndroid Build Coastguard Worker virtual bool isStopping() const = 0; 257*ec779b8eSAndroid Build Coastguard Worker virtual bool isStopping_1() const = 0; 258*ec779b8eSAndroid Build Coastguard Worker virtual bool isStopping_2() const = 0; 259*ec779b8eSAndroid Build Coastguard Worker }; 260*ec779b8eSAndroid Build Coastguard Worker 261*ec779b8eSAndroid Build Coastguard Worker // Common interface for Playback tracks. 262*ec779b8eSAndroid Build Coastguard Worker class IAfTrack : public virtual IAfTrackBase, public virtual VolumePortInterface { 263*ec779b8eSAndroid Build Coastguard Worker public: 264*ec779b8eSAndroid Build Coastguard Worker // FillingStatus is used for suppressing volume ramp at begin of playing 265*ec779b8eSAndroid Build Coastguard Worker enum FillingStatus { FS_INVALID, FS_FILLING, FS_FILLED, FS_ACTIVE }; 266*ec779b8eSAndroid Build Coastguard Worker 267*ec779b8eSAndroid Build Coastguard Worker // createIAudioTrackAdapter() is a static constructor which creates an 268*ec779b8eSAndroid Build Coastguard Worker // IAudioTrack AIDL interface adapter from the Track object that 269*ec779b8eSAndroid Build Coastguard Worker // may be passed back to the client (if needed). 270*ec779b8eSAndroid Build Coastguard Worker // 271*ec779b8eSAndroid Build Coastguard Worker // Only one AIDL IAudioTrack interface adapter should be created per Track. 272*ec779b8eSAndroid Build Coastguard Worker static sp<media::IAudioTrack> createIAudioTrackAdapter(const sp<IAfTrack>& track); 273*ec779b8eSAndroid Build Coastguard Worker 274*ec779b8eSAndroid Build Coastguard Worker static sp<IAfTrack> create( 275*ec779b8eSAndroid Build Coastguard Worker IAfPlaybackThread* thread, 276*ec779b8eSAndroid Build Coastguard Worker const sp<Client>& client, 277*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t streamType, 278*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t& attr, 279*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, 280*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, 281*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, 282*ec779b8eSAndroid Build Coastguard Worker size_t frameCount, 283*ec779b8eSAndroid Build Coastguard Worker void* buffer, 284*ec779b8eSAndroid Build Coastguard Worker size_t bufferSize, 285*ec779b8eSAndroid Build Coastguard Worker const sp<IMemory>& sharedBuffer, 286*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 287*ec779b8eSAndroid Build Coastguard Worker pid_t creatorPid, 288*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource, 289*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t flags, 290*ec779b8eSAndroid Build Coastguard Worker track_type type, 291*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE, 292*ec779b8eSAndroid Build Coastguard Worker /** default behaviour is to start when there are as many frames 293*ec779b8eSAndroid Build Coastguard Worker * ready as possible (aka. Buffer is full). */ 294*ec779b8eSAndroid Build Coastguard Worker size_t frameCountToBeReady = SIZE_MAX, 295*ec779b8eSAndroid Build Coastguard Worker float speed = 1.0f, 296*ec779b8eSAndroid Build Coastguard Worker bool isSpatialized = false, 297*ec779b8eSAndroid Build Coastguard Worker bool isBitPerfect = false, 298*ec779b8eSAndroid Build Coastguard Worker float volume = 0.0f, 299*ec779b8eSAndroid Build Coastguard Worker bool muted = false); 300*ec779b8eSAndroid Build Coastguard Worker getLogHeader()301*ec779b8eSAndroid Build Coastguard Worker static constexpr std::string_view getLogHeader() { 302*ec779b8eSAndroid Build Coastguard Worker using namespace std::literals; 303*ec779b8eSAndroid Build Coastguard Worker return "Type Id Active Client(pid/uid) Session Port Id S Flags " 304*ec779b8eSAndroid Build Coastguard Worker " Format Chn mask SRate " 305*ec779b8eSAndroid Build Coastguard Worker "ST Usg CT " 306*ec779b8eSAndroid Build Coastguard Worker " G db L dB R dB VS dB PortVol dB PortMuted " 307*ec779b8eSAndroid Build Coastguard Worker " Server FrmCnt FrmRdy F Underruns Flushed BitPerfect InternalMute" 308*ec779b8eSAndroid Build Coastguard Worker " Latency\n"sv; 309*ec779b8eSAndroid Build Coastguard Worker } 310*ec779b8eSAndroid Build Coastguard Worker 311*ec779b8eSAndroid Build Coastguard Worker virtual void pause() = 0; 312*ec779b8eSAndroid Build Coastguard Worker virtual void flush() = 0; 313*ec779b8eSAndroid Build Coastguard Worker virtual audio_stream_type_t streamType() const = 0; 314*ec779b8eSAndroid Build Coastguard Worker virtual bool isOffloaded() const = 0; 315*ec779b8eSAndroid Build Coastguard Worker virtual bool isOffloadedOrDirect() const = 0; 316*ec779b8eSAndroid Build Coastguard Worker virtual bool isStatic() const = 0; 317*ec779b8eSAndroid Build Coastguard Worker virtual status_t setParameters(const String8& keyValuePairs) = 0; 318*ec779b8eSAndroid Build Coastguard Worker virtual status_t selectPresentation(int presentationId, int programId) = 0; 319*ec779b8eSAndroid Build Coastguard Worker virtual status_t attachAuxEffect(int EffectId) = 0; 320*ec779b8eSAndroid Build Coastguard Worker virtual void setAuxBuffer(int EffectId, int32_t* buffer) = 0; 321*ec779b8eSAndroid Build Coastguard Worker virtual int32_t* auxBuffer() const = 0; 322*ec779b8eSAndroid Build Coastguard Worker virtual void setMainBuffer(float* buffer) = 0; 323*ec779b8eSAndroid Build Coastguard Worker virtual float* mainBuffer() const = 0; 324*ec779b8eSAndroid Build Coastguard Worker virtual int auxEffectId() const = 0; 325*ec779b8eSAndroid Build Coastguard Worker virtual status_t getTimestamp(AudioTimestamp& timestamp) = 0; 326*ec779b8eSAndroid Build Coastguard Worker virtual void signal() = 0; 327*ec779b8eSAndroid Build Coastguard Worker virtual status_t getDualMonoMode(audio_dual_mono_mode_t* mode) const = 0; 328*ec779b8eSAndroid Build Coastguard Worker virtual status_t setDualMonoMode(audio_dual_mono_mode_t mode) = 0; 329*ec779b8eSAndroid Build Coastguard Worker virtual status_t getAudioDescriptionMixLevel(float* leveldB) const = 0; 330*ec779b8eSAndroid Build Coastguard Worker virtual status_t setAudioDescriptionMixLevel(float leveldB) = 0; 331*ec779b8eSAndroid Build Coastguard Worker virtual status_t getPlaybackRateParameters(audio_playback_rate_t* playbackRate) const = 0; 332*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPlaybackRateParameters(const audio_playback_rate_t& playbackRate) = 0; 333*ec779b8eSAndroid Build Coastguard Worker 334*ec779b8eSAndroid Build Coastguard Worker // implement FastMixerState::VolumeProvider interface 335*ec779b8eSAndroid Build Coastguard Worker virtual gain_minifloat_packed_t getVolumeLR() const = 0; 336*ec779b8eSAndroid Build Coastguard Worker 337*ec779b8eSAndroid Build Coastguard Worker // implement volume handling. 338*ec779b8eSAndroid Build Coastguard Worker virtual media::VolumeShaper::Status applyVolumeShaper( 339*ec779b8eSAndroid Build Coastguard Worker const sp<media::VolumeShaper::Configuration>& configuration, 340*ec779b8eSAndroid Build Coastguard Worker const sp<media::VolumeShaper::Operation>& operation) = 0; 341*ec779b8eSAndroid Build Coastguard Worker virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) const = 0; 342*ec779b8eSAndroid Build Coastguard Worker virtual sp<media::VolumeHandler> getVolumeHandler() const = 0; 343*ec779b8eSAndroid Build Coastguard Worker /** Set the computed normalized final volume of the track. 344*ec779b8eSAndroid Build Coastguard Worker * !masterMute * masterVolume * streamVolume * averageLRVolume */ 345*ec779b8eSAndroid Build Coastguard Worker virtual void setFinalVolume(float volumeLeft, float volumeRight) = 0; 346*ec779b8eSAndroid Build Coastguard Worker virtual float getFinalVolume() const = 0; 347*ec779b8eSAndroid Build Coastguard Worker virtual void getFinalVolume(float* left, float* right) const = 0; 348*ec779b8eSAndroid Build Coastguard Worker 349*ec779b8eSAndroid Build Coastguard Worker using SourceMetadatas = std::vector<playback_track_metadata_v7_t>; 350*ec779b8eSAndroid Build Coastguard Worker using MetadataInserter = std::back_insert_iterator<SourceMetadatas>; 351*ec779b8eSAndroid Build Coastguard Worker /** Copy the track metadata in the provided iterator. Thread safe. */ 352*ec779b8eSAndroid Build Coastguard Worker virtual void copyMetadataTo(MetadataInserter& backInserter) const = 0; 353*ec779b8eSAndroid Build Coastguard Worker 354*ec779b8eSAndroid Build Coastguard Worker /** Return haptic playback of the track is enabled or not, used in mixer. */ 355*ec779b8eSAndroid Build Coastguard Worker virtual bool getHapticPlaybackEnabled() const = 0; 356*ec779b8eSAndroid Build Coastguard Worker /** Set haptic playback of the track is enabled or not, should be 357*ec779b8eSAndroid Build Coastguard Worker * set after query or get callback from vibrator service */ 358*ec779b8eSAndroid Build Coastguard Worker virtual void setHapticPlaybackEnabled(bool hapticPlaybackEnabled) = 0; 359*ec779b8eSAndroid Build Coastguard Worker /** Return the haptics scale, used in mixer. */ 360*ec779b8eSAndroid Build Coastguard Worker virtual os::HapticScale getHapticScale() const = 0; 361*ec779b8eSAndroid Build Coastguard Worker /** Return the maximum amplitude allowed for haptics data, used in mixer. */ 362*ec779b8eSAndroid Build Coastguard Worker virtual float getHapticMaxAmplitude() const = 0; 363*ec779b8eSAndroid Build Coastguard Worker /** Set scale for haptic playback, should be set after querying vibrator service. */ 364*ec779b8eSAndroid Build Coastguard Worker virtual void setHapticScale(os::HapticScale hapticScale) = 0; 365*ec779b8eSAndroid Build Coastguard Worker /** Set maximum amplitude allowed for haptic data, should be set after querying 366*ec779b8eSAndroid Build Coastguard Worker * vibrator service. 367*ec779b8eSAndroid Build Coastguard Worker */ 368*ec779b8eSAndroid Build Coastguard Worker virtual void setHapticMaxAmplitude(float maxAmplitude) = 0; 369*ec779b8eSAndroid Build Coastguard Worker virtual sp<os::ExternalVibration> getExternalVibration() const = 0; 370*ec779b8eSAndroid Build Coastguard Worker 371*ec779b8eSAndroid Build Coastguard Worker // This function should be called with holding thread lock. 372*ec779b8eSAndroid Build Coastguard Worker virtual void updateTeePatches_l() REQUIRES(audio_utils::ThreadBase_Mutex) 373*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_BELOW_ThreadBase_Mutex = 0; 374*ec779b8eSAndroid Build Coastguard Worker 375*ec779b8eSAndroid Build Coastguard Worker // Argument teePatchesToUpdate is by value, use std::move to optimize. 376*ec779b8eSAndroid Build Coastguard Worker virtual void setTeePatchesToUpdate_l(TeePatches teePatchesToUpdate) = 0; 377*ec779b8eSAndroid Build Coastguard Worker checkServerLatencySupported(audio_format_t format,audio_output_flags_t flags)378*ec779b8eSAndroid Build Coastguard Worker static bool checkServerLatencySupported(audio_format_t format, audio_output_flags_t flags) { 379*ec779b8eSAndroid Build Coastguard Worker return audio_is_linear_pcm(format) && (flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC) == 0; 380*ec779b8eSAndroid Build Coastguard Worker } 381*ec779b8eSAndroid Build Coastguard Worker 382*ec779b8eSAndroid Build Coastguard Worker virtual audio_output_flags_t getOutputFlags() const = 0; 383*ec779b8eSAndroid Build Coastguard Worker virtual float getSpeed() const = 0; 384*ec779b8eSAndroid Build Coastguard Worker 385*ec779b8eSAndroid Build Coastguard Worker /** 386*ec779b8eSAndroid Build Coastguard Worker * Updates the mute state and notifies the audio service. Call this only when holding player 387*ec779b8eSAndroid Build Coastguard Worker * thread lock. 388*ec779b8eSAndroid Build Coastguard Worker */ 389*ec779b8eSAndroid Build Coastguard Worker virtual void processMuteEvent_l( 390*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioManager>& audioManager, mute_state_t muteState) = 0; 391*ec779b8eSAndroid Build Coastguard Worker 392*ec779b8eSAndroid Build Coastguard Worker virtual void triggerEvents(AudioSystem::sync_event_t type) = 0; 393*ec779b8eSAndroid Build Coastguard Worker 394*ec779b8eSAndroid Build Coastguard Worker virtual void disable() = 0; 395*ec779b8eSAndroid Build Coastguard Worker virtual bool isDisabled() const = 0; 396*ec779b8eSAndroid Build Coastguard Worker 397*ec779b8eSAndroid Build Coastguard Worker virtual int& fastIndex() = 0; 398*ec779b8eSAndroid Build Coastguard Worker virtual bool isPlaybackRestricted() const = 0; 399*ec779b8eSAndroid Build Coastguard Worker 400*ec779b8eSAndroid Build Coastguard Worker // Used by thread only 401*ec779b8eSAndroid Build Coastguard Worker 402*ec779b8eSAndroid Build Coastguard Worker virtual bool isPausing() const = 0; 403*ec779b8eSAndroid Build Coastguard Worker virtual bool isPaused() const = 0; 404*ec779b8eSAndroid Build Coastguard Worker virtual bool isResuming() const = 0; 405*ec779b8eSAndroid Build Coastguard Worker virtual bool isReady() const = 0; 406*ec779b8eSAndroid Build Coastguard Worker virtual void setPaused() = 0; 407*ec779b8eSAndroid Build Coastguard Worker virtual void reset() = 0; 408*ec779b8eSAndroid Build Coastguard Worker virtual bool isFlushPending() const = 0; 409*ec779b8eSAndroid Build Coastguard Worker virtual void flushAck() = 0; 410*ec779b8eSAndroid Build Coastguard Worker virtual bool isResumePending() const = 0; 411*ec779b8eSAndroid Build Coastguard Worker virtual void resumeAck() = 0; 412*ec779b8eSAndroid Build Coastguard Worker // For direct or offloaded tracks ensure that the pause state is acknowledged 413*ec779b8eSAndroid Build Coastguard Worker // by the playback thread in case of an immediate flush. 414*ec779b8eSAndroid Build Coastguard Worker virtual bool isPausePending() const = 0; 415*ec779b8eSAndroid Build Coastguard Worker virtual void pauseAck() = 0; 416*ec779b8eSAndroid Build Coastguard Worker virtual void updateTrackFrameInfo( 417*ec779b8eSAndroid Build Coastguard Worker int64_t trackFramesReleased, int64_t sinkFramesWritten, uint32_t halSampleRate, 418*ec779b8eSAndroid Build Coastguard Worker const ExtendedTimestamp& timeStamp) = 0; 419*ec779b8eSAndroid Build Coastguard Worker virtual sp<IMemory> sharedBuffer() const = 0; 420*ec779b8eSAndroid Build Coastguard Worker 421*ec779b8eSAndroid Build Coastguard Worker // Dup with ExtendedAudioBufferProvider 422*ec779b8eSAndroid Build Coastguard Worker virtual size_t framesReady() const = 0; 423*ec779b8eSAndroid Build Coastguard Worker 424*ec779b8eSAndroid Build Coastguard Worker // presentationComplete checked by frames. (Mixed Tracks). 425*ec779b8eSAndroid Build Coastguard Worker // framesWritten is cumulative, never reset, and is shared all tracks 426*ec779b8eSAndroid Build Coastguard Worker // audioHalFrames is derived from output latency 427*ec779b8eSAndroid Build Coastguard Worker virtual bool presentationComplete(int64_t framesWritten, size_t audioHalFrames) = 0; 428*ec779b8eSAndroid Build Coastguard Worker 429*ec779b8eSAndroid Build Coastguard Worker // presentationComplete checked by time. (Direct Tracks). 430*ec779b8eSAndroid Build Coastguard Worker virtual bool presentationComplete(uint32_t latencyMs) = 0; 431*ec779b8eSAndroid Build Coastguard Worker 432*ec779b8eSAndroid Build Coastguard Worker virtual void resetPresentationComplete() = 0; 433*ec779b8eSAndroid Build Coastguard Worker 434*ec779b8eSAndroid Build Coastguard Worker virtual bool hasVolumeController() const = 0; 435*ec779b8eSAndroid Build Coastguard Worker virtual void setHasVolumeController(bool hasVolumeController) = 0; 436*ec779b8eSAndroid Build Coastguard Worker virtual const sp<AudioTrackServerProxy>& audioTrackServerProxy() const = 0; 437*ec779b8eSAndroid Build Coastguard Worker virtual void setCachedVolume(float volume) = 0; 438*ec779b8eSAndroid Build Coastguard Worker virtual void setResetDone(bool resetDone) = 0; 439*ec779b8eSAndroid Build Coastguard Worker 440*ec779b8eSAndroid Build Coastguard Worker virtual ExtendedAudioBufferProvider* asExtendedAudioBufferProvider() = 0; 441*ec779b8eSAndroid Build Coastguard Worker virtual VolumeProvider* asVolumeProvider() = 0; 442*ec779b8eSAndroid Build Coastguard Worker 443*ec779b8eSAndroid Build Coastguard Worker // TODO(b/291317964) split into getter/setter 444*ec779b8eSAndroid Build Coastguard Worker virtual FillingStatus& fillingStatus() = 0; 445*ec779b8eSAndroid Build Coastguard Worker virtual int8_t& retryCount() = 0; 446*ec779b8eSAndroid Build Coastguard Worker virtual FastTrackUnderruns& fastTrackUnderruns() = 0; 447*ec779b8eSAndroid Build Coastguard Worker 448*ec779b8eSAndroid Build Coastguard Worker // Internal mute, this is currently only used for bit-perfect playback 449*ec779b8eSAndroid Build Coastguard Worker virtual bool getInternalMute() const = 0; 450*ec779b8eSAndroid Build Coastguard Worker virtual void setInternalMute(bool muted) = 0; 451*ec779b8eSAndroid Build Coastguard Worker }; 452*ec779b8eSAndroid Build Coastguard Worker 453*ec779b8eSAndroid Build Coastguard Worker // playback track, used by DuplicatingThread 454*ec779b8eSAndroid Build Coastguard Worker class IAfOutputTrack : public virtual IAfTrack { 455*ec779b8eSAndroid Build Coastguard Worker public: 456*ec779b8eSAndroid Build Coastguard Worker static sp<IAfOutputTrack> create( 457*ec779b8eSAndroid Build Coastguard Worker IAfPlaybackThread* playbackThread, 458*ec779b8eSAndroid Build Coastguard Worker IAfDuplicatingThread* sourceThread, uint32_t sampleRate, 459*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, audio_channel_mask_t channelMask, size_t frameCount, 460*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource); 461*ec779b8eSAndroid Build Coastguard Worker 462*ec779b8eSAndroid Build Coastguard Worker virtual ssize_t write(void* data, uint32_t frames) = 0; 463*ec779b8eSAndroid Build Coastguard Worker virtual bool bufferQueueEmpty() const = 0; 464*ec779b8eSAndroid Build Coastguard Worker virtual bool isActive() const = 0; 465*ec779b8eSAndroid Build Coastguard Worker 466*ec779b8eSAndroid Build Coastguard Worker /** Set the metadatas of the upstream tracks. Thread safe. */ 467*ec779b8eSAndroid Build Coastguard Worker virtual void setMetadatas(const SourceMetadatas& metadatas) = 0; 468*ec779b8eSAndroid Build Coastguard Worker /** returns client timestamp to the upstream duplicating thread. */ 469*ec779b8eSAndroid Build Coastguard Worker virtual ExtendedTimestamp getClientProxyTimestamp() const = 0; 470*ec779b8eSAndroid Build Coastguard Worker }; 471*ec779b8eSAndroid Build Coastguard Worker 472*ec779b8eSAndroid Build Coastguard Worker class IAfMmapTrack : public virtual IAfTrackBase, public virtual VolumePortInterface { 473*ec779b8eSAndroid Build Coastguard Worker public: 474*ec779b8eSAndroid Build Coastguard Worker static sp<IAfMmapTrack> create(IAfThreadBase* thread, 475*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t& attr, 476*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, 477*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, 478*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, 479*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 480*ec779b8eSAndroid Build Coastguard Worker bool isOut, 481*ec779b8eSAndroid Build Coastguard Worker const android::content::AttributionSourceState& attributionSource, 482*ec779b8eSAndroid Build Coastguard Worker pid_t creatorPid, 483*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE, 484*ec779b8eSAndroid Build Coastguard Worker float volume = 0.0f, 485*ec779b8eSAndroid Build Coastguard Worker bool muted = false); 486*ec779b8eSAndroid Build Coastguard Worker getLogHeader()487*ec779b8eSAndroid Build Coastguard Worker static constexpr std::string_view getLogHeader() { 488*ec779b8eSAndroid Build Coastguard Worker using namespace std::literals; 489*ec779b8eSAndroid Build Coastguard Worker return "Client(pid/uid) Session Port Id" 490*ec779b8eSAndroid Build Coastguard Worker " Format Chn mask SRate Flags Usg/Src PortVol dB PortMuted\n"sv; 491*ec779b8eSAndroid Build Coastguard Worker }; 492*ec779b8eSAndroid Build Coastguard Worker 493*ec779b8eSAndroid Build Coastguard Worker // protected by MMapThread::mLock 494*ec779b8eSAndroid Build Coastguard Worker virtual void setSilenced_l(bool silenced) = 0; 495*ec779b8eSAndroid Build Coastguard Worker // protected by MMapThread::mLock 496*ec779b8eSAndroid Build Coastguard Worker virtual bool isSilenced_l() const = 0; 497*ec779b8eSAndroid Build Coastguard Worker // protected by MMapThread::mLock 498*ec779b8eSAndroid Build Coastguard Worker virtual bool getAndSetSilencedNotified_l() = 0; 499*ec779b8eSAndroid Build Coastguard Worker 500*ec779b8eSAndroid Build Coastguard Worker /** 501*ec779b8eSAndroid Build Coastguard Worker * Updates the mute state and notifies the audio service. Call this only when holding player 502*ec779b8eSAndroid Build Coastguard Worker * thread lock. 503*ec779b8eSAndroid Build Coastguard Worker */ 504*ec779b8eSAndroid Build Coastguard Worker virtual void processMuteEvent_l( // see IAfTrack 505*ec779b8eSAndroid Build Coastguard Worker const sp<IAudioManager>& audioManager, mute_state_t muteState) = 0; 506*ec779b8eSAndroid Build Coastguard Worker }; 507*ec779b8eSAndroid Build Coastguard Worker 508*ec779b8eSAndroid Build Coastguard Worker class RecordBufferConverter; 509*ec779b8eSAndroid Build Coastguard Worker 510*ec779b8eSAndroid Build Coastguard Worker class IAfRecordTrack : public virtual IAfTrackBase { 511*ec779b8eSAndroid Build Coastguard Worker public: 512*ec779b8eSAndroid Build Coastguard Worker // createIAudioRecordAdapter() is a static constructor which creates an 513*ec779b8eSAndroid Build Coastguard Worker // IAudioRecord AIDL interface adapter from the RecordTrack object that 514*ec779b8eSAndroid Build Coastguard Worker // may be passed back to the client (if needed). 515*ec779b8eSAndroid Build Coastguard Worker // 516*ec779b8eSAndroid Build Coastguard Worker // Only one AIDL IAudioRecord interface adapter should be created per RecordTrack. 517*ec779b8eSAndroid Build Coastguard Worker static sp<media::IAudioRecord> createIAudioRecordAdapter(const sp<IAfRecordTrack>& recordTrack); 518*ec779b8eSAndroid Build Coastguard Worker 519*ec779b8eSAndroid Build Coastguard Worker static sp<IAfRecordTrack> create(IAfRecordThread* thread, 520*ec779b8eSAndroid Build Coastguard Worker const sp<Client>& client, 521*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t& attr, 522*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, 523*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, 524*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, 525*ec779b8eSAndroid Build Coastguard Worker size_t frameCount, 526*ec779b8eSAndroid Build Coastguard Worker void* buffer, 527*ec779b8eSAndroid Build Coastguard Worker size_t bufferSize, 528*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 529*ec779b8eSAndroid Build Coastguard Worker pid_t creatorPid, 530*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource, 531*ec779b8eSAndroid Build Coastguard Worker audio_input_flags_t flags, 532*ec779b8eSAndroid Build Coastguard Worker track_type type, 533*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE, 534*ec779b8eSAndroid Build Coastguard Worker int32_t startFrames = -1); 535*ec779b8eSAndroid Build Coastguard Worker getLogHeader()536*ec779b8eSAndroid Build Coastguard Worker static constexpr std::string_view getLogHeader() { 537*ec779b8eSAndroid Build Coastguard Worker using namespace std::literals; 538*ec779b8eSAndroid Build Coastguard Worker return "Active Id Client(pid/uid) Session Port Id S Flags " 539*ec779b8eSAndroid Build Coastguard Worker " Format Chn mask SRate Source " 540*ec779b8eSAndroid Build Coastguard Worker " Server FrmCnt FrmRdy Sil Latency\n"sv; 541*ec779b8eSAndroid Build Coastguard Worker } 542*ec779b8eSAndroid Build Coastguard Worker 543*ec779b8eSAndroid Build Coastguard Worker // clear the buffer overflow flag 544*ec779b8eSAndroid Build Coastguard Worker virtual void clearOverflow() = 0; 545*ec779b8eSAndroid Build Coastguard Worker // set the buffer overflow flag and return previous value 546*ec779b8eSAndroid Build Coastguard Worker virtual bool setOverflow() = 0; 547*ec779b8eSAndroid Build Coastguard Worker 548*ec779b8eSAndroid Build Coastguard Worker // TODO(b/291317964) handleSyncStartEvent in IAfTrackBase should move here. 549*ec779b8eSAndroid Build Coastguard Worker virtual void clearSyncStartEvent() = 0; 550*ec779b8eSAndroid Build Coastguard Worker virtual void updateTrackFrameInfo( 551*ec779b8eSAndroid Build Coastguard Worker int64_t trackFramesReleased, int64_t sourceFramesRead, uint32_t halSampleRate, 552*ec779b8eSAndroid Build Coastguard Worker const ExtendedTimestamp& timestamp) = 0; 553*ec779b8eSAndroid Build Coastguard Worker 554*ec779b8eSAndroid Build Coastguard Worker virtual void setSilenced(bool silenced) = 0; 555*ec779b8eSAndroid Build Coastguard Worker virtual bool isSilenced() const = 0; 556*ec779b8eSAndroid Build Coastguard Worker virtual status_t getActiveMicrophones( 557*ec779b8eSAndroid Build Coastguard Worker std::vector<media::MicrophoneInfoFw>* activeMicrophones) const = 0; 558*ec779b8eSAndroid Build Coastguard Worker 559*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPreferredMicrophoneDirection(audio_microphone_direction_t direction) = 0; 560*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPreferredMicrophoneFieldDimension(float zoom) = 0; 561*ec779b8eSAndroid Build Coastguard Worker virtual status_t shareAudioHistory( 562*ec779b8eSAndroid Build Coastguard Worker const std::string& sharedAudioPackageName, int64_t sharedAudioStartMs) = 0; 563*ec779b8eSAndroid Build Coastguard Worker virtual int32_t startFrames() const = 0; 564*ec779b8eSAndroid Build Coastguard Worker checkServerLatencySupported(audio_format_t format,audio_input_flags_t flags)565*ec779b8eSAndroid Build Coastguard Worker static bool checkServerLatencySupported(audio_format_t format, audio_input_flags_t flags) { 566*ec779b8eSAndroid Build Coastguard Worker return audio_is_linear_pcm(format) && (flags & AUDIO_INPUT_FLAG_HW_AV_SYNC) == 0; 567*ec779b8eSAndroid Build Coastguard Worker } 568*ec779b8eSAndroid Build Coastguard Worker 569*ec779b8eSAndroid Build Coastguard Worker using SinkMetadatas = std::vector<record_track_metadata_v7_t>; 570*ec779b8eSAndroid Build Coastguard Worker using MetadataInserter = std::back_insert_iterator<SinkMetadatas>; 571*ec779b8eSAndroid Build Coastguard Worker virtual void copyMetadataTo(MetadataInserter& backInserter) const = 0; // see IAfTrack 572*ec779b8eSAndroid Build Coastguard Worker 573*ec779b8eSAndroid Build Coastguard Worker // private to Threads 574*ec779b8eSAndroid Build Coastguard Worker virtual AudioBufferProvider::Buffer& sinkBuffer() = 0; 575*ec779b8eSAndroid Build Coastguard Worker virtual audioflinger::SynchronizedRecordState& synchronizedRecordState() = 0; 576*ec779b8eSAndroid Build Coastguard Worker virtual RecordBufferConverter* recordBufferConverter() const = 0; 577*ec779b8eSAndroid Build Coastguard Worker virtual ResamplerBufferProvider* resamplerBufferProvider() const = 0; 578*ec779b8eSAndroid Build Coastguard Worker }; 579*ec779b8eSAndroid Build Coastguard Worker 580*ec779b8eSAndroid Build Coastguard Worker // PatchProxyBufferProvider interface is implemented by PatchTrack and PatchRecord. 581*ec779b8eSAndroid Build Coastguard Worker // it provides buffer access methods that map those of a ClientProxy (see AudioTrackShared.h) 582*ec779b8eSAndroid Build Coastguard Worker class PatchProxyBufferProvider { 583*ec779b8eSAndroid Build Coastguard Worker public: 584*ec779b8eSAndroid Build Coastguard Worker virtual ~PatchProxyBufferProvider() = default; 585*ec779b8eSAndroid Build Coastguard Worker virtual bool producesBufferOnDemand() const = 0; 586*ec779b8eSAndroid Build Coastguard Worker virtual status_t obtainBuffer( 587*ec779b8eSAndroid Build Coastguard Worker Proxy::Buffer* buffer, const struct timespec* requested = nullptr) = 0; 588*ec779b8eSAndroid Build Coastguard Worker virtual void releaseBuffer(Proxy::Buffer* buffer) = 0; 589*ec779b8eSAndroid Build Coastguard Worker }; 590*ec779b8eSAndroid Build Coastguard Worker 591*ec779b8eSAndroid Build Coastguard Worker class IAfPatchTrackBase : public virtual RefBase { 592*ec779b8eSAndroid Build Coastguard Worker public: 593*ec779b8eSAndroid Build Coastguard Worker using Timeout = std::optional<std::chrono::nanoseconds>; 594*ec779b8eSAndroid Build Coastguard Worker 595*ec779b8eSAndroid Build Coastguard Worker virtual void setPeerTimeout(std::chrono::nanoseconds timeout) = 0; 596*ec779b8eSAndroid Build Coastguard Worker virtual void setPeerProxy(const sp<IAfPatchTrackBase>& proxy, bool holdReference) = 0; 597*ec779b8eSAndroid Build Coastguard Worker virtual void clearPeerProxy() = 0; 598*ec779b8eSAndroid Build Coastguard Worker virtual PatchProxyBufferProvider* asPatchProxyBufferProvider() = 0; 599*ec779b8eSAndroid Build Coastguard Worker }; 600*ec779b8eSAndroid Build Coastguard Worker 601*ec779b8eSAndroid Build Coastguard Worker class IAfPatchTrack : public virtual IAfTrack, public virtual IAfPatchTrackBase { 602*ec779b8eSAndroid Build Coastguard Worker public: 603*ec779b8eSAndroid Build Coastguard Worker static sp<IAfPatchTrack> create( 604*ec779b8eSAndroid Build Coastguard Worker IAfPlaybackThread* playbackThread, 605*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t streamType, 606*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, 607*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, 608*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, 609*ec779b8eSAndroid Build Coastguard Worker size_t frameCount, 610*ec779b8eSAndroid Build Coastguard Worker void *buffer, 611*ec779b8eSAndroid Build Coastguard Worker size_t bufferSize, 612*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t flags, 613*ec779b8eSAndroid Build Coastguard Worker const Timeout& timeout = {}, 614*ec779b8eSAndroid Build Coastguard Worker size_t frameCountToBeReady = 1, /** Default behaviour is to start 615*ec779b8eSAndroid Build Coastguard Worker * as soon as possible to have 616*ec779b8eSAndroid Build Coastguard Worker * the lowest possible latency 617*ec779b8eSAndroid Build Coastguard Worker * even if it might glitch. */ 618*ec779b8eSAndroid Build Coastguard Worker float speed = 1.0f, 619*ec779b8eSAndroid Build Coastguard Worker float volume = 1.0f, 620*ec779b8eSAndroid Build Coastguard Worker bool muted = false); 621*ec779b8eSAndroid Build Coastguard Worker }; 622*ec779b8eSAndroid Build Coastguard Worker 623*ec779b8eSAndroid Build Coastguard Worker class IAfPatchRecord : public virtual IAfRecordTrack, public virtual IAfPatchTrackBase { 624*ec779b8eSAndroid Build Coastguard Worker public: 625*ec779b8eSAndroid Build Coastguard Worker static sp<IAfPatchRecord> create( 626*ec779b8eSAndroid Build Coastguard Worker IAfRecordThread* recordThread, 627*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, 628*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, 629*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, 630*ec779b8eSAndroid Build Coastguard Worker size_t frameCount, 631*ec779b8eSAndroid Build Coastguard Worker void* buffer, 632*ec779b8eSAndroid Build Coastguard Worker size_t bufferSize, 633*ec779b8eSAndroid Build Coastguard Worker audio_input_flags_t flags, 634*ec779b8eSAndroid Build Coastguard Worker const Timeout& timeout = {}, 635*ec779b8eSAndroid Build Coastguard Worker audio_source_t source = AUDIO_SOURCE_DEFAULT); 636*ec779b8eSAndroid Build Coastguard Worker 637*ec779b8eSAndroid Build Coastguard Worker static sp<IAfPatchRecord> createPassThru( 638*ec779b8eSAndroid Build Coastguard Worker IAfRecordThread* recordThread, 639*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, 640*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, 641*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, 642*ec779b8eSAndroid Build Coastguard Worker size_t frameCount, 643*ec779b8eSAndroid Build Coastguard Worker audio_input_flags_t flags, 644*ec779b8eSAndroid Build Coastguard Worker audio_source_t source = AUDIO_SOURCE_DEFAULT); 645*ec779b8eSAndroid Build Coastguard Worker 646*ec779b8eSAndroid Build Coastguard Worker virtual Source* getSource() = 0; 647*ec779b8eSAndroid Build Coastguard Worker virtual size_t writeFrames(const void* src, size_t frameCount, size_t frameSize) = 0; 648*ec779b8eSAndroid Build Coastguard Worker }; 649*ec779b8eSAndroid Build Coastguard Worker 650*ec779b8eSAndroid Build Coastguard Worker } // namespace android 651