1 /*
2 * Copyright (c) 2016 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/logging/apm_data_dumper.h"
12
13 #include "rtc_base/strings/string_builder.h"
14
15 // Check to verify that the define is properly set.
16 #if !defined(WEBRTC_APM_DEBUG_DUMP) || \
17 (WEBRTC_APM_DEBUG_DUMP != 0 && WEBRTC_APM_DEBUG_DUMP != 1)
18 #error "Set WEBRTC_APM_DEBUG_DUMP to either 0 or 1"
19 #endif
20
21 namespace webrtc {
22 namespace {
23
24 #if WEBRTC_APM_DEBUG_DUMP == 1
25
26 #if defined(WEBRTC_WIN)
27 constexpr char kPathDelimiter = '\\';
28 #else
29 constexpr char kPathDelimiter = '/';
30 #endif
31
FormFileName(const char * output_dir,const char * name,int instance_index,int reinit_index,const std::string & suffix)32 std::string FormFileName(const char* output_dir,
33 const char* name,
34 int instance_index,
35 int reinit_index,
36 const std::string& suffix) {
37 char buf[1024];
38 rtc::SimpleStringBuilder ss(buf);
39 const size_t output_dir_size = strlen(output_dir);
40 if (output_dir_size > 0) {
41 ss << output_dir;
42 if (output_dir[output_dir_size - 1] != kPathDelimiter) {
43 ss << kPathDelimiter;
44 }
45 }
46 ss << name << "_" << instance_index << "-" << reinit_index << suffix;
47 return ss.str();
48 }
49 #endif
50
51 } // namespace
52
53 #if WEBRTC_APM_DEBUG_DUMP == 1
ApmDataDumper(int instance_index)54 ApmDataDumper::ApmDataDumper(int instance_index)
55 : instance_index_(instance_index) {}
56 #else
ApmDataDumper(int instance_index)57 ApmDataDumper::ApmDataDumper(int instance_index) {}
58 #endif
59
60 ApmDataDumper::~ApmDataDumper() = default;
61
62 #if WEBRTC_APM_DEBUG_DUMP == 1
63 bool ApmDataDumper::recording_activated_ = false;
64 char ApmDataDumper::output_dir_[] = "";
65
GetRawFile(const char * name)66 FILE* ApmDataDumper::GetRawFile(const char* name) {
67 std::string filename = FormFileName(output_dir_, name, instance_index_,
68 recording_set_index_, ".dat");
69 auto& f = raw_files_[filename];
70 if (!f) {
71 f.reset(fopen(filename.c_str(), "wb"));
72 RTC_CHECK(f.get()) << "Cannot write to " << filename << ".";
73 }
74 return f.get();
75 }
76
GetWavFile(const char * name,int sample_rate_hz,int num_channels,WavFile::SampleFormat format)77 WavWriter* ApmDataDumper::GetWavFile(const char* name,
78 int sample_rate_hz,
79 int num_channels,
80 WavFile::SampleFormat format) {
81 std::string filename = FormFileName(output_dir_, name, instance_index_,
82 recording_set_index_, ".wav");
83 auto& f = wav_files_[filename];
84 if (!f) {
85 f.reset(
86 new WavWriter(filename.c_str(), sample_rate_hz, num_channels, format));
87 }
88 return f.get();
89 }
90 #endif
91
92 } // namespace webrtc
93