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

Side by Side Diff: remoting/client/audio_decode_scheduler.cc

Issue 10907187: Don't use base::Unretained in AudioDecodeScheduler. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « remoting/client/audio_decode_scheduler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/client/audio_decode_scheduler.h" 5 #include "remoting/client/audio_decode_scheduler.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "remoting/client/audio_player.h" 10 #include "remoting/client/audio_player.h"
11 #include "remoting/codec/audio_decoder.h" 11 #include "remoting/codec/audio_decoder.h"
12 #include "remoting/proto/audio.pb.h" 12 #include "remoting/proto/audio.pb.h"
13 13
14 namespace remoting { 14 namespace remoting {
15 15
16 AudioDecodeScheduler::AudioDecodeScheduler( 16 class AudioDecodeScheduler::Core : public base::RefCountedThreadSafe<Core> {
17 public:
18 Core(scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
19 scoped_refptr<base::SingleThreadTaskRunner> audio_decode_task_runner,
20 scoped_ptr<AudioPlayer> audio_player);
21
22 void Initialize(const protocol::SessionConfig& config);
23 void ProcessAudioPacket(scoped_ptr<AudioPacket> packet,
24 const base::Closure& done);
25
26 // Called by AudioDecodeScheduler when it is destroyed.
27 void Detach();
28
29 private:
30 friend class base::RefCountedThreadSafe<Core>;
31
32 virtual ~Core();
33
34 // Called on the audio decoder thread.
35 void DecodePacket(scoped_ptr<AudioPacket> packet, const base::Closure& done);
36
37 // Called on the main thread.
38 void ProcessDecodedPacket(scoped_ptr<AudioPacket> packet,
39 const base::Closure& done);
40
41 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
42 scoped_refptr<base::SingleThreadTaskRunner> audio_decode_task_runner_;
43 scoped_ptr<AudioDecoder> decoder_;
44 scoped_ptr<AudioPlayer> audio_player_;
45
46 DISALLOW_COPY_AND_ASSIGN(Core);
47 };
48
49 AudioDecodeScheduler::Core::Core(
17 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 50 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
18 scoped_refptr<base::SingleThreadTaskRunner> audio_decode_task_runner, 51 scoped_refptr<base::SingleThreadTaskRunner> audio_decode_task_runner,
19 scoped_ptr<AudioPlayer> audio_player) 52 scoped_ptr<AudioPlayer> audio_player)
20 : main_task_runner_(main_task_runner), 53 : main_task_runner_(main_task_runner),
21 audio_decode_task_runner_(audio_decode_task_runner), 54 audio_decode_task_runner_(audio_decode_task_runner),
22 audio_player_(audio_player.Pass()) { 55 audio_player_(audio_player.Pass()) {
23 } 56 }
24 57
25 AudioDecodeScheduler::~AudioDecodeScheduler() { 58 AudioDecodeScheduler::Core::~Core() {
26 } 59 }
27 60
28 void AudioDecodeScheduler::Initialize(const protocol::SessionConfig& config) { 61 void AudioDecodeScheduler::Core::Initialize(
62 const protocol::SessionConfig& config) {
29 DCHECK(main_task_runner_->BelongsToCurrentThread()); 63 DCHECK(main_task_runner_->BelongsToCurrentThread());
30 decoder_.reset(AudioDecoder::CreateAudioDecoder(config).release()); 64 decoder_.reset(AudioDecoder::CreateAudioDecoder(config).release());
31 } 65 }
32 66
33 void AudioDecodeScheduler::ProcessAudioPacket(scoped_ptr<AudioPacket> packet, 67 void AudioDecodeScheduler::Core::ProcessAudioPacket(
34 const base::Closure& done) { 68 scoped_ptr<AudioPacket> packet,
69 const base::Closure& done) {
35 DCHECK(main_task_runner_->BelongsToCurrentThread()); 70 DCHECK(main_task_runner_->BelongsToCurrentThread());
36 audio_decode_task_runner_->PostTask(FROM_HERE, base::Bind( 71 audio_decode_task_runner_->PostTask(FROM_HERE, base::Bind(
37 &AudioDecodeScheduler::DecodePacket, base::Unretained(this), 72 &AudioDecodeScheduler::Core::DecodePacket, this,
38 base::Passed(&packet), done)); 73 base::Passed(&packet), done));
39 } 74 }
40 75
41 void AudioDecodeScheduler::DecodePacket(scoped_ptr<AudioPacket> packet, 76 void AudioDecodeScheduler::Core::Detach() {
42 const base::Closure& done) { 77 DCHECK(main_task_runner_->BelongsToCurrentThread());
78 audio_player_.reset();
79 }
80
81 void AudioDecodeScheduler::Core::DecodePacket(
82 scoped_ptr<AudioPacket> packet,
83 const base::Closure& done) {
43 DCHECK(audio_decode_task_runner_->BelongsToCurrentThread()); 84 DCHECK(audio_decode_task_runner_->BelongsToCurrentThread());
44 scoped_ptr<AudioPacket> decoded_packet = decoder_->Decode(packet.Pass()); 85 scoped_ptr<AudioPacket> decoded_packet = decoder_->Decode(packet.Pass());
45 86
46 main_task_runner_->PostTask(FROM_HERE, base::Bind( 87 main_task_runner_->PostTask(FROM_HERE, base::Bind(
47 &AudioDecodeScheduler::ProcessDecodedPacket, base::Unretained(this), 88 &AudioDecodeScheduler::Core::ProcessDecodedPacket, this,
48 base::Passed(decoded_packet.Pass()), done)); 89 base::Passed(decoded_packet.Pass()), done));
49 } 90 }
50 91
51 void AudioDecodeScheduler::ProcessDecodedPacket(scoped_ptr<AudioPacket> packet, 92 void AudioDecodeScheduler::Core::ProcessDecodedPacket(
52 const base::Closure& done) { 93 scoped_ptr<AudioPacket> packet,
94 const base::Closure& done) {
53 DCHECK(main_task_runner_->BelongsToCurrentThread()); 95 DCHECK(main_task_runner_->BelongsToCurrentThread());
54 // Only process |packet| if it is non-NULL. 96 // Only process |packet| if it is non-NULL.
55 if (packet.get()) 97 if (packet.get() && audio_player_.get())
56 audio_player_->ProcessAudioPacket(packet.Pass()); 98 audio_player_->ProcessAudioPacket(packet.Pass());
57 done.Run(); 99 done.Run();
58 } 100 }
59 101
102 AudioDecodeScheduler::AudioDecodeScheduler(
103 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
104 scoped_refptr<base::SingleThreadTaskRunner> audio_decode_task_runner,
105 scoped_ptr<AudioPlayer> audio_player)
106 : core_(new Core(main_task_runner, audio_decode_task_runner,
107 audio_player.Pass())) {
108 }
109
110 AudioDecodeScheduler::~AudioDecodeScheduler() {
111 core_->Detach();
112 }
113
114 void AudioDecodeScheduler::Initialize(const protocol::SessionConfig& config) {
115 core_->Initialize(config);
116 }
117
118 void AudioDecodeScheduler::ProcessAudioPacket(scoped_ptr<AudioPacket> packet,
119 const base::Closure& done) {
120 core_->ProcessAudioPacket(packet.Pass(), done);
121 }
122
60 } // namespace remoting 123 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/audio_decode_scheduler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698