2022-07-25 14:36:05 +08:00
|
|
|
#include <SFML/Audio/SoundBuffer.hpp>
|
|
|
|
|
2023-04-16 10:50:24 +08:00
|
|
|
// Other 1st party headers
|
|
|
|
#include <SFML/System/FileInputStream.hpp>
|
|
|
|
|
|
|
|
#include <catch2/catch_test_macros.hpp>
|
|
|
|
|
|
|
|
#include <AudioUtil.hpp>
|
|
|
|
#include <SystemUtil.hpp>
|
|
|
|
#include <array>
|
2022-07-25 14:36:05 +08:00
|
|
|
#include <type_traits>
|
|
|
|
|
2023-04-16 10:50:24 +08:00
|
|
|
TEST_CASE("[Audio] sf::SoundBuffer", runAudioDeviceTests())
|
|
|
|
{
|
|
|
|
SECTION("Type traits")
|
|
|
|
{
|
2024-05-19 05:37:06 +08:00
|
|
|
STATIC_CHECK(!std::is_default_constructible_v<sf::SoundBuffer>);
|
2023-04-16 10:50:24 +08:00
|
|
|
STATIC_CHECK(std::is_copy_constructible_v<sf::SoundBuffer>);
|
|
|
|
STATIC_CHECK(std::is_copy_assignable_v<sf::SoundBuffer>);
|
|
|
|
STATIC_CHECK(std::is_move_constructible_v<sf::SoundBuffer>);
|
|
|
|
STATIC_CHECK(!std::is_nothrow_move_constructible_v<sf::SoundBuffer>);
|
|
|
|
STATIC_CHECK(std::is_move_assignable_v<sf::SoundBuffer>);
|
|
|
|
STATIC_CHECK(!std::is_nothrow_move_assignable_v<sf::SoundBuffer>);
|
|
|
|
}
|
|
|
|
|
|
|
|
SECTION("Copy semantics")
|
|
|
|
{
|
2024-05-19 05:37:06 +08:00
|
|
|
const auto soundBuffer = sf::SoundBuffer::loadFromFile("Audio/ding.flac").value();
|
2023-04-16 10:50:24 +08:00
|
|
|
|
|
|
|
SECTION("Construction")
|
|
|
|
{
|
|
|
|
const sf::SoundBuffer soundBufferCopy(soundBuffer); // NOLINT(performance-unnecessary-copy-initialization)
|
|
|
|
CHECK(soundBufferCopy.getSamples() != nullptr);
|
|
|
|
CHECK(soundBufferCopy.getSampleCount() == 87798);
|
|
|
|
CHECK(soundBufferCopy.getSampleRate() == 44100);
|
|
|
|
CHECK(soundBufferCopy.getChannelCount() == 1);
|
|
|
|
CHECK(soundBufferCopy.getDuration() == sf::microseconds(1990884));
|
|
|
|
}
|
|
|
|
|
|
|
|
SECTION("Assignment")
|
|
|
|
{
|
2024-05-19 05:37:06 +08:00
|
|
|
sf::SoundBuffer soundBufferCopy = sf::SoundBuffer::loadFromFile("Audio/doodle_pop.ogg").value();
|
|
|
|
soundBufferCopy = soundBuffer;
|
2023-04-16 10:50:24 +08:00
|
|
|
CHECK(soundBufferCopy.getSamples() != nullptr);
|
|
|
|
CHECK(soundBufferCopy.getSampleCount() == 87798);
|
|
|
|
CHECK(soundBufferCopy.getSampleRate() == 44100);
|
|
|
|
CHECK(soundBufferCopy.getChannelCount() == 1);
|
|
|
|
CHECK(soundBufferCopy.getDuration() == sf::microseconds(1990884));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SECTION("loadFromFile()")
|
|
|
|
{
|
|
|
|
SECTION("Invalid filename")
|
|
|
|
{
|
2024-05-19 05:37:06 +08:00
|
|
|
CHECK(!sf::SoundBuffer::loadFromFile("does/not/exist.wav"));
|
2023-04-16 10:50:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
SECTION("Valid file")
|
|
|
|
{
|
2024-05-19 05:37:06 +08:00
|
|
|
const auto soundBuffer = sf::SoundBuffer::loadFromFile("Audio/ding.flac").value();
|
2023-04-16 10:50:24 +08:00
|
|
|
CHECK(soundBuffer.getSamples() != nullptr);
|
|
|
|
CHECK(soundBuffer.getSampleCount() == 87798);
|
|
|
|
CHECK(soundBuffer.getSampleRate() == 44100);
|
|
|
|
CHECK(soundBuffer.getChannelCount() == 1);
|
|
|
|
CHECK(soundBuffer.getDuration() == sf::microseconds(1990884));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SECTION("loadFromMemory()")
|
|
|
|
{
|
|
|
|
SECTION("Invalid memory")
|
|
|
|
{
|
2024-05-19 05:37:06 +08:00
|
|
|
CHECK(!sf::SoundBuffer::loadFromMemory(nullptr, 0));
|
2023-04-16 10:50:24 +08:00
|
|
|
constexpr std::array<std::byte, 5> memory{};
|
2024-05-19 05:37:06 +08:00
|
|
|
CHECK(!sf::SoundBuffer::loadFromMemory(memory.data(), memory.size()));
|
2023-04-16 10:50:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
SECTION("Valid memory")
|
|
|
|
{
|
2024-05-19 05:37:06 +08:00
|
|
|
const auto memory = loadIntoMemory("Audio/ding.flac");
|
|
|
|
const auto soundBuffer = sf::SoundBuffer::loadFromMemory(memory.data(), memory.size()).value();
|
2023-04-16 10:50:24 +08:00
|
|
|
CHECK(soundBuffer.getSamples() != nullptr);
|
|
|
|
CHECK(soundBuffer.getSampleCount() == 87798);
|
|
|
|
CHECK(soundBuffer.getSampleRate() == 44100);
|
|
|
|
CHECK(soundBuffer.getChannelCount() == 1);
|
|
|
|
CHECK(soundBuffer.getDuration() == sf::microseconds(1990884));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SECTION("loadFromStream()")
|
|
|
|
{
|
|
|
|
sf::FileInputStream stream;
|
|
|
|
|
|
|
|
SECTION("Invalid stream")
|
|
|
|
{
|
2024-05-19 05:37:06 +08:00
|
|
|
CHECK(!sf::SoundBuffer::loadFromStream(stream));
|
2023-04-16 10:50:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
SECTION("Valid stream")
|
|
|
|
{
|
|
|
|
REQUIRE(stream.open("Audio/ding.flac"));
|
2024-05-19 05:37:06 +08:00
|
|
|
const auto soundBuffer = sf::SoundBuffer::loadFromStream(stream).value();
|
2023-04-16 10:50:24 +08:00
|
|
|
CHECK(soundBuffer.getSamples() != nullptr);
|
|
|
|
CHECK(soundBuffer.getSampleCount() == 87798);
|
|
|
|
CHECK(soundBuffer.getSampleRate() == 44100);
|
|
|
|
CHECK(soundBuffer.getChannelCount() == 1);
|
|
|
|
CHECK(soundBuffer.getDuration() == sf::microseconds(1990884));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SECTION("saveToFile()")
|
|
|
|
{
|
|
|
|
const auto filename = std::filesystem::temp_directory_path() / "ding.flac";
|
|
|
|
|
|
|
|
{
|
2024-05-19 05:37:06 +08:00
|
|
|
const auto soundBuffer = sf::SoundBuffer::loadFromFile("Audio/ding.flac").value();
|
2023-04-16 10:50:24 +08:00
|
|
|
REQUIRE(soundBuffer.saveToFile(filename));
|
|
|
|
}
|
|
|
|
|
2024-05-19 05:37:06 +08:00
|
|
|
const auto soundBuffer = sf::SoundBuffer::loadFromFile(filename).value();
|
2023-04-16 10:50:24 +08:00
|
|
|
CHECK(soundBuffer.getSamples() != nullptr);
|
|
|
|
CHECK(soundBuffer.getSampleCount() == 87798);
|
|
|
|
CHECK(soundBuffer.getSampleRate() == 44100);
|
|
|
|
CHECK(soundBuffer.getChannelCount() == 1);
|
|
|
|
CHECK(soundBuffer.getDuration() == sf::microseconds(1990884));
|
|
|
|
|
|
|
|
CHECK(std::filesystem::remove(filename));
|
|
|
|
}
|
|
|
|
}
|