Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "media/audio/null_audio_sink.h" | 5 #include "media/audio/null_audio_sink.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
| 9 #include "base/sys_byteorder.h" | 9 #include "base/sys_byteorder.h" |
| 10 #include "base/threading/platform_thread.h" | 10 #include "base/threading/platform_thread.h" |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 38 | 38 |
| 39 void NullAudioSink::Start() { | 39 void NullAudioSink::Start() { |
| 40 if (!thread_.Start()) | 40 if (!thread_.Start()) |
| 41 return; | 41 return; |
| 42 | 42 |
| 43 thread_.message_loop()->PostTask(FROM_HERE, base::Bind( | 43 thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
| 44 &NullAudioSink::FillBufferTask, this)); | 44 &NullAudioSink::FillBufferTask, this)); |
| 45 } | 45 } |
| 46 | 46 |
| 47 void NullAudioSink::Stop() { | 47 void NullAudioSink::Stop() { |
| 48 SetPlaying(false); | 48 playing_ = false; |
| 49 thread_.Stop(); | 49 thread_.Stop(); |
| 50 } | 50 } |
| 51 | 51 |
| 52 void NullAudioSink::Play() { | 52 void NullAudioSink::Play() { |
| 53 SetPlaying(true); | 53 playing_ = true; |
| 54 } | 54 } |
| 55 | 55 |
| 56 void NullAudioSink::Pause(bool /* flush */) { | 56 void NullAudioSink::Pause(bool /* flush */) { |
| 57 SetPlaying(false); | 57 playing_ = false; |
| 58 } | 58 } |
| 59 | 59 |
| 60 bool NullAudioSink::SetVolume(double volume) { | 60 bool NullAudioSink::SetVolume(double volume) { |
| 61 // Audio is always muted. | 61 // Audio is always muted. |
| 62 return volume == 0.0; | 62 return volume == 0.0; |
| 63 } | 63 } |
| 64 | 64 |
| 65 void NullAudioSink::SetPlaying(bool is_playing) { | |
| 66 base::AutoLock auto_lock(lock_); | |
| 67 playing_ = is_playing; | |
| 68 } | |
| 69 | |
| 70 NullAudioSink::~NullAudioSink() { | 65 NullAudioSink::~NullAudioSink() { |
| 71 DCHECK(!thread_.IsRunning()); | 66 DCHECK(!thread_.IsRunning()); |
| 72 } | 67 } |
| 73 | 68 |
| 74 void NullAudioSink::FillBufferTask() { | 69 void NullAudioSink::FillBufferTask() { |
| 75 base::AutoLock auto_lock(lock_); | |
| 76 | |
| 77 base::TimeDelta delay; | 70 base::TimeDelta delay; |
| 78 // Only consume buffers when actually playing. | 71 // Only consume buffers when actually playing. |
| 79 if (playing_) { | 72 if (playing_) { |
|
Ami GONE FROM CHROMIUM
2012/11/01 19:57:01
This variable is set on the pipeline thread but is
DaleCurtis
2012/11/01 22:02:59
Normally we don't want to lock on the audio thread
| |
| 80 int frames_received = callback_->Render(audio_bus_.get(), 0); | 73 int frames_received = callback_->Render(audio_bus_.get(), 0); |
| 81 int frames_per_millisecond = | 74 int frames_per_millisecond = |
| 82 params_.sample_rate() / base::Time::kMillisecondsPerSecond; | 75 params_.sample_rate() / base::Time::kMillisecondsPerSecond; |
| 83 | 76 |
| 84 if (hash_audio_for_testing_ && frames_received > 0) { | 77 if (hash_audio_for_testing_ && frames_received > 0) { |
| 85 DCHECK_EQ(sizeof(float), sizeof(uint32)); | 78 DCHECK_EQ(sizeof(float), sizeof(uint32)); |
| 86 int channels = audio_bus_->channels(); | 79 int channels = audio_bus_->channels(); |
| 87 for (int channel_idx = 0; channel_idx < channels; ++channel_idx) { | 80 for (int channel_idx = 0; channel_idx < channels; ++channel_idx) { |
| 88 float* channel = audio_bus_->channel(channel_idx); | 81 float* channel = audio_bus_->channel(channel_idx); |
| 89 for (int frame_idx = 0; frame_idx < frames_received; frame_idx++) { | 82 for (int frame_idx = 0; frame_idx < frames_received; frame_idx++) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 135 base::MD5Final(&digest, &md5_channel_contexts_[i]); | 128 base::MD5Final(&digest, &md5_channel_contexts_[i]); |
| 136 base::MD5Update(&md5_channel_contexts_[0], base::StringPiece( | 129 base::MD5Update(&md5_channel_contexts_[0], base::StringPiece( |
| 137 reinterpret_cast<char*>(&digest), sizeof(base::MD5Digest))); | 130 reinterpret_cast<char*>(&digest), sizeof(base::MD5Digest))); |
| 138 } | 131 } |
| 139 | 132 |
| 140 base::MD5Final(&digest, &md5_channel_contexts_[0]); | 133 base::MD5Final(&digest, &md5_channel_contexts_[0]); |
| 141 return base::MD5DigestToBase16(digest); | 134 return base::MD5DigestToBase16(digest); |
| 142 } | 135 } |
| 143 | 136 |
| 144 } // namespace media | 137 } // namespace media |
| OLD | NEW |