diff --git a/include/ProjectRenderer.h b/include/ProjectRenderer.h index c00a9bb51..06f08a20b 100644 --- a/include/ProjectRenderer.h +++ b/include/ProjectRenderer.h @@ -44,6 +44,7 @@ public: enum Depths { Depth_16Bit, + Depth_24Bit, Depth_32Bit, NumDepths } ; diff --git a/src/core/ProjectRenderer.cpp b/src/core/ProjectRenderer.cpp index 75a707592..b14634332 100644 --- a/src/core/ProjectRenderer.cpp +++ b/src/core/ProjectRenderer.cpp @@ -76,14 +76,30 @@ ProjectRenderer::ProjectRenderer( const Mixer::qualitySettings & _qs, return; } - bool success_ful = false; + int depth; + switch (_os.depth) + { + case Depth_16Bit: + depth = 16; + break; + case Depth_24Bit: + depth = 24; + break; + case Depth_32Bit: + depth = 32; + break; + default: + // If this line is reached the enum has been extended without taking care here + Q_ASSERT(false); + } + + bool successful = false; m_fileDev = fileEncodeDevices[_file_format].m_getDevInst( - _os.samplerate, DEFAULT_CHANNELS, success_ful, + _os.samplerate, DEFAULT_CHANNELS, successful, _out_file, _os.vbr, _os.bitrate, _os.bitrate - 64, _os.bitrate + 64, - _os.depth == Depth_32Bit ? 32 : 16, - Engine::mixer() ); - if( success_ful == false ) + depth, Engine::mixer() ); + if( !successful ) { delete m_fileDev; m_fileDev = NULL; diff --git a/src/core/audio/AudioFileWave.cpp b/src/core/audio/AudioFileWave.cpp index 65b87db79..a52ea5a96 100644 --- a/src/core/audio/AudioFileWave.cpp +++ b/src/core/audio/AudioFileWave.cpp @@ -64,11 +64,20 @@ bool AudioFileWave::startEncoding() m_si.sections = 1; m_si.seekable = 0; + m_si.format = SF_FORMAT_WAV; + switch( depth() ) { - case 32: m_si.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT; break; - case 16: - default: m_si.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; break; + case 32: + m_si.format |= SF_FORMAT_FLOAT; + break; + case 24: + m_si.format |= SF_FORMAT_PCM_24; + break; + case 16: + default: + m_si.format |= SF_FORMAT_PCM_16; + break; } m_sf = sf_open( #ifdef LMMS_BUILD_WIN32 @@ -88,7 +97,7 @@ void AudioFileWave::writeBuffer( const surroundSampleFrame * _ab, const fpp_t _frames, const float _master_gain ) { - if( depth() == 32 ) + if( depth() == 32 || depth() == 24 ) { float * buf = new float[_frames*channels()]; for( fpp_t frame = 0; frame < _frames; ++frame ) diff --git a/src/gui/dialogs/export_project.ui b/src/gui/dialogs/export_project.ui index f6d695c23..4384993af 100644 --- a/src/gui/dialogs/export_project.ui +++ b/src/gui/dialogs/export_project.ui @@ -86,16 +86,7 @@ 6 - - 0 - - - 0 - - - 0 - - + 0 @@ -148,16 +139,7 @@ - - 0 - - - 0 - - - 0 - - + 0 @@ -174,6 +156,11 @@ 16 Bit Integer + + + 24 Bit Float + + 32 Bit Float