test_utils.cc (5181B)
1 /* 2 * Copyright (c) 2015 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 "modules/audio_processing/test/test_utils.h" 12 13 #include <algorithm> 14 #include <cstddef> 15 #include <cstdint> 16 #include <cstdio> 17 #include <cstdlib> 18 #include <cstring> 19 #include <memory> 20 #include <string> 21 #include <utility> 22 #include <vector> 23 24 #include "absl/strings/string_view.h" 25 #include "api/audio/audio_view.h" 26 #include "common_audio/channel_buffer.h" 27 #include "common_audio/include/audio_util.h" 28 #include "common_audio/wav_file.h" 29 #include "rtc_base/checks.h" 30 31 namespace webrtc { 32 33 void Int16FrameData::CopyFrom(const Int16FrameData& src) { 34 sample_rate_hz = src.sample_rate_hz; 35 view_ = InterleavedView<int16_t>(data.data(), src.samples_per_channel(), 36 src.num_channels()); 37 RTC_CHECK_LE(view_.size(), kMaxDataSizeSamples); 38 CopySamples(view_, src.view()); 39 } 40 41 bool Int16FrameData::IsEqual(const Int16FrameData& frame) const { 42 return samples_per_channel() == frame.samples_per_channel() && 43 num_channels() == num_channels() && 44 memcmp(data.data(), frame.data.data(), 45 samples_per_channel() * num_channels() * sizeof(int16_t)) == 0; 46 } 47 48 void Int16FrameData::Scale(float f) { 49 std::for_each(data.begin(), data.end(), 50 [f](int16_t& sample) { sample = FloatS16ToS16(sample * f); }); 51 } 52 53 void Int16FrameData::SetProperties(size_t samples_per_channel, 54 size_t num_channels) { 55 sample_rate_hz = samples_per_channel * 100; 56 view_ = 57 InterleavedView<int16_t>(data.data(), samples_per_channel, num_channels); 58 RTC_CHECK_LE(view_.size(), kMaxDataSizeSamples); 59 } 60 61 void Int16FrameData::set_num_channels(size_t num_channels) { 62 view_ = InterleavedView<int16_t>(data.data(), samples_per_channel(), 63 num_channels); 64 RTC_CHECK_LE(view_.size(), kMaxDataSizeSamples); 65 } 66 67 void Int16FrameData::FillData(int16_t value) { 68 std::fill(&data[0], &data[size()], value); 69 } 70 71 void Int16FrameData::FillStereoData(int16_t left, int16_t right) { 72 RTC_DCHECK_EQ(num_channels(), 2u); 73 for (size_t i = 0; i < samples_per_channel() * 2u; i += 2u) { 74 data[i] = left; 75 data[i + 1] = right; 76 } 77 } 78 79 ChannelBufferWavReader::ChannelBufferWavReader(std::unique_ptr<WavReader> file) 80 : file_(std::move(file)) {} 81 82 ChannelBufferWavReader::~ChannelBufferWavReader() = default; 83 84 bool ChannelBufferWavReader::Read(ChannelBuffer<float>* buffer) { 85 RTC_CHECK_EQ(file_->num_channels(), buffer->num_channels()); 86 interleaved_.resize(buffer->size()); 87 if (file_->ReadSamples(interleaved_.size(), &interleaved_[0]) != 88 interleaved_.size()) { 89 return false; 90 } 91 92 FloatS16ToFloat(&interleaved_[0], interleaved_.size(), &interleaved_[0]); 93 Deinterleave(&interleaved_[0], buffer->num_frames(), buffer->num_channels(), 94 buffer->channels()); 95 return true; 96 } 97 98 ChannelBufferWavWriter::ChannelBufferWavWriter(std::unique_ptr<WavWriter> file) 99 : file_(std::move(file)) {} 100 101 ChannelBufferWavWriter::~ChannelBufferWavWriter() = default; 102 103 void ChannelBufferWavWriter::Write(const ChannelBuffer<float>& buffer) { 104 RTC_CHECK_EQ(file_->num_channels(), buffer.num_channels()); 105 interleaved_.resize(buffer.size()); 106 InterleavedView<float> view(&interleaved_[0], buffer.num_frames(), 107 buffer.num_channels()); 108 const float* samples = buffer.channels()[0]; 109 DeinterleavedView<const float> source(samples, buffer.num_frames(), 110 buffer.num_channels()); 111 Interleave(source, view); 112 FloatToFloatS16(&interleaved_[0], interleaved_.size(), &interleaved_[0]); 113 file_->WriteSamples(&interleaved_[0], interleaved_.size()); 114 } 115 116 ChannelBufferVectorWriter::ChannelBufferVectorWriter(std::vector<float>* output) 117 : output_(output) { 118 RTC_DCHECK(output_); 119 } 120 121 ChannelBufferVectorWriter::~ChannelBufferVectorWriter() = default; 122 123 void ChannelBufferVectorWriter::Write(const ChannelBuffer<float>& buffer) { 124 // Account for sample rate changes throughout a simulation. 125 interleaved_buffer_.resize(buffer.size()); 126 InterleavedView<float> view(&interleaved_buffer_[0], buffer.num_frames(), 127 buffer.num_channels()); 128 Interleave(buffer.channels(), buffer.num_frames(), buffer.num_channels(), 129 view); 130 size_t old_size = output_->size(); 131 output_->resize(old_size + interleaved_buffer_.size()); 132 FloatToFloatS16(interleaved_buffer_.data(), interleaved_buffer_.size(), 133 output_->data() + old_size); 134 } 135 136 FILE* OpenFile(absl::string_view filename, absl::string_view mode) { 137 std::string filename_str(filename); 138 FILE* file = fopen(filename_str.c_str(), std::string(mode).c_str()); 139 if (!file) { 140 printf("Unable to open file %s\n", filename_str.c_str()); 141 exit(1); 142 } 143 return file; 144 } 145 146 } // namespace webrtc