xref: /aosp_15_r20/frameworks/av/services/audioflinger/MmapTracks.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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 &timestamp) 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