spek

Acoustic spectrum analyser
git clone http://git.hanabi.in/repos/spek.git
Log | Files | Refs | README

commit ae8cd33b8e687896e26e5d8c72efd5e7f329342e
parent 6a0d525fe401f438fdabebec62496feb92dc9881
Author: Alexander Kojevnikov <alexander@kojevnikov.com>
Date:   Thu, 28 Mar 2013 10:45:04 -0700

tests: Squash audio tests

Diffstat:
Mtests/Makefile.am | 3+--
Dtests/test-audio-info.cc | 84-------------------------------------------------------------------------------
Dtests/test-audio-read.cc | 74--------------------------------------------------------------------------
Atests/test-audio.cc | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtests/test.cc | 3+--
Mtests/test.h | 3+--
6 files changed, 137 insertions(+), 164 deletions(-)

diff --git a/tests/Makefile.am b/tests/Makefile.am @@ -7,8 +7,7 @@ endif check_PROGRAMS = $(TESTS) test_SOURCES = \ - test-audio-info.cc \ - test-audio-read.cc \ + test-audio.cc \ test-utils.cc \ test.cc \ test.h diff --git a/tests/test-audio-info.cc b/tests/test-audio-info.cc @@ -1,84 +0,0 @@ -/* test-audio-info.cc - * - * Copyright (C) 2013 Alexander Kojevnikov <alexander@kojevnikov.com> - * - * Spek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Spek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Spek. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <map> - -#include "spek-audio.h" - -#include "test.h" - -struct FileInfo -{ - AudioError error; - std::string codec_name; - int bit_rate; - int sample_rate; - int bits_per_sample; - int channels; - double duration; -}; - -static void test_file(const std::string& name, const FileInfo& info) -{ - Audio audio; - auto file = audio.open(SAMPLES_DIR "/" + name); - test("error", info.error, file->get_error()); - test(file->get_codec_name(), true, !file->get_codec_name().compare( - 0, info.codec_name.length(), info.codec_name - )); - test("bit rate", info.bit_rate, file->get_bit_rate()); - test("sample rate", info.sample_rate, file->get_sample_rate()); - test("bps", info.bits_per_sample, file->get_bits_per_sample()); - test("channels", info.channels, file->get_channels()); - test("duration", info.duration, file->get_duration()); -} - -void test_audio_info() -{ - const double MP3_T = 5.0 * 1152 / 44100; // 5 frames * duration per mp3 frame - const double AAC_T = (10240 + 628) / 2.0 / 44100; - const double DCA_T = 8.0 * 21180 / 1411216; // file size / bit rate - const double AC3_T = 8.0 * 2490 / 190764; // file size / bit rate - - std::map<std::string, FileInfo> files = { - {"no.file", {AudioError::CANNOT_OPEN_FILE, "", 0, 0, 0, 0, 0.0}}, - {"1ch-96000Hz-24bps.flac", {AudioError::OK, "FLAC", 0, 96000, 24, 1, 0.1}}, - {"2ch-48000Hz-16bps.flac", {AudioError::OK, "FLAC", 0, 48000, 16, 2, 0.1}}, - {"1ch-96000Hz-24bps.ape", {AudioError::OK, "Monkey", 0, 96000, 24, 1, 0.1}}, - {"2ch-48000Hz-16bps.ape", {AudioError::OK, "Monkey", 0, 48000, 16, 2, 0.1}}, - {"2ch-44100Hz-16bps.m4a", {AudioError::OK, "ALAC", 0, 44100, 16, 2, 0.1}}, - {"1ch-96000Hz-24bps.wv", {AudioError::OK, "WavPack", 0, 96000, 24, 1, 0.1}}, - {"2ch-48000Hz-16bps.wv", {AudioError::OK, "WavPack", 0, 48000, 16, 2, 0.1}}, - {"2ch-44100Hz-16bps.wav", {AudioError::OK, "PCM", 0, 44100, 16, 2, 0.1}}, - {"2ch-44100Hz-128cbr.mp3", {AudioError::OK, "MP3", 128000, 44100, 0, 2, MP3_T}}, - {"2ch-44100Hz-320cbr.mp3", {AudioError::OK, "MP3", 320000, 44100, 0, 2, MP3_T}}, - {"2ch-44100Hz-V0.mp3", {AudioError::OK, "MP3", 201329, 44100, 0, 2, MP3_T}}, - {"2ch-44100Hz-V2.mp3", {AudioError::OK, "MP3", 150124, 44100, 0, 2, MP3_T}}, - {"2ch-44100Hz-q100.m4a", {AudioError::OK, "AAC", 159649, 44100, 0, 2, AAC_T}}, - {"2ch-44100Hz-q5.ogg", {AudioError::OK, "Vorbis", 160000, 44100, 0, 2, 0.1}}, - {"2ch-44100Hz.dts", {AudioError::OK, "DCA", 1411200, 44100, 0, 2, DCA_T}}, - {"2ch-44100Hz.ac3", {AudioError::OK, "ATSC A/52", 192000, 44100, 0, 2, AC3_T}}, - {"2ch-44100Hz-std.mpc", {AudioError::OK, "Musepack", 0, 44100, 0, 2, 0.0}}, - }; - for (const auto& item : files) { - run( - "audio info: " + item.first, - [&] () { test_file(item.first, item.second); } - ); - } -} diff --git a/tests/test-audio-read.cc b/tests/test-audio-read.cc @@ -1,74 +0,0 @@ -/* test-audio-read.cc - * - * Copyright (C) 2013 Alexander Kojevnikov <alexander@kojevnikov.com> - * - * Spek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Spek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Spek. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <map> - -#include "spek-audio.h" - -#include "test.h" - -static void test_silence(const std::string& name, int samples) -{ - Audio audio; - auto file = audio.open(SAMPLES_DIR "/" + name); - - int samples_read = 0; - double power = 0.0; - int len; - while ((len = file->read()) > 0) { - samples_read += len; - for (int i = 0; i < len; ++i) { - float level = file->get_buffer()[i]; - power += level * level; - } - } - power /= samples_read; - - test("error", 0, len); - test("samples", samples, samples_read); - test("power", 0.0, power); -} - -void test_audio_read() -{ - std::map<std::string, int> files = { - {"1ch-96000Hz-24bps.flac", 1 * 96000 / 10}, - {"2ch-48000Hz-16bps.flac", 2 * 48000 / 10}, - {"1ch-96000Hz-24bps.ape", 1 * 96000 / 10}, - {"2ch-48000Hz-16bps.ape", 2 * 48000 / 10}, - {"2ch-44100Hz-16bps.m4a", 2 * 44100 / 10}, - {"1ch-96000Hz-24bps.wv", 1 * 96000 / 10}, - {"2ch-48000Hz-16bps.wv", 2 * 48000 / 10}, - {"2ch-44100Hz-16bps.wav", 2 * 44100 / 10}, - {"2ch-44100Hz-128cbr.mp3", 2 * 1152 * 4 + 94}, - {"2ch-44100Hz-320cbr.mp3", 2 * 1152 * 4 + 94}, - {"2ch-44100Hz-V0.mp3", 2 * 1152 * 4 + 94}, - {"2ch-44100Hz-V2.mp3", 2 * 1152 * 4 + 94}, - {"2ch-44100Hz-q100.m4a", 10240}, - {"2ch-44100Hz-q5.ogg", 2 * 1024 * 4 + 1152}, - {"2ch-44100Hz.dts", 10240}, - {"2ch-44100Hz.ac3", 9 * 1024}, - {"2ch-44100Hz-std.mpc", 11 * 1024 + 256}, - }; - for (const auto& item : files) { - run( - "audio read: " + item.first, - [&] () { test_silence(item.first, item.second); } - ); - } -} diff --git a/tests/test-audio.cc b/tests/test-audio.cc @@ -0,0 +1,134 @@ +/* test-audio.cc + * + * Copyright (C) 2013 Alexander Kojevnikov <alexander@kojevnikov.com> + * + * Spek is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Spek is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Spek. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <map> + +#include "spek-audio.h" + +#include "test.h" + +struct FileInfo +{ + AudioError error; + std::string codec_name; + int bit_rate; + int sample_rate; + int bits_per_sample; + int channels; + double duration; + int samples; +}; + +static void test_info(AudioFile *file, const FileInfo& info) +{ + test("error", info.error, file->get_error()); + test(file->get_codec_name(), true, !file->get_codec_name().compare( + 0, info.codec_name.length(), info.codec_name + )); + test("bit rate", info.bit_rate, file->get_bit_rate()); + test("sample rate", info.sample_rate, file->get_sample_rate()); + test("bps", info.bits_per_sample, file->get_bits_per_sample()); + test("channels", info.channels, file->get_channels()); + test("duration", info.duration, file->get_duration()); +} + +static void test_read(AudioFile *file, int samples) +{ + int samples_read = 0; + double power = 0.0; + int len; + while ((len = file->read()) > 0) { + samples_read += len; + for (int i = 0; i < len; ++i) { + float level = file->get_buffer()[i]; + power += level * level; + } + } + + test("samples", samples, samples_read); + + if (samples > 0) { + power /= samples_read; + test("error", 0, len); + test("power", 0.0, power); + } else { + test("error", -1, len); + } +} + +void test_audio() +{ + const double MP3_T = 5.0 * 1152 / 44100; // 5 frames * duration per mp3 frame + const double AAC_T = (10240 + 628) / 2.0 / 44100; + const double DCA_T = 8.0 * 21180 / 1411216; // file size / bit rate + const double AC3_T = 8.0 * 2490 / 190764; // file size / bit rate + + std::map<std::string, FileInfo> files = { + {"no.file", + {AudioError::CANNOT_OPEN_FILE, "", 0, 0, 0, 0, 0.0, 0}}, + {"1ch-96000Hz-24bps.flac", + {AudioError::OK, "FLAC", 0, 96000, 24, 1, 0.1, 1 * 96000 / 10}}, + {"2ch-48000Hz-16bps.flac", + {AudioError::OK, "FLAC", 0, 48000, 16, 2, 0.1, 2 * 48000 / 10}}, + {"1ch-96000Hz-24bps.ape", + {AudioError::OK, "Monkey", 0, 96000, 24, 1, 0.1, 1 * 96000 / 10}}, + {"2ch-48000Hz-16bps.ape", + {AudioError::OK, "Monkey", 0, 48000, 16, 2, 0.1, 2 * 48000 / 10}}, + {"2ch-44100Hz-16bps.m4a", + {AudioError::OK, "ALAC", 0, 44100, 16, 2, 0.1, 2 * 44100 / 10}}, + {"1ch-96000Hz-24bps.wv", + {AudioError::OK, "WavPack", 0, 96000, 24, 1, 0.1, 1 * 96000 / 10}}, + {"2ch-48000Hz-16bps.wv", + {AudioError::OK, "WavPack", 0, 48000, 16, 2, 0.1, 2 * 48000 / 10}}, + {"2ch-44100Hz-16bps.wav", + {AudioError::OK, "PCM", 0, 44100, 16, 2, 0.1, 2 * 44100 / 10}}, + {"2ch-44100Hz-128cbr.mp3", + {AudioError::OK, "MP3", 128000, 44100, 0, 2, MP3_T, 2 * 1152 * 4 + 94}}, + {"2ch-44100Hz-320cbr.mp3", + {AudioError::OK, "MP3", 320000, 44100, 0, 2, MP3_T, 2 * 1152 * 4 + 94}}, + {"2ch-44100Hz-V0.mp3", + {AudioError::OK, "MP3", 201329, 44100, 0, 2, MP3_T, 2 * 1152 * 4 + 94}}, + {"2ch-44100Hz-V2.mp3", + {AudioError::OK, "MP3", 150124, 44100, 0, 2, MP3_T, 2 * 1152 * 4 + 94}}, + {"2ch-44100Hz-q100.m4a", + {AudioError::OK, "AAC", 159649, 44100, 0, 2, AAC_T, 10240}}, + {"2ch-44100Hz-q5.ogg", + {AudioError::OK, "Vorbis", 160000, 44100, 0, 2, 0.1, 2 * 1024 * 4 + 1152}}, + {"2ch-44100Hz.dts", + {AudioError::OK, "DCA", 1411200, 44100, 0, 2, DCA_T, 10240}}, + {"2ch-44100Hz.ac3", + {AudioError::OK, "ATSC A/52", 192000, 44100, 0, 2, AC3_T, 9 * 1024}}, + {"2ch-44100Hz-std.mpc", + {AudioError::OK, "Musepack", 0, 44100, 0, 2, 0.0, 11 * 1024 + 256}}, + }; + + Audio audio; + for (const auto& item : files) { + auto name = item.first; + auto info = item.second; + auto file = audio.open(SAMPLES_DIR "/" + name); + run( + "audio info: " + name, + [&] () { test_info(file.get(), info); } + ); + run( + "audio read: " + name, + [&] () { test_read(file.get(), info.samples); } + ); + } +} diff --git a/tests/test.cc b/tests/test.cc @@ -25,8 +25,7 @@ int main() { std::cerr << "-------------" << std::endl; - test_audio_info(); - test_audio_read(); + test_audio(); test_utils(); if (g_passes < g_total) { diff --git a/tests/test.h b/tests/test.h @@ -51,8 +51,7 @@ template<class T> void test(const std::string& message, const T& expected, const } } -void test_audio_info(); -void test_audio_read(); +void test_audio(); void test_utils(); #endif