Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license | |
| 5 * that can be found in the LICENSE file in the root of the source | |
| 6 * tree. An additional intellectual property rights grant can be found | |
| 7 * in the file PATENTS. All contributing project authors may | |
| 8 * be found in the AUTHORS file in the root of the source tree. | |
| 9 */ | |
| 10 | |
| 11 #include "webrtc/modules/audio_processing/test/fake_recording_device.h" | |
| 12 | |
| 13 #include "webrtc/base/logging.h" | |
| 14 | |
| 15 namespace webrtc { | |
| 16 | |
| 17 FakeRecordingDevice::FakeRecordingDevice(MicrophoneKind mapping_kind) | |
| 18 : mapping_kind_(mapping_kind) { | |
| 19 // Create the analog gain simulatory callback depending on the wanted | |
| 20 // microphone kind. | |
| 21 switch (mapping_kind_) { | |
| 22 case MicrophoneKind::kIdentity: { | |
| 23 simulator_callback_int16_ = AnalogGainSimulatorIdentityInt16(); | |
|
peah-webrtc
2017/05/16 12:19:36
These are not used as callbacks, so I don't think
AleBzk
2017/05/17 11:52:23
Acknowledged.
| |
| 24 simulator_callback_float_ = AnalogGainSimulatorIdentityFloat(); | |
| 25 break; | |
| 26 } | |
| 27 case MicrophoneKind::kLinear: { | |
| 28 simulator_callback_int16_ = AnalogGainSimulatorLinearInt16(); | |
|
peah-webrtc
2017/05/16 12:19:36
I would rather have an interface with different im
AleBzk
2017/05/17 11:52:23
Perfect. Let's then go for interface + implementat
| |
| 29 simulator_callback_float_ = AnalogGainSimulatorLinearFloat(); | |
| 30 break; | |
| 31 } | |
| 32 default: { RTC_NOTREACHED(); } | |
| 33 } | |
| 34 } | |
| 35 | |
| 36 FakeRecordingDevice::~FakeRecordingDevice() = default; | |
| 37 | |
| 38 void FakeRecordingDevice::SimulateAnalogGain( | |
| 39 int level, rtc::Optional<int> real_device_level, | |
| 40 std::vector<rtc::ArrayView<float>> buffer) { | |
| 41 for (size_t i = 0; i < buffer.size(); ++i) { | |
| 42 std::transform( | |
|
peah-webrtc
2017/05/16 12:19:35
I think std::for_each is better suited here.
AleBzk
2017/05/17 11:52:23
Acknowledged.
| |
| 43 buffer[i].begin(), buffer[i].end(), buffer[i].begin(), | |
| 44 [this, level, real_device_level](float x) { | |
| 45 return simulator_callback_float_(x, level, real_device_level); | |
|
peah-webrtc
2017/05/16 12:19:36
As you stated offline, this will not scale with me
AleBzk
2017/05/17 11:52:23
Acknowledged.
| |
| 46 }); | |
| 47 } | |
| 48 } | |
| 49 | |
| 50 void FakeRecordingDevice::SimulateAnalogGain( | |
|
peah-webrtc
2017/05/16 12:19:36
Why is this needed as a separate method?
AleBzk
2017/05/17 11:52:23
Please, see my answer to a related question of you
| |
| 51 int level, rtc::Optional<int> real_device_level, | |
| 52 ChannelBuffer<float>* buffer) { | |
| 53 std::vector<rtc::ArrayView<float>> buffer_view; | |
| 54 for (size_t i = 0; i < buffer->num_channels(); ++i) { | |
| 55 buffer_view.emplace_back(buffer->channels()[i], buffer->num_frames()); | |
| 56 } | |
| 57 SimulateAnalogGain(level, real_device_level, buffer_view); | |
| 58 } | |
| 59 | |
| 60 void FakeRecordingDevice::SimulateAnalogGain( | |
| 61 int level, rtc::Optional<int> real_device_level, AudioFrame* buffer) { | |
| 62 const size_t number_of_samples = | |
| 63 buffer->samples_per_channel_ * buffer->num_channels_; | |
| 64 RTC_DCHECK_LE(number_of_samples, AudioFrame::kMaxDataSizeSamples); | |
| 65 std::transform( | |
|
peah-webrtc
2017/05/16 12:19:36
std::for_each
AleBzk
2017/05/17 11:52:23
Acknowledged.
| |
| 66 buffer->data_, buffer->data_ + number_of_samples, buffer->data_, | |
| 67 [this, level, real_device_level](int16_t x) { | |
| 68 return simulator_callback_int16_(x, level, real_device_level); | |
| 69 }); | |
| 70 } | |
| 71 | |
| 72 SimulatorCallbackInt16 FakeRecordingDevice::AnalogGainSimulatorIdentityInt16() { | |
| 73 return [this](int16_t sample, int level, | |
| 74 rtc::Optional<int> real_device_level) { | |
| 75 return sample; | |
| 76 }; | |
| 77 } | |
| 78 | |
| 79 SimulatorCallbackFloat FakeRecordingDevice::AnalogGainSimulatorIdentityFloat() { | |
| 80 return [this](float sample, int level, rtc::Optional<int> real_device_level) { | |
| 81 return sample; | |
| 82 }; | |
| 83 } | |
| 84 | |
| 85 SimulatorCallbackInt16 FakeRecordingDevice::AnalogGainSimulatorLinearInt16() { | |
| 86 return [this](int16_t sample, int level, | |
| 87 rtc::Optional<int> real_device_level) { | |
| 88 float sample_f = static_cast<float>(sample); | |
| 89 | |
| 90 // Virtually restore the unmodified microphone level. | |
| 91 if (real_device_level) { | |
| 92 RTC_DCHECK_GT(*real_device_level, 0) | |
| 93 << "zero real device level, cannot undo mic level"; | |
| 94 sample_f = ClipSample( | |
| 95 sample_f * 255.0f / static_cast<float>(*real_device_level)); | |
| 96 } | |
| 97 | |
| 98 // Simulate the mic gain. | |
| 99 return ClipSample(sample_f * static_cast<float>(level) / 255.0f); | |
| 100 }; | |
| 101 } | |
| 102 | |
| 103 SimulatorCallbackFloat FakeRecordingDevice::AnalogGainSimulatorLinearFloat() { | |
| 104 return [this](float sample, int level, rtc::Optional<int> real_device_level) { | |
| 105 // Virtually restore the unmodified microphone level. | |
| 106 if (real_device_level) { | |
| 107 RTC_DCHECK_GT(*real_device_level, 0) | |
| 108 << "zero real device level, cannot undo mic level"; | |
| 109 sample = ClipSample( | |
| 110 sample * 255.0f / static_cast<float>(*real_device_level)); | |
| 111 } | |
| 112 | |
| 113 // Simulate the mic gain. | |
| 114 return ClipSample(sample * static_cast<float>(level) / 255.0f); | |
| 115 }; | |
| 116 } | |
| 117 | |
| 118 int16_t FakeRecordingDevice::ClipSample(int16_t sample) { | |
| 119 return sample < kSampleMinInt16 ? | |
| 120 kSampleMinInt16 : (sample > kSampleMaxInt16 ? kSampleMaxInt16 : sample); | |
|
peah-webrtc
2017/05/16 12:19:35
Use std::min/std::max instead
peah-webrtc
2017/05/16 12:19:36
Why do you clip the sample value to +-255?
AleBzk
2017/05/17 11:52:23
Done.
AleBzk
2017/05/17 11:52:23
Right, I got confused with the mic level.
| |
| 121 } | |
| 122 | |
| 123 float FakeRecordingDevice::ClipSample(float sample) { | |
| 124 return sample < kSampleMinFloat ? | |
|
peah-webrtc
2017/05/16 12:19:36
Use std::min/std::max instead
AleBzk
2017/05/17 11:52:23
Done.
| |
| 125 kSampleMinFloat : (sample > kSampleMaxFloat ? kSampleMaxFloat : sample); | |
| 126 } | |
| 127 | |
| 128 } // namespace webrtc | |
| OLD | NEW |