1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker ** 3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2017, 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/content/AttributionSourceState.h> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker namespace android { 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker // playback track 27*ec779b8eSAndroid Build Coastguard Worker class MmapTrack : public TrackBase, public IAfMmapTrack { 28*ec779b8eSAndroid Build Coastguard Worker public: 29*ec779b8eSAndroid Build Coastguard Worker MmapTrack(IAfThreadBase* thread, 30*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t& attr, 31*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate, 32*ec779b8eSAndroid Build Coastguard Worker audio_format_t format, 33*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t channelMask, 34*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 35*ec779b8eSAndroid Build Coastguard Worker bool isOut, 36*ec779b8eSAndroid Build Coastguard Worker const android::content::AttributionSourceState& attributionSource, 37*ec779b8eSAndroid Build Coastguard Worker pid_t creatorPid, 38*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE, 39*ec779b8eSAndroid Build Coastguard Worker float volume = 0.0f, 40*ec779b8eSAndroid Build Coastguard Worker bool muted = false); 41*ec779b8eSAndroid Build Coastguard Worker ~MmapTrack() override; 42*ec779b8eSAndroid Build Coastguard Worker 43*ec779b8eSAndroid Build Coastguard Worker status_t initCheck() const final; 44*ec779b8eSAndroid Build Coastguard Worker status_t start( 45*ec779b8eSAndroid Build Coastguard Worker AudioSystem::sync_event_t event, audio_session_t triggerSession) final; 46*ec779b8eSAndroid Build Coastguard Worker void stop() final; isFastTrack()47*ec779b8eSAndroid Build Coastguard Worker bool isFastTrack() const final { return false; } isDirect()48*ec779b8eSAndroid Build Coastguard Worker bool isDirect() const final { return true; } 49*ec779b8eSAndroid Build Coastguard Worker 50*ec779b8eSAndroid Build Coastguard Worker void appendDumpHeader(String8& result) const final; 51*ec779b8eSAndroid Build Coastguard Worker void appendDump(String8& result, bool active) const final; 52*ec779b8eSAndroid Build Coastguard Worker 53*ec779b8eSAndroid Build Coastguard Worker // protected by MMapThread::mLock setSilenced_l(bool silenced)54*ec779b8eSAndroid Build Coastguard Worker void setSilenced_l(bool silenced) final { mSilenced = silenced; 55*ec779b8eSAndroid Build Coastguard Worker mSilencedNotified = false;} 56*ec779b8eSAndroid Build Coastguard Worker // protected by MMapThread::mLock isSilenced_l()57*ec779b8eSAndroid Build Coastguard Worker bool isSilenced_l() const final { return mSilenced; } 58*ec779b8eSAndroid Build Coastguard Worker // protected by MMapThread::mLock getAndSetSilencedNotified_l()59*ec779b8eSAndroid Build Coastguard Worker bool getAndSetSilencedNotified_l() final { bool silencedNotified = mSilencedNotified; 60*ec779b8eSAndroid Build Coastguard Worker mSilencedNotified = true; 61*ec779b8eSAndroid Build Coastguard Worker return silencedNotified; } 62*ec779b8eSAndroid Build Coastguard Worker 63*ec779b8eSAndroid Build Coastguard Worker /** 64*ec779b8eSAndroid Build Coastguard Worker * Updates the mute state and notifies the audio service. Call this only when holding player 65*ec779b8eSAndroid Build Coastguard Worker * thread lock. 66*ec779b8eSAndroid Build Coastguard Worker */ 67*ec779b8eSAndroid Build Coastguard Worker void processMuteEvent_l(const sp<IAudioManager>& audioManager, 68*ec779b8eSAndroid Build Coastguard Worker mute_state_t muteState) 69*ec779b8eSAndroid Build Coastguard Worker /* REQUIRES(MmapPlaybackThread::mLock) */ final; 70*ec779b8eSAndroid Build Coastguard Worker 71*ec779b8eSAndroid Build Coastguard Worker // VolumePortInterface implementation setPortVolume(float volume)72*ec779b8eSAndroid Build Coastguard Worker void setPortVolume(float volume) override { 73*ec779b8eSAndroid Build Coastguard Worker mVolume = volume; 74*ec779b8eSAndroid Build Coastguard Worker } setPortMute(bool muted)75*ec779b8eSAndroid Build Coastguard Worker void setPortMute(bool muted) override { 76*ec779b8eSAndroid Build Coastguard Worker mMutedFromPort = muted; 77*ec779b8eSAndroid Build Coastguard Worker } getPortVolume()78*ec779b8eSAndroid Build Coastguard Worker float getPortVolume() const override { return mVolume; } getPortMute()79*ec779b8eSAndroid Build Coastguard Worker bool getPortMute() const override { return mMutedFromPort; } 80*ec779b8eSAndroid Build Coastguard Worker trackFlagsAsString()81*ec779b8eSAndroid Build Coastguard Worker std::string trackFlagsAsString() const final { return {}; } 82*ec779b8eSAndroid Build Coastguard Worker private: 83*ec779b8eSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(MmapTrack); 84*ec779b8eSAndroid Build Coastguard Worker 85*ec779b8eSAndroid Build Coastguard Worker // AudioBufferProvider interface 86*ec779b8eSAndroid Build Coastguard Worker virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 87*ec779b8eSAndroid Build Coastguard Worker // releaseBuffer() not overridden 88*ec779b8eSAndroid Build Coastguard Worker 89*ec779b8eSAndroid Build Coastguard Worker // ExtendedAudioBufferProvider interface 90*ec779b8eSAndroid Build Coastguard Worker size_t framesReady() const final; 91*ec779b8eSAndroid Build Coastguard Worker int64_t framesReleased() const final; 92*ec779b8eSAndroid Build Coastguard Worker void onTimestamp(const ExtendedTimestamp ×tamp) final; 93*ec779b8eSAndroid Build Coastguard Worker 94*ec779b8eSAndroid Build Coastguard Worker const pid_t mPid; 95*ec779b8eSAndroid Build Coastguard Worker const uid_t mUid; 96*ec779b8eSAndroid Build Coastguard Worker bool mSilenced; // protected by MMapThread::mLock 97*ec779b8eSAndroid Build Coastguard Worker bool mSilencedNotified; // protected by MMapThread::mLock 98*ec779b8eSAndroid Build Coastguard Worker 99*ec779b8eSAndroid Build Coastguard Worker // TODO: replace PersistableBundle with own struct 100*ec779b8eSAndroid Build Coastguard Worker // access these two variables only when holding player thread lock. 101*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<os::PersistableBundle> mMuteEventExtras 102*ec779b8eSAndroid Build Coastguard Worker /* GUARDED_BY(MmapPlaybackThread::mLock) */; 103*ec779b8eSAndroid Build Coastguard Worker mute_state_t mMuteState 104*ec779b8eSAndroid Build Coastguard Worker /* GUARDED_BY(MmapPlaybackThread::mLock) */; 105*ec779b8eSAndroid Build Coastguard Worker bool mMutedFromPort; 106*ec779b8eSAndroid Build Coastguard Worker 107*ec779b8eSAndroid Build Coastguard Worker float mVolume = 0.0f; 108*ec779b8eSAndroid Build Coastguard Worker }; // end of Track 109*ec779b8eSAndroid Build Coastguard Worker 110*ec779b8eSAndroid Build Coastguard Worker } // namespace android 111