1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker ** 3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2012, The Android Open Source Project 4*ec779b8eSAndroid Build Coastguard Worker ** 5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License"); 6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License. 7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at 8*ec779b8eSAndroid Build Coastguard Worker ** 9*ec779b8eSAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0 10*ec779b8eSAndroid Build Coastguard Worker ** 11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software 12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS, 13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and 15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License. 16*ec779b8eSAndroid Build Coastguard Worker */ 17*ec779b8eSAndroid Build Coastguard Worker 18*ec779b8eSAndroid Build Coastguard Worker #pragma once 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include "TrackBase.h" 21*ec779b8eSAndroid Build Coastguard Worker 22*ec779b8eSAndroid Build Coastguard Worker #include <android/os/BnExternalVibrationController.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/mutex.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/LinearMap.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <binder/AppOpsManager.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <utils/RWLock.h> 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker namespace android { 29*ec779b8eSAndroid Build Coastguard Worker 30*ec779b8eSAndroid Build Coastguard Worker // Checks and monitors OP_PLAY_AUDIO 31*ec779b8eSAndroid Build Coastguard Worker class OpPlayAudioMonitor : public RefBase { 32*ec779b8eSAndroid Build Coastguard Worker friend class sp<OpPlayAudioMonitor>; 33*ec779b8eSAndroid Build Coastguard Worker public: 34*ec779b8eSAndroid Build Coastguard Worker ~OpPlayAudioMonitor() override; 35*ec779b8eSAndroid Build Coastguard Worker bool hasOpPlayAudio() const; 36*ec779b8eSAndroid Build Coastguard Worker 37*ec779b8eSAndroid Build Coastguard Worker static sp<OpPlayAudioMonitor> createIfNeeded( 38*ec779b8eSAndroid Build Coastguard Worker IAfThreadBase* thread, 39*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource, 40*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t& attr, int id, 41*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t streamType); 42*ec779b8eSAndroid Build Coastguard Worker 43*ec779b8eSAndroid Build Coastguard Worker private: 44*ec779b8eSAndroid Build Coastguard Worker OpPlayAudioMonitor(IAfThreadBase* thread, 45*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource, 46*ec779b8eSAndroid Build Coastguard Worker audio_usage_t usage, int id, uid_t uid); 47*ec779b8eSAndroid Build Coastguard Worker void onFirstRef() override; 48*ec779b8eSAndroid Build Coastguard Worker static void getPackagesForUid(uid_t uid, Vector<String16>& packages); 49*ec779b8eSAndroid Build Coastguard Worker 50*ec779b8eSAndroid Build Coastguard Worker AppOpsManager mAppOpsManager; 51*ec779b8eSAndroid Build Coastguard Worker 52*ec779b8eSAndroid Build Coastguard Worker class PlayAudioOpCallback : public BnAppOpsCallback { 53*ec779b8eSAndroid Build Coastguard Worker public: 54*ec779b8eSAndroid Build Coastguard Worker explicit PlayAudioOpCallback(const wp<OpPlayAudioMonitor>& monitor); 55*ec779b8eSAndroid Build Coastguard Worker void opChanged(int32_t op, const String16& packageName) override; 56*ec779b8eSAndroid Build Coastguard Worker 57*ec779b8eSAndroid Build Coastguard Worker private: 58*ec779b8eSAndroid Build Coastguard Worker const wp<OpPlayAudioMonitor> mMonitor; 59*ec779b8eSAndroid Build Coastguard Worker }; 60*ec779b8eSAndroid Build Coastguard Worker 61*ec779b8eSAndroid Build Coastguard Worker sp<PlayAudioOpCallback> mOpCallback; 62*ec779b8eSAndroid Build Coastguard Worker // called by PlayAudioOpCallback when OP_PLAY_AUDIO is updated in AppOp callback 63*ec779b8eSAndroid Build Coastguard Worker void checkPlayAudioForUsage(bool doBroadcast); 64*ec779b8eSAndroid Build Coastguard Worker 65*ec779b8eSAndroid Build Coastguard Worker wp<IAfThreadBase> mThread; 66*ec779b8eSAndroid Build Coastguard Worker std::atomic_bool mHasOpPlayAudio; 67*ec779b8eSAndroid Build Coastguard Worker const int32_t mUsage; // on purpose not audio_usage_t because always checked in appOps as 68*ec779b8eSAndroid Build Coastguard Worker // int32_t 69*ec779b8eSAndroid Build Coastguard Worker const int mId; // for logging purposes only 70*ec779b8eSAndroid Build Coastguard Worker const uid_t mUid; 71*ec779b8eSAndroid Build Coastguard Worker const String16 mPackageName; 72*ec779b8eSAndroid Build Coastguard Worker }; 73*ec779b8eSAndroid Build Coastguard Worker 74*ec779b8eSAndroid Build Coastguard Worker // playback track 75*ec779b8eSAndroid Build Coastguard Worker class Track : public TrackBase, public virtual IAfTrack, public VolumeProvider { 76*ec779b8eSAndroid Build Coastguard Worker public: 77*ec779b8eSAndroid Build Coastguard Worker Track(IAfPlaybackThread* thread, 78*ec779b8eSAndroid Build Coastguard Worker const sp<Client>& client, 79*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t streamType, 80*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t& attr, 81*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, 82*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, 83*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, 84*ec779b8eSAndroid Build Coastguard Worker size_t frameCount, 85*ec779b8eSAndroid Build Coastguard Worker void *buffer, 86*ec779b8eSAndroid Build Coastguard Worker size_t bufferSize, 87*ec779b8eSAndroid Build Coastguard Worker const sp<IMemory>& sharedBuffer, 88*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 89*ec779b8eSAndroid Build Coastguard Worker pid_t creatorPid, 90*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource, 91*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t flags, 92*ec779b8eSAndroid Build Coastguard Worker track_type type, 93*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE, 94*ec779b8eSAndroid Build Coastguard Worker /** default behaviour is to start when there are as many frames 95*ec779b8eSAndroid Build Coastguard Worker * ready as possible (aka. Buffer is full). */ 96*ec779b8eSAndroid Build Coastguard Worker size_t frameCountToBeReady = SIZE_MAX, 97*ec779b8eSAndroid Build Coastguard Worker float speed = 1.0f, 98*ec779b8eSAndroid Build Coastguard Worker bool isSpatialized = false, 99*ec779b8eSAndroid Build Coastguard Worker bool isBitPerfect = false, 100*ec779b8eSAndroid Build Coastguard Worker float volume = 0.0f, 101*ec779b8eSAndroid Build Coastguard Worker bool muted = false); 102*ec779b8eSAndroid Build Coastguard Worker ~Track() override; 103*ec779b8eSAndroid Build Coastguard Worker status_t initCheck() const final; 104*ec779b8eSAndroid Build Coastguard Worker void appendDumpHeader(String8& result) const final; 105*ec779b8eSAndroid Build Coastguard Worker void appendDump(String8& result, bool active) const final; 106*ec779b8eSAndroid Build Coastguard Worker status_t start(AudioSystem::sync_event_t event = AudioSystem::SYNC_EVENT_NONE, 107*ec779b8eSAndroid Build Coastguard Worker audio_session_t triggerSession = AUDIO_SESSION_NONE) override; 108*ec779b8eSAndroid Build Coastguard Worker void stop() override; 109*ec779b8eSAndroid Build Coastguard Worker void pause() final; 110*ec779b8eSAndroid Build Coastguard Worker void flush() final; 111*ec779b8eSAndroid Build Coastguard Worker void destroy() final; 112*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate() const final; streamType()113*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t streamType() const final { 114*ec779b8eSAndroid Build Coastguard Worker return mStreamType; 115*ec779b8eSAndroid Build Coastguard Worker } isOffloaded()116*ec779b8eSAndroid Build Coastguard Worker bool isOffloaded() const final 117*ec779b8eSAndroid Build Coastguard Worker { return (mFlags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) != 0; } isDirect()118*ec779b8eSAndroid Build Coastguard Worker bool isDirect() const final 119*ec779b8eSAndroid Build Coastguard Worker { return (mFlags & AUDIO_OUTPUT_FLAG_DIRECT) != 0; } isOffloadedOrDirect()120*ec779b8eSAndroid Build Coastguard Worker bool isOffloadedOrDirect() const final { return (mFlags 121*ec779b8eSAndroid Build Coastguard Worker & (AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD 122*ec779b8eSAndroid Build Coastguard Worker | AUDIO_OUTPUT_FLAG_DIRECT)) != 0; } isStatic()123*ec779b8eSAndroid Build Coastguard Worker bool isStatic() const final { return mSharedBuffer.get() != nullptr; } 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker status_t setParameters(const String8& keyValuePairs) final; 126*ec779b8eSAndroid Build Coastguard Worker status_t selectPresentation(int presentationId, int programId) final; 127*ec779b8eSAndroid Build Coastguard Worker status_t attachAuxEffect(int EffectId) final; 128*ec779b8eSAndroid Build Coastguard Worker void setAuxBuffer(int EffectId, int32_t* buffer) final; auxBuffer()129*ec779b8eSAndroid Build Coastguard Worker int32_t* auxBuffer() const final { return mAuxBuffer; } setMainBuffer(float * buffer)130*ec779b8eSAndroid Build Coastguard Worker void setMainBuffer(float* buffer) final { mMainBuffer = buffer; } mainBuffer()131*ec779b8eSAndroid Build Coastguard Worker float* mainBuffer() const final { return mMainBuffer; } auxEffectId()132*ec779b8eSAndroid Build Coastguard Worker int auxEffectId() const final { return mAuxEffectId; } 133*ec779b8eSAndroid Build Coastguard Worker status_t getTimestamp(AudioTimestamp& timestamp) final; 134*ec779b8eSAndroid Build Coastguard Worker void signal() final; 135*ec779b8eSAndroid Build Coastguard Worker status_t getDualMonoMode(audio_dual_mono_mode_t* mode) const final; 136*ec779b8eSAndroid Build Coastguard Worker status_t setDualMonoMode(audio_dual_mono_mode_t mode) final; 137*ec779b8eSAndroid Build Coastguard Worker status_t getAudioDescriptionMixLevel(float* leveldB) const final; 138*ec779b8eSAndroid Build Coastguard Worker status_t setAudioDescriptionMixLevel(float leveldB) final; 139*ec779b8eSAndroid Build Coastguard Worker status_t getPlaybackRateParameters(audio_playback_rate_t* playbackRate) const final; 140*ec779b8eSAndroid Build Coastguard Worker status_t setPlaybackRateParameters(const audio_playback_rate_t& playbackRate) final; 141*ec779b8eSAndroid Build Coastguard Worker 142*ec779b8eSAndroid Build Coastguard Worker // implement FastMixerState::VolumeProvider interface 143*ec779b8eSAndroid Build Coastguard Worker gain_minifloat_packed_t getVolumeLR() const final; 144*ec779b8eSAndroid Build Coastguard Worker 145*ec779b8eSAndroid Build Coastguard Worker status_t setSyncEvent(const sp<audioflinger::SyncEvent>& event) final; isFastTrack()146*ec779b8eSAndroid Build Coastguard Worker bool isFastTrack() const final { return (mFlags & AUDIO_OUTPUT_FLAG_FAST) != 0; } bufferLatencyMs()147*ec779b8eSAndroid Build Coastguard Worker double bufferLatencyMs() const final { 148*ec779b8eSAndroid Build Coastguard Worker return isStatic() ? 0. : TrackBase::bufferLatencyMs(); 149*ec779b8eSAndroid Build Coastguard Worker } 150*ec779b8eSAndroid Build Coastguard Worker 151*ec779b8eSAndroid Build Coastguard Worker // implement volume handling. 152*ec779b8eSAndroid Build Coastguard Worker media::VolumeShaper::Status applyVolumeShaper( 153*ec779b8eSAndroid Build Coastguard Worker const sp<media::VolumeShaper::Configuration>& configuration, 154*ec779b8eSAndroid Build Coastguard Worker const sp<media::VolumeShaper::Operation>& operation); 155*ec779b8eSAndroid Build Coastguard Worker sp<media::VolumeShaper::State> getVolumeShaperState(int id) const final; getVolumeHandler()156*ec779b8eSAndroid Build Coastguard Worker sp<media::VolumeHandler> getVolumeHandler() const final{ return mVolumeHandler; } 157*ec779b8eSAndroid Build Coastguard Worker /** Set the computed normalized final volume of the track. 158*ec779b8eSAndroid Build Coastguard Worker * !masterMute * masterVolume * streamVolume * averageLRVolume */ 159*ec779b8eSAndroid Build Coastguard Worker void setFinalVolume(float volumeLeft, float volumeRight) final; getFinalVolume()160*ec779b8eSAndroid Build Coastguard Worker float getFinalVolume() const final { return mFinalVolume; } getFinalVolume(float * left,float * right)161*ec779b8eSAndroid Build Coastguard Worker void getFinalVolume(float* left, float* right) const final { 162*ec779b8eSAndroid Build Coastguard Worker *left = mFinalVolumeLeft; 163*ec779b8eSAndroid Build Coastguard Worker *right = mFinalVolumeRight; 164*ec779b8eSAndroid Build Coastguard Worker } 165*ec779b8eSAndroid Build Coastguard Worker 166*ec779b8eSAndroid Build Coastguard Worker using SourceMetadatas = std::vector<playback_track_metadata_v7_t>; 167*ec779b8eSAndroid Build Coastguard Worker using MetadataInserter = std::back_insert_iterator<SourceMetadatas>; 168*ec779b8eSAndroid Build Coastguard Worker /** Copy the track metadata in the provided iterator. Thread safe. */ 169*ec779b8eSAndroid Build Coastguard Worker void copyMetadataTo(MetadataInserter& backInserter) const override; 170*ec779b8eSAndroid Build Coastguard Worker 171*ec779b8eSAndroid Build Coastguard Worker 172*ec779b8eSAndroid Build Coastguard Worker /** Return haptic playback of the track is enabled or not, used in mixer. */ getHapticPlaybackEnabled()173*ec779b8eSAndroid Build Coastguard Worker bool getHapticPlaybackEnabled() const final { return mHapticPlaybackEnabled; } 174*ec779b8eSAndroid Build Coastguard Worker /** Set haptic playback of the track is enabled or not, should be 175*ec779b8eSAndroid Build Coastguard Worker * set after query or get callback from vibrator service */ setHapticPlaybackEnabled(bool hapticPlaybackEnabled)176*ec779b8eSAndroid Build Coastguard Worker void setHapticPlaybackEnabled(bool hapticPlaybackEnabled) final { 177*ec779b8eSAndroid Build Coastguard Worker mHapticPlaybackEnabled = hapticPlaybackEnabled; 178*ec779b8eSAndroid Build Coastguard Worker } 179*ec779b8eSAndroid Build Coastguard Worker /** Return the haptics scale, used in mixer. */ getHapticScale()180*ec779b8eSAndroid Build Coastguard Worker os::HapticScale getHapticScale() const final { return mHapticScale; } 181*ec779b8eSAndroid Build Coastguard Worker /** Return the maximum amplitude allowed for haptics data, used in mixer. */ getHapticMaxAmplitude()182*ec779b8eSAndroid Build Coastguard Worker float getHapticMaxAmplitude() const final { return mHapticMaxAmplitude; } 183*ec779b8eSAndroid Build Coastguard Worker /** Set intensity of haptic playback, should be set after querying vibrator service. */ setHapticScale(os::HapticScale hapticScale)184*ec779b8eSAndroid Build Coastguard Worker void setHapticScale(os::HapticScale hapticScale) final { 185*ec779b8eSAndroid Build Coastguard Worker if (os::isValidHapticScale(hapticScale)) { 186*ec779b8eSAndroid Build Coastguard Worker mHapticScale = hapticScale; 187*ec779b8eSAndroid Build Coastguard Worker setHapticPlaybackEnabled(!mHapticScale.isScaleMute()); 188*ec779b8eSAndroid Build Coastguard Worker } 189*ec779b8eSAndroid Build Coastguard Worker } 190*ec779b8eSAndroid Build Coastguard Worker /** Set maximum amplitude allowed for haptic data, should be set after querying 191*ec779b8eSAndroid Build Coastguard Worker * vibrator service. 192*ec779b8eSAndroid Build Coastguard Worker */ setHapticMaxAmplitude(float maxAmplitude)193*ec779b8eSAndroid Build Coastguard Worker void setHapticMaxAmplitude(float maxAmplitude) final { 194*ec779b8eSAndroid Build Coastguard Worker mHapticMaxAmplitude = maxAmplitude; 195*ec779b8eSAndroid Build Coastguard Worker } getExternalVibration()196*ec779b8eSAndroid Build Coastguard Worker sp<os::ExternalVibration> getExternalVibration() const final { return mExternalVibration; } 197*ec779b8eSAndroid Build Coastguard Worker 198*ec779b8eSAndroid Build Coastguard Worker // This function should be called with holding thread lock. 199*ec779b8eSAndroid Build Coastguard Worker void updateTeePatches_l() final REQUIRES(audio_utils::ThreadBase_Mutex) 200*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_BELOW_ThreadBase_Mutex; 201*ec779b8eSAndroid Build Coastguard Worker void setTeePatchesToUpdate_l(TeePatches teePatchesToUpdate) final; 202*ec779b8eSAndroid Build Coastguard Worker tallyUnderrunFrames(size_t frames)203*ec779b8eSAndroid Build Coastguard Worker void tallyUnderrunFrames(size_t frames) final { 204*ec779b8eSAndroid Build Coastguard Worker if (isOut()) { // we expect this from output tracks only 205*ec779b8eSAndroid Build Coastguard Worker mAudioTrackServerProxy->tallyUnderrunFrames(frames); 206*ec779b8eSAndroid Build Coastguard Worker // Fetch absolute numbers from AudioTrackShared as it counts 207*ec779b8eSAndroid Build Coastguard Worker // contiguous underruns as a one -- we want a consistent number. 208*ec779b8eSAndroid Build Coastguard Worker // TODO: isolate this counting into a class. 209*ec779b8eSAndroid Build Coastguard Worker mTrackMetrics.logUnderruns(mAudioTrackServerProxy->getUnderrunCount(), 210*ec779b8eSAndroid Build Coastguard Worker mAudioTrackServerProxy->getUnderrunFrames()); 211*ec779b8eSAndroid Build Coastguard Worker } 212*ec779b8eSAndroid Build Coastguard Worker } 213*ec779b8eSAndroid Build Coastguard Worker getOutputFlags()214*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t getOutputFlags() const final { return mFlags; } getSpeed()215*ec779b8eSAndroid Build Coastguard Worker float getSpeed() const final { return mSpeed; } isSpatialized()216*ec779b8eSAndroid Build Coastguard Worker bool isSpatialized() const final { return mIsSpatialized; } isBitPerfect()217*ec779b8eSAndroid Build Coastguard Worker bool isBitPerfect() const final { return mIsBitPerfect; } 218*ec779b8eSAndroid Build Coastguard Worker 219*ec779b8eSAndroid Build Coastguard Worker /** 220*ec779b8eSAndroid Build Coastguard Worker * Updates the mute state and notifies the audio service. Call this only when holding player 221*ec779b8eSAndroid Build Coastguard Worker * thread lock. 222*ec779b8eSAndroid Build Coastguard Worker */ 223*ec779b8eSAndroid Build Coastguard Worker void processMuteEvent_l(const sp<IAudioManager>& audioManager, mute_state_t muteState) final; 224*ec779b8eSAndroid Build Coastguard Worker getInternalMute()225*ec779b8eSAndroid Build Coastguard Worker bool getInternalMute() const final { return mInternalMute; } setInternalMute(bool muted)226*ec779b8eSAndroid Build Coastguard Worker void setInternalMute(bool muted) final { mInternalMute = muted; } 227*ec779b8eSAndroid Build Coastguard Worker 228*ec779b8eSAndroid Build Coastguard Worker // VolumePortInterface implementation 229*ec779b8eSAndroid Build Coastguard Worker void setPortVolume(float volume) override; 230*ec779b8eSAndroid Build Coastguard Worker void setPortMute(bool muted) override; getPortVolume()231*ec779b8eSAndroid Build Coastguard Worker float getPortVolume() const override { return mVolume; } getPortMute()232*ec779b8eSAndroid Build Coastguard Worker bool getPortMute() const override { return mMutedFromPort; } 233*ec779b8eSAndroid Build Coastguard Worker trackFlagsAsString()234*ec779b8eSAndroid Build Coastguard Worker std::string trackFlagsAsString() const final { return toString(mFlags); } 235*ec779b8eSAndroid Build Coastguard Worker 236*ec779b8eSAndroid Build Coastguard Worker protected: 237*ec779b8eSAndroid Build Coastguard Worker 238*ec779b8eSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(Track); 239*ec779b8eSAndroid Build Coastguard Worker 240*ec779b8eSAndroid Build Coastguard Worker // AudioBufferProvider interface 241*ec779b8eSAndroid Build Coastguard Worker status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) override; 242*ec779b8eSAndroid Build Coastguard Worker void releaseBuffer(AudioBufferProvider::Buffer* buffer) override; 243*ec779b8eSAndroid Build Coastguard Worker 244*ec779b8eSAndroid Build Coastguard Worker // ExtendedAudioBufferProvider interface 245*ec779b8eSAndroid Build Coastguard Worker size_t framesReady() const override; 246*ec779b8eSAndroid Build Coastguard Worker int64_t framesReleased() const override; 247*ec779b8eSAndroid Build Coastguard Worker void onTimestamp(const ExtendedTimestamp ×tamp) override; 248*ec779b8eSAndroid Build Coastguard Worker 249*ec779b8eSAndroid Build Coastguard Worker // Used by thread isPausing()250*ec779b8eSAndroid Build Coastguard Worker bool isPausing() const final { return mState == PAUSING; } isPaused()251*ec779b8eSAndroid Build Coastguard Worker bool isPaused() const final { return mState == PAUSED; } isResuming()252*ec779b8eSAndroid Build Coastguard Worker bool isResuming() const final { return mState == RESUMING; } 253*ec779b8eSAndroid Build Coastguard Worker bool isReady() const final; setPaused()254*ec779b8eSAndroid Build Coastguard Worker void setPaused() final { mState = PAUSED; } 255*ec779b8eSAndroid Build Coastguard Worker void reset() final; isFlushPending()256*ec779b8eSAndroid Build Coastguard Worker bool isFlushPending() const final { return mFlushHwPending; } 257*ec779b8eSAndroid Build Coastguard Worker void flushAck() final; 258*ec779b8eSAndroid Build Coastguard Worker bool isResumePending() const final; 259*ec779b8eSAndroid Build Coastguard Worker void resumeAck() final; 260*ec779b8eSAndroid Build Coastguard Worker // For direct or offloaded tracks ensure that the pause state is acknowledged 261*ec779b8eSAndroid Build Coastguard Worker // by the playback thread in case of an immediate flush. isPausePending()262*ec779b8eSAndroid Build Coastguard Worker bool isPausePending() const final { return mPauseHwPending; } 263*ec779b8eSAndroid Build Coastguard Worker void pauseAck() final; 264*ec779b8eSAndroid Build Coastguard Worker void updateTrackFrameInfo(int64_t trackFramesReleased, int64_t sinkFramesWritten, 265*ec779b8eSAndroid Build Coastguard Worker uint32_t halSampleRate, const ExtendedTimestamp& timeStamp) final; 266*ec779b8eSAndroid Build Coastguard Worker sharedBuffer()267*ec779b8eSAndroid Build Coastguard Worker sp<IMemory> sharedBuffer() const final { return mSharedBuffer; } 268*ec779b8eSAndroid Build Coastguard Worker 269*ec779b8eSAndroid Build Coastguard Worker // presentationComplete checked by frames. (Mixed Tracks). 270*ec779b8eSAndroid Build Coastguard Worker // framesWritten is cumulative, never reset, and is shared all tracks 271*ec779b8eSAndroid Build Coastguard Worker // audioHalFrames is derived from output latency 272*ec779b8eSAndroid Build Coastguard Worker bool presentationComplete(int64_t framesWritten, size_t audioHalFrames) final; 273*ec779b8eSAndroid Build Coastguard Worker 274*ec779b8eSAndroid Build Coastguard Worker // presentationComplete checked by time. (Direct Tracks). 275*ec779b8eSAndroid Build Coastguard Worker bool presentationComplete(uint32_t latencyMs) final; 276*ec779b8eSAndroid Build Coastguard Worker resetPresentationComplete()277*ec779b8eSAndroid Build Coastguard Worker void resetPresentationComplete() final { 278*ec779b8eSAndroid Build Coastguard Worker mPresentationCompleteFrames = 0; 279*ec779b8eSAndroid Build Coastguard Worker mPresentationCompleteTimeNs = 0; 280*ec779b8eSAndroid Build Coastguard Worker } 281*ec779b8eSAndroid Build Coastguard Worker 282*ec779b8eSAndroid Build Coastguard Worker // notifyPresentationComplete is called when presentationComplete() detects 283*ec779b8eSAndroid Build Coastguard Worker // that the track is finished stopping. 284*ec779b8eSAndroid Build Coastguard Worker void notifyPresentationComplete(); 285*ec779b8eSAndroid Build Coastguard Worker 286*ec779b8eSAndroid Build Coastguard Worker void signalClientFlag(int32_t flag); 287*ec779b8eSAndroid Build Coastguard Worker 288*ec779b8eSAndroid Build Coastguard Worker void triggerEvents(AudioSystem::sync_event_t type) final; 289*ec779b8eSAndroid Build Coastguard Worker void invalidate() final; 290*ec779b8eSAndroid Build Coastguard Worker void disable() final; 291*ec779b8eSAndroid Build Coastguard Worker bool isDisabled() const final; 292*ec779b8eSAndroid Build Coastguard Worker fastIndex()293*ec779b8eSAndroid Build Coastguard Worker int& fastIndex() final { return mFastIndex; } isPlaybackRestricted()294*ec779b8eSAndroid Build Coastguard Worker bool isPlaybackRestricted() const final { 295*ec779b8eSAndroid Build Coastguard Worker // The monitor is only created for tracks that can be silenced. 296*ec779b8eSAndroid Build Coastguard Worker return mOpPlayAudioMonitor ? !mOpPlayAudioMonitor->hasOpPlayAudio() : false; } 297*ec779b8eSAndroid Build Coastguard Worker audioTrackServerProxy()298*ec779b8eSAndroid Build Coastguard Worker const sp<AudioTrackServerProxy>& audioTrackServerProxy() const final { 299*ec779b8eSAndroid Build Coastguard Worker return mAudioTrackServerProxy; 300*ec779b8eSAndroid Build Coastguard Worker } hasVolumeController()301*ec779b8eSAndroid Build Coastguard Worker bool hasVolumeController() const final { return mHasVolumeController; } setHasVolumeController(bool hasVolumeController)302*ec779b8eSAndroid Build Coastguard Worker void setHasVolumeController(bool hasVolumeController) final { 303*ec779b8eSAndroid Build Coastguard Worker mHasVolumeController = hasVolumeController; 304*ec779b8eSAndroid Build Coastguard Worker } setCachedVolume(float volume)305*ec779b8eSAndroid Build Coastguard Worker void setCachedVolume(float volume) final { 306*ec779b8eSAndroid Build Coastguard Worker mCachedVolume = volume; 307*ec779b8eSAndroid Build Coastguard Worker } setResetDone(bool resetDone)308*ec779b8eSAndroid Build Coastguard Worker void setResetDone(bool resetDone) final { 309*ec779b8eSAndroid Build Coastguard Worker mResetDone = resetDone; 310*ec779b8eSAndroid Build Coastguard Worker } asExtendedAudioBufferProvider()311*ec779b8eSAndroid Build Coastguard Worker ExtendedAudioBufferProvider* asExtendedAudioBufferProvider() final { 312*ec779b8eSAndroid Build Coastguard Worker return this; 313*ec779b8eSAndroid Build Coastguard Worker } asVolumeProvider()314*ec779b8eSAndroid Build Coastguard Worker VolumeProvider* asVolumeProvider() final { 315*ec779b8eSAndroid Build Coastguard Worker return this; 316*ec779b8eSAndroid Build Coastguard Worker } 317*ec779b8eSAndroid Build Coastguard Worker fillingStatus()318*ec779b8eSAndroid Build Coastguard Worker FillingStatus& fillingStatus() final { return mFillingStatus; } retryCount()319*ec779b8eSAndroid Build Coastguard Worker int8_t& retryCount() final { return mRetryCount; } fastTrackUnderruns()320*ec779b8eSAndroid Build Coastguard Worker FastTrackUnderruns& fastTrackUnderruns() final { return mObservedUnderruns; } 321*ec779b8eSAndroid Build Coastguard Worker 322*ec779b8eSAndroid Build Coastguard Worker protected: 323*ec779b8eSAndroid Build Coastguard Worker mutable FillingStatus mFillingStatus; 324*ec779b8eSAndroid Build Coastguard Worker int8_t mRetryCount; 325*ec779b8eSAndroid Build Coastguard Worker 326*ec779b8eSAndroid Build Coastguard Worker // see comment at ~Track for why this can't be const 327*ec779b8eSAndroid Build Coastguard Worker sp<IMemory> mSharedBuffer; 328*ec779b8eSAndroid Build Coastguard Worker 329*ec779b8eSAndroid Build Coastguard Worker bool mResetDone; 330*ec779b8eSAndroid Build Coastguard Worker const audio_stream_type_t mStreamType; 331*ec779b8eSAndroid Build Coastguard Worker float *mMainBuffer; 332*ec779b8eSAndroid Build Coastguard Worker 333*ec779b8eSAndroid Build Coastguard Worker int32_t *mAuxBuffer; 334*ec779b8eSAndroid Build Coastguard Worker int mAuxEffectId; 335*ec779b8eSAndroid Build Coastguard Worker bool mHasVolumeController; 336*ec779b8eSAndroid Build Coastguard Worker 337*ec779b8eSAndroid Build Coastguard Worker // access these three variables only when holding thread lock. 338*ec779b8eSAndroid Build Coastguard Worker LinearMap<int64_t> mFrameMap; // track frame to server frame mapping 339*ec779b8eSAndroid Build Coastguard Worker 340*ec779b8eSAndroid Build Coastguard Worker ExtendedTimestamp mSinkTimestamp; 341*ec779b8eSAndroid Build Coastguard Worker 342*ec779b8eSAndroid Build Coastguard Worker sp<media::VolumeHandler> mVolumeHandler; // handles multiple VolumeShaper configs and operations 343*ec779b8eSAndroid Build Coastguard Worker 344*ec779b8eSAndroid Build Coastguard Worker sp<OpPlayAudioMonitor> mOpPlayAudioMonitor; 345*ec779b8eSAndroid Build Coastguard Worker 346*ec779b8eSAndroid Build Coastguard Worker bool mHapticPlaybackEnabled = false; // indicates haptic playback enabled or not 347*ec779b8eSAndroid Build Coastguard Worker // scale to play haptic data 348*ec779b8eSAndroid Build Coastguard Worker os::HapticScale mHapticScale = os::HapticScale::mute(); 349*ec779b8eSAndroid Build Coastguard Worker // max amplitude allowed for haptic data 350*ec779b8eSAndroid Build Coastguard Worker float mHapticMaxAmplitude = NAN; 351*ec779b8eSAndroid Build Coastguard Worker class AudioVibrationController : public os::BnExternalVibrationController { 352*ec779b8eSAndroid Build Coastguard Worker public: AudioVibrationController(Track * track)353*ec779b8eSAndroid Build Coastguard Worker explicit AudioVibrationController(Track* track) : mTrack(track) {} 354*ec779b8eSAndroid Build Coastguard Worker binder::Status mute(/*out*/ bool *ret) override; 355*ec779b8eSAndroid Build Coastguard Worker binder::Status unmute(/*out*/ bool *ret) override; 356*ec779b8eSAndroid Build Coastguard Worker private: 357*ec779b8eSAndroid Build Coastguard Worker Track* const mTrack; 358*ec779b8eSAndroid Build Coastguard Worker bool setMute(bool muted); 359*ec779b8eSAndroid Build Coastguard Worker }; 360*ec779b8eSAndroid Build Coastguard Worker sp<AudioVibrationController> mAudioVibrationController; 361*ec779b8eSAndroid Build Coastguard Worker sp<os::ExternalVibration> mExternalVibration; 362*ec779b8eSAndroid Build Coastguard Worker 363*ec779b8eSAndroid Build Coastguard Worker audio_dual_mono_mode_t mDualMonoMode = AUDIO_DUAL_MONO_MODE_OFF; 364*ec779b8eSAndroid Build Coastguard Worker float mAudioDescriptionMixLevel = -std::numeric_limits<float>::infinity(); 365*ec779b8eSAndroid Build Coastguard Worker audio_playback_rate_t mPlaybackRateParameters = AUDIO_PLAYBACK_RATE_INITIALIZER; 366*ec779b8eSAndroid Build Coastguard Worker 367*ec779b8eSAndroid Build Coastguard Worker private: 368*ec779b8eSAndroid Build Coastguard Worker void interceptBuffer(const AudioBufferProvider::Buffer& buffer); 369*ec779b8eSAndroid Build Coastguard Worker // Must hold thread lock to access tee patches 370*ec779b8eSAndroid Build Coastguard Worker template <class F> forEachTeePatchTrack_l(F f)371*ec779b8eSAndroid Build Coastguard Worker void forEachTeePatchTrack_l(F f) { 372*ec779b8eSAndroid Build Coastguard Worker RWLock::AutoRLock readLock(mTeePatchesRWLock); 373*ec779b8eSAndroid Build Coastguard Worker for (auto& tp : mTeePatches) { f(tp.patchTrack); } 374*ec779b8eSAndroid Build Coastguard Worker }; 375*ec779b8eSAndroid Build Coastguard Worker 376*ec779b8eSAndroid Build Coastguard Worker void populateUsageAndContentTypeFromStreamType(); 377*ec779b8eSAndroid Build Coastguard Worker 378*ec779b8eSAndroid Build Coastguard Worker size_t mPresentationCompleteFrames = 0; // (Used for Mixed tracks) 379*ec779b8eSAndroid Build Coastguard Worker // The number of frames written to the 380*ec779b8eSAndroid Build Coastguard Worker // audio HAL when this track is considered fully rendered. 381*ec779b8eSAndroid Build Coastguard Worker // Zero means not monitoring. 382*ec779b8eSAndroid Build Coastguard Worker int64_t mPresentationCompleteTimeNs = 0; // (Used for Direct tracks) 383*ec779b8eSAndroid Build Coastguard Worker // The time when this track is considered fully rendered. 384*ec779b8eSAndroid Build Coastguard Worker // Zero means not monitoring. 385*ec779b8eSAndroid Build Coastguard Worker 386*ec779b8eSAndroid Build Coastguard Worker // The following fields are only for fast tracks, and should be in a subclass 387*ec779b8eSAndroid Build Coastguard Worker int mFastIndex; // index within FastMixerState::mFastTracks[]; 388*ec779b8eSAndroid Build Coastguard Worker // either mFastIndex == -1 if not isFastTrack() 389*ec779b8eSAndroid Build Coastguard Worker // or 0 < mFastIndex < FastMixerState::kMaxFast because 390*ec779b8eSAndroid Build Coastguard Worker // index 0 is reserved for normal mixer's submix; 391*ec779b8eSAndroid Build Coastguard Worker // index is allocated statically at track creation time 392*ec779b8eSAndroid Build Coastguard Worker // but the slot is only used if track is active 393*ec779b8eSAndroid Build Coastguard Worker FastTrackUnderruns mObservedUnderruns; // Most recently observed value of 394*ec779b8eSAndroid Build Coastguard Worker // mFastMixerDumpState.mTracks[mFastIndex].mUnderruns 395*ec779b8eSAndroid Build Coastguard Worker volatile float mCachedVolume; // combined master volume and stream type volume; 396*ec779b8eSAndroid Build Coastguard Worker // 'volatile' means accessed without lock or 397*ec779b8eSAndroid Build Coastguard Worker // barrier, but is read/written atomically 398*ec779b8eSAndroid Build Coastguard Worker float mFinalVolume; // combine master volume, stream type volume and track volume 399*ec779b8eSAndroid Build Coastguard Worker float mFinalVolumeLeft; // combine master volume, stream type volume and track 400*ec779b8eSAndroid Build Coastguard Worker // volume 401*ec779b8eSAndroid Build Coastguard Worker float mFinalVolumeRight; // combine master volume, stream type volume and track 402*ec779b8eSAndroid Build Coastguard Worker // volume 403*ec779b8eSAndroid Build Coastguard Worker sp<AudioTrackServerProxy> mAudioTrackServerProxy; 404*ec779b8eSAndroid Build Coastguard Worker bool mResumeToStopping; // track was paused in stopping state. 405*ec779b8eSAndroid Build Coastguard Worker bool mFlushHwPending; // track requests for thread flush 406*ec779b8eSAndroid Build Coastguard Worker bool mPauseHwPending = false; // direct/offload track request for thread pause 407*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t mFlags; 408*ec779b8eSAndroid Build Coastguard Worker TeePatches mTeePatches; 409*ec779b8eSAndroid Build Coastguard Worker std::optional<TeePatches> mTeePatchesToUpdate; 410*ec779b8eSAndroid Build Coastguard Worker RWLock mTeePatchesRWLock; 411*ec779b8eSAndroid Build Coastguard Worker const float mSpeed; 412*ec779b8eSAndroid Build Coastguard Worker const bool mIsSpatialized; 413*ec779b8eSAndroid Build Coastguard Worker const bool mIsBitPerfect; 414*ec779b8eSAndroid Build Coastguard Worker 415*ec779b8eSAndroid Build Coastguard Worker // TODO: replace PersistableBundle with own struct 416*ec779b8eSAndroid Build Coastguard Worker // access these two variables only when holding player thread lock. 417*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<os::PersistableBundle> mMuteEventExtras; 418*ec779b8eSAndroid Build Coastguard Worker std::atomic<mute_state_t> mMuteState; 419*ec779b8eSAndroid Build Coastguard Worker std::atomic<bool> mMutedFromPort; 420*ec779b8eSAndroid Build Coastguard Worker bool mInternalMute = false; 421*ec779b8eSAndroid Build Coastguard Worker std::atomic<float> mVolume = 0.0f; 422*ec779b8eSAndroid Build Coastguard Worker }; // end of Track 423*ec779b8eSAndroid Build Coastguard Worker 424*ec779b8eSAndroid Build Coastguard Worker 425*ec779b8eSAndroid Build Coastguard Worker // playback track, used by DuplicatingThread 426*ec779b8eSAndroid Build Coastguard Worker class OutputTrack : public Track, public IAfOutputTrack { 427*ec779b8eSAndroid Build Coastguard Worker public: 428*ec779b8eSAndroid Build Coastguard Worker 429*ec779b8eSAndroid Build Coastguard Worker class Buffer : public AudioBufferProvider::Buffer { 430*ec779b8eSAndroid Build Coastguard Worker public: 431*ec779b8eSAndroid Build Coastguard Worker void *mBuffer; 432*ec779b8eSAndroid Build Coastguard Worker }; 433*ec779b8eSAndroid Build Coastguard Worker 434*ec779b8eSAndroid Build Coastguard Worker OutputTrack(IAfPlaybackThread* thread, 435*ec779b8eSAndroid Build Coastguard Worker IAfDuplicatingThread* sourceThread, 436*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, 437*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, 438*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, 439*ec779b8eSAndroid Build Coastguard Worker size_t frameCount, 440*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource); 441*ec779b8eSAndroid Build Coastguard Worker ~OutputTrack() override; 442*ec779b8eSAndroid Build Coastguard Worker 443*ec779b8eSAndroid Build Coastguard Worker status_t start(AudioSystem::sync_event_t event = 444*ec779b8eSAndroid Build Coastguard Worker AudioSystem::SYNC_EVENT_NONE, 445*ec779b8eSAndroid Build Coastguard Worker audio_session_t triggerSession = AUDIO_SESSION_NONE) final; 446*ec779b8eSAndroid Build Coastguard Worker void stop() final; 447*ec779b8eSAndroid Build Coastguard Worker ssize_t write(void* data, uint32_t frames) final; bufferQueueEmpty()448*ec779b8eSAndroid Build Coastguard Worker bool bufferQueueEmpty() const final { return mBufferQueue.size() == 0; } isActive()449*ec779b8eSAndroid Build Coastguard Worker bool isActive() const final { return mActive; } 450*ec779b8eSAndroid Build Coastguard Worker 451*ec779b8eSAndroid Build Coastguard Worker void copyMetadataTo(MetadataInserter& backInserter) const final; 452*ec779b8eSAndroid Build Coastguard Worker /** Set the metadatas of the upstream tracks. Thread safe. */ 453*ec779b8eSAndroid Build Coastguard Worker void setMetadatas(const SourceMetadatas& metadatas) final; 454*ec779b8eSAndroid Build Coastguard Worker /** returns client timestamp to the upstream duplicating thread. */ getClientProxyTimestamp()455*ec779b8eSAndroid Build Coastguard Worker ExtendedTimestamp getClientProxyTimestamp() const final { 456*ec779b8eSAndroid Build Coastguard Worker // server - kernel difference is not true latency when drained 457*ec779b8eSAndroid Build Coastguard Worker // i.e. mServerProxy->isDrained(). 458*ec779b8eSAndroid Build Coastguard Worker ExtendedTimestamp timestamp; 459*ec779b8eSAndroid Build Coastguard Worker (void) mClientProxy->getTimestamp(×tamp); 460*ec779b8eSAndroid Build Coastguard Worker // On success, the timestamp LOCATION_SERVER and LOCATION_KERNEL 461*ec779b8eSAndroid Build Coastguard Worker // entries will be properly filled. If getTimestamp() 462*ec779b8eSAndroid Build Coastguard Worker // is unsuccessful, then a default initialized timestamp 463*ec779b8eSAndroid Build Coastguard Worker // (with mTimeNs[] filled with -1's) is returned. 464*ec779b8eSAndroid Build Coastguard Worker return timestamp; 465*ec779b8eSAndroid Build Coastguard Worker } 466*ec779b8eSAndroid Build Coastguard Worker private: 467*ec779b8eSAndroid Build Coastguard Worker status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, 468*ec779b8eSAndroid Build Coastguard Worker uint32_t waitTimeMs); 469*ec779b8eSAndroid Build Coastguard Worker void queueBuffer(Buffer& inBuffer); 470*ec779b8eSAndroid Build Coastguard Worker void clearBufferQueue(); 471*ec779b8eSAndroid Build Coastguard Worker 472*ec779b8eSAndroid Build Coastguard Worker void restartIfDisabled() override; 473*ec779b8eSAndroid Build Coastguard Worker 474*ec779b8eSAndroid Build Coastguard Worker // Maximum number of pending buffers allocated by OutputTrack::write() 475*ec779b8eSAndroid Build Coastguard Worker static const uint8_t kMaxOverFlowBuffers = 10; 476*ec779b8eSAndroid Build Coastguard Worker 477*ec779b8eSAndroid Build Coastguard Worker Vector < Buffer* > mBufferQueue; 478*ec779b8eSAndroid Build Coastguard Worker AudioBufferProvider::Buffer mOutBuffer; 479*ec779b8eSAndroid Build Coastguard Worker bool mActive; 480*ec779b8eSAndroid Build Coastguard Worker IAfDuplicatingThread* const mSourceThread; // for waitTimeMs() in write() 481*ec779b8eSAndroid Build Coastguard Worker sp<AudioTrackClientProxy> mClientProxy; 482*ec779b8eSAndroid Build Coastguard Worker 483*ec779b8eSAndroid Build Coastguard Worker /** Attributes of the source tracks. 484*ec779b8eSAndroid Build Coastguard Worker * 485*ec779b8eSAndroid Build Coastguard Worker * This member must be accessed with mTrackMetadatasMutex taken. 486*ec779b8eSAndroid Build Coastguard Worker * There is one writer (duplicating thread) and one reader (downstream mixer). 487*ec779b8eSAndroid Build Coastguard Worker * 488*ec779b8eSAndroid Build Coastguard Worker * That means that the duplicating thread can block the downstream mixer 489*ec779b8eSAndroid Build Coastguard Worker * thread and vice versa for the time of the copy. 490*ec779b8eSAndroid Build Coastguard Worker * If this becomes an issue, the metadata could be stored in an atomic raw pointer, 491*ec779b8eSAndroid Build Coastguard Worker * and a exchange with nullptr and delete can be used. 492*ec779b8eSAndroid Build Coastguard Worker * Alternatively a read-copy-update might be implemented. 493*ec779b8eSAndroid Build Coastguard Worker */ 494*ec779b8eSAndroid Build Coastguard Worker SourceMetadatas mTrackMetadatas; 495*ec779b8eSAndroid Build Coastguard Worker /** Protects mTrackMetadatas against concurrent access. */ trackMetadataMutex()496*ec779b8eSAndroid Build Coastguard Worker audio_utils::mutex& trackMetadataMutex() const { return mTrackMetadataMutex; } 497*ec779b8eSAndroid Build Coastguard Worker mutable audio_utils::mutex mTrackMetadataMutex{ 498*ec779b8eSAndroid Build Coastguard Worker audio_utils::MutexOrder::kOutputTrack_TrackMetadataMutex}; 499*ec779b8eSAndroid Build Coastguard Worker }; // end of OutputTrack 500*ec779b8eSAndroid Build Coastguard Worker 501*ec779b8eSAndroid Build Coastguard Worker // playback track, used by PatchPanel 502*ec779b8eSAndroid Build Coastguard Worker class PatchTrack : public Track, public PatchTrackBase, public IAfPatchTrack { 503*ec779b8eSAndroid Build Coastguard Worker public: 504*ec779b8eSAndroid Build Coastguard Worker PatchTrack(IAfPlaybackThread* playbackThread, 505*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t streamType, 506*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, 507*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, 508*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, 509*ec779b8eSAndroid Build Coastguard Worker size_t frameCount, 510*ec779b8eSAndroid Build Coastguard Worker void *buffer, 511*ec779b8eSAndroid Build Coastguard Worker size_t bufferSize, 512*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t flags, 513*ec779b8eSAndroid Build Coastguard Worker const Timeout& timeout = {}, 514*ec779b8eSAndroid Build Coastguard Worker size_t frameCountToBeReady = 1, /** Default behaviour is to start 515*ec779b8eSAndroid Build Coastguard Worker * as soon as possible to have 516*ec779b8eSAndroid Build Coastguard Worker * the lowest possible latency 517*ec779b8eSAndroid Build Coastguard Worker * even if it might glitch. */ 518*ec779b8eSAndroid Build Coastguard Worker float speed = 1.0f, 519*ec779b8eSAndroid Build Coastguard Worker float volume = 1.0f, 520*ec779b8eSAndroid Build Coastguard Worker bool muted = false); 521*ec779b8eSAndroid Build Coastguard Worker ~PatchTrack() override; 522*ec779b8eSAndroid Build Coastguard Worker 523*ec779b8eSAndroid Build Coastguard Worker size_t framesReady() const final; 524*ec779b8eSAndroid Build Coastguard Worker 525*ec779b8eSAndroid Build Coastguard Worker status_t start(AudioSystem::sync_event_t event = 526*ec779b8eSAndroid Build Coastguard Worker AudioSystem::SYNC_EVENT_NONE, 527*ec779b8eSAndroid Build Coastguard Worker audio_session_t triggerSession = AUDIO_SESSION_NONE) final; 528*ec779b8eSAndroid Build Coastguard Worker 529*ec779b8eSAndroid Build Coastguard Worker // AudioBufferProvider interface 530*ec779b8eSAndroid Build Coastguard Worker status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) final; 531*ec779b8eSAndroid Build Coastguard Worker void releaseBuffer(AudioBufferProvider::Buffer* buffer) final; 532*ec779b8eSAndroid Build Coastguard Worker 533*ec779b8eSAndroid Build Coastguard Worker // PatchProxyBufferProvider interface 534*ec779b8eSAndroid Build Coastguard Worker status_t obtainBuffer(Proxy::Buffer* buffer, const struct timespec* timeOut = nullptr) final; 535*ec779b8eSAndroid Build Coastguard Worker void releaseBuffer(Proxy::Buffer* buffer) final; 536*ec779b8eSAndroid Build Coastguard Worker 537*ec779b8eSAndroid Build Coastguard Worker private: 538*ec779b8eSAndroid Build Coastguard Worker void restartIfDisabled() override; 539*ec779b8eSAndroid Build Coastguard Worker }; // end of PatchTrack 540*ec779b8eSAndroid Build Coastguard Worker 541*ec779b8eSAndroid Build Coastguard Worker } // namespace android 542