| // Copyright 2018 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 "services/audio/test/fake_loopback_group_member.h" |
| |
| #include <algorithm> |
| #include <cmath> |
| #include <string> |
| |
| #include "base/numerics/math_constants.h" |
| #include "media/audio/audio_device_description.h" |
| #include "media/base/audio_bus.h" |
| |
| namespace audio { |
| |
| FakeLoopbackGroupMember::FakeLoopbackGroupMember( |
| const media::AudioParameters& params) |
| : params_(params), |
| audio_bus_(media::AudioBus::Create(params_)), |
| frequency_by_channel_(params_.channels(), 0.0) { |
| CHECK(params_.IsValid()); |
| } |
| |
| FakeLoopbackGroupMember::~FakeLoopbackGroupMember() = default; |
| |
| void FakeLoopbackGroupMember::SetChannelTone(int ch, double frequency) { |
| frequency_by_channel_[ch] = frequency; |
| } |
| |
| void FakeLoopbackGroupMember::SetVolume(double volume) { |
| CHECK_GE(volume, 0.0); |
| CHECK_LE(volume, 1.0); |
| volume_ = volume; |
| } |
| |
| void FakeLoopbackGroupMember::RenderMoreAudio( |
| base::TimeTicks output_timestamp) { |
| if (snooper_) { |
| for (int ch = 0; ch < params_.channels(); ++ch) { |
| const double step = 2.0 * base::kPiDouble * frequency_by_channel_[ch] / |
| params_.sample_rate(); |
| float* const samples = audio_bus_->channel(ch); |
| for (int frame = 0; frame < params_.frames_per_buffer(); ++frame) { |
| samples[frame] = std::sin((at_frame_ + frame) * step); |
| } |
| } |
| snooper_->OnData(*audio_bus_, output_timestamp, volume_); |
| } |
| at_frame_ += params_.frames_per_buffer(); |
| } |
| |
| const media::AudioParameters& FakeLoopbackGroupMember::GetAudioParameters() |
| const { |
| return params_; |
| } |
| |
| std::string FakeLoopbackGroupMember::GetDeviceId() const { |
| return media::AudioDeviceDescription::kDefaultDeviceId; |
| } |
| |
| void FakeLoopbackGroupMember::StartSnooping(Snooper* snooper, |
| SnoopingMode mode) { |
| CHECK(!snooper_); |
| snooper_ = snooper; |
| } |
| |
| void FakeLoopbackGroupMember::StopSnooping(Snooper* snooper, |
| SnoopingMode mode) { |
| snooper_ = nullptr; |
| } |
| |
| void FakeLoopbackGroupMember::StartMuting() { |
| // No effect for this fake implementation. |
| } |
| |
| void FakeLoopbackGroupMember::StopMuting() { |
| // No effect for this fake implementation. |
| } |
| |
| } // namespace audio |