/* * Copyright (c) 2014 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. */ #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_TEST_TEST_UTILS_H_ #define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_TEST_UTILS_H_ #include #include #include #include #include #include "webrtc/base/constructormagic.h" #include "webrtc/base/scoped_ptr.h" #include "webrtc/common_audio/channel_buffer.h" #include "webrtc/common_audio/wav_file.h" #include "webrtc/modules/audio_processing/include/audio_processing.h" #include "webrtc/modules/interface/module_common_types.h" namespace webrtc { static const AudioProcessing::Error kNoErr = AudioProcessing::kNoError; #define EXPECT_NOERR(expr) EXPECT_EQ(kNoErr, (expr)) class RawFile final { public: explicit RawFile(const std::string& filename); ~RawFile(); void WriteSamples(const int16_t* samples, size_t num_samples); void WriteSamples(const float* samples, size_t num_samples); private: FILE* file_handle_; RTC_DISALLOW_COPY_AND_ASSIGN(RawFile); }; void WriteIntData(const int16_t* data, size_t length, WavWriter* wav_file, RawFile* raw_file); void WriteFloatData(const float* const* data, int samples_per_channel, int num_channels, WavWriter* wav_file, RawFile* raw_file); // Exits on failure; do not use in unit tests. FILE* OpenFile(const std::string& filename, const char* mode); int SamplesFromRate(int rate); void SetFrameSampleRate(AudioFrame* frame, int sample_rate_hz); template void SetContainerFormat(int sample_rate_hz, int num_channels, AudioFrame* frame, rtc::scoped_ptr >* cb) { SetFrameSampleRate(frame, sample_rate_hz); frame->num_channels_ = num_channels; cb->reset(new ChannelBuffer(frame->samples_per_channel_, num_channels)); } AudioProcessing::ChannelLayout LayoutFromChannels(int num_channels); template float ComputeSNR(const T* ref, const T* test, int length, float* variance) { float mse = 0; float mean = 0; *variance = 0; for (int i = 0; i < length; ++i) { T error = ref[i] - test[i]; mse += error * error; *variance += ref[i] * ref[i]; mean += ref[i]; } mse /= length; *variance /= length; mean /= length; *variance -= mean * mean; float snr = 100; // We assign 100 dB to the zero-error case. if (mse > 0) snr = 10 * log10(*variance / mse); return snr; } // Returns a vector parsed from whitespace delimited values in to_parse, // or an empty vector if the string could not be parsed. template std::vector ParseList(const std::string& to_parse) { std::vector values; std::istringstream str(to_parse); std::copy( std::istream_iterator(str), std::istream_iterator(), std::back_inserter(values)); return values; } // Parses the array geometry from the command line. // // If a vector with size != num_mics is returned, an error has occurred and an // appropriate error message has been printed to stdout. std::vector ParseArrayGeometry(const std::string& mic_positions, size_t num_mics); } // namespace webrtc #endif // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_TEST_UTILS_H_