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

Side by Side Diff: remoting/host/audio_pump.cc

Issue 866863004: Replace AudioScheduler with AudioPump. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mouse_cursor_pipe
Patch Set: Created 5 years, 10 months 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 2015 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 "remoting/host/audio_pump.h"
6
7 #include "base/bind.h"
8 #include "base/location.h"
9 #include "base/logging.h"
10 #include "base/single_thread_task_runner.h"
11 #include "remoting/codec/audio_encoder.h"
12 #include "remoting/host/audio_capturer.h"
13 #include "remoting/proto/audio.pb.h"
14 #include "remoting/protocol/audio_stub.h"
15
16 namespace remoting {
17
18 class AudioPump::Core {
19 public:
20 Core(base::WeakPtr<AudioPump> pump,
21 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
22 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
23 scoped_ptr<AudioCapturer> audio_capturer,
24 scoped_ptr<AudioEncoder> audio_encoder);
25 ~Core();
26
27 void Start();
28 void Pause(bool pause);
29
30 private:
31 void EncodeAudioPacket(scoped_ptr<AudioPacket> packet);
32
33 base::WeakPtr<AudioPump> pump_;
34
35 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_;
36 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
Wez 2015/02/11 01:41:12 See elsewhere re "network" naming
Sergey Ulanov 2015/02/11 21:18:12 Done.
37
38 scoped_ptr<AudioCapturer> audio_capturer_;
39
40 scoped_ptr<AudioEncoder> audio_encoder_;
41
42 bool enabled_;
43
44 DISALLOW_COPY_AND_ASSIGN(Core);
45 };
46
47 AudioPump::Core::Core(
48 base::WeakPtr<AudioPump> pump,
49 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
50 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
51 scoped_ptr<AudioCapturer> audio_capturer,
52 scoped_ptr<AudioEncoder> audio_encoder)
53 : pump_(pump),
54 audio_task_runner_(audio_task_runner),
55 network_task_runner_(network_task_runner),
56 audio_capturer_(audio_capturer.Pass()),
57 audio_encoder_(audio_encoder.Pass()),
58 enabled_(true) {
59 }
60
61 AudioPump::Core::~Core() {
62 DCHECK(audio_task_runner_->BelongsToCurrentThread());
63 }
64
65 void AudioPump::Core::Start() {
66 DCHECK(audio_task_runner_->BelongsToCurrentThread());
67
68 audio_capturer_->Start(
69 base::Bind(&Core::EncodeAudioPacket, base::Unretained(this)));
70 }
71
72 void AudioPump::Core::Pause(bool pause) {
73 DCHECK(audio_task_runner_->BelongsToCurrentThread());
74
75 enabled_ = !pause;
76 }
77
78 void AudioPump::Core::EncodeAudioPacket(scoped_ptr<AudioPacket> packet) {
79 DCHECK(audio_task_runner_->BelongsToCurrentThread());
80 DCHECK(packet.get());
Wez 2015/02/11 01:41:13 DCHECK(packet)
Sergey Ulanov 2015/02/11 21:18:12 Done.
81
82 if (!enabled_)
83 return;
84
85 scoped_ptr<AudioPacket> encoded_packet =
86 audio_encoder_->Encode(packet.Pass());
87
88 // The audio encoder returns a null audio packet if there's no audio to send.
89 if (!encoded_packet)
90 return;
91
92 network_task_runner_->PostTask(FROM_HERE,
93 base::Bind(&AudioPump::SendAudioPacket, pump_,
94 base::Passed(&encoded_packet)));
95 }
96
97 AudioPump::AudioPump(
98 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
99 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
100 scoped_ptr<AudioCapturer> audio_capturer,
101 scoped_ptr<AudioEncoder> audio_encoder,
102 protocol::AudioStub* audio_stub)
103 : audio_task_runner_(audio_task_runner),
104 audio_stub_(audio_stub),
105 weak_factory_(this) {
106 DCHECK(network_task_runner->BelongsToCurrentThread());
107 DCHECK(audio_stub_);
108
109 core_.reset(new Core(weak_factory_.GetWeakPtr(), audio_task_runner,
110 network_task_runner, audio_capturer.Pass(),
111 audio_encoder.Pass()));
112
113 audio_task_runner_->PostTask(
114 FROM_HERE, base::Bind(&Core::Start, base::Unretained(core_.get())));
115 }
116
117 AudioPump::~AudioPump() {
Wez 2015/02/11 01:41:13 Thread check network_task_runner_?
Sergey Ulanov 2015/02/11 21:18:12 Done.
118 audio_task_runner_->DeleteSoon(FROM_HERE, core_.release());
119 }
120
121 void AudioPump::Pause(bool pause) {
122 DCHECK(CalledOnValidThread());
Wez 2015/02/11 01:41:12 Does this need to be both BaseNonThreadSafe and ho
Sergey Ulanov 2015/02/11 21:18:12 Done.
123
124 audio_task_runner_->PostTask(
125 FROM_HERE,
126 base::Bind(&Core::Pause, base::Unretained(core_.get()), pause));
127 }
128
129 void AudioPump::SendAudioPacket(scoped_ptr<AudioPacket> packet) {
130 DCHECK(CalledOnValidThread());
131 DCHECK(packet.get());
Wez 2015/02/11 01:41:12 nit: DCHECK(packet)
Sergey Ulanov 2015/02/11 21:18:12 Done.
132
133 audio_stub_->ProcessAudioPacket(packet.Pass(), base::Closure());
Wez 2015/02/11 01:41:12 nit: Do we ever use the done callback in ProcessAu
Sergey Ulanov 2015/02/11 21:18:12 Actually I think it's wrong that we are not using
Wez 2015/02/12 02:26:18 Acknowledged.
134 }
135
136 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698