| Index: media/audio/virtual_audio_output_stream.cc
|
| diff --git a/media/audio/virtual_audio_output_stream.cc b/media/audio/virtual_audio_output_stream.cc
|
| index 1740b405d17c36069271113b534453b05f8f51f1..c21a7ac6c2c1f6d4fd969cede272e5d652b14157 100644
|
| --- a/media/audio/virtual_audio_output_stream.cc
|
| +++ b/media/audio/virtual_audio_output_stream.cc
|
| @@ -91,4 +91,62 @@ double VirtualAudioOutputStream::ProvideInput(AudioBus* audio_bus,
|
| return frames > 0 ? volume_ : 0;
|
| }
|
|
|
| +static const base::TimeDelta kBufferSize = base::TimeDelta::FromSeconds(1);
|
| +static const base::TimeDelta kClockAccuracy =
|
| + base::TimeDelta::FromMilliseconds(1);
|
| +static const base::TimeDelta kAdjustTime = base::TimeDelta::FromSeconds(1);
|
| +
|
| +LoopbackSink::LoopbackSink(AudioParameters param,
|
| + VirtualAudioInputStream* target,
|
| + AfterCloseCallback callback)
|
| + : started_(false),
|
| + params_(param),
|
| + target_(target),
|
| + shifter_(new AudioShifter(kBufferSize,
|
| + kClockAccuracy,
|
| + kAdjustTime,
|
| + param.sample_rate(),
|
| + param.channels())),
|
| + after_close_callback_(callback) {}
|
| +
|
| +LoopbackSink::~LoopbackSink() {}
|
| +
|
| +void LoopbackSink::Start() {
|
| + started_ = true;
|
| + target_->AddOutputStream(this, params_);
|
| +}
|
| +
|
| +void LoopbackSink::Stop() {
|
| + target_->RemoveOutputStream(this, params_);
|
| + started_ = false;
|
| +}
|
| +
|
| +void LoopbackSink::Close() {
|
| + if (started_)
|
| + Stop();
|
| + AfterCloseCallback cb = after_close_callback_;
|
| + if (!cb.is_null())
|
| + cb.Run(this);
|
| +}
|
| +
|
| +void LoopbackSink::OnData(AudioInputStream* stream,
|
| + const AudioBus* source,
|
| + uint32_t hardware_delay_bytes,
|
| + double volume) {
|
| + printf("Sink: Input Data\n");
|
| + std::unique_ptr<AudioBus> source_copy = AudioBus::Create(params_);
|
| + source->CopyTo(source_copy.get());
|
| + shifter_->Push(std::move(source_copy), base::TimeTicks::Now());
|
| +}
|
| +
|
| +void LoopbackSink::OnError(AudioInputStream* stream) {}
|
| +
|
| +double LoopbackSink::ProvideInput(AudioBus* audio_bus,
|
| + base::TimeDelta buffer_delay) {
|
| + printf("Sink: Output Data Start\n");
|
| + shifter_->Pull(audio_bus, base::TimeTicks::Now());
|
| + printf("Sink: Output Data Finish\n");
|
| + return 1;
|
| +}
|
| +
|
| } // namespace media
|
|
|