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