blob: 64352eca506b7915d5ca137ad304c684f971ca11 [file] [log] [blame]
// 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