| Index: media/tools/wav_ola_test.cc
|
| ===================================================================
|
| --- media/tools/wav_ola_test.cc (revision 0)
|
| +++ media/tools/wav_ola_test.cc (revision 0)
|
| @@ -0,0 +1,153 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// This application is a test for AudioRendererAlgorithmOLA. It reads in a
|
| +// specified wav file (so far only 8, 16 and 32 bit are supported) and uses
|
| +// ARAO to scale the playback by a specified rate. Then it outputs the result
|
| +// to the specified location. Command line calls should be as follows:
|
| +//
|
| +// wav_ola_test RATE INFILE OUTFILE
|
| +
|
| +#include <iostream>
|
| +#include <string>
|
| +
|
| +#include "base/command_line.h"
|
| +#include "base/file_util.h"
|
| +#include "base/ref_counted.h"
|
| +#include "base/string_util.h"
|
| +#include "media/base/data_buffer.h"
|
| +#include "media/filters/audio_renderer_algorithm_ola.h"
|
| +
|
| +using file_util::ScopedFILE;
|
| +using media::AudioRendererAlgorithmOLA;
|
| +using media::DataBuffer;
|
| +
|
| +const size_t kDefaultWindowSize = 4096;
|
| +
|
| +struct WavHeader {
|
| + int32 riff;
|
| + int32 chunk_size;
|
| + char unused0[8];
|
| + int32 subchunk1_size;
|
| + int16 audio_format;
|
| + int16 channels;
|
| + int32 sample_rate;
|
| + char unused1[6];
|
| + int16 bit_rate;
|
| + char unused2[4];
|
| + int32 subchunk2_size;
|
| +};
|
| +
|
| +// Dummy class to feed data to OLA algorithm. Necessary to create callback.
|
| +class Dummy {
|
| + public:
|
| + Dummy(FILE* in, AudioRendererAlgorithmOLA* ola)
|
| + : input_(in),
|
| + ola_(ola) {
|
| + }
|
| +
|
| + void ReadDataForAlg() {
|
| + scoped_refptr<DataBuffer> b(new DataBuffer());
|
| + uint8* buf = b->GetWritableData(kDefaultWindowSize);
|
| + if (fread(buf, 1, kDefaultWindowSize, input_) > 0) {
|
| + ola_->EnqueueBuffer(b.get());
|
| + }
|
| + }
|
| +
|
| + private:
|
| + FILE* input_;
|
| + AudioRendererAlgorithmOLA* ola_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Dummy);
|
| +};
|
| +
|
| +int main(int argc, const char** argv) {
|
| + AudioRendererAlgorithmOLA ola;
|
| + CommandLine::Init(argc, argv);
|
| + const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
|
| +
|
| + std::vector<std::wstring> filenames(cmd_line->GetLooseValues());
|
| + if (filenames.empty()) {
|
| + std::cerr << "Usage: alg_test RATE INFILE OUTFILE\n"
|
| + << std::endl;
|
| + return 1;
|
| + }
|
| +
|
| + // Retrieve command line options.
|
| + std::string in_path(WideToUTF8(filenames[1]));
|
| + std::string out_path(WideToUTF8(filenames[2]));
|
| + double playback_rate = 0.0;
|
| +
|
| + // Determine speed of rerecord.
|
| + if (!StringToDouble(WideToUTF8(filenames[0]), &playback_rate))
|
| + playback_rate = 0.0;
|
| +
|
| + // Open input file.
|
| + ScopedFILE input(file_util::OpenFile(in_path.c_str(), "rb"));
|
| + if (!(input.get())) {
|
| + LOG(ERROR) << "could not open input";
|
| + return 1;
|
| + }
|
| +
|
| + // Open output file.
|
| + ScopedFILE output(file_util::OpenFile(out_path.c_str(), "wb"));
|
| + if (!(output.get())) {
|
| + LOG(ERROR) << "could not open output";
|
| + return 1;
|
| + }
|
| +
|
| + // Read in header.
|
| + WavHeader wav;
|
| + if (fread(&wav, sizeof(wav), 1, input.get()) < 1) {
|
| + LOG(ERROR) << "could not read WAV header";
|
| + return 1;
|
| + }
|
| +
|
| + // Instantiate dummy class and callback to feed data to |ola|.
|
| + Dummy guy(input.get(), &ola);
|
| + AudioRendererAlgorithmOLA::RequestReadCallback* cb =
|
| + NewCallback(&guy, &Dummy::ReadDataForAlg);
|
| + ola.Initialize(wav.channels,
|
| + wav.bit_rate,
|
| + static_cast<float>(playback_rate),
|
| + cb);
|
| +
|
| + // Print out input format.
|
| + std::cout << in_path << "\n"
|
| + << "Channels: " << wav.channels << "\n"
|
| + << "Sample Rate: " << wav.sample_rate << "\n"
|
| + << "Bit Rate: " << wav.bit_rate << "\n"
|
| + << "\n"
|
| + << "Scaling audio by " << playback_rate << "x..." << std::endl;
|
| +
|
| + // Write the header back out again.
|
| + if (fwrite(&wav, sizeof(wav), 1, output.get()) < 1) {
|
| + LOG(ERROR) << "could not write WAV header";
|
| + return 1;
|
| + }
|
| +
|
| + // Create buffer to be filled by |ola|.
|
| + scoped_refptr<DataBuffer> buffer(new DataBuffer());
|
| + uint8* buf = buffer->GetWritableData(kDefaultWindowSize);
|
| +
|
| + // Keep track of bytes written to disk and bytes copied to |b|.
|
| + size_t bytes_written = 0;
|
| + size_t bytes;
|
| + while ((bytes = ola.FillBuffer(buffer.get())) > 0) {
|
| + if (fwrite(buf, 1, bytes, output.get()) != bytes) {
|
| + LOG(ERROR) << "could not write data after " << bytes_written;
|
| + } else {
|
| + bytes_written += bytes;
|
| + }
|
| + }
|
| +
|
| + // Seek back to the beginning of our output file and update the header.
|
| + wav.chunk_size = 36 + bytes_written;
|
| + wav.subchunk1_size = 16;
|
| + wav.subchunk2_size = bytes_written;
|
| + fseek(output.get(), 0, SEEK_SET);
|
| + fwrite(&wav, sizeof(wav), 1, output.get());
|
| +
|
| + return 0;
|
| +}
|
|
|
| Property changes on: media\tools\wav_ola_test.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|