Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Unified Diff: webrtc/modules/audio_processing/test/fake_recording_device.cc

Issue 2834643002: audioproc_f with simulated mic analog gain (Closed)
Patch Set: FakeRecordingDevice interface simplified, UTs fixes, logs verbosity-- Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..8bf37d0a10a37baf7f218ab92b096419ba69ad00
--- /dev/null
+++ b/webrtc/modules/audio_processing/test/fake_recording_device.cc
@@ -0,0 +1,85 @@
+/*
+ * 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;
+
+void FakeRecordingDevice::SimulateAnalogGain(
+ std::vector<rtc::ArrayView<const float>> src,
+ std::vector<rtc::ArrayView<float>> dest,
+ int level,
+ int real_device_level) {
+ RTC_DCHECK_EQ(src.size(), dest.size());
+ const float scaling_factor = ComputeCompoundScalingFactor(
+ level, real_device_level);
+
+ 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; });
peah-webrtc 2017/05/05 20:25:21 This scaling could create absolute sample values a
AleBzk 2017/05/16 08:53:03 Good point. And we should apply saturation twice:
peah-webrtc 2017/05/16 12:19:35 I don't see why we need the hard-clipping in step
+ }
+}
+
+void FakeRecordingDevice::SimulateAnalogGain(const AudioFrame* src,
+ AudioFrame* dest,
+ int level,
+ int real_device_level) {
+ 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(
+ level, real_device_level);
+
+ 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);
peah-webrtc 2017/05/05 20:25:21 This simulation of the microphone scaling is too s
AleBzk 2017/05/16 08:53:03 Great point! Thanks. I redesigned what goes on be
+ });
+}
+
+float FakeRecordingDevice::ComputeCompoundScalingFactor(
+ int level, int real_device_level) const {
+ const float scaling_factor = GetScalingFactor(level);
+ const float undo_factor = (real_device_level == kRealDeviceLevelUnknown) ?
+ 1.0f : GetScalingFactor(real_device_level);
+
+ if (undo_factor == 0) {
+ LOG(LS_VERBOSE) << "[fake rec device] Cannot undo analog level of 0.";
peah-webrtc 2017/05/05 20:25:21 As this is only simulation/testing code, you shoul
aleloi 2017/05/08 10:15:23 I think a level of 0 can appear in real recordings
peah-webrtc 2017/05/08 11:41:33 No, nothing that occurs in real recordings should
AleBzk 2017/05/16 08:53:03 I'm a bit confused here. We shouldn't include erro
peah-webrtc 2017/05/16 12:19:35 The action to take there is totally dependent on t
+ return scaling_factor;
+ } else {
+ return scaling_factor / undo_factor;
+ }
+}
+
+float FakeRecordingDevice::GetScalingFactor(int level) const {
+ RTC_DCHECK_LE(0, level);
+ RTC_DCHECK_LE(level, 255);
+
+ switch (mapping_kind_) {
+ case LevelToScalingMappingKind::kLinear: {
+ return static_cast<float>(level) / 255.0f;
+ }
+ case LevelToScalingMappingKind::kIdentity: {
+ return 1.0f;
+ }
+ default: { RTC_NOTREACHED(); }
+ }
+}
+
+} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698