| Index: media/audio/virtual_audio_sink.cc
|
| diff --git a/media/audio/virtual_audio_sink.cc b/media/audio/virtual_audio_sink.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1cbe00bc788cd6f0c8a8f7f2fd939494408cc6c1
|
| --- /dev/null
|
| +++ b/media/audio/virtual_audio_sink.cc
|
| @@ -0,0 +1,61 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "media/audio/virtual_audio_sink.h"
|
| +
|
| +#include "base/callback_helpers.h"
|
| +#include "media/audio/virtual_audio_input_stream.h"
|
| +
|
| +namespace media {
|
| +
|
| +// Buffer size limit is chosen large enough that in the normal case, we do not
|
| +// have data loss.
|
| +constexpr int kBufferSizeSecond = 1;
|
| +
|
| +// This is not the system clock accuracy. But considering the cross-process
|
| +// communication, there is fluctuation between the actual and the ideal instant
|
| +// when we receive the audio data. Testing shows the fluctuation is on the order
|
| +// of 1 millisecond.
|
| +constexpr int kClockAccuracyMillisecond = 1;
|
| +
|
| +// See AudioShifter comment for detail about this parameter. We just take the
|
| +// suggestion from there.
|
| +constexpr int kAdjustTimeSecond = 1;
|
| +
|
| +VirtualAudioSink::VirtualAudioSink(AudioParameters param,
|
| + VirtualAudioInputStream* target,
|
| + AfterCloseCallback callback)
|
| + : params_(param),
|
| + target_(target),
|
| + shifter_(base::TimeDelta::FromSeconds(kBufferSizeSecond),
|
| + base::TimeDelta::FromMilliseconds(kClockAccuracyMillisecond),
|
| + base::TimeDelta::FromSeconds(kAdjustTimeSecond),
|
| + param.sample_rate(),
|
| + param.channels()),
|
| + after_close_callback_(callback) {
|
| + target_->AddInputProvider(this, params_);
|
| +}
|
| +
|
| +VirtualAudioSink::~VirtualAudioSink() {}
|
| +
|
| +void VirtualAudioSink::Close() {
|
| + target_->RemoveInputProvider(this, params_);
|
| + const AfterCloseCallback& cb = base::ResetAndReturn(&after_close_callback_);
|
| + if (!cb.is_null())
|
| + cb.Run(this);
|
| +}
|
| +
|
| +void VirtualAudioSink::OnData(const AudioBus& source,
|
| + base::TimeTicks reference_time) {
|
| + std::unique_ptr<AudioBus> source_copy = AudioBus::Create(params_);
|
| + source.CopyTo(source_copy.get());
|
| + shifter_.Push(std::move(source_copy), reference_time);
|
| +}
|
| +
|
| +double VirtualAudioSink::ProvideInput(AudioBus* audio_bus,
|
| + base::TimeDelta buffer_delay) {
|
| + shifter_.Pull(audio_bus, base::TimeTicks::Now() + buffer_delay);
|
| + return 1;
|
| +}
|
| +}
|
|
|