blob: 85ce142ecb9cb7220b2d8037ced67be79d414f66 [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,
Eric Laurent6acd1d42017-01-04 14:23:29 -080038 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
Andy Hungd29af632023-06-23 19:27:19 -070039 ~MmapTrack() override;
Eric Laurent6acd1d42017-01-04 14:23:29 -080040
Andy Hungd29af632023-06-23 19:27:19 -070041 status_t initCheck() const final;
42 status_t start(
43 AudioSystem::sync_event_t event, audio_session_t triggerSession) final;
44 void stop() final;
45 bool isFastTrack() const final { return false; }
46 bool isDirect() const final { return true; }
Eric Laurent6acd1d42017-01-04 14:23:29 -080047
Andy Hungd29af632023-06-23 19:27:19 -070048 void appendDumpHeader(String8& result) const final;
49 void appendDump(String8& result, bool active) const final;
Eric Laurent6acd1d42017-01-04 14:23:29 -080050
Eric Laurent331679c2018-04-16 17:03:16 -070051 // protected by MMapThread::mLock
Andy Hungd29af632023-06-23 19:27:19 -070052 void setSilenced_l(bool silenced) final { mSilenced = silenced;
Eric Laurent331679c2018-04-16 17:03:16 -070053 mSilencedNotified = false;}
54 // protected by MMapThread::mLock
Andy Hungd29af632023-06-23 19:27:19 -070055 bool isSilenced_l() const final { return mSilenced; }
Eric Laurent331679c2018-04-16 17:03:16 -070056 // protected by MMapThread::mLock
Andy Hungd29af632023-06-23 19:27:19 -070057 bool getAndSetSilencedNotified_l() final { bool silencedNotified = mSilencedNotified;
Eric Laurent331679c2018-04-16 17:03:16 -070058 mSilencedNotified = true;
59 return silencedNotified; }
Vlad Popaec1788e2022-08-04 11:23:30 +020060
61 /**
62 * Updates the mute state and notifies the audio service. Call this only when holding player
63 * thread lock.
64 */
65 void processMuteEvent_l(const sp<IAudioManager>& audioManager,
66 mute_state_t muteState)
Andy Hungee58e4a2023-07-07 13:47:37 -070067 /* REQUIRES(MmapPlaybackThread::mLock) */ final;
Mikhail Naganovbf493082017-04-17 17:37:12 -070068private:
Mikhail Naganovbf493082017-04-17 17:37:12 -070069 DISALLOW_COPY_AND_ASSIGN(MmapTrack);
Eric Laurent6acd1d42017-01-04 14:23:29 -080070
71 // AudioBufferProvider interface
72 virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
73 // releaseBuffer() not overridden
74
75 // ExtendedAudioBufferProvider interface
Andy Hungd29af632023-06-23 19:27:19 -070076 size_t framesReady() const final;
77 int64_t framesReleased() const final;
78 void onTimestamp(const ExtendedTimestamp &timestamp) final;
Eric Laurent6acd1d42017-01-04 14:23:29 -080079
Andy Hungd29af632023-06-23 19:27:19 -070080 const pid_t mPid;
Eric Laurent331679c2018-04-16 17:03:16 -070081 bool mSilenced; // protected by MMapThread::mLock
82 bool mSilencedNotified; // protected by MMapThread::mLock
Vlad Popaec1788e2022-08-04 11:23:30 +020083
84 // TODO: replace PersistableBundle with own struct
85 // access these two variables only when holding player thread lock.
86 std::unique_ptr<os::PersistableBundle> mMuteEventExtras
Andy Hungee58e4a2023-07-07 13:47:37 -070087 /* GUARDED_BY(MmapPlaybackThread::mLock) */;
Vlad Popaec1788e2022-08-04 11:23:30 +020088 mute_state_t mMuteState
Andy Hungee58e4a2023-07-07 13:47:37 -070089 /* GUARDED_BY(MmapPlaybackThread::mLock) */;
Eric Laurent6acd1d42017-01-04 14:23:29 -080090}; // end of Track
91
Andy Hung8d31fd22023-06-26 19:20:57 -070092} // namespace android