Chromium Code Reviews| Index: webrtc/modules/audio_processing/test/fake_recording_device.cc |
| diff --git a/webrtc/modules/audio_processing/test/fake_recording_device.cc b/webrtc/modules/audio_processing/test/fake_recording_device.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..de20b299a2cfcd9c3014a2393e6608d5a32c1702 |
| --- /dev/null |
| +++ b/webrtc/modules/audio_processing/test/fake_recording_device.cc |
| @@ -0,0 +1,99 @@ |
| +/* |
| + * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
| + * |
| + * Use of this source code is governed by a BSD-style license |
| + * that can be found in the LICENSE file in the root of the source |
| + * tree. An additional intellectual property rights grant can be found |
| + * in the file PATENTS. All contributing project authors may |
| + * be found in the AUTHORS file in the root of the source tree. |
| + */ |
| + |
| +#include "webrtc/modules/audio_processing/test/fake_recording_device.h" |
| + |
| +#include "webrtc/base/logging.h" |
| + |
| +namespace webrtc { |
| + |
| +FakeRecordingDevice::FakeRecordingDevice(LevelToScalingMappingKind mapping_kind) |
| + : mapping_kind_(mapping_kind) {} |
| + |
| +FakeRecordingDevice::~FakeRecordingDevice() = default; |
| + |
| +// |level| must be within [0, 255]. |
| +void FakeRecordingDevice::set_analog_level(int level) { |
| + RTC_DCHECK_LE(0, level); |
| + RTC_DCHECK_LE(level, 255); |
| + level_ = level; |
| +} |
| + |
| +int FakeRecordingDevice::analog_level() const { |
| + return level_; |
| +} |
| + |
| +FakeRecordingDevice::LevelToScalingMappingKind |
| + FakeRecordingDevice::mapping_kind() const { |
| + return mapping_kind_; |
| +} |
| + |
| +void FakeRecordingDevice::ProcessStream( |
| + std::vector<rtc::ArrayView<const float>> src, |
| + std::vector<rtc::ArrayView<float>> dest) { |
| + RTC_DCHECK_EQ(src.size(), dest.size()); |
| + |
| + const float scaling_factor = ComputeCompoundScalingFactor(); |
| + |
| + for (size_t i = 0; i < src.size(); ++i) { |
| + RTC_DCHECK_EQ(src[i].size(), dest[i].size()); |
| + std::transform(src[i].begin(), src[i].end(), dest[i].begin(), |
| + [scaling_factor](float x) { return scaling_factor * x; }); |
| + } |
| + real_device_level_.reset(); |
| +} |
| + |
| +void FakeRecordingDevice::ProcessStream(const AudioFrame* src, |
| + AudioFrame* dest) { |
| + RTC_DCHECK_EQ(src->num_channels_, dest->num_channels_); |
| + RTC_DCHECK_EQ(src->samples_per_channel_, dest->samples_per_channel_); |
| + const size_t number_of_samples = |
| + src->samples_per_channel_ * src->num_channels_; |
| + RTC_DCHECK_LE(number_of_samples, AudioFrame::kMaxDataSizeSamples); |
| + const float scaling_factor = ComputeCompoundScalingFactor(); |
| + |
| + std::transform(src->data_, src->data_ + number_of_samples, dest->data_, |
| + [scaling_factor](int16_t x) { |
| + return rtc::saturated_cast<int16_t>(scaling_factor * x); |
| + }); |
| + |
| + real_device_level_.reset(); |
| +} |
| + |
| +void FakeRecordingDevice::NotifyAudioDeviceLevel(int level) { |
| + real_device_level_.emplace(level); |
| +} |
| + |
| +float FakeRecordingDevice::ComputeCompoundScalingFactor() { |
| + const float level_scaling_factor = GetScalingFactor(level_); |
| + const float undo_factor = |
| + real_device_level_ ? GetScalingFactor(*real_device_level_) : 1.0f; |
| + |
| + if (undo_factor == 0) { |
| + LOG(LS_INFO) << "[fake rec device] Cannot undo analog level of 0."; |
|
aleloi
2017/05/04 12:47:13
Maybe this one should be verbose? It's probably no
AleBzk
2017/05/05 12:20:18
Done.
|
| + return level_scaling_factor; |
| + } else { |
| + return level_scaling_factor / undo_factor; |
| + } |
| +} |
| + |
| +float FakeRecordingDevice::GetScalingFactor(int level) const { |
| + switch (mapping_kind_) { |
| + case LevelToScalingMappingKind::kLinear: { |
| + return static_cast<float>(level) / 255.0f; |
| + } |
| + case LevelToScalingMappingKind::kIdentity: { |
| + return 1.0f; |
| + } |
| + default: { RTC_NOTREACHED(); } |
| + } |
| +} |
| + |
| +} // namespace webrtc |