alessiob 3339743878 MultiEndCall is responsible for analyzing and validating timing information and audiotracks with which a multi-end call can be simulated.
The class creates one WavReaderInterface object for each unique audiotrack and builds the set of speaker names.
Validating if the audiotrack lengths and the timing information are compatible (and hence valid) is not implemented yet.

MultiEndCall is designed using dependency injection. This allows to use mock objects with which we can quickly simulate different timings and track lengths without needing actual wav files.

BUG=webrtc:7218

Review-Url: https://codereview.webrtc.org/2761853002
Cr-Commit-Position: refs/heads/master@{#17421}
2017-03-28 12:39:59 +00:00

67 lines
1.8 KiB
C++

/*
* Copyright (c) 2017 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.
*/
#include "webrtc/modules/audio_processing/test/conversational_speech/timing.h"
#include <fstream>
#include <iostream>
#include "webrtc/base/stringencode.h"
namespace webrtc {
namespace test {
namespace conversational_speech {
bool Turn::operator==(const Turn &b) const {
return b.speaker_name == speaker_name &&
b.audiotrack_file_name == audiotrack_file_name &&
b.offset == offset;
}
std::vector<Turn> LoadTiming(const std::string& timing_filepath) {
// Line parser.
auto parse_line = [](const std::string& line) {
std::vector<std::string> fields;
rtc::split(line, ' ', &fields);
RTC_CHECK_EQ(fields.size(), 3);
return Turn(fields[0], fields[1], std::atol(fields[2].c_str()));
};
// Init.
std::vector<Turn> timing;
// Parse lines.
std::string line;
std::ifstream infile(timing_filepath);
while (std::getline(infile, line)) {
if (line.empty())
continue;
timing.push_back(parse_line(line));
}
infile.close();
return timing;
}
void SaveTiming(const std::string& timing_filepath,
rtc::ArrayView<const Turn> timing) {
std::ofstream outfile(timing_filepath);
// TODO(alessio): check if file open for writing.
for (const Turn& turn : timing) {
outfile << turn.speaker_name << " " << turn.audiotrack_file_name
<< " " << turn.offset << std::endl;
}
outfile.close();
}
} // namespace conversational_speech
} // namespace test
} // namespace webrtc