Skip to content

Commit e3d9adf

Browse files
xhwang-chromiumChromium LUCI CQ
authored and
Chromium LUCI CQ
committed
media: Add AudioStreamMonitor::AudibleClientRegistration
As suggested in previous code review, adding a class to automatically remove audible client on destruction. Bug: 1017943 Change-Id: I3007f4f1300c12984a7d8e92ab26d3006c401d92 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2998306 Commit-Queue: Xiaohan Wang <xhwang@chromium.org> Reviewed-by: Dale Curtis <dalecurtis@chromium.org> Cr-Commit-Position: refs/heads/master@{#897890}
1 parent daec3d6 commit e3d9adf

5 files changed

+54
-29
lines changed

content/browser/media/audio_stream_monitor.cc

+19-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ AudioStreamMonitor* GetMonitorForRenderFrame(int render_process_id,
2828

2929
} // namespace
3030

31+
AudioStreamMonitor::AudibleClientRegistration::AudibleClientRegistration(
32+
AudioStreamMonitor* audio_stream_monitor)
33+
: audio_stream_monitor_(audio_stream_monitor) {
34+
audio_stream_monitor_->AddAudibleClient();
35+
}
36+
37+
AudioStreamMonitor::AudibleClientRegistration::~AudibleClientRegistration() {
38+
audio_stream_monitor_->RemoveAudibleClient();
39+
}
40+
3141
bool AudioStreamMonitor::StreamID::operator<(const StreamID& other) const {
3242
return std::tie(render_process_id, render_frame_id, stream_id) <
3343
std::tie(other.render_process_id, other.render_frame_id,
@@ -47,7 +57,9 @@ AudioStreamMonitor::AudioStreamMonitor(WebContents* contents)
4757
DCHECK(web_contents_);
4858
}
4959

50-
AudioStreamMonitor::~AudioStreamMonitor() {}
60+
AudioStreamMonitor::~AudioStreamMonitor() {
61+
DCHECK_EQ(audible_clients_, 0);
62+
}
5163

5264
bool AudioStreamMonitor::WasRecentlyAudible() const {
5365
DCHECK(thread_checker_.CalledOnValidThread());
@@ -77,6 +89,12 @@ void AudioStreamMonitor::RenderProcessGone(int render_process_id) {
7789
UpdateStreams();
7890
}
7991

92+
std::unique_ptr<AudioStreamMonitor::AudibleClientRegistration>
93+
AudioStreamMonitor::RegisterAudibleClient() {
94+
DCHECK(thread_checker_.CalledOnValidThread());
95+
return std::make_unique<AudibleClientRegistration>(this);
96+
}
97+
8098
void AudioStreamMonitor::AddAudibleClient() {
8199
DCHECK(thread_checker_.CalledOnValidThread());
82100
DCHECK_GE(audible_clients_, 0);

content/browser/media/audio_stream_monitor.h

+19-5
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,6 @@ class CONTENT_EXPORT AudioStreamMonitor : public WebContentsObserver {
5555
// any outstanding poll callbacks.
5656
void RenderProcessGone(int render_process_id);
5757

58-
// Adds/Removes Audible clients.
59-
void AddAudibleClient();
60-
void RemoveAudibleClient();
61-
6258
// Starts or stops monitoring respectively for the stream owned by the
6359
// specified renderer. Safe to call from any thread.
6460
static void StartMonitoringStream(int render_process_id,
@@ -85,8 +81,24 @@ class CONTENT_EXPORT AudioStreamMonitor : public WebContentsObserver {
8581

8682
void set_is_currently_audible_for_testing(bool value) { is_audible_ = value; }
8783

84+
// Class to help automatically remove audible client.
85+
class CONTENT_EXPORT AudibleClientRegistration {
86+
public:
87+
explicit AudibleClientRegistration(
88+
AudioStreamMonitor* audio_stream_monitor);
89+
~AudibleClientRegistration();
90+
91+
private:
92+
AudioStreamMonitor* audio_stream_monitor_;
93+
};
94+
95+
// Registers an audible client, which will be unregistered when the returned
96+
// AudibleClientRegistration is released.
97+
std::unique_ptr<AudibleClientRegistration> RegisterAudibleClient();
98+
8899
private:
89100
friend class AudioStreamMonitorTest;
101+
friend class AudibleClientRegistration;
90102

91103
enum {
92104
// Minimum amount of time to hold a tab indicator on after it becomes
@@ -117,7 +129,9 @@ class CONTENT_EXPORT AudioStreamMonitor : public WebContentsObserver {
117129
void MaybeToggle();
118130
void UpdateStreams();
119131

120-
// void OnStreamRemoved();
132+
// Adds/Removes Audible clients.
133+
void AddAudibleClient();
134+
void RemoveAudibleClient();
121135

122136
// The WebContents instance to receive indicator toggle notifications. This
123137
// pointer should be valid for the lifetime of AudioStreamMonitor.

content/browser/media/audio_stream_monitor_unittest.cc

+8-8
Original file line numberDiff line numberDiff line change
@@ -403,11 +403,11 @@ TEST_F(AudioStreamMonitorTest, OneAudibleClient) {
403403

404404
ExpectRecentlyAudibleChangeNotification(true);
405405
ExpectCurrentlyAudibleChangeNotification(true);
406-
monitor_->AddAudibleClient();
406+
auto registration = monitor_->RegisterAudibleClient();
407407
ExpectIsCurrentlyAudible();
408408

409409
ExpectCurrentlyAudibleChangeNotification(false);
410-
monitor_->RemoveAudibleClient();
410+
registration.reset();
411411
ExpectNotCurrentlyAudible();
412412
}
413413

@@ -417,20 +417,20 @@ TEST_F(AudioStreamMonitorTest, MultipleAudibleClients) {
417417
// Add one client and the tab becomes audible.
418418
ExpectRecentlyAudibleChangeNotification(true);
419419
ExpectCurrentlyAudibleChangeNotification(true);
420-
monitor_->AddAudibleClient();
420+
auto registration1 = monitor_->RegisterAudibleClient();
421421
ExpectIsCurrentlyAudible();
422422

423423
// Add another client and the tab remains audible.
424-
monitor_->AddAudibleClient();
424+
auto registration2 = monitor_->RegisterAudibleClient();
425425
ExpectIsCurrentlyAudible();
426426

427427
// Removes one client and the tab remains audible.
428-
monitor_->RemoveAudibleClient();
428+
registration1.reset();
429429
ExpectIsCurrentlyAudible();
430430

431431
// Removes another client and the tab is not audible.
432432
ExpectCurrentlyAudibleChangeNotification(false);
433-
monitor_->RemoveAudibleClient();
433+
registration2.reset();
434434
ExpectNotCurrentlyAudible();
435435
}
436436

@@ -441,15 +441,15 @@ TEST_F(AudioStreamMonitorTest, AudibleClientAndStream) {
441441
// Add one client and the tab becomes audible.
442442
ExpectRecentlyAudibleChangeNotification(true);
443443
ExpectCurrentlyAudibleChangeNotification(true);
444-
monitor_->AddAudibleClient();
444+
auto registration = monitor_->RegisterAudibleClient();
445445
ExpectIsCurrentlyAudible();
446446

447447
// The stream becomes audible and the tab remains audible.
448448
UpdateAudibleState(kRenderProcessId, kRenderFrameId, kStreamId, true);
449449
ExpectIsCurrentlyAudible();
450450

451451
// Remove the client and the tab remains audible.
452-
monitor_->RemoveAudibleClient();
452+
registration.reset();
453453
ExpectIsCurrentlyAudible();
454454

455455
// The stream becomes not audible and the tab is not audible.

content/browser/media/media_web_contents_observer.cc

+5-14
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include "base/threading/sequenced_task_runner_handle.h"
1515
#include "build/build_config.h"
1616
#include "content/browser/media/audible_metrics.h"
17-
#include "content/browser/media/audio_stream_monitor.h"
1817
#include "content/browser/media/media_devices_util.h"
1918
#include "content/browser/renderer_host/media/media_stream_manager.h"
2019
#include "content/browser/renderer_host/render_frame_host_impl.h"
@@ -318,13 +317,7 @@ MediaWebContentsObserver::MediaPlayerObserverHostImpl::
318317
media_web_contents_observer_(media_web_contents_observer) {}
319318

320319
MediaWebContentsObserver::MediaPlayerObserverHostImpl::
321-
~MediaPlayerObserverHostImpl() {
322-
if (audible_client_added_) {
323-
media_web_contents_observer_->web_contents_impl()
324-
->audio_stream_monitor()
325-
->RemoveAudibleClient();
326-
}
327-
}
320+
~MediaPlayerObserverHostImpl() = default;
328321

329322
void MediaWebContentsObserver::MediaPlayerObserverHostImpl::
330323
BindMediaPlayerObserverReceiver(
@@ -460,12 +453,10 @@ void MediaWebContentsObserver::MediaPlayerObserverHostImpl::
460453
auto* audio_stream_monitor =
461454
media_web_contents_observer_->web_contents_impl()->audio_stream_monitor();
462455

463-
if (should_add_client && !audible_client_added_) {
464-
audio_stream_monitor->AddAudibleClient();
465-
audible_client_added_ = true;
466-
} else if (!should_add_client && audible_client_added_) {
467-
audio_stream_monitor->RemoveAudibleClient();
468-
audible_client_added_ = false;
456+
if (should_add_client && !audio_client_registration_) {
457+
audio_client_registration_ = audio_stream_monitor->RegisterAudibleClient();
458+
} else if (!should_add_client && audio_client_registration_) {
459+
audio_client_registration_.reset();
469460
}
470461
}
471462

content/browser/media/media_web_contents_observer.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "base/macros.h"
1515
#include "base/memory/weak_ptr.h"
1616
#include "build/build_config.h"
17+
#include "content/browser/media/audio_stream_monitor.h"
1718
#include "content/browser/media/media_power_experiment_manager.h"
1819
#include "content/browser/media/session/media_session_controllers_manager.h"
1920
#include "content/common/content_export.h"
@@ -215,7 +216,8 @@ class CONTENT_EXPORT MediaWebContentsObserver : public WebContentsObserver {
215216

216217
// Helps monitor audio stream when not using AudioService.
217218
bool uses_audio_service_ = true;
218-
bool audible_client_added_ = false;
219+
std::unique_ptr<AudioStreamMonitor::AudibleClientRegistration>
220+
audio_client_registration_;
219221
};
220222

221223
using MediaPlayerHostImplMap =

0 commit comments

Comments
 (0)