mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 07:30:19 +00:00
LibAudio: Test reading and writing of wav files
Includes a set of wav files of different frequencies, these are each loaded and then written to a temporary file, checking that the meta-data is correctly read and that the output matches the input.
This commit is contained in:
parent
01930a7043
commit
7e3249ad4c
Notes:
sideshowbarker
2024-07-17 09:41:18 +09:00
Author: https://github.com/macsplit Commit: https://github.com/SerenityOS/serenity/commit/7e3249ad4c Pull-request: https://github.com/SerenityOS/serenity/pull/22575 Reviewed-by: https://github.com/ADKaster ✅ Reviewed-by: https://github.com/AtkinsSJ Reviewed-by: https://github.com/LucasChollet Reviewed-by: https://github.com/kleinesfilmroellchen ✅
12 changed files with 132 additions and 1 deletions
|
@ -1,10 +1,13 @@
|
||||||
set(TEST_SOURCES
|
set(TEST_SOURCES
|
||||||
|
TestWav.cpp
|
||||||
TestFLACSpec.cpp
|
TestFLACSpec.cpp
|
||||||
TestPlaybackStream.cpp
|
TestPlaybackStream.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
foreach(source IN LISTS TEST_SOURCES)
|
foreach(source IN LISTS TEST_SOURCES)
|
||||||
serenity_test("${source}" LibAudio LIBS LibAudio)
|
serenity_test("${source}" LibAudio LIBS LibAudio LibFileSystem)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
install(DIRECTORY ${FLAC_SPEC_TEST_PATH} DESTINATION usr/Tests/LibAudio/FLAC)
|
install(DIRECTORY ${FLAC_SPEC_TEST_PATH} DESTINATION usr/Tests/LibAudio/FLAC)
|
||||||
|
|
||||||
|
install(DIRECTORY WAV DESTINATION usr/Tests/LibAudio)
|
||||||
|
|
128
Tests/LibAudio/TestWav.cpp
Normal file
128
Tests/LibAudio/TestWav.cpp
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024, Lee Hanken <github-12-2017-ds8@leehanken.uk>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <AK/ByteString.h>
|
||||||
|
#include <AK/LexicalPath.h>
|
||||||
|
#include <LibAudio/WavLoader.h>
|
||||||
|
#include <LibAudio/WavWriter.h>
|
||||||
|
#include <LibCore/Directory.h>
|
||||||
|
#include <LibCore/File.h>
|
||||||
|
#include <LibFileSystem/FileSystem.h>
|
||||||
|
#include <LibFileSystem/TempFile.h>
|
||||||
|
#include <LibTest/TestCase.h>
|
||||||
|
|
||||||
|
static void compare_files(StringView const& in_path, StringView const& out_path)
|
||||||
|
{
|
||||||
|
Array<u8, 4096> buffer1;
|
||||||
|
Array<u8, 4096> buffer2;
|
||||||
|
|
||||||
|
auto original_file = MUST(Core::File::open(in_path, Core::File::OpenMode::Read));
|
||||||
|
auto copied_file = MUST(Core::File::open(out_path, Core::File::OpenMode::Read));
|
||||||
|
|
||||||
|
while (!original_file->is_eof() && !copied_file->is_eof()) {
|
||||||
|
auto original_bytes = TRY_OR_FAIL(original_file->read_some(buffer1));
|
||||||
|
auto copied_bytes = TRY_OR_FAIL(copied_file->read_some(buffer2));
|
||||||
|
|
||||||
|
EXPECT_EQ(original_bytes, copied_bytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void run_test(StringView file_name, int const num_samples, int const channels, u32 const rate)
|
||||||
|
{
|
||||||
|
|
||||||
|
constexpr auto format = "RIFF WAVE (.wav)";
|
||||||
|
constexpr int bits = 16;
|
||||||
|
|
||||||
|
auto out_file = TRY_OR_FAIL(FileSystem::TempFile::create_temp_file());
|
||||||
|
auto out_path = out_file->path();
|
||||||
|
|
||||||
|
// This makes sure that the tests will run both on target and in Lagom.
|
||||||
|
#ifdef AK_OS_SERENITY
|
||||||
|
ByteString in_path = ByteString::formatted("/usr/Tests/LibAudio/WAV/{}", file_name);
|
||||||
|
#else
|
||||||
|
ByteString in_path = ByteString::formatted("WAV/{}", file_name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
auto loader = TRY_OR_FAIL(Audio::Loader::create(in_path));
|
||||||
|
|
||||||
|
EXPECT_EQ(loader->format_name(), format);
|
||||||
|
EXPECT_EQ(loader->sample_rate(), rate);
|
||||||
|
EXPECT_EQ(loader->num_channels(), channels);
|
||||||
|
EXPECT_EQ(loader->bits_per_sample(), bits);
|
||||||
|
EXPECT_EQ(loader->total_samples(), num_samples);
|
||||||
|
|
||||||
|
auto writer = TRY_OR_FAIL(Audio::WavWriter::create_from_file(out_path, rate, channels));
|
||||||
|
|
||||||
|
int samples_read = 0;
|
||||||
|
int size = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
auto samples = TRY_OR_FAIL(loader->get_more_samples());
|
||||||
|
TRY_OR_FAIL(writer->write_samples(samples.span()));
|
||||||
|
|
||||||
|
size = samples.size();
|
||||||
|
samples_read += size;
|
||||||
|
|
||||||
|
} while (size);
|
||||||
|
|
||||||
|
TRY_OR_FAIL(writer->finalize());
|
||||||
|
|
||||||
|
EXPECT_EQ(samples_read, num_samples);
|
||||||
|
|
||||||
|
compare_files(in_path, out_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5 seconds, 16-bit audio samples
|
||||||
|
|
||||||
|
TEST_CASE(mono_8khz)
|
||||||
|
{
|
||||||
|
run_test("tone_8000_mono.wav"sv, 40000, 1, 8000);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(stereo_8khz)
|
||||||
|
{
|
||||||
|
run_test("tone_8000_stereo.wav"sv, 40000, 2, 8000);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(mono_11khz)
|
||||||
|
{
|
||||||
|
run_test("tone_11025_mono.wav"sv, 55125, 1, 11025);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(stereo_11khz)
|
||||||
|
{
|
||||||
|
run_test("tone_11025_stereo.wav"sv, 55125, 2, 11025);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(mono_16khz)
|
||||||
|
{
|
||||||
|
run_test("tone_16000_mono.wav"sv, 80000, 1, 16000);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(stereo_16khz)
|
||||||
|
{
|
||||||
|
run_test("tone_16000_stereo.wav"sv, 80000, 2, 16000);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(mono_22khz)
|
||||||
|
{
|
||||||
|
run_test("tone_22050_mono.wav"sv, 110250, 1, 22050);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(stereo_22khz)
|
||||||
|
{
|
||||||
|
run_test("tone_22050_stereo.wav"sv, 110250, 2, 22050);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(mono_44khz)
|
||||||
|
{
|
||||||
|
run_test("tone_44100_mono.wav"sv, 220500, 1, 44100);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE(stereo_44khz)
|
||||||
|
{
|
||||||
|
run_test("tone_44100_stereo.wav"sv, 220500, 2, 44100);
|
||||||
|
}
|
BIN
Tests/LibAudio/WAV/tone_11025_mono.wav
Normal file
BIN
Tests/LibAudio/WAV/tone_11025_mono.wav
Normal file
Binary file not shown.
BIN
Tests/LibAudio/WAV/tone_11025_stereo.wav
Normal file
BIN
Tests/LibAudio/WAV/tone_11025_stereo.wav
Normal file
Binary file not shown.
BIN
Tests/LibAudio/WAV/tone_16000_mono.wav
Normal file
BIN
Tests/LibAudio/WAV/tone_16000_mono.wav
Normal file
Binary file not shown.
BIN
Tests/LibAudio/WAV/tone_16000_stereo.wav
Normal file
BIN
Tests/LibAudio/WAV/tone_16000_stereo.wav
Normal file
Binary file not shown.
BIN
Tests/LibAudio/WAV/tone_22050_mono.wav
Normal file
BIN
Tests/LibAudio/WAV/tone_22050_mono.wav
Normal file
Binary file not shown.
BIN
Tests/LibAudio/WAV/tone_22050_stereo.wav
Normal file
BIN
Tests/LibAudio/WAV/tone_22050_stereo.wav
Normal file
Binary file not shown.
BIN
Tests/LibAudio/WAV/tone_44100_mono.wav
Normal file
BIN
Tests/LibAudio/WAV/tone_44100_mono.wav
Normal file
Binary file not shown.
BIN
Tests/LibAudio/WAV/tone_44100_stereo.wav
Normal file
BIN
Tests/LibAudio/WAV/tone_44100_stereo.wav
Normal file
Binary file not shown.
BIN
Tests/LibAudio/WAV/tone_8000_mono.wav
Normal file
BIN
Tests/LibAudio/WAV/tone_8000_mono.wav
Normal file
Binary file not shown.
BIN
Tests/LibAudio/WAV/tone_8000_stereo.wav
Normal file
BIN
Tests/LibAudio/WAV/tone_8000_stereo.wav
Normal file
Binary file not shown.
Loading…
Reference in a new issue