From: <sv...@op...> - 2025-03-16 18:49:28
|
Author: manx Date: Sun Mar 16 19:49:10 2025 New Revision: 23042 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=23042 Log: [Imp] Stream Export: FLAC: Enable multi-threading by default. It can be disabled via a new hidden setting [Export]FLACMultithreading=true. This depends on <https://github.com/xiph/flac/pull/822>, and is a no-op until our libflac supports multi-threading. [Imp] FLAC Samples: Add hidden setting [Sample Editor]FLACMultithreading=false. As samples are short for the most part, thread creation overhead might dominate the encoding, so this is disabled by default. This has not been benchmarked. This depends on <https://github.com/xiph/flac/pull/822>, and is a no-op until our libflac supports multi-threading. [Imp] openmpt123: Enable FLAC multithreading unconditionally. Modified: trunk/OpenMPT/mptrack/StreamEncoderSettings.cpp trunk/OpenMPT/mptrack/StreamEncoderSettings.h trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/openmpt123/openmpt123_flac.hpp trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.hpp trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoderFLAC.cpp Modified: trunk/OpenMPT/mptrack/StreamEncoderSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/StreamEncoderSettings.cpp Sat Mar 15 20:23:48 2025 (r23041) +++ trunk/OpenMPT/mptrack/StreamEncoderSettings.cpp Sun Mar 16 19:49:10 2025 (r23042) @@ -69,6 +69,7 @@ StreamEncoderSettingsConf::StreamEncoderSettingsConf(SettingsContainer &conf, const mpt::ustring §ion) : FLACCompressionLevel(conf, section, U_("FLACCompressionLevel"), Encoder::StreamSettings().FLACCompressionLevel) + , FLACMultithreading(conf, section, U_("FLACMultithreading"), Encoder::StreamSettings().FLACMultithreading) , AUPaddingAlignHint(conf, section, U_("AUPaddingAlignHint"), Encoder::StreamSettings().AUPaddingAlignHint) , MP3ID3v2MinPadding(conf, section, U_("MP3ID3v2MinPadding"), Encoder::StreamSettings().MP3ID3v2MinPadding) , MP3ID3v2PaddingAlignHint(conf, section, U_("MP3ID3v2PaddingAlignHint"), Encoder::StreamSettings().MP3ID3v2PaddingAlignHint) @@ -87,6 +88,7 @@ { Encoder::StreamSettings result; result.FLACCompressionLevel = FLACCompressionLevel; + result.FLACMultithreading = FLACMultithreading; result.AUPaddingAlignHint = AUPaddingAlignHint; result.MP3ID3v2MinPadding = MP3ID3v2MinPadding; result.MP3ID3v2PaddingAlignHint = MP3ID3v2PaddingAlignHint; Modified: trunk/OpenMPT/mptrack/StreamEncoderSettings.h ============================================================================== --- trunk/OpenMPT/mptrack/StreamEncoderSettings.h Sat Mar 15 20:23:48 2025 (r23041) +++ trunk/OpenMPT/mptrack/StreamEncoderSettings.h Sun Mar 16 19:49:10 2025 (r23042) @@ -96,6 +96,7 @@ struct StreamEncoderSettingsConf { Setting<int32> FLACCompressionLevel; + Setting<bool> FLACMultithreading; Setting<uint32> AUPaddingAlignHint; Setting<uint32> MP3ID3v2MinPadding; Setting<uint32> MP3ID3v2PaddingAlignHint; Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp Sat Mar 15 20:23:48 2025 (r23041) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp Sun Mar 16 19:49:10 2025 (r23042) @@ -294,6 +294,7 @@ , sampleEditorDefaultResampler(conf, UL_("Sample Editor"), UL_("DefaultResampler"), SRCMODE_DEFAULT) , m_nFinetuneStep(conf, UL_("Sample Editor"), UL_("FinetuneStep"), 10) , m_FLACCompressionLevel(conf, UL_("Sample Editor"), UL_("FLACCompressionLevel"), 5) + , m_FLACMultithreading(conf, UL_("Sample Editor"), UL_("FLACMultithreading"), false) , compressITI(conf, UL_("Sample Editor"), UL_("CompressITI"), true) , m_MayNormalizeSamplesOnLoad(conf, UL_("Sample Editor"), UL_("MayNormalizeSamplesOnLoad"), true) , previewInFileDialogs(conf, UL_("Sample Editor"), UL_("PreviewInFileDialogs"), false) Modified: trunk/OpenMPT/mptrack/TrackerSettings.h ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h Sat Mar 15 20:23:48 2025 (r23041) +++ trunk/OpenMPT/mptrack/TrackerSettings.h Sun Mar 16 19:49:10 2025 (r23042) @@ -878,6 +878,7 @@ Setting<ResamplingMode> sampleEditorDefaultResampler; Setting<int32> m_nFinetuneStep; // Increment finetune by x cents when using spin control. Setting<int32> m_FLACCompressionLevel; // FLAC compression level for saving (0...8) + Setting<bool> m_FLACMultithreading; Setting<bool> compressITI; Setting<bool> m_MayNormalizeSamplesOnLoad; Setting<bool> previewInFileDialogs; Modified: trunk/OpenMPT/openmpt123/openmpt123_flac.hpp ============================================================================== --- trunk/OpenMPT/openmpt123/openmpt123_flac.hpp Sat Mar 15 20:23:48 2025 (r23041) +++ trunk/OpenMPT/openmpt123/openmpt123_flac.hpp Sun Mar 16 19:49:10 2025 (r23042) @@ -18,6 +18,11 @@ #include "mpt/base/detect.hpp" #include "mpt/base/saturate_round.hpp" +#include <algorithm> +#if MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS) +#include <thread> +#endif + #if defined(_MSC_VER) && defined(__clang__) && defined(__c2__) #include <sys/types.h> #if __STDC__ @@ -66,6 +71,9 @@ FLAC__stream_encoder_set_bits_per_sample( encoder, flags.use_float ? 24 : 16 ); FLAC__stream_encoder_set_sample_rate( encoder, flags.samplerate ); FLAC__stream_encoder_set_compression_level( encoder, 8 ); +#if (FLAC_API_VERSION_CURRENT >= 14) && MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS) + FLAC__stream_encoder_set_num_threads(encoder, static_cast<std::uint32_t>(std::max(std::thread::hardware_concurrency(), static_cast<unsigned int>(1)))); +#endif } ~flac_stream_raii() { if ( encoder ) { Modified: trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp ============================================================================== --- trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp Sat Mar 15 20:23:48 2025 (r23041) +++ trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp Sun Mar 16 19:49:10 2025 (r23042) @@ -34,6 +34,10 @@ #include "mpt/parse/parse.hpp" //#include "mpt/crc/crc.hpp" #include "OggStream.h" +#include <algorithm> +#if MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS) +#include <thread> +#endif #ifdef MPT_WITH_OGG #if MPT_COMPILER_CLANG #pragma clang diagnostic push @@ -689,6 +693,10 @@ FLAC__stream_encoder_set_metadata(encoder, metadata.data(), numBlocks); #ifdef MODPLUG_TRACKER FLAC__stream_encoder_set_compression_level(encoder, TrackerSettings::Instance().m_FLACCompressionLevel); +#if (FLAC_API_VERSION_CURRENT >= 14) && MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS) + uint32 threads = TrackerSettings::Instance().m_FLACMultithreading ? static_cast<uint32>(std::max(std::thread::hardware_concurrency(), static_cast<unsigned int>(1))) : static_cast<uint32>(1); + FLAC__stream_encoder_set_num_threads(encoder, threads); +#endif #endif // MODPLUG_TRACKER bool success = FLAC__stream_encoder_init_stream(encoder, &FLAC__StreamEncoder_RAII::StreamEncoderWriteCallback, &FLAC__StreamEncoder_RAII::StreamEncoderSeekCallback, &FLAC__StreamEncoder_RAII::StreamEncoderTellCallback, nullptr, &encoder.f) == FLAC__STREAM_ENCODER_INIT_STATUS_OK; Modified: trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.hpp ============================================================================== --- trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.hpp Sat Mar 15 20:23:48 2025 (r23041) +++ trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.hpp Sun Mar 16 19:49:10 2025 (r23042) @@ -213,6 +213,7 @@ struct StreamSettings { int32 FLACCompressionLevel = 5; // 8 + bool FLACMultithreading = true; uint32 AUPaddingAlignHint = 4096; uint32 MP3ID3v2MinPadding = 1024; uint32 MP3ID3v2PaddingAlignHint = 4096; Modified: trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoderFLAC.cpp ============================================================================== --- trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoderFLAC.cpp Sat Mar 15 20:23:48 2025 (r23041) +++ trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoderFLAC.cpp Sun Mar 16 19:49:10 2025 (r23042) @@ -8,6 +8,7 @@ #include "openmpt/streamencoder/StreamEncoderFLAC.hpp" #include "mpt/base/bit.hpp" +#include "mpt/base/detect.hpp" #include "mpt/base/macros.hpp" #include "mpt/base/pointer.hpp" #include "mpt/base/saturate_cast.hpp" @@ -25,8 +26,12 @@ #include "openmpt/soundfile_data/tags.hpp" #include "openmpt/streamencoder/StreamEncoder.hpp" +#include <algorithm> #include <memory> #include <string> +#if MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS) +#include <thread> +#endif #include <vector> #include <cassert> @@ -123,6 +128,11 @@ int compressionLevel = settings.Details.FLACCompressionLevel; FLAC__stream_encoder_set_compression_level(encoder, compressionLevel); +#if (FLAC_API_VERSION_CURRENT >= 14) && MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS) + uint32 threads = settings.Details.FLACMultithreading ? static_cast<uint32>(std::max(std::thread::hardware_concurrency(), static_cast<unsigned int>(1))) : static_cast<uint32>(1); + FLAC__stream_encoder_set_num_threads(encoder, threads); +#endif + if(settings.Tags) { flac_metadata[0] = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT); |