1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Commandline tool to unpack audioproc debug files. 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The debug files are dumped as protobuf blobs. For analysis, it's necessary 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// to unpack the file into its component parts: audio and other data. 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdio.h> 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 189fb16139d917ba32720e031d3c871987d418668fpbos@webrtc.org#include "gflags/gflags.h" 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "webrtc/audio_processing/debug.pb.h" 20b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org#include "webrtc/modules/audio_processing/test/test_utils.h" 219fb16139d917ba32720e031d3c871987d418668fpbos@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 229fb16139d917ba32720e031d3c871987d418668fpbos@webrtc.org#include "webrtc/typedefs.h" 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// TODO(andrew): unpack more of the data. 2529841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.orgDEFINE_string(input_file, "input", "The name of the input stream file."); 2629841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.orgDEFINE_string(output_file, "ref_out", 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "The name of the reference output stream file."); 2829841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.orgDEFINE_string(reverse_file, "reverse", 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "The name of the reverse input stream file."); 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgDEFINE_string(delay_file, "delay.int32", "The name of the delay file."); 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgDEFINE_string(drift_file, "drift.int32", "The name of the drift file."); 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgDEFINE_string(level_file, "level.int32", "The name of the level file."); 3348d75c0870cebf8253e09a323a6c341c8be762b0andrew@webrtc.orgDEFINE_string(keypress_file, "keypress.bool", "The name of the keypress file."); 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgDEFINE_string(settings_file, "settings.txt", "The name of the settings file."); 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgDEFINE_bool(full, false, 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "Unpack the full set of files (normally not needed)."); 3729841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.orgDEFINE_bool(raw, false, "Write raw data instead of a WAV file."); 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.orgnamespace webrtc { 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 41b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.orgusing audioproc::Event; 42b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.orgusing audioproc::ReverseStream; 43b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.orgusing audioproc::Stream; 44b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.orgusing audioproc::Init; 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 46b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.orgvoid WriteData(const void* data, size_t size, FILE* file, 47b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org const std::string& filename) { 48b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org if (fwrite(data, size, 1, file) != 1) { 49b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org printf("Error when writing to %s\n", filename.c_str()); 50b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org exit(1); 51b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org } 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 54b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.orgint do_main(int argc, char* argv[]) { 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string program_name = argv[0]; 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string usage = "Commandline tool to unpack audioproc debug files.\n" 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "Example usage:\n" + program_name + " debug_dump.pb\n"; 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org google::SetUsageMessage(usage); 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org google::ParseCommandLineFlags(&argc, &argv, true); 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (argc < 2) { 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("%s", google::ProgramUsage()); 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 1; 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 66b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org FILE* debug_file = OpenFile(argv[1], "rb"); 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Event event_msg; 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int frame_count = 0; 7083d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org int reverse_samples_per_channel = 0; 7183d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org int input_samples_per_channel = 0; 7283d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org int output_samples_per_channel = 0; 7383d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org int num_reverse_channels = 0; 7402b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org int num_input_channels = 0; 7502b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org int num_output_channels = 0; 7602b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org scoped_ptr<WavFile> reverse_wav_file; 7702b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org scoped_ptr<WavFile> input_wav_file; 7802b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org scoped_ptr<WavFile> output_wav_file; 7929841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org scoped_ptr<RawFile> reverse_raw_file; 8029841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org scoped_ptr<RawFile> input_raw_file; 8129841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org scoped_ptr<RawFile> output_raw_file; 8202b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org while (ReadMessageFromFile(debug_file, &event_msg)) { 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (event_msg.type() == Event::REVERSE_STREAM) { 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!event_msg.has_reverse_stream()) { 85b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org printf("Corrupt input file: ReverseStream missing.\n"); 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 1; 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const ReverseStream msg = event_msg.reverse_stream(); 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (msg.has_data()) { 9129841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org if (FLAGS_raw && !reverse_raw_file) { 9229841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org reverse_raw_file.reset(new RawFile(FLAGS_reverse_file + ".pcm")); 9329841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org } 9483d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org // TODO(aluebs): Replace "num_reverse_channels * 9583d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org // reverse_samples_per_channel" with "msg.data().size() / 9683d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org // sizeof(int16_t)" and so on when this fix in audio_processing has made 9783d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org // it into stable: https://webrtc-codereview.appspot.com/15299004/ 9802b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org WriteIntData(reinterpret_cast<const int16_t*>(msg.data().data()), 9983d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org num_reverse_channels * reverse_samples_per_channel, 10002b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org reverse_wav_file.get(), 10129841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org reverse_raw_file.get()); 102b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org } else if (msg.channel_size() > 0) { 10329841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org if (FLAGS_raw && !reverse_raw_file) { 10429841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org reverse_raw_file.reset(new RawFile(FLAGS_reverse_file + ".float")); 10529841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org } 10602b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org scoped_ptr<const float*[]> data(new const float*[num_reverse_channels]); 10702b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org for (int i = 0; i < num_reverse_channels; ++i) { 10802b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org data[i] = reinterpret_cast<const float*>(msg.channel(i).data()); 10902b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org } 11002b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org WriteFloatData(data.get(), 11183d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org reverse_samples_per_channel, 11202b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org num_reverse_channels, 11302b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org reverse_wav_file.get(), 11429841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org reverse_raw_file.get()); 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } else if (event_msg.type() == Event::STREAM) { 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame_count++; 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!event_msg.has_stream()) { 119b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org printf("Corrupt input file: Stream missing.\n"); 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 1; 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const Stream msg = event_msg.stream(); 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (msg.has_input_data()) { 12529841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org if (FLAGS_raw && !input_raw_file) { 12629841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org input_raw_file.reset(new RawFile(FLAGS_input_file + ".pcm")); 12729841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org } 12802b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org WriteIntData(reinterpret_cast<const int16_t*>(msg.input_data().data()), 12983d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org num_input_channels * input_samples_per_channel, 13002b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org input_wav_file.get(), 13129841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org input_raw_file.get()); 132b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org } else if (msg.input_channel_size() > 0) { 13329841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org if (FLAGS_raw && !input_raw_file) { 13429841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org input_raw_file.reset(new RawFile(FLAGS_input_file + ".float")); 13529841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org } 13602b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org scoped_ptr<const float*[]> data(new const float*[num_input_channels]); 13702b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org for (int i = 0; i < num_input_channels; ++i) { 13802b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org data[i] = reinterpret_cast<const float*>(msg.input_channel(i).data()); 13902b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org } 14002b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org WriteFloatData(data.get(), 14183d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org input_samples_per_channel, 14202b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org num_input_channels, 14302b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org input_wav_file.get(), 14429841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org input_raw_file.get()); 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (msg.has_output_data()) { 14829841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org if (FLAGS_raw && !output_raw_file) { 14929841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org output_raw_file.reset(new RawFile(FLAGS_output_file + ".pcm")); 15029841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org } 15102b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org WriteIntData(reinterpret_cast<const int16_t*>(msg.output_data().data()), 15283d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org num_output_channels * output_samples_per_channel, 15302b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org output_wav_file.get(), 15429841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org output_raw_file.get()); 155b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org } else if (msg.output_channel_size() > 0) { 15629841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org if (FLAGS_raw && !output_raw_file) { 15729841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org output_raw_file.reset(new RawFile(FLAGS_output_file + ".float")); 15829841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org } 15902b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org scoped_ptr<const float*[]> data(new const float*[num_output_channels]); 16002b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org for (int i = 0; i < num_output_channels; ++i) { 16102b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org data[i] = 16202b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org reinterpret_cast<const float*>(msg.output_channel(i).data()); 16302b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org } 16402b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org WriteFloatData(data.get(), 16583d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org output_samples_per_channel, 16602b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org num_output_channels, 16702b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org output_wav_file.get(), 16829841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org output_raw_file.get()); 169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (FLAGS_full) { 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (msg.has_delay()) { 173b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org static FILE* delay_file = OpenFile(FLAGS_delay_file, "wb"); 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int32_t delay = msg.delay(); 175b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org WriteData(&delay, sizeof(delay), delay_file, FLAGS_delay_file); 176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (msg.has_drift()) { 179b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org static FILE* drift_file = OpenFile(FLAGS_drift_file, "wb"); 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int32_t drift = msg.drift(); 181b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org WriteData(&drift, sizeof(drift), drift_file, FLAGS_drift_file); 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (msg.has_level()) { 185b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org static FILE* level_file = OpenFile(FLAGS_level_file, "wb"); 186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int32_t level = msg.level(); 187b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org WriteData(&level, sizeof(level), level_file, FLAGS_level_file); 188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 18948d75c0870cebf8253e09a323a6c341c8be762b0andrew@webrtc.org 19048d75c0870cebf8253e09a323a6c341c8be762b0andrew@webrtc.org if (msg.has_keypress()) { 191b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org static FILE* keypress_file = OpenFile(FLAGS_keypress_file, "wb"); 19248d75c0870cebf8253e09a323a6c341c8be762b0andrew@webrtc.org bool keypress = msg.keypress(); 193b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org WriteData(&keypress, sizeof(keypress), keypress_file, 194b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org FLAGS_keypress_file); 19548d75c0870cebf8253e09a323a6c341c8be762b0andrew@webrtc.org } 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } else if (event_msg.type() == Event::INIT) { 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!event_msg.has_init()) { 199b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org printf("Corrupt input file: Init missing.\n"); 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 1; 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 203b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org static FILE* settings_file = OpenFile(FLAGS_settings_file, "wb"); 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const Init msg = event_msg.init(); 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // These should print out zeros if they're missing. 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fprintf(settings_file, "Init at frame: %d\n", frame_count); 20702b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org int input_sample_rate = msg.sample_rate(); 20802b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org fprintf(settings_file, " Input sample rate: %d\n", input_sample_rate); 20902b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org int output_sample_rate = msg.output_sample_rate(); 21002b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org fprintf(settings_file, " Output sample rate: %d\n", output_sample_rate); 21102b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org int reverse_sample_rate = msg.reverse_sample_rate(); 21202b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org fprintf(settings_file, 21302b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org " Reverse sample rate: %d\n", 21402b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org reverse_sample_rate); 21502b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org num_input_channels = msg.num_input_channels(); 21602b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org fprintf(settings_file, " Input channels: %d\n", num_input_channels); 21702b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org num_output_channels = msg.num_output_channels(); 21802b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org fprintf(settings_file, " Output channels: %d\n", num_output_channels); 21902b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org num_reverse_channels = msg.num_reverse_channels(); 22002b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org fprintf(settings_file, " Reverse channels: %d\n", num_reverse_channels); 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fprintf(settings_file, "\n"); 22302b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org 22402b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org if (reverse_sample_rate == 0) { 22502b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org reverse_sample_rate = input_sample_rate; 22602b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org } 22702b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org if (output_sample_rate == 0) { 22802b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org output_sample_rate = input_sample_rate; 22902b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org } 23002b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org 23183d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org reverse_samples_per_channel = reverse_sample_rate / 100; 23283d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org input_samples_per_channel = input_sample_rate / 100; 23383d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org output_samples_per_channel = output_sample_rate / 100; 23483d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org 23529841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org if (!FLAGS_raw) { 23629841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org // The WAV files need to be reset every time, because they cant change 23729841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org // their sample rate or number of channels. 23829841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org reverse_wav_file.reset(new WavFile(FLAGS_reverse_file + ".wav", 23983d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org reverse_sample_rate, 24083d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org num_reverse_channels)); 24129841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org input_wav_file.reset(new WavFile(FLAGS_input_file + ".wav", 24283d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org input_sample_rate, 24383d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org num_input_channels)); 24429841cb8d3a1101cc878debdbc481cee63e75a19aluebs@webrtc.org output_wav_file.reset(new WavFile(FLAGS_output_file + ".wav", 24583d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org output_sample_rate, 24683d0456730a4036ec6be89bf1b1ce9d0b38ce2b5aluebs@webrtc.org num_output_channels)); 24702b30eb3e27bd4db9caa02cdf4001d8f42417533aluebs@webrtc.org } 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 253b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org 254b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org} // namespace webrtc 255b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org 256b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.orgint main(int argc, char* argv[]) { 257b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org return webrtc::do_main(argc, argv); 258b5b49c0723428d30e68bc8edcc089049a29e0703andrew@webrtc.org} 259