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

Unified Diff: media/audio/virtual_audio_input_stream.cc

Issue 11416350: Tab Audio Mirroring: WebContentsAudioInputStream is a new implementation which represents the lifet… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Destructors hate ASSERT() in unit tests. Created 7 years, 11 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
Index: media/audio/virtual_audio_input_stream.cc
diff --git a/media/audio/virtual_audio_input_stream.cc b/media/audio/virtual_audio_input_stream.cc
index 4f2f9bd04fb84a4619766597777c75665b5641c6..e3145093be792a79cfed91f3fa715301159a44de 100644
--- a/media/audio/virtual_audio_input_stream.cc
+++ b/media/audio/virtual_audio_input_stream.cc
@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/message_loop.h"
+#include "base/message_loop_proxy.h"
#include "media/audio/virtual_audio_output_stream.h"
namespace media {
@@ -47,26 +48,20 @@ class LoopbackAudioConverter : public AudioConverter::InputCallback {
DISALLOW_COPY_AND_ASSIGN(LoopbackAudioConverter);
};
-VirtualAudioInputStream* VirtualAudioInputStream::MakeStream(
- AudioManagerBase* manager, const AudioParameters& params,
- base::MessageLoopProxy* message_loop) {
- return new VirtualAudioInputStream(manager, params, message_loop);
-}
-
VirtualAudioInputStream::VirtualAudioInputStream(
- AudioManagerBase* manager, const AudioParameters& params,
- base::MessageLoopProxy* message_loop)
- : audio_manager_(manager),
- message_loop_(message_loop),
+ const AudioParameters& params, base::MessageLoopProxy* message_loop)
+ : message_loop_(message_loop),
callback_(NULL),
- buffer_duration_ms_(base::TimeDelta::FromMilliseconds(
- params.frames_per_buffer() * base::Time::kMillisecondsPerSecond /
- static_cast<float>(params.sample_rate()))),
+ buffer_duration_(base::TimeDelta::FromMicroseconds(
+ params.frames_per_buffer() * base::Time::kMicrosecondsPerSecond /
+ params.sample_rate())),
buffer_(new uint8[params.GetBytesPerBuffer()]),
params_(params),
audio_bus_(AudioBus::Create(params_)),
mixer_(params_, params_, false),
- num_attached_outputs_streams_(0) {
+ num_attached_output_streams_(0) {
+ DCHECK(params_.IsValid());
+ DCHECK(message_loop_);
}
VirtualAudioInputStream::~VirtualAudioInputStream() {
@@ -74,10 +69,16 @@ VirtualAudioInputStream::~VirtualAudioInputStream() {
it != converters_.end(); ++it)
delete it->second;
- DCHECK_EQ(0, num_attached_outputs_streams_);
+ DCHECK_EQ(0, num_attached_output_streams_);
+}
+
+void VirtualAudioInputStream::RunOnceClosed(const base::Closure& cb) {
+ DCHECK(on_close_cb_.is_null());
+ on_close_cb_ = cb;
}
bool VirtualAudioInputStream::Open() {
+ DCHECK(message_loop_->BelongsToCurrentThread());
memset(buffer_.get(), 0, params_.GetBytesPerBuffer());
return true;
}
@@ -87,8 +88,7 @@ void VirtualAudioInputStream::Start(AudioInputCallback* callback) {
callback_ = callback;
on_more_data_cb_.Reset(base::Bind(&VirtualAudioInputStream::ReadAudio,
base::Unretained(this)));
- audio_manager_->GetMessageLoop()->PostTask(FROM_HERE,
- on_more_data_cb_.callback());
+ message_loop_->PostTask(FROM_HERE, on_more_data_cb_.callback());
}
void VirtualAudioInputStream::Stop() {
@@ -111,7 +111,7 @@ void VirtualAudioInputStream::AddOutputStream(
mixer_.AddInput(converter->second);
}
converter->second->AddInput(stream);
- ++num_attached_outputs_streams_;
+ ++num_attached_output_streams_;
}
void VirtualAudioInputStream::RemoveOutputStream(
@@ -121,7 +121,8 @@ void VirtualAudioInputStream::RemoveOutputStream(
DCHECK(converters_.find(output_params) != converters_.end());
converters_[output_params]->RemoveInput(stream);
- --num_attached_outputs_streams_;
+ --num_attached_output_streams_;
+ DCHECK_LE(0, num_attached_output_streams_);
}
void VirtualAudioInputStream::ReadAudio() {
@@ -139,9 +140,14 @@ void VirtualAudioInputStream::ReadAudio() {
params_.GetBytesPerBuffer(),
1.0);
+ // TODO(miu): We want ReadAudio() to be called every buffer_duration_ amount
+ // of time. However, we're not accounting for the time spent doing the
+ // conversion and data delivery above, which is significant. Therefore, audio
+ // data is always being delivered at a slower rate than required, and this
+ // will cause cut-outs!
DaleCurtis 2013/01/15 22:02:18 Justin has a fix out for this?
miu 2013/01/16 03:22:18 Yep (https://codereview.chromium.org/11889041/).
message_loop_->PostDelayedTask(FROM_HERE,
on_more_data_cb_.callback(),
- buffer_duration_ms_);
+ buffer_duration_);
}
void VirtualAudioInputStream::Close() {
@@ -151,7 +157,11 @@ void VirtualAudioInputStream::Close() {
callback_->OnClose(this);
callback_ = NULL;
}
- audio_manager_->ReleaseInputStream(this);
+ if (!on_close_cb_.is_null()) {
+ const base::Closure cb = on_close_cb_;
+ on_close_cb_.Reset();
+ cb.Run();
+ }
}
double VirtualAudioInputStream::GetMaxVolume() {

Powered by Google App Engine
This is Rietveld 408576698