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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/client/audio_decode_scheduler.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/client/audio_decode_scheduler.cc
diff --git a/remoting/client/audio_decode_scheduler.cc b/remoting/client/audio_decode_scheduler.cc
index 940eb66bc46794b3d57a34f0a76bf27adfdf303a..da17fbdbb801c3fa296cbb5e4745fcabac8f4716 100644
--- a/remoting/client/audio_decode_scheduler.cc
+++ b/remoting/client/audio_decode_scheduler.cc
@@ -13,7 +13,40 @@
namespace remoting {
-AudioDecodeScheduler::AudioDecodeScheduler(
+class AudioDecodeScheduler::Core : public base::RefCountedThreadSafe<Core> {
+ public:
+ Core(scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
+ scoped_refptr<base::SingleThreadTaskRunner> audio_decode_task_runner,
+ scoped_ptr<AudioPlayer> audio_player);
+
+ void Initialize(const protocol::SessionConfig& config);
+ void ProcessAudioPacket(scoped_ptr<AudioPacket> packet,
+ const base::Closure& done);
+
+ // Called by AudioDecodeScheduler when it is destroyed.
+ void Detach();
+
+ private:
+ friend class base::RefCountedThreadSafe<Core>;
+
+ virtual ~Core();
+
+ // Called on the audio decoder thread.
+ void DecodePacket(scoped_ptr<AudioPacket> packet, const base::Closure& done);
+
+ // Called on the main thread.
+ void ProcessDecodedPacket(scoped_ptr<AudioPacket> packet,
+ const base::Closure& done);
+
+ scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
+ scoped_refptr<base::SingleThreadTaskRunner> audio_decode_task_runner_;
+ scoped_ptr<AudioDecoder> decoder_;
+ scoped_ptr<AudioPlayer> audio_player_;
+
+ DISALLOW_COPY_AND_ASSIGN(Core);
+};
+
+AudioDecodeScheduler::Core::Core(
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> audio_decode_task_runner,
scoped_ptr<AudioPlayer> audio_player)
@@ -22,39 +55,69 @@ AudioDecodeScheduler::AudioDecodeScheduler(
audio_player_(audio_player.Pass()) {
}
-AudioDecodeScheduler::~AudioDecodeScheduler() {
+AudioDecodeScheduler::Core::~Core() {
}
-void AudioDecodeScheduler::Initialize(const protocol::SessionConfig& config) {
+void AudioDecodeScheduler::Core::Initialize(
+ const protocol::SessionConfig& config) {
DCHECK(main_task_runner_->BelongsToCurrentThread());
decoder_.reset(AudioDecoder::CreateAudioDecoder(config).release());
}
-void AudioDecodeScheduler::ProcessAudioPacket(scoped_ptr<AudioPacket> packet,
- const base::Closure& done) {
+void AudioDecodeScheduler::Core::ProcessAudioPacket(
+ scoped_ptr<AudioPacket> packet,
+ const base::Closure& done) {
DCHECK(main_task_runner_->BelongsToCurrentThread());
audio_decode_task_runner_->PostTask(FROM_HERE, base::Bind(
- &AudioDecodeScheduler::DecodePacket, base::Unretained(this),
+ &AudioDecodeScheduler::Core::DecodePacket, this,
base::Passed(&packet), done));
}
-void AudioDecodeScheduler::DecodePacket(scoped_ptr<AudioPacket> packet,
- const base::Closure& done) {
+void AudioDecodeScheduler::Core::Detach() {
+ DCHECK(main_task_runner_->BelongsToCurrentThread());
+ audio_player_.reset();
+}
+
+void AudioDecodeScheduler::Core::DecodePacket(
+ scoped_ptr<AudioPacket> packet,
+ const base::Closure& done) {
DCHECK(audio_decode_task_runner_->BelongsToCurrentThread());
scoped_ptr<AudioPacket> decoded_packet = decoder_->Decode(packet.Pass());
main_task_runner_->PostTask(FROM_HERE, base::Bind(
- &AudioDecodeScheduler::ProcessDecodedPacket, base::Unretained(this),
+ &AudioDecodeScheduler::Core::ProcessDecodedPacket, this,
base::Passed(decoded_packet.Pass()), done));
}
-void AudioDecodeScheduler::ProcessDecodedPacket(scoped_ptr<AudioPacket> packet,
- const base::Closure& done) {
+void AudioDecodeScheduler::Core::ProcessDecodedPacket(
+ scoped_ptr<AudioPacket> packet,
+ const base::Closure& done) {
DCHECK(main_task_runner_->BelongsToCurrentThread());
// Only process |packet| if it is non-NULL.
- if (packet.get())
+ if (packet.get() && audio_player_.get())
audio_player_->ProcessAudioPacket(packet.Pass());
done.Run();
}
+AudioDecodeScheduler::AudioDecodeScheduler(
+ scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
+ scoped_refptr<base::SingleThreadTaskRunner> audio_decode_task_runner,
+ scoped_ptr<AudioPlayer> audio_player)
+ : core_(new Core(main_task_runner, audio_decode_task_runner,
+ audio_player.Pass())) {
+}
+
+AudioDecodeScheduler::~AudioDecodeScheduler() {
+ core_->Detach();
+}
+
+void AudioDecodeScheduler::Initialize(const protocol::SessionConfig& config) {
+ core_->Initialize(config);
+}
+
+void AudioDecodeScheduler::ProcessAudioPacket(scoped_ptr<AudioPacket> packet,
+ const base::Closure& done) {
+ core_->ProcessAudioPacket(packet.Pass(), done);
+}
+
} // namespace remoting
« 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