From 2241bee942644a3ab4861806375f9ed849ce9e50 Mon Sep 17 00:00:00 2001 From: Chris Thrasher Date: Fri, 7 Feb 2025 10:24:26 -0700 Subject: [PATCH] Fix saving FLAC files to non-ASCII paths --- src/SFML/Audio/SoundFileWriterFlac.cpp | 6 ++++-- src/SFML/Audio/SoundFileWriterFlac.hpp | 2 ++ test/Audio/OutputSoundFile.test.cpp | 2 +- test/Audio/SoundBuffer.test.cpp | 11 ++++++----- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/SFML/Audio/SoundFileWriterFlac.cpp b/src/SFML/Audio/SoundFileWriterFlac.cpp index 2bcd6b540..ddcc0f360 100644 --- a/src/SFML/Audio/SoundFileWriterFlac.cpp +++ b/src/SFML/Audio/SoundFileWriterFlac.cpp @@ -137,14 +137,16 @@ bool SoundFileWriterFlac::open(const std::filesystem::path& filename, return false; } + // Open file + m_file = openFile(filename, "w+b"); + // Setup the encoder FLAC__stream_encoder_set_channels(m_encoder.get(), channelCount); FLAC__stream_encoder_set_bits_per_sample(m_encoder.get(), 16); FLAC__stream_encoder_set_sample_rate(m_encoder.get(), sampleRate); // Initialize the output stream - if (FLAC__stream_encoder_init_file(m_encoder.get(), filename.string().c_str(), nullptr, nullptr) != - FLAC__STREAM_ENCODER_INIT_STATUS_OK) + if (FLAC__stream_encoder_init_FILE(m_encoder.get(), m_file, nullptr, nullptr) != FLAC__STREAM_ENCODER_INIT_STATUS_OK) { err() << "Failed to write flac file (failed to open the file)\n" << formatDebugPathInfo(filename) << std::endl; m_encoder.reset(); diff --git a/src/SFML/Audio/SoundFileWriterFlac.hpp b/src/SFML/Audio/SoundFileWriterFlac.hpp index 810f4d455..c270f380b 100644 --- a/src/SFML/Audio/SoundFileWriterFlac.hpp +++ b/src/SFML/Audio/SoundFileWriterFlac.hpp @@ -36,6 +36,7 @@ #include #include +#include namespace sf::priv @@ -90,6 +91,7 @@ private: { void operator()(FLAC__StreamEncoder* encoder) const; }; + std::FILE* m_file{}; std::unique_ptr m_encoder; //!< FLAC stream encoder unsigned int m_channelCount{}; //!< Number of channels std::array m_remapTable{}; //!< Table we use to remap source to target channel order diff --git a/test/Audio/OutputSoundFile.test.cpp b/test/Audio/OutputSoundFile.test.cpp index 2b2509093..9d53e2005 100644 --- a/test/Audio/OutputSoundFile.test.cpp +++ b/test/Audio/OutputSoundFile.test.cpp @@ -17,7 +17,7 @@ TEST_CASE("[Audio] sf::OutputSoundFile") } const std::u32string stem = GENERATE(U"tmp", U"tmp-ń", U"tmp-🐌"); - const std::u32string extension = GENERATE(U".wav", U".ogg"); // , U".flac"); FLAC fails to handle Unicode strings + const std::u32string extension = GENERATE(U".wav", U".ogg", U".flac"); const auto filename = std::filesystem::temp_directory_path() / std::filesystem::path(stem + extension); const std::vector channelMap{sf::SoundChannel::FrontLeft, sf::SoundChannel::FrontRight}; diff --git a/test/Audio/SoundBuffer.test.cpp b/test/Audio/SoundBuffer.test.cpp index 2a842ba68..0a3e9346b 100644 --- a/test/Audio/SoundBuffer.test.cpp +++ b/test/Audio/SoundBuffer.test.cpp @@ -183,12 +183,13 @@ TEST_CASE("[Audio] sf::SoundBuffer", runAudioDeviceTests()) SECTION("saveToFile()") { - const auto filename = std::filesystem::temp_directory_path() / "ding.flac"; + const std::u32string stem = GENERATE(U"tmp", U"tmp-ń", U"tmp-🐌"); + const std::u32string extension = GENERATE(U".wav", U".ogg", U".flac"); + const auto filename = std::filesystem::temp_directory_path() / std::filesystem::path(stem + extension); - { - const sf::SoundBuffer soundBuffer("Audio/ding.flac"); - REQUIRE(soundBuffer.saveToFile(filename)); - } + INFO("Filename: " << reinterpret_cast(filename.u8string().c_str())); + + REQUIRE(sf::SoundBuffer("Audio/ding.flac").saveToFile(filename)); const sf::SoundBuffer soundBuffer(filename); CHECK(soundBuffer.getSamples() != nullptr);