152 lines
4.3 KiB
C
Raw Normal View History

This CL introduces a new data logging functionality to use for the APM. It allows simple and rapid additions of exploratory data logpoints to use during bug investigations and module performance analysis. The new data logging functionality is also in this CL used to replace the existing data logging functionality present in the AEC. Additional information: As there was an issue with that the build flag for activating this feature was not present in all compilation units that included the feature additional changes were needed. A summary of the changes are -The build files were modified to ensure that the logging build flag always is set to either 0 or 1 for compilation units that include the feature. -Build-time checks in the appropriate places were added to ensure that the above is fulfilled. -The build object was added dynamically to the AEC state as a pointer to ensure that the size of that state is not dependent on whether the logging build flag is set or not. -The constructor of the AEC class needed to be modified in order to construct the logging object. For this a destructor was also needed. -An unused method without any declaration was removed in order to avoid any issues with the logging flag being set to 0 or 1. This CL will be immediately followed with an upcoming CL that replaces the logging in echo_cancellation.cc with the new functionality which will ensure that the logging flag is only used in one place within WebRTC, which in turn will fully ensure that all compilation units that uses the feature also have the flag properly set. BUG=webrtc:5201, webrtc:5298 Review-Url: https://codereview.webrtc.org/1877713002 Cr-Commit-Position: refs/heads/master@{#12607}
2016-05-03 07:01:18 -07:00
/*
* Copyright (c) 2016 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_LOGGING_APM_DATA_DUMPER_H_
#define WEBRTC_MODULES_AUDIO_PROCESSING_LOGGING_APM_DATA_DUMPER_H_
#include <stdio.h>
#include <memory>
#include <string>
#include <unordered_map>
#include "webrtc/base/array_view.h"
#include "webrtc/base/constructormagic.h"
#include "webrtc/common_audio/wav_file.h"
// Check to verify that the define is properly set.
#if !defined(WEBRTC_AEC_DEBUG_DUMP) || \
(WEBRTC_AEC_DEBUG_DUMP != 0 && WEBRTC_AEC_DEBUG_DUMP != 1)
#error "Set WEBRTC_AEC_DEBUG_DUMP to either 0 or 1"
#endif
namespace webrtc {
#if WEBRTC_AEC_DEBUG_DUMP == 1
// Functor used to use as a custom deleter in the map of file pointers to raw
// files.
struct RawFileCloseFunctor {
void operator()(FILE* f) const { fclose(f); }
};
#endif
// Class that handles dumping of variables into files.
class ApmDataDumper {
public:
// Constructor that takes an instance index that may
// be used to distinguish data dumped from different
// instances of the code.
explicit ApmDataDumper(int instance_index);
~ApmDataDumper();
This CL introduces a new data logging functionality to use for the APM. It allows simple and rapid additions of exploratory data logpoints to use during bug investigations and module performance analysis. The new data logging functionality is also in this CL used to replace the existing data logging functionality present in the AEC. Additional information: As there was an issue with that the build flag for activating this feature was not present in all compilation units that included the feature additional changes were needed. A summary of the changes are -The build files were modified to ensure that the logging build flag always is set to either 0 or 1 for compilation units that include the feature. -Build-time checks in the appropriate places were added to ensure that the above is fulfilled. -The build object was added dynamically to the AEC state as a pointer to ensure that the size of that state is not dependent on whether the logging build flag is set or not. -The constructor of the AEC class needed to be modified in order to construct the logging object. For this a destructor was also needed. -An unused method without any declaration was removed in order to avoid any issues with the logging flag being set to 0 or 1. This CL will be immediately followed with an upcoming CL that replaces the logging in echo_cancellation.cc with the new functionality which will ensure that the logging flag is only used in one place within WebRTC, which in turn will fully ensure that all compilation units that uses the feature also have the flag properly set. BUG=webrtc:5201, webrtc:5298 Review-Url: https://codereview.webrtc.org/1877713002 Cr-Commit-Position: refs/heads/master@{#12607}
2016-05-03 07:01:18 -07:00
// Reinitializes the data dumping such that new versions
// of all files being dumped to are created.
void InitiateNewSetOfRecordings() {
#if WEBRTC_AEC_DEBUG_DUMP == 1
++recording_set_index_;
#endif
}
// Methods for performing dumping of data of various types into
// various formats.
void DumpRaw(const char* name, int v_length, const float* v) {
#if WEBRTC_AEC_DEBUG_DUMP == 1
FILE* file = GetRawFile(name);
fwrite(v, sizeof(v[0]), v_length, file);
#endif
}
void DumpRaw(const char* name, rtc::ArrayView<const float> v) {
#if WEBRTC_AEC_DEBUG_DUMP == 1
DumpRaw(name, v.size(), v.data());
#endif
}
void DumpRaw(const char* name, int v_length, const bool* v) {
#if WEBRTC_AEC_DEBUG_DUMP == 1
FILE* file = GetRawFile(name);
for (int k = 0; k < v_length; ++k) {
int16_t value = static_cast<int16_t>(v[k]);
fwrite(&value, sizeof(value), 1, file);
}
#endif
}
void DumpRaw(const char* name, rtc::ArrayView<const bool> v) {
#if WEBRTC_AEC_DEBUG_DUMP == 1
DumpRaw(name, v.size(), v.data());
#endif
}
void DumpRaw(const char* name, int v_length, const int16_t* v) {
#if WEBRTC_AEC_DEBUG_DUMP == 1
FILE* file = GetRawFile(name);
fwrite(v, sizeof(v[0]), v_length, file);
#endif
}
void DumpRaw(const char* name, rtc::ArrayView<const int16_t> v) {
#if WEBRTC_AEC_DEBUG_DUMP == 1
DumpRaw(name, v.size(), v.data());
#endif
}
void DumpRaw(const char* name, int v_length, const int32_t* v) {
#if WEBRTC_AEC_DEBUG_DUMP == 1
FILE* file = GetRawFile(name);
fwrite(v, sizeof(v[0]), v_length, file);
#endif
}
void DumpRaw(const char* name, rtc::ArrayView<const int32_t> v) {
#if WEBRTC_AEC_DEBUG_DUMP == 1
DumpRaw(name, v.size(), v.data());
#endif
}
This CL introduces a new data logging functionality to use for the APM. It allows simple and rapid additions of exploratory data logpoints to use during bug investigations and module performance analysis. The new data logging functionality is also in this CL used to replace the existing data logging functionality present in the AEC. Additional information: As there was an issue with that the build flag for activating this feature was not present in all compilation units that included the feature additional changes were needed. A summary of the changes are -The build files were modified to ensure that the logging build flag always is set to either 0 or 1 for compilation units that include the feature. -Build-time checks in the appropriate places were added to ensure that the above is fulfilled. -The build object was added dynamically to the AEC state as a pointer to ensure that the size of that state is not dependent on whether the logging build flag is set or not. -The constructor of the AEC class needed to be modified in order to construct the logging object. For this a destructor was also needed. -An unused method without any declaration was removed in order to avoid any issues with the logging flag being set to 0 or 1. This CL will be immediately followed with an upcoming CL that replaces the logging in echo_cancellation.cc with the new functionality which will ensure that the logging flag is only used in one place within WebRTC, which in turn will fully ensure that all compilation units that uses the feature also have the flag properly set. BUG=webrtc:5201, webrtc:5298 Review-Url: https://codereview.webrtc.org/1877713002 Cr-Commit-Position: refs/heads/master@{#12607}
2016-05-03 07:01:18 -07:00
void DumpWav(const char* name,
int v_length,
const float* v,
int sample_rate_hz,
int num_channels) {
#if WEBRTC_AEC_DEBUG_DUMP == 1
WavWriter* file = GetWavFile(name, sample_rate_hz, num_channels);
file->WriteSamples(v, v_length);
#endif
}
void DumpWav(const char* name,
rtc::ArrayView<const float> v,
int sample_rate_hz,
int num_channels) {
#if WEBRTC_AEC_DEBUG_DUMP == 1
DumpWav(name, v.size(), v.data(), sample_rate_hz, num_channels);
#endif
}
This CL introduces a new data logging functionality to use for the APM. It allows simple and rapid additions of exploratory data logpoints to use during bug investigations and module performance analysis. The new data logging functionality is also in this CL used to replace the existing data logging functionality present in the AEC. Additional information: As there was an issue with that the build flag for activating this feature was not present in all compilation units that included the feature additional changes were needed. A summary of the changes are -The build files were modified to ensure that the logging build flag always is set to either 0 or 1 for compilation units that include the feature. -Build-time checks in the appropriate places were added to ensure that the above is fulfilled. -The build object was added dynamically to the AEC state as a pointer to ensure that the size of that state is not dependent on whether the logging build flag is set or not. -The constructor of the AEC class needed to be modified in order to construct the logging object. For this a destructor was also needed. -An unused method without any declaration was removed in order to avoid any issues with the logging flag being set to 0 or 1. This CL will be immediately followed with an upcoming CL that replaces the logging in echo_cancellation.cc with the new functionality which will ensure that the logging flag is only used in one place within WebRTC, which in turn will fully ensure that all compilation units that uses the feature also have the flag properly set. BUG=webrtc:5201, webrtc:5298 Review-Url: https://codereview.webrtc.org/1877713002 Cr-Commit-Position: refs/heads/master@{#12607}
2016-05-03 07:01:18 -07:00
private:
#if WEBRTC_AEC_DEBUG_DUMP == 1
const int instance_index_;
int recording_set_index_ = 0;
std::unordered_map<std::string, std::unique_ptr<FILE, RawFileCloseFunctor>>
raw_files_;
std::unordered_map<std::string, std::unique_ptr<WavWriter>> wav_files_;
FILE* GetRawFile(const char* name);
WavWriter* GetWavFile(const char* name, int sample_rate_hz, int num_channels);
#endif
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ApmDataDumper);
};
} // namespace webrtc
#endif // WEBRTC_MODULES_AUDIO_PROCESSING_LOGGING_APM_DATA_DUMPER_H_