Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Side by Side Diff: content/browser/renderer_host/media/audio_output_delegate.cc

Issue 2443573003: Factor out AudioOutputDelegate from AudioRendererHost. (Closed)
Patch Set: Change iterator. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/renderer_host/media/audio_output_delegate.h"
6
7 #include <utility>
8
9 #include "base/bind.h"
10 #include "content/browser/media/audio_stream_monitor.h"
11 #include "content/browser/media/media_internals.h"
12 #include "content/public/browser/browser_thread.h"
13
14 namespace content {
15
16 AudioOutputDelegate::AudioOutputDelegate(
17 EventHandler* handler,
18 std::unique_ptr<media::AudioLog> audio_log,
19 AudioMirroringManager* mirroring_manager,
20 MediaObserver* media_observer,
21 int stream_id,
22 int render_frame_id,
23 int render_process_id,
24 media::AudioParameters params,
25 const std::string& output_device_id)
26 : handler_(handler),
27 audio_log_(std::move(audio_log)),
28 mirroring_manager_(mirroring_manager),
29 reader_(AudioSyncReader::Create(params)),
30 controller_(
31 media::AudioOutputController::Create(media::AudioManager::Get(),
32 this,
33 params,
34 output_device_id,
35 reader_.get())),
36 stream_id_(stream_id),
37 render_frame_id_(render_frame_id),
38 render_process_id_(render_process_id),
39 weak_factory_(this) {
40 DCHECK(controller_);
41 if (media_observer)
42 media_observer->OnCreatingAudioStream(render_process_id_, render_frame_id_);
43 if (mirroring_manager_)
44 mirroring_manager_->AddDiverter(render_process_id_, render_frame_id_,
45 controller_.get());
46 audio_log_->OnCreated(stream_id, params, output_device_id);
47 MediaInternals::GetInstance()->SetWebContentsTitleForAudioLogEntry(
48 stream_id_, render_process_id_, render_frame_id_, audio_log_.get());
49 }
50
51 AudioOutputDelegate::~AudioOutputDelegate() {
52 DCHECK(closed_);
o1ka 2016/10/26 13:11:48 thread check?
53 DCHECK(!playing_);
54 }
55
56 void AudioOutputDelegate::OnPlayStream() {
57 DCHECK_CURRENTLY_ON(BrowserThread::IO);
58 DCHECK(!closed_);
59 controller_->Play();
60 audio_log_->OnStarted(stream_id_);
61 }
62
63 void AudioOutputDelegate::OnPauseStream() {
64 DCHECK_CURRENTLY_ON(BrowserThread::IO);
65 DCHECK(!closed_);
66 controller_->Pause();
67 audio_log_->OnStopped(stream_id_);
68 }
69
70 void AudioOutputDelegate::OnSetVolume(double volume) {
71 DCHECK_CURRENTLY_ON(BrowserThread::IO);
72 DCHECK(!closed_);
73 controller_->SetVolume(volume);
74 audio_log_->OnSetVolume(stream_id_, volume);
75 }
76
77 void AudioOutputDelegate::OnCloseStream(
78 std::unique_ptr<AudioOutputDelegate> owned_this) {
79 DCHECK_CURRENTLY_ON(BrowserThread::IO);
o1ka 2016/10/26 13:11:48 DCHEK(this == owned_this.get())?
80 DCHECK(!closed_);
81 UpdatePlayingStateForHandler(false);
82 closed_ = true;
83 audio_log_->OnClosed(stream_id_);
84 controller_->Close(base::Bind(&AudioOutputDelegate::FinishClosing,
85 base::Owned(owned_this.release())));
86 }
87
88 void AudioOutputDelegate::FinishClosing() {
89 AudioStreamMonitor::StopMonitoringStream(render_process_id_, render_frame_id_,
90 stream_id_);
91
92 mirroring_manager_->RemoveDiverter(controller_.get());
93 }
94
95 void AudioOutputDelegate::OnControllerCreated() {
96 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
97 BrowserThread::PostTask(
98 BrowserThread::IO, FROM_HERE,
99 base::Bind(&AudioOutputDelegate::OnControllerCreated,
100 weak_factory_.GetWeakPtr()));
101 return;
102 }
103 if (closed_)
104 return;
105
106 handler_->OnStreamCreated(stream_id_, reader_->shared_memory(),
107 reader_->foreign_socket());
108 }
109
110 void AudioOutputDelegate::OnControllerPlaying() {
111 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
112 BrowserThread::PostTask(
113 BrowserThread::IO, FROM_HERE,
114 base::Bind(&AudioOutputDelegate::OnControllerPlaying,
115 weak_factory_.GetWeakPtr()));
116 return;
117 }
118 if (closed_)
119 return;
120
121 UpdatePlayingStateForHandler(false);
o1ka 2016/10/26 13:11:48 true?
122
123 AudioStreamMonitor::StartMonitoringStream(
124 render_process_id_, render_frame_id_, stream_id_,
125 base::Bind(&media::AudioOutputController::ReadCurrentPowerAndClip,
126 controller_));
127 }
128
129 void AudioOutputDelegate::OnControllerPaused() {
130 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
131 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
132 base::Bind(&AudioOutputDelegate::OnControllerPaused,
133 weak_factory_.GetWeakPtr()));
134 return;
135 }
136 if (closed_)
137 return;
138
139 UpdatePlayingStateForHandler(false);
140
141 AudioStreamMonitor::StopMonitoringStream(render_process_id_, render_frame_id_,
142 stream_id_);
143 }
144
145 void AudioOutputDelegate::OnControllerError() {
146 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
147 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
148 base::Bind(&AudioOutputDelegate::OnControllerError,
149 weak_factory_.GetWeakPtr()));
150 return;
151 }
152 if (closed_)
153 return;
154
155 audio_log_->OnError(stream_id_);
156 handler_->OnStreamError(stream_id_);
157 }
158
159 void AudioOutputDelegate::UpdatePlayingStateForHandler(bool playing) {
o1ka 2016/10/26 13:11:48 thread DCHECK?
160 if (playing != playing_) {
161 playing_ = playing;
162 handler_->OnStreamStateChanged(playing_);
163 }
164 }
165
166 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698