Add aecdump support to audioproc_f

Originally landed here: https://codereview.webrtc.org/1409943002/
The transient suppression fix landed here: https://codereview.webrtc.org/1411423010/

TBR=mflodman

Review URL: https://codereview.webrtc.org/1432843002

Cr-Commit-Position: refs/heads/master@{#10722}
This commit is contained in:
aluebs
2015-11-20 00:11:53 -08:00
committed by Commit bot
parent ceb450b51d
commit b0ad43baa0
10 changed files with 465 additions and 160 deletions

View File

@ -31,6 +31,35 @@ void RawFile::WriteSamples(const float* samples, size_t num_samples) {
fwrite(samples, sizeof(*samples), num_samples, file_handle_);
}
ChannelBufferWavReader::ChannelBufferWavReader(rtc::scoped_ptr<WavReader> file)
: file_(file.Pass()) {}
bool ChannelBufferWavReader::Read(ChannelBuffer<float>* buffer) {
RTC_CHECK_EQ(file_->num_channels(), buffer->num_channels());
interleaved_.resize(buffer->size());
if (file_->ReadSamples(interleaved_.size(), &interleaved_[0]) !=
interleaved_.size()) {
return false;
}
FloatS16ToFloat(&interleaved_[0], interleaved_.size(), &interleaved_[0]);
Deinterleave(&interleaved_[0], buffer->num_frames(), buffer->num_channels(),
buffer->channels());
return true;
}
ChannelBufferWavWriter::ChannelBufferWavWriter(rtc::scoped_ptr<WavWriter> file)
: file_(file.Pass()) {}
void ChannelBufferWavWriter::Write(const ChannelBuffer<float>& buffer) {
RTC_CHECK_EQ(file_->num_channels(), buffer.num_channels());
interleaved_.resize(buffer.size());
Interleave(buffer.channels(), buffer.num_frames(), buffer.num_channels(),
&interleaved_[0]);
FloatToFloatS16(&interleaved_[0], interleaved_.size(), &interleaved_[0]);
file_->WriteSamples(&interleaved_[0], interleaved_.size());
}
void WriteIntData(const int16_t* data,
size_t length,
WavWriter* wav_file,
@ -92,28 +121,32 @@ AudioProcessing::ChannelLayout LayoutFromChannels(int num_channels) {
case 2:
return AudioProcessing::kStereo;
default:
assert(false);
RTC_CHECK(false);
return AudioProcessing::kMono;
}
}
std::vector<Point> ParseArrayGeometry(const std::string& mic_positions,
size_t num_mics) {
std::vector<Point> ParseArrayGeometry(const std::string& mic_positions) {
const std::vector<float> values = ParseList<float>(mic_positions);
RTC_CHECK_EQ(values.size(), 3 * num_mics)
<< "Could not parse mic_positions or incorrect number of points.";
const size_t num_mics =
rtc::CheckedDivExact(values.size(), static_cast<size_t>(3));
RTC_CHECK_GT(num_mics, 0u) << "mic_positions is not large enough.";
std::vector<Point> result;
result.reserve(num_mics);
for (size_t i = 0; i < values.size(); i += 3) {
double x = values[i + 0];
double y = values[i + 1];
double z = values[i + 2];
result.push_back(Point(x, y, z));
result.push_back(Point(values[i + 0], values[i + 1], values[i + 2]));
}
return result;
}
std::vector<Point> ParseArrayGeometry(const std::string& mic_positions,
size_t num_mics) {
std::vector<Point> result = ParseArrayGeometry(mic_positions);
RTC_CHECK_EQ(result.size(), num_mics)
<< "Could not parse mic_positions or incorrect number of points.";
return result;
}
} // namespace webrtc