Skip to content

Commit 443622f

Browse files
committed
[Imp] Stream Export: FLAC: Enable multi-threading by default. It can be disabled via a new hidden setting [Export]FLACMultithreading=true. This depends on <xiph/flac#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 <xiph/flac#822>, and is a no-op until our libflac supports multi-threading. [Imp] openmpt123: Enable FLAC multithreading unconditionally. git-svn-id: https://source.openmpt.org/svn/openmpt/trunk/OpenMPT@23042 56274372-70c3-4bfc-bfc3-4c3a0b034d27
1 parent a957929 commit 443622f

8 files changed

+32
-0
lines changed

mptrack/StreamEncoderSettings.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ EncoderSettingsConf::operator Encoder::Settings() const
6969

7070
StreamEncoderSettingsConf::StreamEncoderSettingsConf(SettingsContainer &conf, const mpt::ustring &section)
7171
: FLACCompressionLevel(conf, section, U_("FLACCompressionLevel"), Encoder::StreamSettings().FLACCompressionLevel)
72+
, FLACMultithreading(conf, section, U_("FLACMultithreading"), Encoder::StreamSettings().FLACMultithreading)
7273
, AUPaddingAlignHint(conf, section, U_("AUPaddingAlignHint"), Encoder::StreamSettings().AUPaddingAlignHint)
7374
, MP3ID3v2MinPadding(conf, section, U_("MP3ID3v2MinPadding"), Encoder::StreamSettings().MP3ID3v2MinPadding)
7475
, MP3ID3v2PaddingAlignHint(conf, section, U_("MP3ID3v2PaddingAlignHint"), Encoder::StreamSettings().MP3ID3v2PaddingAlignHint)
@@ -87,6 +88,7 @@ StreamEncoderSettingsConf::operator Encoder::StreamSettings() const
8788
{
8889
Encoder::StreamSettings result;
8990
result.FLACCompressionLevel = FLACCompressionLevel;
91+
result.FLACMultithreading = FLACMultithreading;
9092
result.AUPaddingAlignHint = AUPaddingAlignHint;
9193
result.MP3ID3v2MinPadding = MP3ID3v2MinPadding;
9294
result.MP3ID3v2PaddingAlignHint = MP3ID3v2PaddingAlignHint;

mptrack/StreamEncoderSettings.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ struct EncoderSettingsConf
9696
struct StreamEncoderSettingsConf
9797
{
9898
Setting<int32> FLACCompressionLevel;
99+
Setting<bool> FLACMultithreading;
99100
Setting<uint32> AUPaddingAlignHint;
100101
Setting<uint32> MP3ID3v2MinPadding;
101102
Setting<uint32> MP3ID3v2PaddingAlignHint;

mptrack/TrackerSettings.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ TrackerSettings::TrackerSettings(SettingsContainer &conf)
294294
, sampleEditorDefaultResampler(conf, UL_("Sample Editor"), UL_("DefaultResampler"), SRCMODE_DEFAULT)
295295
, m_nFinetuneStep(conf, UL_("Sample Editor"), UL_("FinetuneStep"), 10)
296296
, m_FLACCompressionLevel(conf, UL_("Sample Editor"), UL_("FLACCompressionLevel"), 5)
297+
, m_FLACMultithreading(conf, UL_("Sample Editor"), UL_("FLACMultithreading"), false)
297298
, compressITI(conf, UL_("Sample Editor"), UL_("CompressITI"), true)
298299
, m_MayNormalizeSamplesOnLoad(conf, UL_("Sample Editor"), UL_("MayNormalizeSamplesOnLoad"), true)
299300
, previewInFileDialogs(conf, UL_("Sample Editor"), UL_("PreviewInFileDialogs"), false)

mptrack/TrackerSettings.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,7 @@ class TrackerSettings
878878
Setting<ResamplingMode> sampleEditorDefaultResampler;
879879
Setting<int32> m_nFinetuneStep; // Increment finetune by x cents when using spin control.
880880
Setting<int32> m_FLACCompressionLevel; // FLAC compression level for saving (0...8)
881+
Setting<bool> m_FLACMultithreading;
881882
Setting<bool> compressITI;
882883
Setting<bool> m_MayNormalizeSamplesOnLoad;
883884
Setting<bool> previewInFileDialogs;

openmpt123/openmpt123_flac.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
#include "mpt/base/detect.hpp"
1919
#include "mpt/base/saturate_round.hpp"
2020

21+
#include <algorithm>
22+
#if MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS)
23+
#include <thread>
24+
#endif
25+
2126
#if defined(_MSC_VER) && defined(__clang__) && defined(__c2__)
2227
#include <sys/types.h>
2328
#if __STDC__
@@ -66,6 +71,9 @@ class flac_stream_raii : public file_audio_stream_base {
6671
FLAC__stream_encoder_set_bits_per_sample( encoder, flags.use_float ? 24 : 16 );
6772
FLAC__stream_encoder_set_sample_rate( encoder, flags.samplerate );
6873
FLAC__stream_encoder_set_compression_level( encoder, 8 );
74+
#if (FLAC_API_VERSION_CURRENT >= 14) && MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS)
75+
FLAC__stream_encoder_set_num_threads(encoder, static_cast<std::uint32_t>(std::max(std::thread::hardware_concurrency(), static_cast<unsigned int>(1))));
76+
#endif
6977
}
7078
~flac_stream_raii() {
7179
if ( encoder ) {

soundlib/SampleFormatFLAC.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
#include "mpt/parse/parse.hpp"
3535
//#include "mpt/crc/crc.hpp"
3636
#include "OggStream.h"
37+
#include <algorithm>
38+
#if MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS)
39+
#include <thread>
40+
#endif
3741
#ifdef MPT_WITH_OGG
3842
#if MPT_COMPILER_CLANG
3943
#pragma clang diagnostic push
@@ -689,6 +693,10 @@ bool CSoundFile::SaveFLACSample(SAMPLEINDEX nSample, std::ostream &f) const
689693
FLAC__stream_encoder_set_metadata(encoder, metadata.data(), numBlocks);
690694
#ifdef MODPLUG_TRACKER
691695
FLAC__stream_encoder_set_compression_level(encoder, TrackerSettings::Instance().m_FLACCompressionLevel);
696+
#if (FLAC_API_VERSION_CURRENT >= 14) && MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS)
697+
uint32 threads = TrackerSettings::Instance().m_FLACMultithreading ? static_cast<uint32>(std::max(std::thread::hardware_concurrency(), static_cast<unsigned int>(1))) : static_cast<uint32>(1);
698+
FLAC__stream_encoder_set_num_threads(encoder, threads);
699+
#endif
692700
#endif // MODPLUG_TRACKER
693701

694702
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;

src/openmpt/streamencoder/StreamEncoder.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ struct Traits
213213
struct StreamSettings
214214
{
215215
int32 FLACCompressionLevel = 5; // 8
216+
bool FLACMultithreading = true;
216217
uint32 AUPaddingAlignHint = 4096;
217218
uint32 MP3ID3v2MinPadding = 1024;
218219
uint32 MP3ID3v2PaddingAlignHint = 4096;

src/openmpt/streamencoder/StreamEncoderFLAC.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "openmpt/streamencoder/StreamEncoderFLAC.hpp"
99

1010
#include "mpt/base/bit.hpp"
11+
#include "mpt/base/detect.hpp"
1112
#include "mpt/base/macros.hpp"
1213
#include "mpt/base/pointer.hpp"
1314
#include "mpt/base/saturate_cast.hpp"
@@ -25,8 +26,12 @@
2526
#include "openmpt/soundfile_data/tags.hpp"
2627
#include "openmpt/streamencoder/StreamEncoder.hpp"
2728

29+
#include <algorithm>
2830
#include <memory>
2931
#include <string>
32+
#if MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS)
33+
#include <thread>
34+
#endif
3035
#include <vector>
3136

3237
#include <cassert>
@@ -123,6 +128,11 @@ class FLACStreamWriter : public StreamWriterBase
123128
int compressionLevel = settings.Details.FLACCompressionLevel;
124129
FLAC__stream_encoder_set_compression_level(encoder, compressionLevel);
125130

131+
#if (FLAC_API_VERSION_CURRENT >= 14) && MPT_PLATFORM_MULTITHREADED && !defined(MPT_COMPILER_QUIRK_NO_STDCPP_THREADS)
132+
uint32 threads = settings.Details.FLACMultithreading ? static_cast<uint32>(std::max(std::thread::hardware_concurrency(), static_cast<unsigned int>(1))) : static_cast<uint32>(1);
133+
FLAC__stream_encoder_set_num_threads(encoder, threads);
134+
#endif
135+
126136
if(settings.Tags)
127137
{
128138
flac_metadata[0] = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT);

0 commit comments

Comments
 (0)