New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2014 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.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// MSVC++ requires this to be set before any other includes to get M_PI.
|
|
|
|
|
#define _USE_MATH_DEFINES
|
|
|
|
|
|
|
|
|
|
#include <cmath>
|
|
|
|
|
#include <limits>
|
|
|
|
|
|
2017-09-15 06:47:31 +02:00
|
|
|
#include "common_audio/wav_file.h"
|
|
|
|
|
#include "common_audio/wav_header.h"
|
|
|
|
|
#include "test/gtest.h"
|
|
|
|
|
#include "test/testsupport/fileutils.h"
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
|
2014-12-16 20:17:21 +00:00
|
|
|
namespace webrtc {
|
|
|
|
|
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
static const float kSamples[] = {0.0, 10.0, 4e4, -1e9};
|
|
|
|
|
|
|
|
|
|
// Write a tiny WAV file with the C++ interface and verify the result.
|
|
|
|
|
TEST(WavWriterTest, CPP) {
|
2014-12-16 20:17:21 +00:00
|
|
|
const std::string outfile = test::OutputPath() + "wavtest1.wav";
|
Misc. small cleanups.
* Better param names
* Avoid using negative values for (bogus) placeholder channel counts (mostly in tests). Since channels will be changing to size_t, negative values will be illegal; it's sufficient to use 0 in these cases.
* Use arraysize()
* Use size_t for counting frames, samples, blocks, buffers, and bytes -- most of these are already size_t in most places, this just fixes some stragglers
* reinterpret_cast<int64_t>(void*) is not necessarily safe; use uintptr_t instead
* Remove unnecessary code, e.g. dead code, needlessly long/repetitive code, or function overrides that exactly match the base definition
* Fix indenting
* Use uint32_t for timestamps (matching how it's already a uint32_t in most places)
* Spelling
* RTC_CHECK_EQ(expected, actual)
* Rewrap
* Use .empty()
* Be more pedantic about matching int/int32_t/
* Remove pointless consts on input parameters to functions
* Add missing sanity checks
All this was found in the course of constructing https://codereview.webrtc.org/1316523002/ , and is being landed separately first.
BUG=none
TEST=none
Review URL: https://codereview.webrtc.org/1534193008
Cr-Commit-Position: refs/heads/master@{#11191}
2016-01-08 13:50:27 -08:00
|
|
|
static const size_t kNumSamples = 3;
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
{
|
2014-12-16 20:17:21 +00:00
|
|
|
WavWriter w(outfile, 14099, 1);
|
2014-08-25 06:26:04 +00:00
|
|
|
EXPECT_EQ(14099, w.sample_rate());
|
Convert channel counts to size_t.
IIRC, this was originally requested by ajm during review of the other size_t conversions I did over the past year, and I agreed it made sense, but wanted to do it separately since those changes were already gargantuan.
BUG=chromium:81439
TEST=none
R=henrik.lundin@webrtc.org, henrika@webrtc.org, kjellander@webrtc.org, minyue@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1316523002 .
Cr-Commit-Position: refs/heads/master@{#11229}
2016-01-12 16:26:35 -08:00
|
|
|
EXPECT_EQ(1u, w.num_channels());
|
2014-08-25 06:26:04 +00:00
|
|
|
EXPECT_EQ(0u, w.num_samples());
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
w.WriteSamples(kSamples, kNumSamples);
|
2014-08-25 06:26:04 +00:00
|
|
|
EXPECT_EQ(kNumSamples, w.num_samples());
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
}
|
2014-12-16 20:17:21 +00:00
|
|
|
// Write some extra "metadata" to the file that should be silently ignored
|
|
|
|
|
// by WavReader. We don't use WavWriter directly for this because it doesn't
|
|
|
|
|
// support metadata.
|
|
|
|
|
static const uint8_t kMetadata[] = {101, 202};
|
|
|
|
|
{
|
|
|
|
|
FILE* f = fopen(outfile.c_str(), "ab");
|
|
|
|
|
ASSERT_TRUE(f);
|
|
|
|
|
ASSERT_EQ(1u, fwrite(kMetadata, sizeof(kMetadata), 1, f));
|
|
|
|
|
fclose(f);
|
|
|
|
|
}
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
static const uint8_t kExpectedContents[] = {
|
|
|
|
|
'R', 'I', 'F', 'F',
|
|
|
|
|
42, 0, 0, 0, // size of whole file - 8: 6 + 44 - 8
|
|
|
|
|
'W', 'A', 'V', 'E',
|
|
|
|
|
'f', 'm', 't', ' ',
|
|
|
|
|
16, 0, 0, 0, // size of fmt block - 8: 24 - 8
|
|
|
|
|
1, 0, // format: PCM (1)
|
|
|
|
|
1, 0, // channels: 1
|
|
|
|
|
0x13, 0x37, 0, 0, // sample rate: 14099
|
|
|
|
|
0x26, 0x6e, 0, 0, // byte rate: 2 * 14099
|
|
|
|
|
2, 0, // block align: NumChannels * BytesPerSample
|
|
|
|
|
16, 0, // bits per sample: 2 * 8
|
|
|
|
|
'd', 'a', 't', 'a',
|
|
|
|
|
6, 0, 0, 0, // size of payload: 6
|
|
|
|
|
0, 0, // first sample: 0.0
|
|
|
|
|
10, 0, // second sample: 10.0
|
|
|
|
|
0xff, 0x7f, // third sample: 4e4 (saturated)
|
2014-12-16 20:17:21 +00:00
|
|
|
kMetadata[0], kMetadata[1],
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
};
|
Misc. small cleanups.
* Better param names
* Avoid using negative values for (bogus) placeholder channel counts (mostly in tests). Since channels will be changing to size_t, negative values will be illegal; it's sufficient to use 0 in these cases.
* Use arraysize()
* Use size_t for counting frames, samples, blocks, buffers, and bytes -- most of these are already size_t in most places, this just fixes some stragglers
* reinterpret_cast<int64_t>(void*) is not necessarily safe; use uintptr_t instead
* Remove unnecessary code, e.g. dead code, needlessly long/repetitive code, or function overrides that exactly match the base definition
* Fix indenting
* Use uint32_t for timestamps (matching how it's already a uint32_t in most places)
* Spelling
* RTC_CHECK_EQ(expected, actual)
* Rewrap
* Use .empty()
* Be more pedantic about matching int/int32_t/
* Remove pointless consts on input parameters to functions
* Add missing sanity checks
All this was found in the course of constructing https://codereview.webrtc.org/1316523002/ , and is being landed separately first.
BUG=none
TEST=none
Review URL: https://codereview.webrtc.org/1534193008
Cr-Commit-Position: refs/heads/master@{#11191}
2016-01-08 13:50:27 -08:00
|
|
|
static const size_t kContentSize =
|
2014-12-16 20:17:21 +00:00
|
|
|
kWavHeaderSize + kNumSamples * sizeof(int16_t) + sizeof(kMetadata);
|
2015-01-14 10:51:54 +00:00
|
|
|
static_assert(sizeof(kExpectedContents) == kContentSize, "content size");
|
Misc. small cleanups.
* Better param names
* Avoid using negative values for (bogus) placeholder channel counts (mostly in tests). Since channels will be changing to size_t, negative values will be illegal; it's sufficient to use 0 in these cases.
* Use arraysize()
* Use size_t for counting frames, samples, blocks, buffers, and bytes -- most of these are already size_t in most places, this just fixes some stragglers
* reinterpret_cast<int64_t>(void*) is not necessarily safe; use uintptr_t instead
* Remove unnecessary code, e.g. dead code, needlessly long/repetitive code, or function overrides that exactly match the base definition
* Fix indenting
* Use uint32_t for timestamps (matching how it's already a uint32_t in most places)
* Spelling
* RTC_CHECK_EQ(expected, actual)
* Rewrap
* Use .empty()
* Be more pedantic about matching int/int32_t/
* Remove pointless consts on input parameters to functions
* Add missing sanity checks
All this was found in the course of constructing https://codereview.webrtc.org/1316523002/ , and is being landed separately first.
BUG=none
TEST=none
Review URL: https://codereview.webrtc.org/1534193008
Cr-Commit-Position: refs/heads/master@{#11191}
2016-01-08 13:50:27 -08:00
|
|
|
EXPECT_EQ(kContentSize, test::GetFileSize(outfile));
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
FILE* f = fopen(outfile.c_str(), "rb");
|
|
|
|
|
ASSERT_TRUE(f);
|
|
|
|
|
uint8_t contents[kContentSize];
|
|
|
|
|
ASSERT_EQ(1u, fread(contents, kContentSize, 1, f));
|
|
|
|
|
EXPECT_EQ(0, fclose(f));
|
|
|
|
|
EXPECT_EQ(0, memcmp(kExpectedContents, contents, kContentSize));
|
2014-10-31 21:51:03 +00:00
|
|
|
|
|
|
|
|
{
|
2014-12-16 20:17:21 +00:00
|
|
|
WavReader r(outfile);
|
2014-10-31 21:51:03 +00:00
|
|
|
EXPECT_EQ(14099, r.sample_rate());
|
Convert channel counts to size_t.
IIRC, this was originally requested by ajm during review of the other size_t conversions I did over the past year, and I agreed it made sense, but wanted to do it separately since those changes were already gargantuan.
BUG=chromium:81439
TEST=none
R=henrik.lundin@webrtc.org, henrika@webrtc.org, kjellander@webrtc.org, minyue@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1316523002 .
Cr-Commit-Position: refs/heads/master@{#11229}
2016-01-12 16:26:35 -08:00
|
|
|
EXPECT_EQ(1u, r.num_channels());
|
2014-10-31 21:51:03 +00:00
|
|
|
EXPECT_EQ(kNumSamples, r.num_samples());
|
|
|
|
|
static const float kTruncatedSamples[] = {0.0, 10.0, 32767.0};
|
|
|
|
|
float samples[kNumSamples];
|
|
|
|
|
EXPECT_EQ(kNumSamples, r.ReadSamples(kNumSamples, samples));
|
|
|
|
|
EXPECT_EQ(0, memcmp(kTruncatedSamples, samples, sizeof(samples)));
|
|
|
|
|
EXPECT_EQ(0u, r.ReadSamples(kNumSamples, samples));
|
|
|
|
|
}
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Write a tiny WAV file with the C interface and verify the result.
|
|
|
|
|
TEST(WavWriterTest, C) {
|
2014-12-16 20:17:21 +00:00
|
|
|
const std::string outfile = test::OutputPath() + "wavtest2.wav";
|
|
|
|
|
rtc_WavWriter* w = rtc_WavOpen(outfile.c_str(), 11904, 2);
|
2014-08-25 06:26:04 +00:00
|
|
|
EXPECT_EQ(11904, rtc_WavSampleRate(w));
|
Convert channel counts to size_t.
IIRC, this was originally requested by ajm during review of the other size_t conversions I did over the past year, and I agreed it made sense, but wanted to do it separately since those changes were already gargantuan.
BUG=chromium:81439
TEST=none
R=henrik.lundin@webrtc.org, henrika@webrtc.org, kjellander@webrtc.org, minyue@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1316523002 .
Cr-Commit-Position: refs/heads/master@{#11229}
2016-01-12 16:26:35 -08:00
|
|
|
EXPECT_EQ(2u, rtc_WavNumChannels(w));
|
2014-08-25 06:26:04 +00:00
|
|
|
EXPECT_EQ(0u, rtc_WavNumSamples(w));
|
Misc. small cleanups.
* Better param names
* Avoid using negative values for (bogus) placeholder channel counts (mostly in tests). Since channels will be changing to size_t, negative values will be illegal; it's sufficient to use 0 in these cases.
* Use arraysize()
* Use size_t for counting frames, samples, blocks, buffers, and bytes -- most of these are already size_t in most places, this just fixes some stragglers
* reinterpret_cast<int64_t>(void*) is not necessarily safe; use uintptr_t instead
* Remove unnecessary code, e.g. dead code, needlessly long/repetitive code, or function overrides that exactly match the base definition
* Fix indenting
* Use uint32_t for timestamps (matching how it's already a uint32_t in most places)
* Spelling
* RTC_CHECK_EQ(expected, actual)
* Rewrap
* Use .empty()
* Be more pedantic about matching int/int32_t/
* Remove pointless consts on input parameters to functions
* Add missing sanity checks
All this was found in the course of constructing https://codereview.webrtc.org/1316523002/ , and is being landed separately first.
BUG=none
TEST=none
Review URL: https://codereview.webrtc.org/1534193008
Cr-Commit-Position: refs/heads/master@{#11191}
2016-01-08 13:50:27 -08:00
|
|
|
static const size_t kNumSamples = 4;
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
rtc_WavWriteSamples(w, &kSamples[0], 2);
|
2014-08-25 06:26:04 +00:00
|
|
|
EXPECT_EQ(2u, rtc_WavNumSamples(w));
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
rtc_WavWriteSamples(w, &kSamples[2], kNumSamples - 2);
|
2014-08-25 06:26:04 +00:00
|
|
|
EXPECT_EQ(kNumSamples, rtc_WavNumSamples(w));
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
rtc_WavClose(w);
|
|
|
|
|
static const uint8_t kExpectedContents[] = {
|
|
|
|
|
'R', 'I', 'F', 'F',
|
|
|
|
|
44, 0, 0, 0, // size of whole file - 8: 8 + 44 - 8
|
|
|
|
|
'W', 'A', 'V', 'E',
|
|
|
|
|
'f', 'm', 't', ' ',
|
|
|
|
|
16, 0, 0, 0, // size of fmt block - 8: 24 - 8
|
|
|
|
|
1, 0, // format: PCM (1)
|
|
|
|
|
2, 0, // channels: 2
|
|
|
|
|
0x80, 0x2e, 0, 0, // sample rate: 11904
|
|
|
|
|
0, 0xba, 0, 0, // byte rate: 2 * 2 * 11904
|
|
|
|
|
4, 0, // block align: NumChannels * BytesPerSample
|
|
|
|
|
16, 0, // bits per sample: 2 * 8
|
|
|
|
|
'd', 'a', 't', 'a',
|
|
|
|
|
8, 0, 0, 0, // size of payload: 8
|
|
|
|
|
0, 0, // first sample: 0.0
|
|
|
|
|
10, 0, // second sample: 10.0
|
|
|
|
|
0xff, 0x7f, // third sample: 4e4 (saturated)
|
|
|
|
|
0, 0x80, // fourth sample: -1e9 (saturated)
|
|
|
|
|
};
|
Misc. small cleanups.
* Better param names
* Avoid using negative values for (bogus) placeholder channel counts (mostly in tests). Since channels will be changing to size_t, negative values will be illegal; it's sufficient to use 0 in these cases.
* Use arraysize()
* Use size_t for counting frames, samples, blocks, buffers, and bytes -- most of these are already size_t in most places, this just fixes some stragglers
* reinterpret_cast<int64_t>(void*) is not necessarily safe; use uintptr_t instead
* Remove unnecessary code, e.g. dead code, needlessly long/repetitive code, or function overrides that exactly match the base definition
* Fix indenting
* Use uint32_t for timestamps (matching how it's already a uint32_t in most places)
* Spelling
* RTC_CHECK_EQ(expected, actual)
* Rewrap
* Use .empty()
* Be more pedantic about matching int/int32_t/
* Remove pointless consts on input parameters to functions
* Add missing sanity checks
All this was found in the course of constructing https://codereview.webrtc.org/1316523002/ , and is being landed separately first.
BUG=none
TEST=none
Review URL: https://codereview.webrtc.org/1534193008
Cr-Commit-Position: refs/heads/master@{#11191}
2016-01-08 13:50:27 -08:00
|
|
|
static const size_t kContentSize =
|
2014-12-16 20:17:21 +00:00
|
|
|
kWavHeaderSize + kNumSamples * sizeof(int16_t);
|
2015-01-14 10:51:54 +00:00
|
|
|
static_assert(sizeof(kExpectedContents) == kContentSize, "content size");
|
Misc. small cleanups.
* Better param names
* Avoid using negative values for (bogus) placeholder channel counts (mostly in tests). Since channels will be changing to size_t, negative values will be illegal; it's sufficient to use 0 in these cases.
* Use arraysize()
* Use size_t for counting frames, samples, blocks, buffers, and bytes -- most of these are already size_t in most places, this just fixes some stragglers
* reinterpret_cast<int64_t>(void*) is not necessarily safe; use uintptr_t instead
* Remove unnecessary code, e.g. dead code, needlessly long/repetitive code, or function overrides that exactly match the base definition
* Fix indenting
* Use uint32_t for timestamps (matching how it's already a uint32_t in most places)
* Spelling
* RTC_CHECK_EQ(expected, actual)
* Rewrap
* Use .empty()
* Be more pedantic about matching int/int32_t/
* Remove pointless consts on input parameters to functions
* Add missing sanity checks
All this was found in the course of constructing https://codereview.webrtc.org/1316523002/ , and is being landed separately first.
BUG=none
TEST=none
Review URL: https://codereview.webrtc.org/1534193008
Cr-Commit-Position: refs/heads/master@{#11191}
2016-01-08 13:50:27 -08:00
|
|
|
EXPECT_EQ(kContentSize, test::GetFileSize(outfile));
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
FILE* f = fopen(outfile.c_str(), "rb");
|
|
|
|
|
ASSERT_TRUE(f);
|
|
|
|
|
uint8_t contents[kContentSize];
|
|
|
|
|
ASSERT_EQ(1u, fread(contents, kContentSize, 1, f));
|
|
|
|
|
EXPECT_EQ(0, fclose(f));
|
|
|
|
|
EXPECT_EQ(0, memcmp(kExpectedContents, contents, kContentSize));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Write a larger WAV file. You can listen to this file to sanity-check it.
|
|
|
|
|
TEST(WavWriterTest, LargeFile) {
|
2014-12-16 20:17:21 +00:00
|
|
|
std::string outfile = test::OutputPath() + "wavtest3.wav";
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
static const int kSampleRate = 8000;
|
Convert channel counts to size_t.
IIRC, this was originally requested by ajm during review of the other size_t conversions I did over the past year, and I agreed it made sense, but wanted to do it separately since those changes were already gargantuan.
BUG=chromium:81439
TEST=none
R=henrik.lundin@webrtc.org, henrika@webrtc.org, kjellander@webrtc.org, minyue@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1316523002 .
Cr-Commit-Position: refs/heads/master@{#11229}
2016-01-12 16:26:35 -08:00
|
|
|
static const size_t kNumChannels = 2;
|
Misc. small cleanups.
* Better param names
* Avoid using negative values for (bogus) placeholder channel counts (mostly in tests). Since channels will be changing to size_t, negative values will be illegal; it's sufficient to use 0 in these cases.
* Use arraysize()
* Use size_t for counting frames, samples, blocks, buffers, and bytes -- most of these are already size_t in most places, this just fixes some stragglers
* reinterpret_cast<int64_t>(void*) is not necessarily safe; use uintptr_t instead
* Remove unnecessary code, e.g. dead code, needlessly long/repetitive code, or function overrides that exactly match the base definition
* Fix indenting
* Use uint32_t for timestamps (matching how it's already a uint32_t in most places)
* Spelling
* RTC_CHECK_EQ(expected, actual)
* Rewrap
* Use .empty()
* Be more pedantic about matching int/int32_t/
* Remove pointless consts on input parameters to functions
* Add missing sanity checks
All this was found in the course of constructing https://codereview.webrtc.org/1316523002/ , and is being landed separately first.
BUG=none
TEST=none
Review URL: https://codereview.webrtc.org/1534193008
Cr-Commit-Position: refs/heads/master@{#11191}
2016-01-08 13:50:27 -08:00
|
|
|
static const size_t kNumSamples = 3 * kSampleRate * kNumChannels;
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
float samples[kNumSamples];
|
Misc. small cleanups.
* Better param names
* Avoid using negative values for (bogus) placeholder channel counts (mostly in tests). Since channels will be changing to size_t, negative values will be illegal; it's sufficient to use 0 in these cases.
* Use arraysize()
* Use size_t for counting frames, samples, blocks, buffers, and bytes -- most of these are already size_t in most places, this just fixes some stragglers
* reinterpret_cast<int64_t>(void*) is not necessarily safe; use uintptr_t instead
* Remove unnecessary code, e.g. dead code, needlessly long/repetitive code, or function overrides that exactly match the base definition
* Fix indenting
* Use uint32_t for timestamps (matching how it's already a uint32_t in most places)
* Spelling
* RTC_CHECK_EQ(expected, actual)
* Rewrap
* Use .empty()
* Be more pedantic about matching int/int32_t/
* Remove pointless consts on input parameters to functions
* Add missing sanity checks
All this was found in the course of constructing https://codereview.webrtc.org/1316523002/ , and is being landed separately first.
BUG=none
TEST=none
Review URL: https://codereview.webrtc.org/1534193008
Cr-Commit-Position: refs/heads/master@{#11191}
2016-01-08 13:50:27 -08:00
|
|
|
for (size_t i = 0; i < kNumSamples; i += kNumChannels) {
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
// A nice periodic beeping sound.
|
|
|
|
|
static const double kToneHz = 440;
|
|
|
|
|
const double t = static_cast<double>(i) / (kNumChannels * kSampleRate);
|
|
|
|
|
const double x =
|
|
|
|
|
std::numeric_limits<int16_t>::max() * std::sin(t * kToneHz * 2 * M_PI);
|
|
|
|
|
samples[i] = std::pow(std::sin(t * 2 * 2 * M_PI), 10) * x;
|
|
|
|
|
samples[i + 1] = std::pow(std::cos(t * 2 * 2 * M_PI), 10) * x;
|
|
|
|
|
}
|
|
|
|
|
{
|
2014-12-16 20:17:21 +00:00
|
|
|
WavWriter w(outfile, kSampleRate, kNumChannels);
|
2014-08-25 06:26:04 +00:00
|
|
|
EXPECT_EQ(kSampleRate, w.sample_rate());
|
|
|
|
|
EXPECT_EQ(kNumChannels, w.num_channels());
|
|
|
|
|
EXPECT_EQ(0u, w.num_samples());
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
w.WriteSamples(samples, kNumSamples);
|
2014-08-25 06:26:04 +00:00
|
|
|
EXPECT_EQ(kNumSamples, w.num_samples());
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
}
|
2014-12-16 20:17:21 +00:00
|
|
|
EXPECT_EQ(sizeof(int16_t) * kNumSamples + kWavHeaderSize,
|
|
|
|
|
test::GetFileSize(outfile));
|
2014-10-31 21:51:03 +00:00
|
|
|
|
|
|
|
|
{
|
2014-12-16 20:17:21 +00:00
|
|
|
WavReader r(outfile);
|
2014-10-31 21:51:03 +00:00
|
|
|
EXPECT_EQ(kSampleRate, r.sample_rate());
|
|
|
|
|
EXPECT_EQ(kNumChannels, r.num_channels());
|
|
|
|
|
EXPECT_EQ(kNumSamples, r.num_samples());
|
|
|
|
|
|
|
|
|
|
float read_samples[kNumSamples];
|
|
|
|
|
EXPECT_EQ(kNumSamples, r.ReadSamples(kNumSamples, read_samples));
|
|
|
|
|
for (size_t i = 0; i < kNumSamples; ++i)
|
|
|
|
|
EXPECT_NEAR(samples[i], read_samples[i], 1);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(0u, r.ReadSamples(kNumSamples, read_samples));
|
|
|
|
|
}
|
New utility class for easy debug dumping to WAV files
There are currently a number of places in the code where we dump audio
data in various stages of processing for debug purposes. Currently
these all write raw, uncompressed PCM files, which isn't supported by
the most common audio players, and requires the user to supply
metadata such as sample rate, sample size and endianness, etc.
This patch adds a simple class that makes it easy to write WAV files
instead. WAV files still contain the same uncompressed PCM data, but
they have a small header that contains all the requisite metadata, and
are supported by virtually all audio players.
Since some of the debug code that will be writing WAV files is written
in plain C, a C API is included as well.
R=andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/16809004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6932 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-08-20 07:42:46 +00:00
|
|
|
}
|
2014-12-16 20:17:21 +00:00
|
|
|
|
2018-03-19 15:40:00 +01:00
|
|
|
// Write a tiny WAV file with the the std::FILE interface and verify the
|
|
|
|
|
// result.
|
|
|
|
|
TEST(WavWriterTest, CPPFileDescriptor) {
|
|
|
|
|
const std::string outfile = test::OutputPath() + "wavtest1.wav";
|
|
|
|
|
static constexpr size_t kNumSamples = 3;
|
|
|
|
|
{
|
|
|
|
|
WavWriter w(rtc::CreatePlatformFile(outfile), 14099, 1);
|
|
|
|
|
EXPECT_EQ(14099, w.sample_rate());
|
|
|
|
|
EXPECT_EQ(1u, w.num_channels());
|
|
|
|
|
EXPECT_EQ(0u, w.num_samples());
|
|
|
|
|
w.WriteSamples(kSamples, kNumSamples);
|
|
|
|
|
EXPECT_EQ(kNumSamples, w.num_samples());
|
|
|
|
|
}
|
|
|
|
|
// Write some extra "metadata" to the file that should be silently ignored
|
|
|
|
|
// by WavReader. We don't use WavWriter directly for this because it doesn't
|
|
|
|
|
// support metadata.
|
|
|
|
|
static constexpr uint8_t kMetadata[] = {101, 202};
|
|
|
|
|
{
|
|
|
|
|
FILE* f = fopen(outfile.c_str(), "ab");
|
|
|
|
|
ASSERT_TRUE(f);
|
|
|
|
|
ASSERT_EQ(1u, fwrite(kMetadata, sizeof(kMetadata), 1, f));
|
|
|
|
|
fclose(f);
|
|
|
|
|
}
|
|
|
|
|
static const uint8_t kExpectedContents[] = {
|
|
|
|
|
// clang-format off
|
|
|
|
|
'R', 'I', 'F', 'F',
|
|
|
|
|
42, 0, 0, 0, // size of whole file - 8: 6 + 44 - 8
|
|
|
|
|
'W', 'A', 'V', 'E',
|
|
|
|
|
'f', 'm', 't', ' ',
|
|
|
|
|
16, 0, 0, 0, // size of fmt block - 8: 24 - 8
|
|
|
|
|
1, 0, // format: PCM (1)
|
|
|
|
|
1, 0, // channels: 1
|
|
|
|
|
0x13, 0x37, 0, 0, // sample rate: 14099
|
|
|
|
|
0x26, 0x6e, 0, 0, // byte rate: 2 * 14099
|
|
|
|
|
2, 0, // block align: NumChannels * BytesPerSample
|
|
|
|
|
16, 0, // bits per sample: 2 * 8
|
|
|
|
|
'd', 'a', 't', 'a',
|
|
|
|
|
6, 0, 0, 0, // size of payload: 6
|
|
|
|
|
0, 0, // first sample: 0.0
|
|
|
|
|
10, 0, // second sample: 10.0
|
|
|
|
|
0xff, 0x7f, // third sample: 4e4 (saturated)
|
|
|
|
|
kMetadata[0], kMetadata[1],
|
|
|
|
|
// clang-format on
|
|
|
|
|
};
|
|
|
|
|
static constexpr size_t kContentSize =
|
|
|
|
|
kWavHeaderSize + kNumSamples * sizeof(int16_t) + sizeof(kMetadata);
|
|
|
|
|
static_assert(sizeof(kExpectedContents) == kContentSize, "");
|
|
|
|
|
EXPECT_EQ(kContentSize, test::GetFileSize(outfile));
|
|
|
|
|
FILE* f = fopen(outfile.c_str(), "rb");
|
|
|
|
|
ASSERT_TRUE(f);
|
|
|
|
|
uint8_t contents[kContentSize];
|
|
|
|
|
ASSERT_EQ(1u, fread(contents, kContentSize, 1, f));
|
|
|
|
|
EXPECT_EQ(0, fclose(f));
|
|
|
|
|
EXPECT_EQ(0, memcmp(kExpectedContents, contents, kContentSize));
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
WavReader r(rtc::OpenPlatformFileReadOnly(outfile));
|
|
|
|
|
EXPECT_EQ(14099, r.sample_rate());
|
|
|
|
|
EXPECT_EQ(1u, r.num_channels());
|
|
|
|
|
EXPECT_EQ(kNumSamples, r.num_samples());
|
|
|
|
|
static constexpr float kTruncatedSamples[] = {0.0, 10.0, 32767.0};
|
|
|
|
|
float samples[kNumSamples];
|
|
|
|
|
EXPECT_EQ(kNumSamples, r.ReadSamples(kNumSamples, samples));
|
|
|
|
|
EXPECT_EQ(0, memcmp(kTruncatedSamples, samples, sizeof(samples)));
|
|
|
|
|
EXPECT_EQ(0u, r.ReadSamples(kNumSamples, samples));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-16 20:17:21 +00:00
|
|
|
} // namespace webrtc
|