blob: 442dd8092f779215f1afa38991502bff18cb5547 [file] [log] [blame]
Eric Laurent6acd1d42017-01-04 14:23:29 -08001/*
2**
3** Copyright 2017, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
Andy Hung8d31fd22023-06-26 19:20:57 -070018#pragma once
19
Andy Hung0f725b42023-07-19 11:40:07 -070020#include "TrackBase.h"
21
22#include <android/content/AttributionSourceState.h>
23
Andy Hung8d31fd22023-06-26 19:20:57 -070024namespace android {
Eric Laurent6acd1d42017-01-04 14:23:29 -080025
26// playback track
Andy Hungd29af632023-06-23 19:27:19 -070027class MmapTrack : public TrackBase, public IAfMmapTrack {
Eric Laurent6acd1d42017-01-04 14:23:29 -080028public:
Andy Hung87c693c2023-07-06 20:56:16 -070029 MmapTrack(IAfThreadBase* thread,
Kevin Rocard1f564ac2018-03-29 13:53:10 -070030 const audio_attributes_t& attr,
Eric Laurent6acd1d42017-01-04 14:23:29 -080031 uint32_t sampleRate,
32 audio_format_t format,
33 audio_channel_mask_t channelMask,
34 audio_session_t sessionId,
Kevin Rocard5f2136e2018-05-11 22:03:00 -070035 bool isOut,
Svet Ganov3e5f14f2021-05-13 22:51:08 +000036 const android::content::AttributionSourceState& attributionSource,
Eric Laurent09f1ed22019-04-24 17:45:17 -070037 pid_t creatorPid,
Andy Hung6b137d12024-08-27 22:35:17 +000038 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE,
39 float volume = 0.0f);
Andy Hungd29af632023-06-23 19:27:19 -070040 ~MmapTrack() override;
Eric Laurent6acd1d42017-01-04 14:23:29 -080041
Andy Hungd29af632023-06-23 19:27:19 -070042 status_t initCheck() const final;
43 status_t start(
44 AudioSystem::sync_event_t event, audio_session_t triggerSession) final;
45 void stop() final;
46 bool isFastTrack() const final { return false; }
47 bool isDirect() const final { return true; }
Eric Laurent6acd1d42017-01-04 14:23:29 -080048
Andy Hungd29af632023-06-23 19:27:19 -070049 void appendDumpHeader(String8& result) const final;
50 void appendDump(String8& result, bool active) const final;
Eric Laurent6acd1d42017-01-04 14:23:29 -080051
Eric Laurent331679c2018-04-16 17:03:16 -070052 // protected by MMapThread::mLock
Andy Hungd29af632023-06-23 19:27:19 -070053 void setSilenced_l(bool silenced) final { mSilenced = silenced;
Eric Laurent331679c2018-04-16 17:03:16 -070054 mSilencedNotified = false;}
55 // protected by MMapThread::mLock
Andy Hungd29af632023-06-23 19:27:19 -070056 bool isSilenced_l() const final { return mSilenced; }
Eric Laurent331679c2018-04-16 17:03:16 -070057 // protected by MMapThread::mLock
Andy Hungd29af632023-06-23 19:27:19 -070058 bool getAndSetSilencedNotified_l() final { bool silencedNotified = mSilencedNotified;
Eric Laurent331679c2018-04-16 17:03:16 -070059 mSilencedNotified = true;
60 return silencedNotified; }
Vlad Popaec1788e2022-08-04 11:23:30 +020061
62 /**
63 * Updates the mute state and notifies the audio service. Call this only when holding player
64 * thread lock.
65 */
66 void processMuteEvent_l(const sp<IAudioManager>& audioManager,
67 mute_state_t muteState)
Andy Hungee58e4a2023-07-07 13:47:37 -070068 /* REQUIRES(MmapPlaybackThread::mLock) */ final;
Andy Hung6b137d12024-08-27 22:35:17 +000069
70 // VolumePortInterface implementation
71 void setPortVolume(float volume) override {
72 mVolume = volume;
73 }
74 float getPortVolume() const override { return mVolume; }
75
Mikhail Naganovbf493082017-04-17 17:37:12 -070076private:
Mikhail Naganovbf493082017-04-17 17:37:12 -070077 DISALLOW_COPY_AND_ASSIGN(MmapTrack);
Eric Laurent6acd1d42017-01-04 14:23:29 -080078
79 // AudioBufferProvider interface
80 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
81 // releaseBuffer() not overridden
82
83 // ExtendedAudioBufferProvider interface
Andy Hungd29af632023-06-23 19:27:19 -070084 size_t framesReady() const final;
85 int64_t framesReleased() const final;
86 void onTimestamp(const ExtendedTimestamp &timestamp) final;
Eric Laurent6acd1d42017-01-04 14:23:29 -080087
Andy Hungd29af632023-06-23 19:27:19 -070088 const pid_t mPid;
Atneya Nairb01390f2024-10-09 23:33:27 +000089 const uid_t mUid;
Eric Laurent331679c2018-04-16 17:03:16 -070090 bool mSilenced; // protected by MMapThread::mLock
91 bool mSilencedNotified; // protected by MMapThread::mLock
Vlad Popaec1788e2022-08-04 11:23:30 +020092
93 // TODO: replace PersistableBundle with own struct
94 // access these two variables only when holding player thread lock.
95 std::unique_ptr<os::PersistableBundle> mMuteEventExtras
Andy Hungee58e4a2023-07-07 13:47:37 -070096 /* GUARDED_BY(MmapPlaybackThread::mLock) */;
Vlad Popaec1788e2022-08-04 11:23:30 +020097 mute_state_t mMuteState
Andy Hungee58e4a2023-07-07 13:47:37 -070098 /* GUARDED_BY(MmapPlaybackThread::mLock) */;
Andy Hung6b137d12024-08-27 22:35:17 +000099
100 float mVolume = 0.0f;
Eric Laurent6acd1d42017-01-04 14:23:29 -0800101}; // end of Track
102
Atneya Nairb01390f2024-10-09 23:33:27 +0000103} // namespace android