diff options
author | wez@chromium.org <wez@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-23 01:06:31 +0000 |
---|---|---|
committer | wez@chromium.org <wez@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-23 01:06:31 +0000 |
commit | 0c850013a3ca89673bc8f0be9a620d63c06955e8 (patch) | |
tree | 7dceca22a3bb565108870e100777bb740e9ac656 /remoting/host | |
parent | 90e567f24427e220d41b22c016e092a3836e8a8b (diff) | |
download | chromium_src-0c850013a3ca89673bc8f0be9a620d63c06955e8.zip chromium_src-0c850013a3ca89673bc8f0be9a620d63c06955e8.tar.gz chromium_src-0c850013a3ca89673bc8f0be9a620d63c06955e8.tar.bz2 |
Simplify the AudioScheduler implementation.
- Merge OnClientDisconnected() into Stop(), since each AudioScheduler now supports only a single ClientSession.
- Remove unnecessary thread-hopping in the implementation of Stop().
- Guarantee that no more packets will reach AudioStub after Stop() returns.
Review URL: https://chromiumcodereview.appspot.com/11232027
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@163465 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/host')
-rw-r--r-- | remoting/host/audio_scheduler.cc | 82 | ||||
-rw-r--r-- | remoting/host/audio_scheduler.h | 20 | ||||
-rw-r--r-- | remoting/host/client_session.cc | 1 |
3 files changed, 42 insertions, 61 deletions
diff --git a/remoting/host/audio_scheduler.cc b/remoting/host/audio_scheduler.cc index c5e3ef3..02cc989 100644 --- a/remoting/host/audio_scheduler.cc +++ b/remoting/host/audio_scheduler.cc @@ -29,62 +29,43 @@ AudioScheduler::AudioScheduler( audio_stub_(audio_stub), network_stopped_(false), enabled_(true) { - DCHECK(audio_task_runner_); - DCHECK(network_task_runner_); + DCHECK(network_task_runner_->BelongsToCurrentThread()); DCHECK(audio_capturer_); DCHECK(audio_stub_); + audio_task_runner_->PostTask( - FROM_HERE, base::Bind(&AudioScheduler::DoStart, this)); + FROM_HERE, base::Bind(&AudioScheduler::StartOnAudioThread, this)); } void AudioScheduler::Stop(const base::Closure& done_task) { - DCHECK(!done_task.is_null()); - - if (!audio_task_runner_->BelongsToCurrentThread()) { - audio_task_runner_->PostTask(FROM_HERE, base::Bind( - &AudioScheduler::Stop, this, done_task)); - return; - } - - audio_capturer_->Stop(); - - network_task_runner_->PostTask(FROM_HERE, base::Bind( - &AudioScheduler::DoStopOnNetworkThread, this, done_task)); -} - -void AudioScheduler::OnClientDisconnected() { DCHECK(network_task_runner_->BelongsToCurrentThread()); + DCHECK(!done_task.is_null()); DCHECK(audio_stub_); + + // Clear |audio_stub_| to prevent audio packets being delivered to the client. audio_stub_ = NULL; + + audio_task_runner_->PostTask( + FROM_HERE, + base::Bind(&AudioScheduler::StopOnAudioThread, this, done_task)); } AudioScheduler::~AudioScheduler() { } -void AudioScheduler::NotifyAudioPacketCaptured( - scoped_ptr<AudioPacket> packet) { - DCHECK(packet.get()); - - if (!enabled_) - return; - - scoped_ptr<AudioPacket> encoded_packet = - audio_encoder_->Encode(packet.Pass()); +void AudioScheduler::StartOnAudioThread() { + DCHECK(audio_task_runner_->BelongsToCurrentThread()); - // The audio encoder returns a NULL audio packet if there's no audio to send. - if (encoded_packet.get()) { - network_task_runner_->PostTask( - FROM_HERE, base::Bind(&AudioScheduler::DoSendAudioPacket, - this, base::Passed(encoded_packet.Pass()))); - } + // TODO(kxing): Do something with the return value. + audio_capturer_->Start( + base::Bind(&AudioScheduler::EncodeAudioPacket, this)); } -void AudioScheduler::DoStart() { +void AudioScheduler::StopOnAudioThread(const base::Closure& done_task) { DCHECK(audio_task_runner_->BelongsToCurrentThread()); + audio_capturer_->Stop(); - // TODO(kxing): Do something with the return value. - audio_capturer_->Start( - base::Bind(&AudioScheduler::NotifyAudioPacketCaptured, this)); + network_task_runner_->PostTask(FROM_HERE, done_task); } void AudioScheduler::SetEnabled(bool enabled) { @@ -97,27 +78,32 @@ void AudioScheduler::SetEnabled(bool enabled) { enabled_ = enabled; } -void AudioScheduler::DoSendAudioPacket(scoped_ptr<AudioPacket> packet) { - DCHECK(network_task_runner_->BelongsToCurrentThread()); +void AudioScheduler::EncodeAudioPacket(scoped_ptr<AudioPacket> packet) { + DCHECK(audio_task_runner_->BelongsToCurrentThread()); DCHECK(packet.get()); - if (network_stopped_ || !audio_stub_) + if (!enabled_) return; - audio_stub_->ProcessAudioPacket( - packet.Pass(), - base::Bind(&AudioScheduler::OnCaptureCallbackNotified, this)); -} + scoped_ptr<AudioPacket> encoded_packet = + audio_encoder_->Encode(packet.Pass()); -void AudioScheduler::OnCaptureCallbackNotified() { + // The audio encoder returns a NULL audio packet if there's no audio to send. + if (encoded_packet.get()) { + network_task_runner_->PostTask( + FROM_HERE, base::Bind(&AudioScheduler::SendAudioPacket, + this, base::Passed(encoded_packet.Pass()))); + } } -void AudioScheduler::DoStopOnNetworkThread(const base::Closure& done_task) { +void AudioScheduler::SendAudioPacket(scoped_ptr<AudioPacket> packet) { DCHECK(network_task_runner_->BelongsToCurrentThread()); + DCHECK(packet.get()); - network_stopped_ = true; + if (!audio_stub_) + return; - done_task.Run(); + audio_stub_->ProcessAudioPacket(packet.Pass(), base::Closure()); } } // namespace remoting diff --git a/remoting/host/audio_scheduler.h b/remoting/host/audio_scheduler.h index 130edeb..9ccc991 100644 --- a/remoting/host/audio_scheduler.h +++ b/remoting/host/audio_scheduler.h @@ -43,9 +43,6 @@ class AudioScheduler : public base::RefCountedThreadSafe<AudioScheduler> { // Stop the recording session. void Stop(const base::Closure& done_task); - // Called when a client disconnects. - void OnClientDisconnected(); - // Enable or disable audio on a running session. // This leaves the audio capturer running, and only affects whether or not the // captured audio is encoded and sent on the wire. @@ -55,18 +52,17 @@ class AudioScheduler : public base::RefCountedThreadSafe<AudioScheduler> { friend class base::RefCountedThreadSafe<AudioScheduler>; virtual ~AudioScheduler(); - void NotifyAudioPacketCaptured(scoped_ptr<AudioPacket> packet); - - void DoStart(); + // Called on the audio thread to start capturing. + void StartOnAudioThread(); - // Sends an audio packet to the client. - void DoSendAudioPacket(scoped_ptr<AudioPacket> packet); + // Called on the audio thread to stop capturing. + void StopOnAudioThread(const base::Closure& done_task); - // Signal network thread to cease activities. - void DoStopOnNetworkThread(const base::Closure& done_task); + // Called on the audio thread when a new audio packet is available. + void EncodeAudioPacket(scoped_ptr<AudioPacket> packet); - // Called when an AudioPacket has been delivered to the client. - void OnCaptureCallbackNotified(); + // Called on the network thread to send a captured packet to the audio stub. + void SendAudioPacket(scoped_ptr<AudioPacket> packet); scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_; diff --git a/remoting/host/client_session.cc b/remoting/host/client_session.cc index 7400287..d311d46 100644 --- a/remoting/host/client_session.cc +++ b/remoting/host/client_session.cc @@ -213,7 +213,6 @@ void ClientSession::Stop(const base::Closure& done_task) { done_task_ = done_task; if (audio_scheduler_.get()) { - audio_scheduler_->OnClientDisconnected(); audio_scheduler_->Stop(base::Bind(&ClientSession::OnRecorderStopped, this)); audio_scheduler_ = NULL; } |