You can subscribe to this list here.
| 2006 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
(10) |
Sep
|
Oct
|
Nov
|
Dec
(3) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2007 |
Jan
(1) |
Feb
(2) |
Mar
(3) |
Apr
(2) |
May
(10) |
Jun
(2) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
|
| 2008 |
Jan
(6) |
Feb
(4) |
Mar
(5) |
Apr
(2) |
May
(1) |
Jun
(1) |
Jul
(4) |
Aug
(6) |
Sep
(2) |
Oct
(9) |
Nov
(1) |
Dec
(4) |
| 2009 |
Jan
(9) |
Feb
(2) |
Mar
(2) |
Apr
(2) |
May
(6) |
Jun
(18) |
Jul
(33) |
Aug
(39) |
Sep
(33) |
Oct
(24) |
Nov
(23) |
Dec
(22) |
| 2010 |
Jan
(29) |
Feb
(32) |
Mar
(51) |
Apr
(17) |
May
(31) |
Jun
(21) |
Jul
(32) |
Aug
(28) |
Sep
(35) |
Oct
(27) |
Nov
(11) |
Dec
(13) |
| 2011 |
Jan
(14) |
Feb
(13) |
Mar
(27) |
Apr
(27) |
May
(28) |
Jun
(20) |
Jul
(43) |
Aug
(52) |
Sep
(66) |
Oct
(61) |
Nov
(11) |
Dec
(8) |
| 2012 |
Jan
(20) |
Feb
(30) |
Mar
(38) |
Apr
(21) |
May
(33) |
Jun
(21) |
Jul
(25) |
Aug
(9) |
Sep
(24) |
Oct
(42) |
Nov
(27) |
Dec
(41) |
| 2013 |
Jan
(20) |
Feb
(35) |
Mar
(156) |
Apr
(298) |
May
(258) |
Jun
(201) |
Jul
(105) |
Aug
(60) |
Sep
(193) |
Oct
(245) |
Nov
(280) |
Dec
(194) |
| 2014 |
Jan
(63) |
Feb
(202) |
Mar
(200) |
Apr
(23) |
May
(53) |
Jun
(105) |
Jul
(18) |
Aug
(26) |
Sep
(110) |
Oct
(187) |
Nov
(97) |
Dec
(74) |
| 2015 |
Jan
(45) |
Feb
(55) |
Mar
(116) |
Apr
(116) |
May
(193) |
Jun
(164) |
Jul
(50) |
Aug
(111) |
Sep
(98) |
Oct
(71) |
Nov
(103) |
Dec
(63) |
| 2016 |
Jan
(33) |
Feb
(101) |
Mar
(182) |
Apr
(139) |
May
(140) |
Jun
(103) |
Jul
(165) |
Aug
(286) |
Sep
(208) |
Oct
(127) |
Nov
(97) |
Dec
(54) |
| 2017 |
Jan
(64) |
Feb
(335) |
Mar
(202) |
Apr
(212) |
May
(139) |
Jun
(127) |
Jul
(294) |
Aug
(154) |
Sep
(170) |
Oct
(152) |
Nov
(156) |
Dec
(62) |
| 2018 |
Jan
(168) |
Feb
(237) |
Mar
(196) |
Apr
(174) |
May
(174) |
Jun
(161) |
Jul
(127) |
Aug
(88) |
Sep
(149) |
Oct
(66) |
Nov
(52) |
Dec
(135) |
| 2019 |
Jan
(146) |
Feb
(126) |
Mar
(104) |
Apr
(58) |
May
(60) |
Jun
(28) |
Jul
(197) |
Aug
(129) |
Sep
(141) |
Oct
(148) |
Nov
(63) |
Dec
(100) |
| 2020 |
Jan
(74) |
Feb
(37) |
Mar
(59) |
Apr
(154) |
May
(194) |
Jun
(133) |
Jul
(313) |
Aug
(197) |
Sep
(49) |
Oct
(162) |
Nov
(143) |
Dec
(57) |
| 2021 |
Jan
(120) |
Feb
(107) |
Mar
(314) |
Apr
(157) |
May
(524) |
Jun
(169) |
Jul
(72) |
Aug
(133) |
Sep
(135) |
Oct
(146) |
Nov
(198) |
Dec
(325) |
| 2022 |
Jan
(409) |
Feb
(249) |
Mar
(138) |
Apr
(95) |
May
(102) |
Jun
(221) |
Jul
(66) |
Aug
(120) |
Sep
(192) |
Oct
(131) |
Nov
(53) |
Dec
(171) |
| 2023 |
Jan
(357) |
Feb
(82) |
Mar
(168) |
Apr
(218) |
May
(196) |
Jun
(86) |
Jul
(115) |
Aug
(49) |
Sep
(190) |
Oct
(102) |
Nov
(45) |
Dec
(76) |
| 2024 |
Jan
(86) |
Feb
(50) |
Mar
(324) |
Apr
(209) |
May
(197) |
Jun
(232) |
Jul
(194) |
Aug
(247) |
Sep
(219) |
Oct
(266) |
Nov
(328) |
Dec
(304) |
| 2025 |
Jan
(191) |
Feb
(115) |
Mar
(137) |
Apr
(32) |
May
(126) |
Jun
(403) |
Jul
(213) |
Aug
(203) |
Sep
(148) |
Oct
(109) |
Nov
(191) |
Dec
(209) |
| 2026 |
Jan
(127) |
Feb
(123) |
Mar
(160) |
Apr
(139) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <sv...@op...> - 2026-04-27 21:23:43
|
Author: sagamusix Date: Mon Apr 27 23:23:36 2026 New Revision: 25298 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25298 Log: Merged revision(s) 25297 from trunk/OpenMPT: [Var] Re-save mptrack.rc in a way that hopefully keeps UTF-8 enabled when editing dialogs from now on... ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/mptrack.rc Modified: branches/OpenMPT-1.32/mptrack/mptrack.rc ============================================================================== --- branches/OpenMPT-1.32/mptrack/mptrack.rc Mon Apr 27 23:23:14 2026 (r25297) +++ branches/OpenMPT-1.32/mptrack/mptrack.rc Mon Apr 27 23:23:36 2026 (r25298) @@ -1,5 +1,7 @@ // Microsoft Visual C++ generated resource script. // +#pragma code_page(65001) + #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS @@ -17,7 +19,6 @@ #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(65001) ///////////////////////////////////////////////////////////////////////////// // @@ -2198,6 +2199,10 @@ IDD_CHORDEDIT, DIALOG BEGIN END + + IDD_OPTIONS_MIXER, DIALOG + BEGIN + END END #endif // APSTUDIO_INVOKED @@ -3187,7 +3192,6 @@ #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK -#pragma code_page(65001) ///////////////////////////////////////////////////////////////////////////// // |
|
From: <sv...@op...> - 2026-04-27 21:23:21
|
Author: sagamusix Date: Mon Apr 27 23:23:14 2026 New Revision: 25297 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25297 Log: [Var] Re-save mptrack.rc in a way that hopefully keeps UTF-8 enabled when editing dialogs from now on... Modified: trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Mon Apr 27 21:03:57 2026 (r25296) +++ trunk/OpenMPT/mptrack/mptrack.rc Mon Apr 27 23:23:14 2026 (r25297) @@ -1,5 +1,7 @@ // Microsoft Visual C++ generated resource script. // +#pragma code_page(65001) + #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS @@ -17,7 +19,6 @@ #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(65001) ///////////////////////////////////////////////////////////////////////////// // @@ -2229,6 +2230,10 @@ TOPMARGIN, 4 BOTTOMMARGIN, 138 END + + IDD_OPTIONS_MIXER, DIALOG + BEGIN + END END #endif // APSTUDIO_INVOKED @@ -3246,7 +3251,6 @@ #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK -#pragma code_page(65001) ///////////////////////////////////////////////////////////////////////////// // |
|
From: <sv...@op...> - 2026-04-27 19:04:12
|
Author: sagamusix Date: Mon Apr 27 21:03:57 2026 New Revision: 25296 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25296 Log: [Fix] Add silence dialog: Length unit update was not announced properly to screen readers. Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp Modified: branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp Mon Apr 27 21:02:47 2026 (r25295) +++ branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp Mon Apr 27 21:03:57 2026 (r25296) @@ -601,10 +601,10 @@ if(m_unit == unit) return; - m_EditAmount.AllowFractions(unit == kMilliseconds); - m_EditAmount.SetAccessibleSuffix((m_unit == kSamples) ? _T("samples") : _T("ms")); m_unit = unit; - if(unit == kSamples) + m_EditAmount.AllowFractions(m_unit == kMilliseconds); + m_EditAmount.SetAccessibleSuffix((m_unit == kSamples) ? _T("samples") : _T("ms")); + if(m_unit == kSamples) { // Convert from milliseconds to samples double ms = 0.0; |
|
From: <sv...@op...> - 2026-04-27 19:02:58
|
Author: sagamusix Date: Mon Apr 27 21:02:47 2026 New Revision: 25295 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25295 Log: [Fix] Add silence dialog: Length unit update was not announced properly to screen readers. Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Mon Apr 27 20:53:32 2026 (r25294) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Mon Apr 27 21:02:47 2026 (r25295) @@ -682,10 +682,10 @@ if(m_unit == unit) return; - m_EditAmount.AllowFractions(unit == SampleLengthUnit::Milliseconds); - m_EditAmount.SetAccessibleSuffix((m_unit == SampleLengthUnit::Samples) ? _T("samples") : _T("ms")); m_unit = unit; - if(unit == SampleLengthUnit::Samples) + m_EditAmount.AllowFractions(m_unit == SampleLengthUnit::Milliseconds); + m_EditAmount.SetAccessibleSuffix((m_unit == SampleLengthUnit::Samples) ? _T("samples") : _T("ms")); + if(m_unit == SampleLengthUnit::Samples) { // Convert from milliseconds to samples double ms = 0.0; |
|
From: <sv...@op...> - 2026-04-27 18:53:44
|
Author: sagamusix Date: Mon Apr 27 20:53:32 2026 New Revision: 25294 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25294 Log: [Mod] Accessibility: Grid segments label is no longer required. Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Mon Apr 27 20:51:31 2026 (r25293) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Mon Apr 27 20:53:32 2026 (r25294) @@ -759,7 +759,6 @@ m_EditSegments.AllowFractions(true); m_EditSegments.AllowNegative(false); m_EditSegments.SetDecimalValue(m_segments); - m_EditSegments.SetAccessibleName(_T("Grid segments")); m_SpinSpacing.SetRange32(0, m_maxSegments); m_SpinSpacing.SetPos32(mpt::saturate_round<int32>(m_spacing)); |
|
From: <sv...@op...> - 2026-04-27 18:51:40
|
Author: manx Date: Mon Apr 27 20:51:31 2026 New Revision: 25293 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25293 Log: [Ref] openmpt/soundbase/SampleConvert.hpp: Add ConvertChain. [Ref] openmpt/soundbase/SampleDecode.hpp: Rename ConversionChain to DecodeChain. [Ref] Sample Copy: Rename CopySample to DecodeSample, and add a new CopySample based on ConvertChain. [Ref] Rename and simplify all users accordingly. [Ref] openmpt/soundbase/SampleDecode.hpp: Remove DecodeIdentity, as it is now unused. Modified: trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/Load_symmod.cpp trunk/OpenMPT/soundlib/Load_wav.cpp trunk/OpenMPT/soundlib/ModSampleCopy.h trunk/OpenMPT/soundlib/SampleCopy.h trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp trunk/OpenMPT/soundlib/SampleFormatMediaFoundation.cpp trunk/OpenMPT/soundlib/SampleIO.cpp trunk/OpenMPT/soundlib/SampleNormalize.h trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp trunk/OpenMPT/src/openmpt/soundbase/SampleDecode.hpp trunk/OpenMPT/test/test.cpp trunk/OpenMPT/tracklib/SampleEdit.cpp trunk/OpenMPT/tracklib/TimeStretchPitchShift.cpp Modified: trunk/OpenMPT/mptrack/View_smp.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/mptrack/View_smp.cpp Mon Apr 27 20:51:31 2026 (r25293) @@ -3003,13 +3003,13 @@ uint8 newChn = chn % sample.GetNumChannels(); if(oldSample.GetElementarySampleSize() == 1 && sample.GetElementarySampleSize() == 1) { - CopySample(oldSample.sample8() + offset + chn, sample.nLength, numChannels, sample.sample8() + newChn, sample.GetSampleSizeInBytes(), sample.GetNumChannels(), SC::ConversionChain<SC::Convert<int8, int8>, SC::DecodeIdentity<int8> >()); + CopySample(oldSample.sample8() + offset + chn, sample.nLength, numChannels, sample.sample8() + newChn, sample.GetSampleSizeInBytes(), sample.GetNumChannels(), SC::Convert<int8, int8>()); } else if(oldSample.GetElementarySampleSize() == 2 && sample.GetElementarySampleSize() == 1) { - CopySample(oldSample.sample16() + offset + chn, sample.nLength, numChannels, sample.sample8() + newChn, sample.GetSampleSizeInBytes(), sample.GetNumChannels(), SC::ConversionChain<SC::Convert<int16, int8>, SC::DecodeIdentity<int8> >()); + CopySample(oldSample.sample16() + offset + chn, sample.nLength, numChannels, sample.sample8() + newChn, sample.GetSampleSizeInBytes(), sample.GetNumChannels(), SC::Convert<int16, int8>()); } else if(oldSample.GetElementarySampleSize() == 2 && sample.GetElementarySampleSize() == 2) { - CopySample(oldSample.sample16() + offset + chn, sample.nLength, numChannels, sample.sample16() + newChn, sample.GetSampleSizeInBytes(), sample.GetNumChannels(), SC::ConversionChain<SC::Convert<int16, int16>, SC::DecodeIdentity<int16> >()); + CopySample(oldSample.sample16() + offset + chn, sample.nLength, numChannels, sample.sample16() + newChn, sample.GetSampleSizeInBytes(), sample.GetNumChannels(), SC::Convert<int16, int16>()); } else { MPT_ASSERT_NOTREACHED(); Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp Mon Apr 27 20:51:31 2026 (r25293) @@ -2239,7 +2239,7 @@ if(sample.uFlags[CHN_16BIT]) CopySample<SC::CopyNative16>(pDest, sample.nLength, 2, sample.sample16(), sample.GetSampleSizeInBytes(), 1); else - CopySample<SC::ConversionChain<SC::Convert<int16, int8>, SC::DecodeIdentity<int8>>>(pDest, sample.nLength, 2, sample.sample8(), sample.GetSampleSizeInBytes(), 1); + CopySample<SC::Convert<int16, int8>>(pDest, sample.nLength, 2, sample.sample8(), sample.GetSampleSizeInBytes(), 1); sample.FreeSample(); // Now read the other channel @@ -2253,14 +2253,14 @@ if(sample.uFlags[CHN_16BIT]) CopySample<SC::CopyNative16>(pDest, copyLength, 2, sample.sample16(), sample.GetSampleSizeInBytes(), sample.GetNumChannels()); else - CopySample<SC::ConversionChain<SC::Convert<int16, int8>, SC::DecodeIdentity<int8>>>(pDest, copyLength, 2, sample.sample8(), sample.GetSampleSizeInBytes(), sample.GetNumChannels()); + CopySample<SC::Convert<int16, int8>>(pDest, copyLength, 2, sample.sample8(), sample.GetSampleSizeInBytes(), sample.GetNumChannels()); } } else { SmpLength len = std::min(mpt::saturate_cast<SmpLength>(waveData.size() / 2u), sampleCopy.nLength); const std::byte *src = mpt::byte_cast<const std::byte *>(waveData.data()); int16 *dst = sampleCopy.sample16() + offsetNew; - CopySample<SC::ConversionChain<SC::Convert<int16, int16>, SC::DecodeInt16<0, littleEndian16>>>(dst, len, 2, src, waveData.size(), 1); + DecodeSample<SC::DecodeChain<SC::Convert<int16, int16>, SC::DecodeInt16<0, littleEndian16>>>(dst, len, 2, src, waveData.size(), 1); } sample.FreeSample(); sample = sampleCopy; Modified: trunk/OpenMPT/soundlib/Load_symmod.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_symmod.cpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/soundlib/Load_symmod.cpp Mon Apr 27 20:51:31 2026 (r25293) @@ -256,7 +256,7 @@ if(chn.position.GetUInt() >= chn.nLength) chn.pCurrentSample = nullptr; } - CopySample<SC::ConversionChain<SC::ConvertFixedPoint<int16, mixsample_t, 27>, SC::DecodeIdentity<mixsample_t>>>(target.sample16() + writeOffset, writeCount, 1, buffer.data(), sizeof(buffer), 2); + CopySample<SC::ConvertFixedPoint<int16, mixsample_t, 27>>(target.sample16() + writeOffset, writeCount, 1, buffer.data(), sizeof(buffer), 2); writeOffset += writeCount; } @@ -507,7 +507,7 @@ int16 *newSample = static_cast<int16 *>(ModSample::AllocateSample(mptSmp.nLength, 2 * mptSmp.GetNumChannels())); if(!newSample) return; - CopySample<SC::ConversionChain<SC::Convert<int16, int8>, SC::DecodeIdentity<int8>>>(newSample, mptSmp.nLength * mptSmp.GetNumChannels(), 1, mptSmp.sample8(), mptSmp.GetSampleSizeInBytes(), 1); + CopySample<SC::Convert<int16, int8>>(newSample, mptSmp.nLength * mptSmp.GetNumChannels(), 1, mptSmp.sample8(), mptSmp.GetSampleSizeInBytes(), 1); mptSmp.uFlags.set(CHN_16BIT); mptSmp.ReplaceWaveform(newSample, mptSmp.nLength, sndFile); } Modified: trunk/OpenMPT/soundlib/Load_wav.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_wav.cpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/soundlib/Load_wav.cpp Mon Apr 27 20:51:31 2026 (r25293) @@ -38,7 +38,7 @@ } FileReader::PinnedView inData = file.GetPinnedView(file.BytesLeft()); - CopySample<SampleConversion>(sample.template sample<typename SampleConversion::output_t>(), sample.nLength, 1, inData.data() + offset, inData.size() - offset, numChannels, conv); + DecodeSample<SampleConversion>(sample.template sample<typename SampleConversion::output_t>(), sample.nLength, 1, inData.data() + offset, inData.size() - offset, numChannels, conv); return true; } @@ -175,9 +175,9 @@ if(wavFile.GetSampleFormat() == WAVFormatChunk::fmtFloat) { if(wavFile.GetBitsPerSample() <= 32) - CopyWavChannel<SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<littleEndian32>>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); + CopyWavChannel<SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<littleEndian32>>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); else - CopyWavChannel<SC::ConversionChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<littleEndian64>>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); + CopyWavChannel<SC::DecodeChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<littleEndian64>>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); } else { if(wavFile.GetBitsPerSample() <= 8) @@ -185,11 +185,11 @@ else if(wavFile.GetBitsPerSample() <= 16) CopyWavChannel<SC::DecodeInt16<0, littleEndian16>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); else if(wavFile.GetBitsPerSample() <= 24) - CopyWavChannel<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24>>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); + CopyWavChannel<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24>>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); else if(wavFile.GetBitsPerSample() <= 32) - CopyWavChannel<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32>>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); + CopyWavChannel<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32>>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); else if(wavFile.GetBitsPerSample() <= 64) - CopyWavChannel<SC::ConversionChain<SC::Convert<int16, int64>, SC::DecodeInt64<0, littleEndian64>>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); + CopyWavChannel<SC::DecodeChain<SC::Convert<int16, int64>, SC::DecodeInt64<0, littleEndian64>>>(sample, sampleChunk, channel, wavFile.GetNumChannels()); } sample.PrecomputeLoops(*this, false); Modified: trunk/OpenMPT/soundlib/ModSampleCopy.h ============================================================================== --- trunk/OpenMPT/soundlib/ModSampleCopy.h Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/soundlib/ModSampleCopy.h Mon Apr 27 20:51:31 2026 (r25293) @@ -23,7 +23,7 @@ // Copy a mono sample data buffer. template <typename SampleConversion, typename Tbyte> -size_t CopyMonoSample(ModSample &sample, const Tbyte *sourceBuffer, size_t sourceSize, SampleConversion conv = SampleConversion()) +size_t DecodeMonoSample(ModSample &sample, const Tbyte *sourceBuffer, size_t sourceSize, SampleConversion conv = SampleConversion()) { MPT_ASSERT(sample.GetNumChannels() == 1); MPT_ASSERT(sample.GetElementarySampleSize() == sizeof(typename SampleConversion::output_t)); @@ -46,7 +46,7 @@ // Copy a stereo interleaved sample data buffer. template <typename SampleConversion, typename Tbyte> -size_t CopyStereoInterleavedSample(ModSample &sample, const Tbyte *sourceBuffer, size_t sourceSize, SampleConversion conv = SampleConversion()) +size_t DecodeStereoInterleavedSample(ModSample &sample, const Tbyte *sourceBuffer, size_t sourceSize, SampleConversion conv = SampleConversion()) { MPT_ASSERT(sample.GetNumChannels() == 2); MPT_ASSERT(sample.GetElementarySampleSize() == sizeof(typename SampleConversion::output_t)); @@ -73,7 +73,7 @@ // Copy a stereo split sample data buffer. template <typename SampleConversion, typename Tbyte> -size_t CopyStereoSplitSample(ModSample &sample, const Tbyte *sourceBuffer, size_t sourceSize, SampleConversion conv = SampleConversion()) +size_t DecodeStereoSplitSample(ModSample &sample, const Tbyte *sourceBuffer, size_t sourceSize, SampleConversion conv = SampleConversion()) { MPT_ASSERT(sample.GetNumChannels() == 2); MPT_ASSERT(sample.GetElementarySampleSize() == sizeof(typename SampleConversion::output_t)); @@ -112,7 +112,7 @@ // Copy a sample data buffer and normalize it. Requires slightly advanced sample conversion functor. template <typename SampleConversion, typename Tbyte> -size_t CopyAndNormalizeSample(ModSample &sample, const Tbyte *sourceBuffer, size_t sourceSize, typename SampleConversion::peak_t *srcPeak = nullptr, SampleConversion conv = SampleConversion()) +size_t DecodeAndNormalizeSample(ModSample &sample, const Tbyte *sourceBuffer, size_t sourceSize, typename SampleConversion::peak_t *srcPeak = nullptr, SampleConversion conv = SampleConversion()) { const size_t sampleSize = SampleConversion::input_inc; Modified: trunk/OpenMPT/soundlib/SampleCopy.h ============================================================================== --- trunk/OpenMPT/soundlib/SampleCopy.h Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/soundlib/SampleCopy.h Mon Apr 27 20:51:31 2026 (r25293) @@ -41,10 +41,26 @@ template <typename SampleConversion> std::size_t CopySample(typename SampleConversion::output_t *MPT_RESTRICT outBuf, std::size_t numSamples, std::size_t incTarget, const typename SampleConversion::input_t *MPT_RESTRICT inBuf, std::size_t sourceSize, std::size_t incSource, SampleConversion conv = SampleConversion()) { - const std::size_t sampleSize = incSource * SampleConversion::input_inc * sizeof(typename SampleConversion::input_t); + const std::size_t sampleSize = incSource * sizeof(typename SampleConversion::input_t); LimitMax(numSamples, sourceSize / sampleSize); const std::size_t copySize = numSamples * sampleSize; + SampleConversion sampleConv(conv); + while(numSamples--) + { + *outBuf = sampleConv(*inBuf); + outBuf += incTarget; + inBuf += incSource; + } + return copySize; +} + +template <typename SampleConversion> +std::size_t DecodeSample(typename SampleConversion::output_t *MPT_RESTRICT outBuf, std::size_t numSamples, std::size_t incTarget, const typename SampleConversion::input_t *MPT_RESTRICT inBuf, std::size_t sourceSize, std::size_t incSource, SampleConversion conv = SampleConversion()) +{ + const std::size_t sampleSize = incSource * SampleConversion::input_inc * sizeof(typename SampleConversion::input_t); + LimitMax(numSamples, sourceSize / sampleSize); + const std::size_t copySize = numSamples * sampleSize; SampleConversion sampleConv(conv); while(numSamples--) { @@ -52,7 +68,6 @@ outBuf += incTarget; inBuf += incSource * SampleConversion::input_inc; } - return copySize; } @@ -81,8 +96,8 @@ // SampleConversion template parameter shortcuts for pure copying of native sample data namespace SC { // SC = _S_ample_C_onversion - using CopyNative8 = ConversionChain<Convert<int8, int8>, DecodeIdentity<int8>>; - using CopyNative16 = ConversionChain<Convert<int16, int16>, DecodeIdentity<int16>>; + using CopyNative8 = Convert<int8, int8>; + using CopyNative16 = Convert<int16, int16>; } Modified: trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp ============================================================================== --- trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp Mon Apr 27 20:51:31 2026 (r25293) @@ -165,19 +165,19 @@ if(bps <= 8) { int8 *sampleData8 = sample.sample8() + offset; - CopySample<SC::ConversionChain<SC::ConvertShift< int8, int32, 0>, SC::DecodeIdentity<int32> > >(sampleData8 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); + CopySample<SC::ConvertShift< int8, int32, 0>>(sampleData8 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); } else if(bps <= 16) { int16 *sampleData16 = sample.sample16() + offset; - CopySample<SC::ConversionChain<SC::ConvertShift<int16, int32, 0>, SC::DecodeIdentity<int32> > >(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); + CopySample<SC::ConvertShift<int16, int32, 0>>(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); } else if(bps <= 24) { int16 *sampleData16 = sample.sample16() + offset; - CopySample<SC::ConversionChain<SC::ConvertShift<int16, int32, 8>, SC::DecodeIdentity<int32> > >(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); + CopySample<SC::ConvertShift<int16, int32, 8>>(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); } else if(bps <= 32) { int16 *sampleData16 = sample.sample16() + offset; - CopySample<SC::ConversionChain<SC::ConvertShift<int16, int32, 16>, SC::DecodeIdentity<int32> > >(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); + CopySample<SC::ConvertShift<int16, int32, 16>>(sampleData16 + chn, copySamples, modChannels, buffer[chn], srcSize, 1); } } Modified: trunk/OpenMPT/soundlib/SampleFormatMediaFoundation.cpp ============================================================================== --- trunk/OpenMPT/soundlib/SampleFormatMediaFoundation.cpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/soundlib/SampleFormatMediaFoundation.cpp Mon Apr 27 20:51:31 2026 (r25293) @@ -422,19 +422,19 @@ { if(numChannels == 2) { - CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24>>>(Samples[sample], rawData.data(), rawData.size()); + DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24>>>(Samples[sample], rawData.data(), rawData.size()); } else { - CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24>>>(Samples[sample], rawData.data(), rawData.size()); + DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24>>>(Samples[sample], rawData.data(), rawData.size()); } } else if(bitsPerSample == 32) { if(numChannels == 2) { - CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32>>>(Samples[sample], rawData.data(), rawData.size()); + DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32>>>(Samples[sample], rawData.data(), rawData.size()); } else { - CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32>>>(Samples[sample], rawData.data(), rawData.size()); + DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32>>>(Samples[sample], rawData.data(), rawData.size()); } } else { Modified: trunk/OpenMPT/soundlib/SampleIO.cpp ============================================================================== --- trunk/OpenMPT/soundlib/SampleIO.cpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/soundlib/SampleIO.cpp Mon Apr 27 20:51:31 2026 (r25293) @@ -191,7 +191,7 @@ } else if(GetEncoding() == PTM8Dto16 && GetChannelFormat() == mono && GetBitDepth() == 16) { // PTM 8-Bit delta to 16-Bit sample - bytesRead = CopyMonoSample<SC::DecodeInt16Delta8>(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeInt16Delta8>(sample, sourceBuf, fileSize); } else if(GetEncoding() == MDL && GetChannelFormat() == mono && GetBitDepth() <= 16) { // Huffman MDL compressed samples @@ -288,14 +288,14 @@ switch(GetEncoding()) { case signedPCM: // 8-Bit / Mono / Signed / PCM - bytesRead = CopyMonoSample<SC::DecodeInt8>(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeInt8>(sample, sourceBuf, fileSize); break; case unsignedPCM: // 8-Bit / Mono / Unsigned / PCM - bytesRead = CopyMonoSample<SC::DecodeUint8>(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeUint8>(sample, sourceBuf, fileSize); break; case deltaPCM: // 8-Bit / Mono / Delta / PCM case MT2: - bytesRead = CopyMonoSample<SC::DecodeInt8Delta>(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeInt8Delta>(sample, sourceBuf, fileSize); break; default: MPT_ASSERT_NOTREACHED(); @@ -310,14 +310,14 @@ switch(GetEncoding()) { case signedPCM: // 8-Bit / Stereo Split / Signed / PCM - bytesRead = CopyStereoSplitSample<SC::DecodeInt8>(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoSplitSample<SC::DecodeInt8>(sample, sourceBuf, fileSize); break; case unsignedPCM: // 8-Bit / Stereo Split / Unsigned / PCM - bytesRead = CopyStereoSplitSample<SC::DecodeUint8>(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoSplitSample<SC::DecodeUint8>(sample, sourceBuf, fileSize); break; case deltaPCM: // 8-Bit / Stereo Split / Delta / PCM case MT2: // same as deltaPCM, but right channel is stored as a difference from the left channel - bytesRead = CopyStereoSplitSample<SC::DecodeInt8Delta>(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoSplitSample<SC::DecodeInt8Delta>(sample, sourceBuf, fileSize); if(GetEncoding() == MT2) { for(int8 *p = sample.sample8(), *pEnd = p + sample.nLength * 2; p < pEnd; p += 2) @@ -339,13 +339,13 @@ switch(GetEncoding()) { case signedPCM: // 8-Bit / Stereo Interleaved / Signed / PCM - bytesRead = CopyStereoInterleavedSample<SC::DecodeInt8>(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeInt8>(sample, sourceBuf, fileSize); break; case unsignedPCM: // 8-Bit / Stereo Interleaved / Unsigned / PCM - bytesRead = CopyStereoInterleavedSample<SC::DecodeUint8>(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeUint8>(sample, sourceBuf, fileSize); break; case deltaPCM: // 8-Bit / Stereo Interleaved / Delta / PCM - bytesRead = CopyStereoInterleavedSample<SC::DecodeInt8Delta>(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeInt8Delta>(sample, sourceBuf, fileSize); break; default: MPT_ASSERT_NOTREACHED(); @@ -360,14 +360,14 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Stereo Interleaved / Signed / PCM - bytesRead = CopyMonoSample<SC::DecodeInt16<0, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeInt16<0, littleEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Stereo Interleaved / Unsigned / PCM - bytesRead = CopyMonoSample<SC::DecodeInt16<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeInt16<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Stereo Interleaved / Delta / PCM case MT2: - bytesRead = CopyMonoSample<SC::DecodeInt16Delta<littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeInt16Delta<littleEndian16> >(sample, sourceBuf, fileSize); break; default: MPT_ASSERT_NOTREACHED(); @@ -382,13 +382,13 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Mono / Signed / PCM - bytesRead = CopyMonoSample<SC::DecodeInt16<0, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeInt16<0, bigEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Mono / Unsigned / PCM - bytesRead = CopyMonoSample<SC::DecodeInt16<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeInt16<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Mono / Delta / PCM - bytesRead = CopyMonoSample<SC::DecodeInt16Delta<bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeInt16Delta<bigEndian16> >(sample, sourceBuf, fileSize); break; default: MPT_ASSERT_NOTREACHED(); @@ -403,14 +403,14 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Stereo Split / Signed / PCM - bytesRead = CopyStereoSplitSample<SC::DecodeInt16<0, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoSplitSample<SC::DecodeInt16<0, littleEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Stereo Split / Unsigned / PCM - bytesRead = CopyStereoSplitSample<SC::DecodeInt16<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoSplitSample<SC::DecodeInt16<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Stereo Split / Delta / PCM case MT2: // same as deltaPCM, but right channel is stored as a difference from the left channel - bytesRead = CopyStereoSplitSample<SC::DecodeInt16Delta<littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoSplitSample<SC::DecodeInt16Delta<littleEndian16> >(sample, sourceBuf, fileSize); if(GetEncoding() == MT2) { for(int16 *p = sample.sample16(), *pEnd = p + sample.nLength * 2; p < pEnd; p += 2) @@ -432,13 +432,13 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Stereo Split / Signed / PCM - bytesRead = CopyStereoSplitSample<SC::DecodeInt16<0, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoSplitSample<SC::DecodeInt16<0, bigEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Stereo Split / Unsigned / PCM - bytesRead = CopyStereoSplitSample<SC::DecodeInt16<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoSplitSample<SC::DecodeInt16<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Stereo Split / Delta / PCM - bytesRead = CopyStereoSplitSample<SC::DecodeInt16Delta<bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoSplitSample<SC::DecodeInt16Delta<bigEndian16> >(sample, sourceBuf, fileSize); break; default: MPT_ASSERT_NOTREACHED(); @@ -453,13 +453,13 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Stereo Interleaved / Signed / PCM - bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16<0, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeInt16<0, littleEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Stereo Interleaved / Unsigned / PCM - bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeInt16<0x8000u, littleEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Stereo Interleaved / Delta / PCM - bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16Delta<littleEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeInt16Delta<littleEndian16> >(sample, sourceBuf, fileSize); break; default: MPT_ASSERT_NOTREACHED(); @@ -474,13 +474,13 @@ switch(GetEncoding()) { case signedPCM: // 16-Bit / Stereo Interleaved / Signed / PCM - bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16<0, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeInt16<0, bigEndian16> >(sample, sourceBuf, fileSize); break; case unsignedPCM: // 16-Bit / Stereo Interleaved / Unsigned / PCM - bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeInt16<0x8000u, bigEndian16> >(sample, sourceBuf, fileSize); break; case deltaPCM: // 16-Bit / Stereo Interleaved / Delta / PCM - bytesRead = CopyStereoInterleavedSample<SC::DecodeInt16Delta<bigEndian16> >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeInt16Delta<bigEndian16> >(sample, sourceBuf, fileSize); break; default: MPT_ASSERT_NOTREACHED(); @@ -494,10 +494,10 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, bigEndian24> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, bigEndian24> > >(sample, sourceBuf, fileSize); } } @@ -507,10 +507,10 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, bigEndian24> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, bigEndian24> > >(sample, sourceBuf, fileSize); } } @@ -520,10 +520,10 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, bigEndian32> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, bigEndian32> > >(sample, sourceBuf, fileSize); } } @@ -533,10 +533,10 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, bigEndian32> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, bigEndian32> > >(sample, sourceBuf, fileSize); } } @@ -546,10 +546,10 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int64>, SC::DecodeInt64<0, littleEndian64> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, int64>, SC::DecodeInt64<0, littleEndian64> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, int64>, SC::DecodeInt64<0, bigEndian64> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, int64>, SC::DecodeInt64<0, bigEndian64> > >(sample, sourceBuf, fileSize); } } @@ -559,10 +559,10 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, int64>, SC::DecodeInt64<0, littleEndian64> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, int64>, SC::DecodeInt64<0, littleEndian64> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, int64>, SC::DecodeInt64<0, bigEndian64> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, int64>, SC::DecodeInt64<0, bigEndian64> > >(sample, sourceBuf, fileSize); } } @@ -572,10 +572,10 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<littleEndian32> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<littleEndian32> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<bigEndian32> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<bigEndian32> > >(sample, sourceBuf, fileSize); } } @@ -585,10 +585,10 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<littleEndian32> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<littleEndian32> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<bigEndian32> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<bigEndian32> > >(sample, sourceBuf, fileSize); } } @@ -598,10 +598,10 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<littleEndian64> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<littleEndian64> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyMonoSample<SC::ConversionChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<bigEndian64> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeMonoSample<SC::DecodeChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<bigEndian64> > >(sample, sourceBuf, fileSize); } } @@ -611,10 +611,10 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<littleEndian64> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<littleEndian64> > >(sample, sourceBuf, fileSize); } else { - bytesRead = CopyStereoInterleavedSample<SC::ConversionChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<bigEndian64> > >(sample, sourceBuf, fileSize); + bytesRead = DecodeStereoInterleavedSample<SC::DecodeChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<bigEndian64> > >(sample, sourceBuf, fileSize); } } @@ -626,10 +626,10 @@ uint32 srcPeak = uint32(1)<<31; if(GetEndianness() == littleEndian) { - bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, sourceBuf, fileSize, &srcPeak); + bytesRead = DecodeAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, sourceBuf, fileSize, &srcPeak); } else { - bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, bigEndian24> > >(sample, sourceBuf, fileSize, &srcPeak); + bytesRead = DecodeAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, bigEndian24> > >(sample, sourceBuf, fileSize, &srcPeak); } if(bytesRead && srcPeak != uint32(1)<<31) { @@ -647,10 +647,10 @@ uint32 srcPeak = uint32(1)<<31; if(GetEndianness() == littleEndian) { - bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32> > >(sample, sourceBuf, fileSize, &srcPeak); + bytesRead = DecodeAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, littleEndian32> > >(sample, sourceBuf, fileSize, &srcPeak); } else { - bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, bigEndian32> > >(sample, sourceBuf, fileSize, &srcPeak); + bytesRead = DecodeAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt32<0, bigEndian32> > >(sample, sourceBuf, fileSize, &srcPeak); } if(bytesRead && srcPeak != uint32(1)<<31) { @@ -668,10 +668,10 @@ somefloat32 srcPeak = 1.0f; if(GetEndianness() == littleEndian) { - bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<littleEndian32> > >(sample, sourceBuf, fileSize, &srcPeak); + bytesRead = DecodeAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<littleEndian32> > >(sample, sourceBuf, fileSize, &srcPeak); } else { - bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<bigEndian32> > >(sample, sourceBuf, fileSize, &srcPeak); + bytesRead = DecodeAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<bigEndian32> > >(sample, sourceBuf, fileSize, &srcPeak); } if(bytesRead && srcPeak != 1.0f) { @@ -689,10 +689,10 @@ somefloat64 srcPeak = 1.0; if(GetEndianness() == littleEndian) { - bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<littleEndian64> > >(sample, sourceBuf, fileSize, &srcPeak); + bytesRead = DecodeAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<littleEndian64> > >(sample, sourceBuf, fileSize, &srcPeak); } else { - bytesRead = CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<bigEndian64> > >(sample, sourceBuf, fileSize, &srcPeak); + bytesRead = DecodeAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, somefloat64>, SC::DecodeFloat64<bigEndian64> > >(sample, sourceBuf, fileSize, &srcPeak); } if(bytesRead && srcPeak != 1.0) { @@ -708,16 +708,16 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyMonoSample + bytesRead = DecodeMonoSample (sample, sourceBuf, fileSize, - SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<littleEndian32> > + SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<littleEndian32> > (SC::Convert<int16, somefloat32>(), SC::DecodeScaledFloat32<littleEndian32>(1.0f / static_cast<float>(1<<15))) ); } else { - bytesRead = CopyMonoSample + bytesRead = DecodeMonoSample (sample, sourceBuf, fileSize, - SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<bigEndian32> > + SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<bigEndian32> > (SC::Convert<int16, somefloat32>(), SC::DecodeScaledFloat32<bigEndian32>(1.0f / static_cast<float>(1<<15))) ); } @@ -729,16 +729,16 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyStereoInterleavedSample + bytesRead = DecodeStereoInterleavedSample (sample, sourceBuf, fileSize, - SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<littleEndian32> > + SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<littleEndian32> > (SC::Convert<int16, somefloat32>(), SC::DecodeScaledFloat32<littleEndian32>(1.0f / static_cast<float>(1<<15))) ); } else { - bytesRead = CopyStereoInterleavedSample + bytesRead = DecodeStereoInterleavedSample (sample, sourceBuf, fileSize, - SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<bigEndian32> > + SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<bigEndian32> > (SC::Convert<int16, somefloat32>(), SC::DecodeScaledFloat32<bigEndian32>(1.0f / static_cast<float>(1<<15))) ); } @@ -750,16 +750,16 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyMonoSample + bytesRead = DecodeMonoSample (sample, sourceBuf, fileSize, - SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<littleEndian32> > + SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<littleEndian32> > (SC::Convert<int16, somefloat32>(), SC::DecodeScaledFloat32<littleEndian32>(1.0f / static_cast<float>(1<<23))) ); } else { - bytesRead = CopyMonoSample + bytesRead = DecodeMonoSample (sample, sourceBuf, fileSize, - SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<bigEndian32> > + SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<bigEndian32> > (SC::Convert<int16, somefloat32>(), SC::DecodeScaledFloat32<bigEndian32>(1.0f / static_cast<float>(1<<23))) ); } @@ -771,16 +771,16 @@ { if(GetEndianness() == littleEndian) { - bytesRead = CopyStereoInterleavedSample + bytesRead = DecodeStereoInterleavedSample (sample, sourceBuf, fileSize, - SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<littleEndian32> > + SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<littleEndian32> > (SC::Convert<int16, somefloat32>(), SC::DecodeScaledFloat32<littleEndian32>(1.0f / static_cast<float>(1<<23))) ); } else { - bytesRead = CopyStereoInterleavedSample + bytesRead = DecodeStereoInterleavedSample (sample, sourceBuf, fileSize, - SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<bigEndian32> > + SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeScaledFloat32<bigEndian32> > (SC::Convert<int16, somefloat32>(), SC::DecodeScaledFloat32<bigEndian32>(1.0f / static_cast<float>(1<<23))) ); } Modified: trunk/OpenMPT/soundlib/SampleNormalize.h ============================================================================== --- trunk/OpenMPT/soundlib/SampleNormalize.h Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/soundlib/SampleNormalize.h Mon Apr 27 20:51:31 2026 (r25293) @@ -146,7 +146,6 @@ // Reads sample data with Func1, then normalizes the sample data, and then converts it with Func2. // Func1::output_t and Func2::input_t must be identical. -// Func1 can also be the identity decode (DecodeIdentity<T>). // Func2 can also be the identity conversion (Convert<T,T>). template <typename Func2, typename Func1> struct NormalizationChain Modified: trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp ============================================================================== --- trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp Mon Apr 27 20:51:31 2026 (r25293) @@ -739,6 +739,27 @@ +template <typename Func2, typename Func1> +struct ConvertChain +{ + using input_t = typename Func1::input_t; + using output_t = typename Func2::output_t; + Func1 func1; + Func2 func2; + MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE output_t operator()(input_t in) + { + return func2(func1(in)); + } + MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE ConvertChain(Func2 f2 = Func2(), Func1 f1 = Func1()) + : func1(f1) + , func2(f2) + { + return; + } +}; + + + template <typename Tdst, typename Tsrc> MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE Tdst sample_cast(Tsrc src) { Modified: trunk/OpenMPT/src/openmpt/soundbase/SampleDecode.hpp ============================================================================== --- trunk/OpenMPT/src/openmpt/soundbase/SampleDecode.hpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/src/openmpt/soundbase/SampleDecode.hpp Mon Apr 27 20:51:31 2026 (r25293) @@ -364,23 +364,11 @@ } }; -template <typename Tsample> -struct DecodeIdentity -{ - using input_t = Tsample; - using output_t = Tsample; - static constexpr std::size_t input_inc = 1; - MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE output_t operator()(const input_t *inBuf) - { - return *inBuf; - } -}; - // Reads sample data with Func and passes it directly to Func2. // Func1::output_t and Func2::input_t must be identical template <typename Func2, typename Func1> -struct ConversionChain +struct DecodeChain { using input_t = typename Func1::input_t; using output_t = typename Func2::output_t; @@ -391,7 +379,7 @@ { return func2(func1(inBuf)); } - MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE ConversionChain(Func2 f2 = Func2(), Func1 f1 = Func1()) + MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE DecodeChain(Func2 f2 = Func2(), Func1 f1 = Func1()) : func1(f1) , func2(f2) { Modified: trunk/OpenMPT/test/test.cpp ============================================================================== --- trunk/OpenMPT/test/test.cpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/test/test.cpp Mon Apr 27 20:51:31 2026 (r25293) @@ -5293,9 +5293,9 @@ std::vector<int8> unsigned8(256); std::vector<int8> delta8(256); int8 delta = 0; - CopySample<SC::DecodeInt8>(signed8.data(), 256, 1, source8.data(), 256, 1); - CopySample<SC::DecodeUint8>(unsigned8.data(), 256, 1, source8.data(), 256, 1); - CopySample<SC::DecodeInt8Delta>(delta8.data(), 256, 1, source8.data(), 256, 1); + DecodeSample<SC::DecodeInt8>(signed8.data(), 256, 1, source8.data(), 256, 1); + DecodeSample<SC::DecodeUint8>(unsigned8.data(), 256, 1, source8.data(), 256, 1); + DecodeSample<SC::DecodeInt8Delta>(delta8.data(), 256, 1, source8.data(), 256, 1); for(std::size_t i = 0; i < 256; i++) { @@ -5323,9 +5323,9 @@ std::vector<int16> unsigned16(65536); std::vector<int16> delta16(65536); int16 delta = 0; - CopySample<SC::DecodeInt16<0, littleEndian16> >(signed16.data(), 65536, 1, source16.data(), 65536 * 2, 1); - CopySample<SC::DecodeInt16<0x8000u, littleEndian16> >(unsigned16.data(), 65536, 1, source16.data(), 65536 * 2, 1); - CopySample<SC::DecodeInt16Delta<littleEndian16> >(delta16.data(), 65536, 1, source16.data(), 65536 * 2, 1); + DecodeSample<SC::DecodeInt16<0, littleEndian16> >(signed16.data(), 65536, 1, source16.data(), 65536 * 2, 1); + DecodeSample<SC::DecodeInt16<0x8000u, littleEndian16> >(unsigned16.data(), 65536, 1, source16.data(), 65536 * 2, 1); + DecodeSample<SC::DecodeInt16Delta<littleEndian16> >(delta16.data(), 65536, 1, source16.data(), 65536 * 2, 1); for(std::size_t i = 0; i < 65536; i++) { @@ -5343,9 +5343,9 @@ source16[i * 2 + 1] = mpt::byte_cast<std::byte>(static_cast<uint8>(i & 0xFF)); } - CopySample<SC::DecodeInt16<0, bigEndian16> >(signed16.data(), 65536, 1, source16.data(), 65536 * 2, 1); - CopySample<SC::DecodeInt16<0x8000u, bigEndian16> >(unsigned16.data(), 65536, 1, source16.data(), 65536 * 2, 1); - CopySample<SC::DecodeInt16Delta<bigEndian16> >(delta16.data(), 65536, 1, source16.data(), 65536 * 2, 1); + DecodeSample<SC::DecodeInt16<0, bigEndian16> >(signed16.data(), 65536, 1, source16.data(), 65536 * 2, 1); + DecodeSample<SC::DecodeInt16<0x8000u, bigEndian16> >(unsigned16.data(), 65536, 1, source16.data(), 65536 * 2, 1); + DecodeSample<SC::DecodeInt16Delta<bigEndian16> >(delta16.data(), 65536, 1, source16.data(), 65536 * 2, 1); delta = 0; for(size_t i = 0; i < 65536; i++) @@ -5375,8 +5375,8 @@ sample.nLength = 65536; sample.uFlags.set(CHN_16BIT); sample.pData.pSample = sampleBuf.data(); - CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, source24.data(), 3*65536); - CopySample<SC::ConversionChain<SC::ConvertShift<int16, int32, 16>, SC::DecodeInt24<0, littleEndian24> > >(truncated16.data(), 65536, 1, source24.data(), 65536 * 3, 1); + DecodeAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, int32>, SC::DecodeInt24<0, littleEndian24> > >(sample, source24.data(), 3*65536); + DecodeSample<SC::DecodeChain<SC::ConvertShift<int16, int32, 16>, SC::DecodeInt24<0, littleEndian24> > >(truncated16.data(), 65536, 1, source24.data(), 65536 * 3, 1); for(std::size_t i = 0; i < 65536; i++) { @@ -5404,8 +5404,8 @@ sample.nLength = 65536; sample.uFlags.set(CHN_16BIT); sample.pData.pSample = sampleBuf.data(); - CopyAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<bigEndian32> > >(sample, source32.data(), 4*65536); - CopySample<SC::ConversionChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<bigEndian32> > >(truncated16.data(), 65536, 1, source32.data(), 65536 * 4, 1); + DecodeAndNormalizeSample<SC::NormalizationChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<bigEndian32> > >(sample, source32.data(), 4*65536); + DecodeSample<SC::DecodeChain<SC::Convert<int16, somefloat32>, SC::DecodeFloat32<bigEndian32> > >(truncated16.data(), 65536, 1, source32.data(), 65536 * 4, 1); for(std::size_t i = 0; i < 65536; i++) { @@ -5485,7 +5485,7 @@ int8 targetBuf4[4]; int8 *signed8 = targetBuf4; std::memset(signed8, 0, 4); - CopySample<SC::DecodeInt8>(targetBuf4, 4, 1, &oneSample, sizeof(oneSample), 1); + DecodeSample<SC::DecodeInt8>(targetBuf4, 4, 1, &oneSample, sizeof(oneSample), 1); VERIFY_EQUAL_NONCONT(signed8[0], 1); VERIFY_EQUAL_NONCONT(signed8[1], 0); VERIFY_EQUAL_NONCONT(signed8[2], 0); Modified: trunk/OpenMPT/tracklib/SampleEdit.cpp ============================================================================== --- trunk/OpenMPT/tracklib/SampleEdit.cpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/tracklib/SampleEdit.cpp Mon Apr 27 20:51:31 2026 (r25293) @@ -805,7 +805,7 @@ if(!smp.HasSampleData() || smp.GetElementarySampleSize() != 2) return false; - CopySample<SC::ConversionChain<SC::Convert<int8, int16>, SC::DecodeIdentity<int16>>>(static_cast<int8 *>(smp.samplev()), smp.nLength * smp.GetNumChannels(), 1, smp.sample16(), smp.GetSampleSizeInBytes(), 1); + CopySample<SC::Convert<int8, int16>>(static_cast<int8 *>(smp.samplev()), smp.nLength * smp.GetNumChannels(), 1, smp.sample16(), smp.GetSampleSizeInBytes(), 1); smp.uFlags.reset(CHN_16BIT); for(auto &chn : sndFile.m_PlayState.Chn) { @@ -828,7 +828,7 @@ if(newSample == nullptr) return false; - CopySample<SC::ConversionChain<SC::Convert<int16, int8>, SC::DecodeIdentity<int8>>>(newSample, smp.nLength * smp.GetNumChannels(), 1, smp.sample8(), smp.GetSampleSizeInBytes(), 1); + CopySample<SC::Convert<int16, int8>>(newSample, smp.nLength * smp.GetNumChannels(), 1, smp.sample8(), smp.GetSampleSizeInBytes(), 1); smp.uFlags.set(CHN_16BIT); smp.ReplaceWaveform(newSample, smp.nLength, sndFile); smp.PrecomputeLoops(sndFile, false); @@ -1001,10 +1001,10 @@ switch(smp.GetElementarySampleSize()) { case 1: - CopySample<SC::ConversionChain<SC::Convert<double, int8>, SC::DecodeIdentity<int8>>>(convBuffer.data(), smpCount, 1, smp.sample8() + readOffset, smp.GetSampleSizeInBytes(), smp.GetNumChannels()); + CopySample<SC::Convert<double, int8>>(convBuffer.data(), smpCount, 1, smp.sample8() + readOffset, smp.GetSampleSizeInBytes(), smp.GetNumChannels()); break; case 2: - CopySample<SC::ConversionChain<SC::Convert<double, int16>, SC::DecodeIdentity<int16>>>(convBuffer.data(), smpCount, 1, smp.sample16() + readOffset, smp.GetSampleSizeInBytes(), smp.GetNumChannels()); + CopySample<SC::Convert<double, int16>>(convBuffer.data(), smpCount, 1, smp.sample16() + readOffset, smp.GetSampleSizeInBytes(), smp.GetNumChannels()); break; } readOffset += smpCount * numChannels; @@ -1023,10 +1023,10 @@ switch(smp.GetElementarySampleSize()) { case 1: - CopySample<SC::ConversionChain<SC::Convert<int8, double>, SC::DecodeIdentity<double>>>(static_cast<int8 *>(newSample) + writeOffset, procCount, smp.GetNumChannels(), outBuffer + procLatency, procCount * sizeof(double), 1); + CopySample<SC::Convert<int8, double>>(static_cast<int8 *>(newSample) + writeOffset, procCount, smp.GetNumChannels(), outBuffer + procLatency, procCount * sizeof(double), 1); break; case 2: - CopySample<SC::ConversionChain<SC::Convert<int16, double>, SC::DecodeIdentity<double>>>(static_cast<int16 *>(newSample) + writeOffset, procCount, smp.GetNumChannels(), outBuffer + procLatency, procCount * sizeof(double), 1); + CopySample<SC::Convert<int16, double>>(static_cast<int16 *>(newSample) + writeOffset, procCount, smp.GetNumChannels(), outBuffer + procLatency, procCount * sizeof(double), 1); break; } writeOffset += procCount * numChannels; @@ -1062,10 +1062,10 @@ switch(smp.GetElementarySampleSize()) { case 1: - CopySample<SC::ConversionChain<SC::ConvertFixedPoint<int8, mixsample_t, 23>, SC::DecodeIdentity<mixsample_t>>>(static_cast<int8 *>(newSample) + writeOffset + c, procCount, numChannels, buffer + c, sizeof(buffer), 2); + CopySample<SC::ConvertFixedPoint<int8, mixsample_t, 23>>(static_cast<int8 *>(newSample) + writeOffset + c, procCount, numChannels, buffer + c, sizeof(buffer), 2); break; case 2: - CopySample<SC::ConversionChain<SC::ConvertFixedPoint<int16, mixsample_t, 23>, SC::DecodeIdentity<mixsample_t>>>(static_cast<int16 *>(newSample) + writeOffset + c, procCount, numChannels, buffer + c, sizeof(buffer), 2); + CopySample<SC::ConvertFixedPoint<int16, mixsample_t, 23>>(static_cast<int16 *>(newSample) + writeOffset + c, procCount, numChannels, buffer + c, sizeof(buffer), 2); break; } } Modified: trunk/OpenMPT/tracklib/TimeStretchPitchShift.cpp ============================================================================== --- trunk/OpenMPT/tracklib/TimeStretchPitchShift.cpp Mon Apr 27 20:47:13 2026 (r25292) +++ trunk/OpenMPT/tracklib/TimeStretchPitchShift.cpp Mon Apr 27 20:51:31 2026 (r25293) @@ -180,10 +180,10 @@ switch(smpSize) { case 1: - CopySample<SC::ConversionChain<SC::Convert<ProcessingType, int8>, SC::DecodeIdentity<int8>>>(inputBuffers[chn - startChn].data(), processInLen, 1, m_sample.sample8() + inPos + chn, sizeof(int8) * inRemain * numChans, numChans); + CopySample<SC::Convert<ProcessingType, int8>>(inputBuffers[chn - startChn].data(), processInLen, 1, m_sample.sample8() + inPos + chn, sizeof(int8) * inRemain * numChans, numChans); break; case 2: - CopySample<SC::ConversionChain<SC::Convert<ProcessingType, int16>, SC::DecodeIdentity<int16>>>(inputBuffers[chn - startChn].data(), processInLen, 1, m_sample.sample16() + inPos + chn, sizeof(int16) * inRemain * numChans, numChans); + CopySample<SC::Convert<ProcessingType, int16>>(inputBuffers[chn - startChn].data(), processInLen, 1, m_sample.sample16() + inPos + chn, sizeof(int16) * inRemain * numChans, numChans); break; } // If we're at the end of the sample, fill the remaining buffer with silence. @@ -200,10 +200,10 @@ switch(smpSize) { case 1: - CopySample<SC::ConversionChain<SC::Convert<int8, ProcessingType>, SC::DecodeIdentity<ProcessingType>>>(static_cast<int8 *>(newSampleData) + outPos + chn, processOutLen, numChans, outputBuffers[chn - startChn].data() + readOffset, sizeof(ProcessingType) * processOutLen, 1); + CopySample<SC::Convert<int8, ProcessingType>>(static_cast<int8 *>(newSampleData) + outPos + chn, processOutLen, numChans, outputBuffers[chn - startChn].data() + readOffset, sizeof(ProcessingType) * processOutLen, 1); break; case 2: - CopySample<SC::ConversionChain<SC::Convert<int16, ProcessingType>, SC::DecodeIdentity<ProcessingType>>>(static_cast<int16 *>(newSampleData) + outPos + chn, processOutLen, numChans, outputBuffers[chn - startChn].data() + readOffset, sizeof(ProcessingType) * processOutLen, 1); + CopySample<SC::Convert<int16, ProcessingType>>(static_cast<int16 *>(newSampleData) + outPos + chn, processOutLen, numChans, outputBuffers[chn - startChn].data() + readOffset, sizeof(ProcessingType) * processOutLen, 1); break; } } |
|
From: <sv...@op...> - 2026-04-27 18:47:20
|
Author: sagamusix Date: Mon Apr 27 20:47:13 2026 New Revision: 25292 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25292 Log: Merged revision(s) 25291 from trunk/OpenMPT: [Fix] Accessibility: Don't announce empty names (https://bugs.openmpt.org/view.php?id=1968). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/AccessibleControls.h Modified: branches/OpenMPT-1.32/mptrack/AccessibleControls.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/AccessibleControls.h Mon Apr 27 20:46:42 2026 (r25291) +++ branches/OpenMPT-1.32/mptrack/AccessibleControls.h Mon Apr 27 20:47:13 2026 (r25292) @@ -23,7 +23,7 @@ HRESULT get_accName(VARIANT varChild, BSTR *pszName) override { - if(varChild.lVal == CHILDID_SELF) + if(varChild.lVal == CHILDID_SELF && !m_text.IsEmpty()) { *pszName = m_text.AllocSysString(); return S_OK; @@ -46,7 +46,7 @@ HRESULT get_accName(VARIANT varChild, BSTR *pszName) override { - if(varChild.lVal == CHILDID_SELF) + if(varChild.lVal == CHILDID_SELF && !m_name.IsEmpty()) { *pszName = m_name.AllocSysString(); return S_OK; @@ -88,7 +88,7 @@ HRESULT get_accName(VARIANT varChild, BSTR *pszName) override { - if(varChild.lVal == CHILDID_SELF) + if(varChild.lVal == CHILDID_SELF && !m_name.IsEmpty()) { *pszName = m_name.AllocSysString(); return S_OK; |
|
From: <sv...@op...> - 2026-04-27 18:46:55
|
Author: sagamusix Date: Mon Apr 27 20:46:42 2026 New Revision: 25291 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25291 Log: [Fix] Accessibility: Don't announce empty names (https://bugs.openmpt.org/view.php?id=1968). Modified: trunk/OpenMPT/mptrack/AccessibleControls.h Modified: trunk/OpenMPT/mptrack/AccessibleControls.h ============================================================================== --- trunk/OpenMPT/mptrack/AccessibleControls.h Mon Apr 27 20:39:55 2026 (r25290) +++ trunk/OpenMPT/mptrack/AccessibleControls.h Mon Apr 27 20:46:42 2026 (r25291) @@ -23,7 +23,7 @@ HRESULT get_accName(VARIANT varChild, BSTR *pszName) override { - if(varChild.lVal == CHILDID_SELF) + if(varChild.lVal == CHILDID_SELF && !m_text.IsEmpty()) { *pszName = m_text.AllocSysString(); return S_OK; @@ -46,7 +46,7 @@ HRESULT get_accName(VARIANT varChild, BSTR *pszName) override { - if(varChild.lVal == CHILDID_SELF) + if(varChild.lVal == CHILDID_SELF && !m_name.IsEmpty()) { *pszName = m_name.AllocSysString(); return S_OK; @@ -88,7 +88,7 @@ HRESULT get_accName(VARIANT varChild, BSTR *pszName) override { - if(varChild.lVal == CHILDID_SELF) + if(varChild.lVal == CHILDID_SELF && !m_name.IsEmpty()) { *pszName = m_name.AllocSysString(); return S_OK; |
|
From: <sv...@op...> - 2026-04-27 18:40:02
|
Author: manx Date: Mon Apr 27 20:39:55 2026 New Revision: 25290 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25290 Log: [Ref] openmpt/soundbase/SampleConvert.hpp: Remove unused Convert<mpt::endian>. Modified: trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp Modified: trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp ============================================================================== --- trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp Mon Apr 27 20:34:00 2026 (r25289) +++ trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp Mon Apr 27 20:39:55 2026 (r25290) @@ -11,7 +11,6 @@ #include "mpt/base/math.hpp" #include "mpt/base/saturate_cast.hpp" #include "mpt/base/saturate_round.hpp" -#include "openmpt/base/Endian.hpp" #include "openmpt/base/Int24.hpp" #include "openmpt/base/Types.hpp" @@ -98,19 +97,6 @@ } }; -template <typename Tid, mpt::endian endian> -struct Convert<mpt::packed<Tid, endian>, Tid> -{ - using input_t = Tid; - using output_t = mpt::packed<Tid, endian>; - MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE output_t operator()(input_t val) - { - output_t out; - out = val; - return out; - } -}; - template <> struct Convert<uint8, int8> { |
|
From: <sv...@op...> - 2026-04-27 18:34:12
|
Author: manx Date: Mon Apr 27 20:34:00 2026 New Revision: 25289 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25289 Log: [Fix] Sample Tab: Avoid Undefined Behaviour by using EncodeSample(). Modified: trunk/OpenMPT/mptrack/View_smp.cpp Modified: trunk/OpenMPT/mptrack/View_smp.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp Mon Apr 27 20:26:55 2026 (r25288) +++ trunk/OpenMPT/mptrack/View_smp.cpp Mon Apr 27 20:34:00 2026 (r25289) @@ -2803,16 +2803,16 @@ // Write sample data file.StartChunk(RIFFChunk::iddata); - void *sampleData = data.data() + ff.TellWrite(); + std::byte *sampleData = data.data() + ff.TellWrite(); const uint8 selectedChn = SampleEdit::SelectedChannel(channelSel); const uint8 srcChannels = sample.GetNumChannels(); switch(sample.GetElementarySampleSize()) { case 1: - CopySample<SC::ConversionChain<SC::Convert<uint8, int8>, SC::DecodeIdentity<int8>>>(static_cast<uint8 *>(sampleData), rangeLength * (singleChannel ? 1 : srcChannels), 1, sample.sample8() + rangeStart * srcChannels + selectedChn, rangeLength * sample.GetBytesPerSample(), singleChannel ? srcChannels : 1); + EncodeSample<SC::EncodeChain<SC::EncodeEndian<mpt::endian::little, uint8>, SC::Convert<uint8, int8>>>(sampleData, rangeLength * (singleChannel ? 1 : srcChannels), 1, sample.sample8() + rangeStart * srcChannels + selectedChn, rangeLength * sample.GetBytesPerSample(), singleChannel ? srcChannels : 1); break; case 2: - CopySample<SC::ConversionChain<SC::Convert<int16le, int16>, SC::DecodeIdentity<int16>>>(static_cast<int16le *>(sampleData), rangeLength * (singleChannel ? 1 : srcChannels), 1, sample.sample16() + rangeStart * srcChannels + selectedChn, rangeLength * sample.GetBytesPerSample(), singleChannel ? srcChannels : 1); + EncodeSample<SC::EncodeEndian<mpt::endian::little, int16>>(sampleData, rangeLength * (singleChannel ? 1 : srcChannels), 1, sample.sample16() + rangeStart * srcChannels + selectedChn, rangeLength * sample.GetBytesPerSample(), singleChannel ? srcChannels : 1); break; } ff.SeekRelative(sampleDataSize); |
|
From: <sv...@op...> - 2026-04-27 18:27:02
|
Author: manx Date: Mon Apr 27 20:26:55 2026 New Revision: 25288 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25288 Log: [Ref] openmpt/soundbase/SampleEncode.hpp: Add EncodeChain. [Ref] Sample Copy: Add EncodeSample(). Modified: trunk/OpenMPT/soundlib/SampleCopy.h trunk/OpenMPT/src/openmpt/soundbase/SampleEncode.hpp trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.cpp trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/soundlib/SampleCopy.h ============================================================================== --- trunk/OpenMPT/soundlib/SampleCopy.h Mon Apr 27 20:15:46 2026 (r25287) +++ trunk/OpenMPT/soundlib/SampleCopy.h Mon Apr 27 20:26:55 2026 (r25288) @@ -14,6 +14,13 @@ #include "openmpt/soundbase/SampleConvert.hpp" #include "openmpt/soundbase/SampleDecode.hpp" +#include "openmpt/soundbase/SampleEncode.hpp" + +#include "mpt/base/bit.hpp" +#include "mpt/base/memory.hpp" + +#include <algorithm> +#include <array> #include <cstddef> @@ -49,6 +56,27 @@ return copySize; } + +template <typename SampleConversion> +std::size_t EncodeSample(typename SampleConversion::encoded_t *MPT_RESTRICT outBuf, std::size_t numSamples, std::size_t incTarget, const typename SampleConversion::input_t *MPT_RESTRICT inBuf, std::size_t sourceSize, std::size_t incSource, SampleConversion conv = SampleConversion()) +{ + const std::size_t sampleSize = incSource * sizeof(typename SampleConversion::input_t); + LimitMax(numSamples, sourceSize / sampleSize); + const std::size_t copySize = numSamples * sampleSize; + static_assert(mpt::is_binary_safe<typename SampleConversion::output_t>::value); + static_assert((sizeof(typename SampleConversion::output_t) % sizeof(typename SampleConversion::encoded_t)) == 0); + using Tbuf = std::array<typename SampleConversion::encoded_t, sizeof(typename SampleConversion::output_t) / sizeof(typename SampleConversion::encoded_t)>; + SampleConversion sampleConv(conv); + while(numSamples--) + { + Tbuf buf = mpt::bit_cast<Tbuf>(sampleConv(*inBuf)); + std::copy(buf.data(), buf.data() + buf.size(), outBuf); + outBuf += incTarget * SampleConversion::encoded_inc; + inBuf += incSource; + } + return copySize; +} + // SampleConversion template parameter shortcuts for pure copying of native sample data namespace SC Modified: trunk/OpenMPT/src/openmpt/soundbase/SampleEncode.hpp ============================================================================== --- trunk/OpenMPT/src/openmpt/soundbase/SampleEncode.hpp Mon Apr 27 20:15:46 2026 (r25287) +++ trunk/OpenMPT/src/openmpt/soundbase/SampleEncode.hpp Mon Apr 27 20:26:55 2026 (r25288) @@ -9,6 +9,7 @@ #include "mpt/base/bit.hpp" #include "mpt/base/macros.hpp" #include "mpt/base/memory.hpp" +#include "openmpt/base/Endian.hpp" #include "openmpt/base/Types.hpp" #include <algorithm> @@ -28,7 +29,9 @@ struct EncodeuLaw { using input_t = int16; - using output_t = std::byte; + using output_t = uint8; + using encoded_t = std::byte; + static constexpr std::size_t encoded_inc = 1; static constexpr uint8 exp_table[17] = {0, 7 << 4, 6 << 4, 5 << 4, 4 << 4, 3 << 4, 2 << 4, 1 << 4, 0 << 4, 0, 0, 0, 0, 0, 0, 0, 0}; static constexpr uint8 mant_table[17] = {0, 10, 9, 8, 7, 6, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3}; MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE output_t operator()(input_t val) @@ -46,7 +49,7 @@ out |= exp_table[index]; out |= (x >> mant_table[index]) & 0x0fu; out ^= 0xffu; - return mpt::byte_cast<std::byte>(out); + return out; } }; @@ -54,7 +57,9 @@ struct EncodeALaw { using input_t = int16; - using output_t = std::byte; + using output_t = uint8; + using encoded_t = std::byte; + static constexpr std::size_t encoded_inc = 1; static constexpr uint8 exp_table[17] = {0, 7 << 4, 6 << 4, 5 << 4, 4 << 4, 3 << 4, 2 << 4, 1 << 4, 0 << 4, 0, 0, 0, 0, 0, 0, 0, 0}; static constexpr uint8 mant_table[17] = {0, 10, 9, 8, 7, 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}; MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE output_t operator()(input_t val) @@ -67,11 +72,50 @@ out |= exp_table[index]; out |= (x >> mant_table[index]) & 0x0fu; out ^= 0x55u; - return mpt::byte_cast<std::byte>(out); + return out; } }; +template <mpt::endian endian, typename Tsample> +struct EncodeEndian +{ + using input_t = Tsample; + using output_t = mpt::packed<Tsample, endian>; + using encoded_t = std::byte; + static constexpr std::size_t encoded_inc = sizeof(output_t); + MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE output_t operator()(input_t val) + { + output_t out; + out = val; + return out; + } +}; + + +template <typename Func2, typename Func1> +struct EncodeChain +{ + using input_t = typename Func1::input_t; + using output_t = typename Func2::output_t; + using encoded_t = typename Func2::encoded_t; + static constexpr std::size_t encoded_inc = Func2::encoded_inc; + Func1 func1; + Func2 func2; + MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE output_t operator()(input_t in) + { + return func2(func1(in)); + } + MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE EncodeChain(Func2 f2 = Func2(), Func1 f1 = Func1()) + : func1(f1) + , func2(f2) + { + return; + } +}; + + + } // namespace SC Modified: trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.cpp ============================================================================== --- trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.cpp Mon Apr 27 20:15:46 2026 (r25287) +++ trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.cpp Mon Apr 27 20:26:55 2026 (r25288) @@ -79,7 +79,7 @@ { for(uint16 channel = 0; channel < channels; ++channel) { - std::byte sampledata = conv(interleaved[channel]); + std::byte sampledata = mpt::byte_cast<std::byte>(conv(interleaved[channel])); mpt::IO::WriteRaw(bf, &sampledata, 1); written += 1; } @@ -95,7 +95,7 @@ { for(uint16 channel = 0; channel < channels; ++channel) { - std::byte sampledata = conv(interleaved[channel]); + std::byte sampledata = mpt::byte_cast<std::byte>(conv(interleaved[channel])); mpt::IO::WriteRaw(bf, &sampledata, 1); written += 1; } Modified: trunk/OpenMPT/test/test.cpp ============================================================================== --- trunk/OpenMPT/test/test.cpp Mon Apr 27 20:15:46 2026 (r25287) +++ trunk/OpenMPT/test/test.cpp Mon Apr 27 20:26:55 2026 (r25288) @@ -5419,7 +5419,7 @@ for(unsigned int i = 0; i < 256; ++i) { std::byte in = mpt::byte_cast<std::byte>(static_cast<uint8>(i)); - std::byte out = SC::EncodeALaw{}(SC::DecodeInt16ALaw{}(&in)); + std::byte out = mpt::byte_cast<std::byte>(SC::EncodeALaw{}(SC::DecodeInt16ALaw{}(&in))); VERIFY_EQUAL_NONCONT(in, out); } VERIFY_EQUAL_NONCONT(SC::EncodeALaw{}(-32768), SC::EncodeALaw{}(-32256)); @@ -5443,7 +5443,7 @@ for(unsigned int i = 0; i < 256; ++i) { std::byte in = mpt::byte_cast<std::byte>(static_cast<uint8>(i)); - std::byte out = SC::EncodeuLaw{}(SC::DecodeInt16uLaw{}(&in)); + std::byte out = mpt::byte_cast<std::byte>(SC::EncodeuLaw{}(SC::DecodeInt16uLaw{}(&in))); VERIFY_EQUAL_NONCONT(in, out); } #if 0 |
|
From: <sv...@op...> - 2026-04-27 18:15:58
|
Author: manx Date: Mon Apr 27 20:15:46 2026 New Revision: 25287 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25287 Log: [Ref] Use std::size_t. Modified: trunk/OpenMPT/soundlib/SampleCopy.h Modified: trunk/OpenMPT/soundlib/SampleCopy.h ============================================================================== --- trunk/OpenMPT/soundlib/SampleCopy.h Mon Apr 27 19:51:25 2026 (r25286) +++ trunk/OpenMPT/soundlib/SampleCopy.h Mon Apr 27 20:15:46 2026 (r25287) @@ -15,6 +15,8 @@ #include "openmpt/soundbase/SampleConvert.hpp" #include "openmpt/soundbase/SampleDecode.hpp" +#include <cstddef> + OPENMPT_NAMESPACE_BEGIN @@ -30,11 +32,11 @@ // Template arguments: // SampleConversion: Functor of type SampleConversionFunctor to apply sample conversion (see above for existing functors). template <typename SampleConversion> -size_t CopySample(typename SampleConversion::output_t *MPT_RESTRICT outBuf, size_t numSamples, size_t incTarget, const typename SampleConversion::input_t *MPT_RESTRICT inBuf, size_t sourceSize, size_t incSource, SampleConversion conv = SampleConversion()) +std::size_t CopySample(typename SampleConversion::output_t *MPT_RESTRICT outBuf, std::size_t numSamples, std::size_t incTarget, const typename SampleConversion::input_t *MPT_RESTRICT inBuf, std::size_t sourceSize, std::size_t incSource, SampleConversion conv = SampleConversion()) { - const size_t sampleSize = incSource * SampleConversion::input_inc * sizeof(typename SampleConversion::input_t); + const std::size_t sampleSize = incSource * SampleConversion::input_inc * sizeof(typename SampleConversion::input_t); LimitMax(numSamples, sourceSize / sampleSize); - const size_t copySize = numSamples * sampleSize; + const std::size_t copySize = numSamples * sampleSize; SampleConversion sampleConv(conv); while(numSamples--) |
|
From: <sv...@op...> - 2026-04-27 17:51:38
|
Author: sagamusix Date: Mon Apr 27 19:51:25 2026 New Revision: 25286 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25286 Log: [Imp] Sample tab: Allow previewing a single-channel sample selection. Modified: trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/View_smp.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp Sun Apr 26 23:07:30 2026 (r25285) +++ trunk/OpenMPT/mptrack/Moddoc.cpp Mon Apr 27 19:51:25 2026 (r25286) @@ -1117,6 +1117,8 @@ m_SndFile.NoteChange(chn, note, false, true, true, channel); if(params.m_volume >= 0) chn.nVolume = std::min(params.m_volume, 256); + if(params.m_panning >= 0) + chn.nPan = std::min(params.m_panning, 256); chn.nnaChannelAge = 0; // Handle sample looping. Modified: trunk/OpenMPT/mptrack/Moddoc.h ============================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h Sun Apr 26 23:07:30 2026 (r25285) +++ trunk/OpenMPT/mptrack/Moddoc.h Mon Apr 27 19:51:25 2026 (r25286) @@ -85,6 +85,7 @@ std::bitset<128> *m_notesPlaying = nullptr; SmpLength m_loopStart = 0, m_loopEnd = 0, m_sampleOffset = 0; int32 m_volume = -1; + int32 m_panning = -1; SAMPLEINDEX m_sample = 0; INSTRUMENTINDEX m_instr = 0; CHANNELINDEX m_currentChannel = CHANNELINDEX_INVALID; @@ -97,6 +98,7 @@ PlayNoteParam& Offset(SmpLength sampleOffset) { m_sampleOffset = sampleOffset; return *this; } PlayNoteParam& Volume(int32 volume) { m_volume = volume; return *this; } + PlayNoteParam& Panning(int32 panning) { m_panning= panning; return *this; } PlayNoteParam& Sample(SAMPLEINDEX sample) { m_sample = sample; return *this; } PlayNoteParam& Instrument(INSTRUMENTINDEX instr) { m_instr = instr; return *this; } PlayNoteParam& Channel(CHANNELINDEX channel) { m_currentChannel = channel; return *this; } Modified: trunk/OpenMPT/mptrack/View_smp.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp Sun Apr 26 23:07:30 2026 (r25285) +++ trunk/OpenMPT/mptrack/View_smp.cpp Mon Apr 27 19:51:25 2026 (r25286) @@ -3348,7 +3348,10 @@ loopend = loopstart = 0; } - pModDoc->PlayNote(PlayNoteParam(note).Sample(m_nSample).Volume(volume).LoopStart(loopstart).LoopEnd(loopend).Offset(nStartPos), &m_noteChannel); + PlayNoteParam params = PlayNoteParam(note).Sample(m_nSample).Volume(volume).LoopStart(loopstart).LoopEnd(loopend).Offset(nStartPos); + if(loopend > loopstart && SampleEdit::IsSingleChannel(sample, m_channelSelection)) + params.Panning(SampleEdit::SelectedChannel(m_channelSelection) * 256); + pModDoc->PlayNote(params, &m_noteChannel); m_dwStatus.set(SMPSTATUS_KEYDOWN); |
|
From: <sv...@op...> - 2026-04-26 21:07:42
|
Author: sagamusix Date: Sun Apr 26 23:07:30 2026 New Revision: 25285 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25285 Log: Merged revision(s) 25277 from trunk/OpenMPT: [Imp] Export dialogs: Add accessible labels to various edit boxes. [Fix] Export dialogs: For an empty sequence, a bogus end order was shown. ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/Mod2wave.cpp branches/OpenMPT-1.32/mptrack/Moddoc.cpp branches/OpenMPT-1.32/mptrack/OPLExport.cpp branches/OpenMPT-1.32/mptrack/mod2midi.cpp branches/OpenMPT-1.32/mptrack/mod2midi.h branches/OpenMPT-1.32/mptrack/mod2wave.h Modified: branches/OpenMPT-1.32/mptrack/Mod2wave.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/Mod2wave.cpp Sun Apr 26 23:06:31 2026 (r25284) +++ branches/OpenMPT-1.32/mptrack/Mod2wave.cpp Sun Apr 26 23:07:30 2026 (r25285) @@ -111,6 +111,10 @@ DDX_Control(pDX, IDC_SPIN6, m_SpinSubsongIndex); DDX_Control(pDX, IDC_COMBO9, m_CbnSampleSlot); + DDX_Control(pDX, IDC_EDIT3, m_EditMinOrder); + DDX_Control(pDX, IDC_EDIT5, m_EditLoopCount); + DDX_Control(pDX, IDC_EDIT12, m_EditSubSong); + DDX_Control(pDX, IDC_COMBO3, m_CbnGenre); DDX_Control(pDX, IDC_EDIT10, m_EditGenre); DDX_Control(pDX, IDC_EDIT11, m_EditTitle); @@ -140,13 +144,17 @@ SetDlgItemInt(IDC_EDIT3, m_Settings.minOrder); SetDlgItemInt(IDC_EDIT4, m_Settings.maxOrder); } + m_EditMinOrder.SetAccessibleName(_T("From position")); m_SpinMinOrder.SetRange32(0, m_nNumOrders); m_SpinMaxOrder.SetRange32(0, m_nNumOrders); SetDlgItemInt(IDC_EDIT5, m_Settings.repeatCount, FALSE); m_SpinLoopCount.SetRange32(1, int16_max); + m_EditLoopCount.SetAccessibleName(_T("Repeat")); + m_EditLoopCount.SetAccessibleSuffix(_T("times")); m_SpinSubsongIndex.SetRange32(1, static_cast<int>(m_subSongs.size())); + m_EditSubSong.SetAccessibleName(_T("Sub Song")); SetDlgItemInt(IDC_EDIT12, static_cast<UINT>(m_selectedSong + 1), FALSE); if(m_subSongs.size() <= 1) { Modified: branches/OpenMPT-1.32/mptrack/Moddoc.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/Moddoc.cpp Sun Apr 26 23:06:31 2026 (r25284) +++ branches/OpenMPT-1.32/mptrack/Moddoc.cpp Sun Apr 26 23:07:30 2026 (r25285) @@ -3092,7 +3092,7 @@ sequenceName.empty() ? mpt::tstring{} : MPT_TFORMAT(" ({})")(sequenceName), subsongInSequence, song.startOrder, - song.endOrder, + song.endOrder == ORDERINDEX_INVALID ? song.startOrder : song.endOrder, orderName.empty() ? mpt::tstring{} : MPT_TFORMAT(" ({})")(mpt::ToWin(m_SndFile.GetCharsetInternal(), orderName))); } Modified: branches/OpenMPT-1.32/mptrack/OPLExport.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/OPLExport.cpp Sun Apr 26 23:06:31 2026 (r25284) +++ branches/OpenMPT-1.32/mptrack/OPLExport.cpp Sun Apr 26 23:07:30 2026 (r25285) @@ -9,6 +9,7 @@ #include "stdafx.h" +#include "AccessibleControls.h" #include "FileDialog.h" #include "InputHandler.h" #include "Mainfrm.h" @@ -345,6 +346,8 @@ static ExportFormat s_format; + AccessibleEdit m_EditSubSong; + OPLCapture m_oplLogger; CSoundFile &m_sndFile; CModDoc &m_modDoc; @@ -373,6 +376,8 @@ CheckRadioButton(IDC_RADIO4, IDC_RADIO5, m_subSongs.size() <= 1 ? IDC_RADIO4 : IDC_RADIO5); static_cast<CSpinButtonCtrl *>(GetDlgItem(IDC_SPIN1))->SetRange32(1, static_cast<int>(m_subSongs.size())); + m_EditSubSong.SubclassDlgItem(IDC_EDIT1, this); + m_EditSubSong.SetAccessibleName(_T("Sub Song")); SetDlgItemInt(IDC_EDIT1, static_cast<UINT>(m_selectedSong + 1), FALSE); if(m_subSongs.size() <= 1) { Modified: branches/OpenMPT-1.32/mptrack/mod2midi.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/mod2midi.cpp Sun Apr 26 23:06:31 2026 (r25284) +++ branches/OpenMPT-1.32/mptrack/mod2midi.cpp Sun Apr 26 23:07:30 2026 (r25285) @@ -644,10 +644,11 @@ void CModToMidi::DoDataExchange(CDataExchange *pDX) { DialogBase::DoDataExchange(pDX); - DDX_Control(pDX, IDC_COMBO1, m_CbnInstrument); - DDX_Control(pDX, IDC_COMBO2, m_CbnChannel); - DDX_Control(pDX, IDC_COMBO3, m_CbnProgram); - DDX_Control(pDX, IDC_SPIN1, m_SpinInstrument); + DDX_Control(pDX, IDC_COMBO1, m_CbnInstrument); + DDX_Control(pDX, IDC_COMBO2, m_CbnChannel); + DDX_Control(pDX, IDC_COMBO3, m_CbnProgram); + DDX_Control(pDX, IDC_SPIN1, m_SpinInstrument); + DDX_Control(pDX, IDC_EDIT1, m_EditSubSong); } @@ -743,6 +744,7 @@ static_cast<CSpinButtonCtrl *>(GetDlgItem(IDC_SPIN2))->SetRange32(1, static_cast<int>(m_subSongs.size())); SetDlgItemInt(IDC_EDIT1, static_cast<UINT>(m_selectedSong + 1), FALSE); + m_EditSubSong.SetAccessibleName(_T("Sub Song")); if(m_subSongs.size() <= 1) { const int controls[] = {IDC_RADIO4, IDC_RADIO5, IDC_EDIT1, IDC_SPIN2}; Modified: branches/OpenMPT-1.32/mptrack/mod2midi.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/mod2midi.h Sun Apr 26 23:06:31 2026 (r25284) +++ branches/OpenMPT-1.32/mptrack/mod2midi.h Sun Apr 26 23:07:30 2026 (r25285) @@ -13,6 +13,7 @@ #include "openmpt/all/BuildSettings.hpp" #ifndef NO_PLUGINS +#include "AccessibleControls.h" #include "DialogBase.h" #include "ProgressDialog.h" #include "../soundlib/Snd_defs.h" @@ -37,6 +38,7 @@ { protected: CComboBox m_CbnInstrument, m_CbnChannel, m_CbnProgram; + AccessibleEdit m_EditSubSong; CSpinButtonCtrl m_SpinInstrument; CModDoc &m_modDoc; MidiExport::InstrMap m_instrMap; Modified: branches/OpenMPT-1.32/mptrack/mod2wave.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/mod2wave.h Sun Apr 26 23:06:31 2026 (r25284) +++ branches/OpenMPT-1.32/mptrack/mod2wave.h Sun Apr 26 23:07:30 2026 (r25285) @@ -12,6 +12,7 @@ #include "openmpt/all/BuildSettings.hpp" +#include "AccessibleControls.h" #include "DialogBase.h" #include "ProgressDialog.h" #include "Settings.h" @@ -73,6 +74,7 @@ CComboBox m_CbnFileType, m_CbnSampleRate, m_CbnChannels, m_CbnDither, m_CbnSampleFormat, m_CbnSampleSlot; CSpinButtonCtrl m_SpinLoopCount, m_SpinMinOrder, m_SpinMaxOrder, m_SpinSubsongIndex; + AccessibleEdit m_EditLoopCount, m_EditSubSong, m_EditMinOrder; CEdit m_EditTitle, m_EditAuthor, m_EditURL, m_EditAlbum, m_EditYear; CComboBox m_CbnGenre; CEdit m_EditGenre; |
|
From: <sv...@op...> - 2026-04-26 21:06:38
|
Author: sagamusix Date: Sun Apr 26 23:06:31 2026 New Revision: 25284 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25284 Log: Merged revision(s) 25275 from trunk/OpenMPT: [Imp] More accessibility improvements for sample grid configuration, and add similar improvements to the Add Silence dialog (https://bugs.openmpt.org/view.php?id=1968). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/AccessibleControls.h branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.h Modified: branches/OpenMPT-1.32/mptrack/AccessibleControls.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/AccessibleControls.h Sun Apr 26 23:00:37 2026 (r25283) +++ branches/OpenMPT-1.32/mptrack/AccessibleControls.h Sun Apr 26 23:06:31 2026 (r25284) @@ -41,8 +41,19 @@ public: AccessibleEdit() { EnableActiveAccessibility(); } + void SetAccessibleName(const TCHAR *name) { m_name = name; } void SetAccessibleSuffix(const TCHAR *suffix) { m_suffix = suffix; } + HRESULT get_accName(VARIANT varChild, BSTR *pszName) override + { + if(varChild.lVal == CHILDID_SELF) + { + *pszName = m_name.AllocSysString(); + return S_OK; + } + return CEdit::get_accName(varChild, pszName); + } + HRESULT get_accValue(VARIANT varChild, BSTR *pszName) override { if(varChild.lVal == CHILDID_SELF) @@ -55,9 +66,39 @@ return CEdit::get_accValue(varChild, pszName); } + HRESULT get_accDescription(VARIANT varChild, BSTR *pszName) override + { + if(varChild.lVal == CHILDID_SELF) + return get_accValue(varChild, pszName); + return CEdit::get_accDescription(varChild, pszName); + } + private: + CString m_name; CString m_suffix; }; +class AccessibleComboBox : public CComboBox +{ +public: + AccessibleComboBox() { EnableActiveAccessibility(); } + + void SetAccessibleName(const TCHAR *name) { m_name = name; } + + HRESULT get_accName(VARIANT varChild, BSTR *pszName) override + { + if(varChild.lVal == CHILDID_SELF) + { + *pszName = m_name.AllocSysString(); + return S_OK; + } + return CComboBox::get_accName(varChild, pszName); + } + +private: + CString m_name; +}; + + OPENMPT_NAMESPACE_END Modified: branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp Sun Apr 26 23:00:37 2026 (r25283) +++ branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp Sun Apr 26 23:06:31 2026 (r25284) @@ -468,6 +468,15 @@ SmpLength AddSilenceDlg::m_addSamples = 32; SmpLength AddSilenceDlg::m_createSamples = 64; +void AddSilenceDlg::DoDataExchange(CDataExchange *pDX) +{ + DialogBase::DoDataExchange(pDX); + //{{AFX_DATA_MAP(AddSilenceDlg) + DDX_Control(pDX, IDC_COMBO1, m_ComboUnit); + //}}AFX_DATA_MAP +} + + AddSilenceDlg::AddSilenceDlg(CWnd *parent, SmpLength origLength, uint32 sampleRate, bool allowOPL) : DialogBase(IDD_ADDSILENCE, parent) , m_numSamples(m_addSamples) @@ -497,17 +506,14 @@ spin->SetPos32(m_numSamples); } - CComboBox *box = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO1)); - if(box) + m_ComboUnit.SetAccessibleName(_T("Length unit")); + m_ComboUnit.AddString(_T("samples")); + m_ComboUnit.AddString(_T("ms")); + m_ComboUnit.SetCurSel(m_unit); + if(m_sampleRate == 0) { - box->AddString(_T("samples")); - box->AddString(_T("ms")); - box->SetCurSel(m_unit); - if(m_sampleRate == 0) - { - // Can't do any conversions if samplerate is unknown - box->EnableWindow(FALSE); - } + // Can't do any conversions if samplerate is unknown + m_ComboUnit.EnableWindow(FALSE); } int buttonID = IDC_RADIO_ADDSILENCE_END; @@ -523,6 +529,7 @@ m_EditAmount.SubclassDlgItem(IDC_EDIT_ADDSILENCE, this); m_EditAmount.AllowNegative(false); m_EditAmount.AllowFractions(m_unit == kMilliseconds); + m_EditAmount.SetAccessibleSuffix((m_unit == kSamples) ? _T("samples") : _T("ms")); SetDlgItemInt(IDC_EDIT_ADDSILENCE, (m_editOption == kResize) ? m_length : m_numSamples, FALSE); GetDlgItem(IDC_RADIO1)->EnableWindow(m_allowOPL ? TRUE : FALSE); @@ -590,11 +597,12 @@ void AddSilenceDlg::OnUnitChanged() { - const auto unit = static_cast<Unit>(static_cast<CComboBox*>(GetDlgItem(IDC_COMBO1))->GetCurSel()); + const auto unit = static_cast<Unit>(m_ComboUnit.GetCurSel()); if(m_unit == unit) return; m_EditAmount.AllowFractions(unit == kMilliseconds); + m_EditAmount.SetAccessibleSuffix((m_unit == kSamples) ? _T("samples") : _T("ms")); m_unit = unit; if(unit == kSamples) { Modified: branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.h Sun Apr 26 23:00:37 2026 (r25283) +++ branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.h Sun Apr 26 23:06:31 2026 (r25284) @@ -128,6 +128,7 @@ AddSilenceOptions m_editOption; // See above protected: + AccessibleComboBox m_ComboUnit; CNumberEdit m_EditAmount; static SmpLength m_addSamples; static SmpLength m_createSamples; @@ -138,6 +139,7 @@ public: AddSilenceDlg(CWnd *parent, SmpLength origLength, uint32 sampleRate, bool allowOPL); + void DoDataExchange(CDataExchange *pDX) override; BOOL OnInitDialog() override; void OnOK() override; |
|
From: <sv...@op...> - 2026-04-26 21:00:45
|
Author: sagamusix Date: Sun Apr 26 23:00:37 2026 New Revision: 25283 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25283 Log: [Fix] Fix compilation. Modified: branches/OpenMPT-1.32/mptrack/View_smp.cpp Modified: branches/OpenMPT-1.32/mptrack/View_smp.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/View_smp.cpp Sun Apr 26 22:59:40 2026 (r25282) +++ branches/OpenMPT-1.32/mptrack/View_smp.cpp Sun Apr 26 23:00:37 2026 (r25283) @@ -1171,7 +1171,7 @@ rect.top = timelineHeight; if((rcClient.bottom > rcClient.top) && (rcClient.right > rcClient.left)) { - const int ymed = mpt::midpoint(rect.top, rect.bottom); + const int ymed = (rect.top + rect.bottom) / 2; const int yrange = (rect.Height()) / 2; // Erase background |
|
From: <sv...@op...> - 2026-04-26 20:59:52
|
Author: sagamusix Date: Sun Apr 26 22:59:40 2026 New Revision: 25282 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25282 Log: Merged revision(s) 25264 from trunk/OpenMPT: [Fix] Sample tab: Waiting cursor was not removed if converting to mono failed because there was no sample slot left for splitting. [Ref] Cleanup. ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/View_smp.cpp Modified: branches/OpenMPT-1.32/mptrack/View_smp.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/View_smp.cpp Sun Apr 26 22:58:49 2026 (r25281) +++ branches/OpenMPT-1.32/mptrack/View_smp.cpp Sun Apr 26 22:59:40 2026 (r25282) @@ -922,7 +922,7 @@ //posincr = Util::muldiv(len, 0x10000, cx); posincr = uint64(len) * uint64(0x10000) / uint64(cx); } - ::MoveToEx(hdc, 0, ymed, NULL); + ::MoveToEx(hdc, 0, ymed, nullptr); posfrac = 0; poshi = 0; for (int x=0; x<xmax; x++) @@ -1171,8 +1171,8 @@ rect.top = timelineHeight; if((rcClient.bottom > rcClient.top) && (rcClient.right > rcClient.left)) { - const int ymed = (rect.top + rect.bottom) / 2; - const int yrange = (rect.bottom - rect.top) / 2; + const int ymed = mpt::midpoint(rect.top, rect.bottom); + const int yrange = (rect.Height()) / 2; // Erase background if ((m_dwBeginSel < m_dwEndSel) && (m_dwEndSel > smpScrollPos)) @@ -1699,7 +1699,7 @@ m_drawChannel = (point.y - m_timelineHeight) * smp.GetNumChannels() / (m_rcClient.Height() - m_timelineHeight); else m_drawChannel = 0; - Limit(m_drawChannel, 0, (int)smp.GetNumChannels() - 1); + Limit(m_drawChannel, 0, static_cast<int>(smp.GetNumChannels() - 1)); T *data = static_cast<T *>(smp.samplev()) + m_drawChannel; data[m_dwEndDrag * smp.GetNumChannels()] = GetSampleValueFromPoint<T>(smp, point); @@ -2931,69 +2931,76 @@ void CViewSample::OnMonoConvert(ctrlSmp::StereoToMonoMode convert) { CModDoc *pModDoc = GetDocument(); + if(pModDoc == nullptr || m_nSample > pModDoc->GetNumSamples()) + return; + + CSoundFile &sndFile = pModDoc->GetSoundFile(); + ModSample &sample = sndFile.GetSample(m_nSample); + if(sample.uFlags[CHN_ADLIB] || !sample.HasSampleData()) + return; + BeginWaitCursor(); - if(pModDoc != nullptr && (m_nSample <= pModDoc->GetNumSamples())) + bool success = false; + if(sample.GetNumChannels() > 1) { - CSoundFile &sndFile = pModDoc->GetSoundFile(); - ModSample &sample = sndFile.GetSample(m_nSample); - if(sample.GetNumChannels() > 1 && sample.HasSampleData() && !sample.uFlags[CHN_ADLIB]) + SAMPLEINDEX rightSmp = SAMPLEINDEX_INVALID; + if(convert == ctrlSmp::splitSample) { - SAMPLEINDEX rightSmp = SAMPLEINDEX_INVALID; - if(convert == ctrlSmp::splitSample) + // Split sample into two slots + rightSmp = pModDoc->InsertSample(); + if(rightSmp == SAMPLEINDEX_INVALID) { - // Split sample into two slots - rightSmp = pModDoc->InsertSample(); - if(rightSmp == SAMPLEINDEX_INVALID) - return; + EndWaitCursor(); + return; } + } - pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace, "Mono Conversion"); + pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace, "Mono Conversion"); - bool success = false; - if(convert == ctrlSmp::splitSample) - { - ModSample &right = sndFile.GetSample(rightSmp); - success = ctrlSmp::SplitStereo(sample, sample, right, sndFile); + if(convert == ctrlSmp::splitSample) + { + ModSample &right = sndFile.GetSample(rightSmp); + success = ctrlSmp::SplitStereo(sample, sample, right, sndFile); - // Try to create a new instrument as well which maps to the right sample. - if(success) + // Try to create a new instrument as well which maps to the right sample. + if(success) + { + INSTRUMENTINDEX ins = pModDoc->FindSampleParent(m_nSample); + if(ins != INSTRUMENTINDEX_INVALID) { - INSTRUMENTINDEX ins = pModDoc->FindSampleParent(m_nSample); - if(ins != INSTRUMENTINDEX_INVALID) + INSTRUMENTINDEX rightIns = pModDoc->InsertInstrument(0, ins); + if(rightIns != INSTRUMENTINDEX_INVALID) { - INSTRUMENTINDEX rightIns = pModDoc->InsertInstrument(0, ins); - if(rightIns != INSTRUMENTINDEX_INVALID) + for(auto &smp : sndFile.Instruments[rightIns]->Keyboard) { - for(auto &smp : sndFile.Instruments[rightIns]->Keyboard) - { - if(smp == m_nSample) - smp = rightSmp; - } + if(smp == m_nSample) + smp = rightSmp; } - pModDoc->UpdateAllViews(this, InstrumentHint(rightIns).Info().Envelope().Names(), this); } + pModDoc->UpdateAllViews(this, InstrumentHint(rightIns).Info().Envelope().Names(), this); + } - // Finally, adjust sample panning - if(sndFile.GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM)) - { - sample.uFlags.set(CHN_PANNING); - sample.nPan = 0; - right.uFlags.set(CHN_PANNING); - right.nPan = 256; - } - pModDoc->UpdateAllViews(this, SampleHint(rightSmp).Info().Data().Names(), this); + // Finally, adjust sample panning + if(sndFile.GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM)) + { + sample.uFlags.set(CHN_PANNING); + sample.nPan = 0; + right.uFlags.set(CHN_PANNING); + right.nPan = 256; } - } else - { - success = ctrlSmp::ConvertToMono(sample, sndFile, convert); + pModDoc->UpdateAllViews(this, SampleHint(rightSmp).Info().Data().Names(), this); } - - if(success) - SetModified(SampleHint().Info().Data().Names(), true, true); - else - pModDoc->GetSampleUndo().RemoveLastUndoStep(m_nSample); + } else + { + success = ctrlSmp::ConvertToMono(sample, sndFile, convert); } } + + if(success) + SetModified(SampleHint().Info().Data().Names(), true, true); + else + pModDoc->GetSampleUndo().RemoveLastUndoStep(m_nSample); + EndWaitCursor(); } |
|
From: <sv...@op...> - 2026-04-26 20:59:02
|
Author: sagamusix Date: Sun Apr 26 22:58:49 2026 New Revision: 25281 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25281 Log: Merged revision(s) 25230 from trunk/OpenMPT: [Imp] Add Silence Dialog: Allow milliseconds value to be fractional. ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.h Modified: branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp Sun Apr 26 22:50:33 2026 (r25280) +++ branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp Sun Apr 26 22:58:49 2026 (r25281) @@ -520,6 +520,9 @@ } CheckDlgButton(buttonID, BST_CHECKED); + m_EditAmount.SubclassDlgItem(IDC_EDIT_ADDSILENCE, this); + m_EditAmount.AllowNegative(false); + m_EditAmount.AllowFractions(m_unit == kMilliseconds); SetDlgItemInt(IDC_EDIT_ADDSILENCE, (m_editOption == kResize) ? m_length : m_numSamples, FALSE); GetDlgItem(IDC_RADIO1)->EnableWindow(m_allowOPL ? TRUE : FALSE); @@ -529,11 +532,7 @@ void AddSilenceDlg::OnOK() { - m_numSamples = GetDlgItemInt(IDC_EDIT_ADDSILENCE, nullptr, FALSE); - if(m_unit == kMilliseconds) - { - m_numSamples = Util::muldivr_unsigned(m_numSamples, m_sampleRate, 1000); - } + m_numSamples = GetEditLength(); switch(m_editOption = GetEditMode()) { case kSilenceAtBeginning: @@ -550,6 +549,20 @@ } +SmpLength AddSilenceDlg::GetEditLength() const +{ + if(m_unit == kMilliseconds) + { + double ms = 0.0; + m_EditAmount.GetDecimalValue(ms); + return mpt::saturate_round<SmpLength>(ms * m_sampleRate / 1000.0); + } else + { + return GetDlgItemInt(IDC_EDIT_ADDSILENCE, nullptr, FALSE); + } +} + + void AddSilenceDlg::OnEditModeChanged() { AddSilenceOptions newEditOption = GetEditMode(); @@ -557,13 +570,19 @@ if(newEditOption != kResize && m_editOption == kResize) { // Switch to "add silence" - m_length = GetDlgItemInt(IDC_EDIT_ADDSILENCE); - SetDlgItemInt(IDC_EDIT_ADDSILENCE, m_numSamples); + m_length = GetEditLength(); + if(m_unit == kMilliseconds) + m_EditAmount.SetDecimalValue(m_numSamples * 1000.0 / m_sampleRate); + else + SetDlgItemInt(IDC_EDIT_ADDSILENCE, m_numSamples); } else if(newEditOption == kResize && m_editOption != kResize) { // Switch to "resize" - m_numSamples = GetDlgItemInt(IDC_EDIT_ADDSILENCE); - SetDlgItemInt(IDC_EDIT_ADDSILENCE, m_length); + m_numSamples = GetEditLength(); + if(m_unit == kMilliseconds) + m_EditAmount.SetDecimalValue(m_length * 1000.0 / m_sampleRate); + else + SetDlgItemInt(IDC_EDIT_ADDSILENCE, m_length); } m_editOption = newEditOption; } @@ -575,18 +594,20 @@ if(m_unit == unit) return; + m_EditAmount.AllowFractions(unit == kMilliseconds); m_unit = unit; - SmpLength duration = GetDlgItemInt(IDC_EDIT_ADDSILENCE); - if(m_unit == kSamples) + if(unit == kSamples) { - // Convert from milliseconds - duration = Util::muldivr_unsigned(duration, m_sampleRate, 1000); + // Convert from milliseconds to samples + double ms = 0.0; + m_EditAmount.GetDecimalValue(ms); + SetDlgItemInt(IDC_EDIT_ADDSILENCE, mpt::saturate_round<SmpLength>(ms * m_sampleRate / 1000.0)); } else { - // Convert from samples - duration = Util::muldivr_unsigned(duration, 1000, m_sampleRate); + // Convert from samples to milliseconds + SmpLength duration = GetDlgItemInt(IDC_EDIT_ADDSILENCE, nullptr, FALSE); + m_EditAmount.SetDecimalValue(duration * 1000.0 / m_sampleRate); } - SetDlgItemInt(IDC_EDIT_ADDSILENCE, duration); } Modified: branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.h ============================================================================== --- branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.h Sun Apr 26 22:50:33 2026 (r25280) +++ branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.h Sun Apr 26 22:58:49 2026 (r25281) @@ -128,6 +128,7 @@ AddSilenceOptions m_editOption; // See above protected: + CNumberEdit m_EditAmount; static SmpLength m_addSamples; static SmpLength m_createSamples; uint32 m_sampleRate; @@ -141,6 +142,7 @@ void OnOK() override; protected: + SmpLength GetEditLength() const; AddSilenceOptions GetEditMode() const; afx_msg void OnEditModeChanged(); afx_msg void OnUnitChanged(); |
|
From: <sv...@op...> - 2026-04-26 20:50:45
|
Author: sagamusix Date: Sun Apr 26 22:50:33 2026 New Revision: 25280 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25280 Log: Merged revision(s) 25222 from trunk/OpenMPT: [Fix] use GotoDlgCtrl instead of SetFocus in various places. See https://devblogs.microsoft.com/oldnewthing/20040802-00/?p=38283 ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/ColorConfigDlg.cpp branches/OpenMPT-1.32/mptrack/DialogBase.cpp branches/OpenMPT-1.32/mptrack/KeyConfigDlg.cpp branches/OpenMPT-1.32/mptrack/OPLExport.cpp branches/OpenMPT-1.32/mptrack/OPLInstrDlg.cpp branches/OpenMPT-1.32/mptrack/PatternClipboard.cpp branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp branches/OpenMPT-1.32/mptrack/PatternGotoDialog.cpp branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp branches/OpenMPT-1.32/mptrack/dlg_misc.cpp branches/OpenMPT-1.32/mptrack/mod2midi.cpp branches/OpenMPT-1.32/mptrack/plugins/LFOPluginEditor.cpp Modified: branches/OpenMPT-1.32/mptrack/ColorConfigDlg.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/ColorConfigDlg.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/ColorConfigDlg.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -251,7 +251,7 @@ if(highlightBeats > highlightMeasures) { Reporting::Warning("Error: Primary highlight must be greater than or equal secondary highlight."); - ::SetFocus(::GetDlgItem(m_hWnd, IDC_PRIMARYHILITE)); + GotoDlgCtrl(GetDlgItem(IDC_PRIMARYHILITE)); return 0; } Modified: branches/OpenMPT-1.32/mptrack/DialogBase.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/DialogBase.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/DialogBase.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -78,7 +78,7 @@ { if((child->GetStyle() & WS_TABSTOP) && child->IsWindowEnabled()) { - child->SetFocus(); + GotoDlgCtrl(child); return; } child = child->GetNextWindow(); Modified: branches/OpenMPT-1.32/mptrack/KeyConfigDlg.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/KeyConfigDlg.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/KeyConfigDlg.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -453,7 +453,7 @@ if(!hasKey) UpdateCategory(); UpdateShortcutList(hasKey ? -1 : m_curCategory); - m_lbnCommandKeys.SetFocus(); + GotoDlgCtrl(&m_lbnCommandKeys); } @@ -837,11 +837,11 @@ void COptionsKeyboard::EnableKeyChoice(bool enable) { if(!enable && GetFocus() == &m_eCustHotKey) - GetDlgItem(IDC_BUTTON1)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDC_BUTTON1)); m_eCustHotKey.Bypass(!enable); GetDlgItem(IDC_BUTTON1)->SetWindowText(enable ? _T("Cancel") : _T("&Set")); if(enable) - m_eCustHotKey.SetFocus(); + GotoDlgCtrl(&m_eCustHotKey); } Modified: branches/OpenMPT-1.32/mptrack/OPLExport.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/OPLExport.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/OPLExport.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -463,7 +463,7 @@ const int controls[] = {IDC_RADIO1, IDC_RADIO2, IDC_RADIO3, IDC_RADIO4, IDC_RADIO5, IDC_EDIT1, IDC_EDIT2, IDC_EDIT3, IDC_EDIT4, IDC_EDIT5, IDC_SPIN1, IDOK}; for(int control : controls) GetDlgItem(control)->EnableWindow(FALSE); - GetDlgItem(IDCANCEL)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDCANCEL)); BypassInputHandler bih; CMainFrame::GetMainFrame()->StopMod(&m_modDoc); Modified: branches/OpenMPT-1.32/mptrack/OPLInstrDlg.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/OPLInstrDlg.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/OPLInstrDlg.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -157,7 +157,7 @@ if(::IsChild(m_hWnd, m_lastFocusItem)) ::SetFocus(m_lastFocusItem); else - GetNextDlgTabItem(nullptr)->SetFocus(); + NextDlgCtrl(); } } Modified: branches/OpenMPT-1.32/mptrack/PatternClipboard.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/PatternClipboard.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/PatternClipboard.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -1170,8 +1170,7 @@ m_editNameBox.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT | ES_AUTOHSCROLL, rect, &m_clipList, 1); m_editNameBox.SetFont(m_clipList.GetFont()); m_editNameBox.SetWindowText(PatternClipboard::instance.m_clipboards[sel].description); - m_editNameBox.SetSel(0, -1, TRUE); - m_editNameBox.SetFocus(); + GotoDlgCtrl(&m_editNameBox); SetWindowLongPtr(m_editNameBox.m_hWnd, GWLP_USERDATA, (LONG_PTR)m_clipList.GetItemDataPtr(sel)); } Modified: branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/PatternEditorDialogs.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -173,7 +173,7 @@ m_numRows.AddString(mpt::cfmt::dec(irow)); } m_numRows.SetRedraw(TRUE); - m_numRows.SetFocus(); + GotoDlgCtrl(&m_numRows); m_spinRPB.SetRange32(1, MAX_ROWS_PER_BEAT); m_spinRPM.SetRange32(1, MAX_ROWS_PER_MEASURE); m_spinPattern.SetRange32(-1, 1); @@ -273,7 +273,7 @@ Reporting::Error("Invalid time signature!", "Pattern Properties"); SetCurrentPattern(m_nPattern); SetDlgItemInt(IDC_EDIT1, m_nPattern); - GetDlgItem(IDC_ROWSPERBEAT)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDC_ROWSPERBEAT)); return false; } @@ -295,7 +295,7 @@ { SetCurrentPattern(m_nPattern); SetDlgItemInt(IDC_EDIT1, m_nPattern); - m_numRows.SetFocus(); + GotoDlgCtrl(&m_numRows); return false; } break; Modified: branches/OpenMPT-1.32/mptrack/PatternGotoDialog.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/PatternGotoDialog.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/PatternGotoDialog.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -79,14 +79,14 @@ if(m_nOrder >= Order.size()) { MessageBeep(MB_ICONWARNING); - GetDlgItem(IDC_GOTO_ORD)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDC_GOTO_ORD)); return; } // Does order match pattern? Does pattern exist? if(Order[m_nOrder] != m_nPattern || !Order.IsValidPat(m_nOrder)) { MessageBeep(MB_ICONWARNING); - GetDlgItem(IDC_GOTO_PAT)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDC_GOTO_PAT)); return; } Modified: branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/SampleEditorDialogs.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -721,7 +721,7 @@ m_editLocked = true; m_SpinSamples.SetRange32(0, std::min(m_loopLength, m_maxLength)); - GetDlgItem(IDC_EDIT1)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDC_EDIT1)); CheckDlgButton(IDC_CHECK1, m_afterloopFade ? BST_CHECKED : BST_UNCHECKED); SmpLength numSamples = PercentToSamples(m_SliderLength.GetPos()); @@ -875,7 +875,7 @@ } else { MessageBeep(MB_ICONWARNING); - GetDlgItem(IDC_EDIT1)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDC_EDIT1)); return; } } Modified: branches/OpenMPT-1.32/mptrack/dlg_misc.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/dlg_misc.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/dlg_misc.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -374,13 +374,13 @@ if(newRPB > newRPM) { Reporting::Warning("Error: Rows per measure must be greater than or equal to rows per beat."); - GetDlgItem(IDC_ROWSPERMEASURE)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDC_ROWSPERMEASURE)); return false; } if(newRPB == 0 && static_cast<TempoMode>(m_TempoModeBox.GetItemData(m_TempoModeBox.GetCurSel())) == TempoMode::Modern) { Reporting::Warning("Error: Rows per beat must be greater than 0 in modern tempo mode."); - GetDlgItem(IDC_ROWSPERBEAT)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDC_ROWSPERBEAT)); return false; } Modified: branches/OpenMPT-1.32/mptrack/mod2midi.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/mod2midi.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/mod2midi.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -977,7 +977,7 @@ const int controls[] = {IDC_COMBO1, IDC_COMBO2, IDC_COMBO3, IDC_RADIO4, IDC_RADIO5, IDC_EDIT1, IDC_CHECK1, IDC_SPIN1, IDC_SPIN2, IDOK}; for(int control : controls) GetDlgItem(control)->EnableWindow(FALSE); - GetDlgItem(IDCANCEL)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDCANCEL)); CSoundFile &sndFile = m_modDoc.GetSoundFile(); SetRange(0, mpt::saturate_round<uint64>(std::accumulate(m_subSongs.begin(), m_subSongs.end(), 0.0, [](double acc, const auto &song) { return acc + song.duration; }) * sndFile.GetSampleRate())); Modified: branches/OpenMPT-1.32/mptrack/plugins/LFOPluginEditor.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/plugins/LFOPluginEditor.cpp Sun Apr 26 22:37:35 2026 (r25279) +++ branches/OpenMPT-1.32/mptrack/plugins/LFOPluginEditor.cpp Sun Apr 26 22:50:33 2026 (r25280) @@ -95,7 +95,7 @@ m_locked = false; // Avoid weird WM_COMMAND message (following a WM_ACTIVATE message) activating a wrong waveform when closing the plugin editor while the pattern editor is open - GetDlgItem(IDC_RADIO1 + m_lfoPlugin.m_waveForm)->SetFocus(); + GotoDlgCtrl(GetDlgItem(IDC_RADIO1 + m_lfoPlugin.m_waveForm)); return CAbstractVstEditor::OpenEditor(parent); } |
|
From: <sv...@op...> - 2026-04-26 20:37:47
|
Author: sagamusix Date: Sun Apr 26 22:37:35 2026 New Revision: 25279 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25279 Log: Merged revision(s) 25232 from trunk/OpenMPT: [Fix] ULT: Don't stop sustain loop on portamento (https://bugs.openmpt.org/view.php?id=1967). ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/soundlib/Load_ult.cpp Modified: branches/OpenMPT-1.32/soundlib/Load_ult.cpp ============================================================================== --- branches/OpenMPT-1.32/soundlib/Load_ult.cpp Sun Apr 26 22:36:57 2026 (r25278) +++ branches/OpenMPT-1.32/soundlib/Load_ult.cpp Sun Apr 26 22:37:35 2026 (r25279) @@ -316,6 +316,7 @@ m_SongFlags = SONG_AUTO_TONEPORTA | SONG_AUTO_TONEPORTA_CONT | SONG_ITCOMPATGXX | SONG_ITOLDEFFECTS; // this will be converted to IT format by MPT. m_playBehaviour.reset(kITClearPortaTarget); m_playBehaviour.reset(kITPortaTargetReached); + m_playBehaviour.reset(kITNoSustainOnPortamento); m_playBehaviour.set(kFT2PortaTargetNoReset); // Read "messageLength" lines, each containing 32 characters. |
|
From: <sv...@op...> - 2026-04-26 20:37:04
|
Author: sagamusix Date: Sun Apr 26 22:36:57 2026 New Revision: 25278 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25278 Log: Merged revision(s) 25276 from trunk/OpenMPT: [Imp] MIDI I/O plugin editor: Init string storage for parameter dropdown. ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/mptrack/plugins/MidiInOutEditor.cpp Modified: branches/OpenMPT-1.32/mptrack/plugins/MidiInOutEditor.cpp ============================================================================== --- branches/OpenMPT-1.32/mptrack/plugins/MidiInOutEditor.cpp Sun Apr 26 21:54:31 2026 (r25277) +++ branches/OpenMPT-1.32/mptrack/plugins/MidiInOutEditor.cpp Sun Apr 26 22:36:57 2026 (r25278) @@ -78,6 +78,8 @@ CheckDlgButton(IDC_CHECK2, plugin.m_alwaysSendInitialDump ? BST_UNCHECKED : BST_CHECKED); UpdateMidiDump(); m_paramCombo.SetRedraw(FALSE); + int numItems = MidiInOut::kMacroParamMax - MidiInOut::kMacroParamMin + 1; + m_paramCombo.InitStorage(numItems, static_cast<UINT>(numItems * 14 * sizeof(TCHAR))); for(unsigned int i = MidiInOut::kMacroParamMin; i <= MidiInOut::kMacroParamMax; i++) { m_paramCombo.AddString(MPT_CFORMAT("Parameter {}")(i)); |
|
From: <sv...@op...> - 2026-04-26 19:54:44
|
Author: sagamusix Date: Sun Apr 26 21:54:31 2026 New Revision: 25277 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25277 Log: [Imp] Export dialogs: Add accessible labels to various edit boxes. [Fix] Export dialogs: For an empty sequence, a bogus end order was shown. Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/OPLExport.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/mod2midi.h trunk/OpenMPT/mptrack/mod2wave.h Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp Sun Apr 26 13:04:37 2026 (r25276) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp Sun Apr 26 21:54:31 2026 (r25277) @@ -111,6 +111,10 @@ DDX_Control(pDX, IDC_SPIN6, m_SpinSubsongIndex); DDX_Control(pDX, IDC_COMBO9, m_CbnSampleSlot); + DDX_Control(pDX, IDC_EDIT3, m_EditMinOrder); + DDX_Control(pDX, IDC_EDIT5, m_EditLoopCount); + DDX_Control(pDX, IDC_EDIT12, m_EditSubSong); + DDX_Control(pDX, IDC_COMBO3, m_CbnGenre); DDX_Control(pDX, IDC_EDIT10, m_EditGenre); DDX_Control(pDX, IDC_EDIT11, m_EditTitle); @@ -140,13 +144,17 @@ SetDlgItemInt(IDC_EDIT3, m_Settings.minOrder); SetDlgItemInt(IDC_EDIT4, m_Settings.maxOrder); } + m_EditMinOrder.SetAccessibleName(_T("From position")); m_SpinMinOrder.SetRange32(0, m_nNumOrders); m_SpinMaxOrder.SetRange32(0, m_nNumOrders); SetDlgItemInt(IDC_EDIT5, m_Settings.repeatCount, FALSE); m_SpinLoopCount.SetRange32(1, int16_max); + m_EditLoopCount.SetAccessibleName(_T("Repeat")); + m_EditLoopCount.SetAccessibleSuffix(_T("times")); m_SpinSubsongIndex.SetRange32(1, static_cast<int>(m_subSongs.size())); + m_EditSubSong.SetAccessibleName(_T("Sub Song")); SetDlgItemInt(IDC_EDIT12, static_cast<UINT>(m_selectedSong + 1), FALSE); if(m_subSongs.size() <= 1) { Modified: trunk/OpenMPT/mptrack/Moddoc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp Sun Apr 26 13:04:37 2026 (r25276) +++ trunk/OpenMPT/mptrack/Moddoc.cpp Sun Apr 26 21:54:31 2026 (r25277) @@ -3084,7 +3084,7 @@ sequenceName.empty() ? mpt::tstring{} : MPT_TFORMAT(" ({})")(sequenceName), subsongInSequence, song.startOrder, - song.endOrder, + song.endOrder == ORDERINDEX_INVALID ? song.startOrder : song.endOrder, orderName.empty() ? mpt::tstring{} : MPT_TFORMAT(" ({})")(mpt::ToWin(m_SndFile.GetCharsetInternal(), orderName))); } Modified: trunk/OpenMPT/mptrack/OPLExport.cpp ============================================================================== --- trunk/OpenMPT/mptrack/OPLExport.cpp Sun Apr 26 13:04:37 2026 (r25276) +++ trunk/OpenMPT/mptrack/OPLExport.cpp Sun Apr 26 21:54:31 2026 (r25277) @@ -9,6 +9,7 @@ #include "stdafx.h" +#include "AccessibleControls.h" #include "FileDialog.h" #include "InputHandler.h" #include "Mainfrm.h" @@ -345,6 +346,8 @@ static ExportFormat s_format; + AccessibleEdit m_EditSubSong; + OPLCapture m_oplLogger; CSoundFile &m_sndFile; CModDoc &m_modDoc; @@ -373,6 +376,8 @@ CheckRadioButton(IDC_RADIO4, IDC_RADIO5, m_subSongs.size() <= 1 ? IDC_RADIO4 : IDC_RADIO5); static_cast<CSpinButtonCtrl *>(GetDlgItem(IDC_SPIN1))->SetRange32(1, static_cast<int>(m_subSongs.size())); + m_EditSubSong.SubclassDlgItem(IDC_EDIT1, this); + m_EditSubSong.SetAccessibleName(_T("Sub Song")); SetDlgItemInt(IDC_EDIT1, static_cast<UINT>(m_selectedSong + 1), FALSE); if(m_subSongs.size() <= 1) { Modified: trunk/OpenMPT/mptrack/mod2midi.cpp ============================================================================== --- trunk/OpenMPT/mptrack/mod2midi.cpp Sun Apr 26 13:04:37 2026 (r25276) +++ trunk/OpenMPT/mptrack/mod2midi.cpp Sun Apr 26 21:54:31 2026 (r25277) @@ -642,10 +642,11 @@ void CModToMidi::DoDataExchange(CDataExchange *pDX) { DialogBase::DoDataExchange(pDX); - DDX_Control(pDX, IDC_COMBO1, m_CbnInstrument); - DDX_Control(pDX, IDC_COMBO2, m_CbnChannel); - DDX_Control(pDX, IDC_COMBO3, m_CbnProgram); - DDX_Control(pDX, IDC_SPIN1, m_SpinInstrument); + DDX_Control(pDX, IDC_COMBO1, m_CbnInstrument); + DDX_Control(pDX, IDC_COMBO2, m_CbnChannel); + DDX_Control(pDX, IDC_COMBO3, m_CbnProgram); + DDX_Control(pDX, IDC_SPIN1, m_SpinInstrument); + DDX_Control(pDX, IDC_EDIT1, m_EditSubSong); } @@ -741,6 +742,7 @@ static_cast<CSpinButtonCtrl *>(GetDlgItem(IDC_SPIN2))->SetRange32(1, static_cast<int>(m_subSongs.size())); SetDlgItemInt(IDC_EDIT1, static_cast<UINT>(m_selectedSong + 1), FALSE); + m_EditSubSong.SetAccessibleName(_T("Sub Song")); if(m_subSongs.size() <= 1) { const int controls[] = {IDC_RADIO4, IDC_RADIO5, IDC_EDIT1, IDC_SPIN2}; Modified: trunk/OpenMPT/mptrack/mod2midi.h ============================================================================== --- trunk/OpenMPT/mptrack/mod2midi.h Sun Apr 26 13:04:37 2026 (r25276) +++ trunk/OpenMPT/mptrack/mod2midi.h Sun Apr 26 21:54:31 2026 (r25277) @@ -12,6 +12,7 @@ #include "openmpt/all/BuildSettings.hpp" +#include "AccessibleControls.h" #include "DialogBase.h" #include "ProgressDialog.h" #include "../soundlib/Snd_defs.h" @@ -36,6 +37,7 @@ { protected: CComboBox m_CbnInstrument, m_CbnChannel, m_CbnProgram; + AccessibleEdit m_EditSubSong; CSpinButtonCtrl m_SpinInstrument; CModDoc &m_modDoc; MidiExport::InstrMap m_instrMap; Modified: trunk/OpenMPT/mptrack/mod2wave.h ============================================================================== --- trunk/OpenMPT/mptrack/mod2wave.h Sun Apr 26 13:04:37 2026 (r25276) +++ trunk/OpenMPT/mptrack/mod2wave.h Sun Apr 26 21:54:31 2026 (r25277) @@ -12,6 +12,7 @@ #include "openmpt/all/BuildSettings.hpp" +#include "AccessibleControls.h" #include "DialogBase.h" #include "ProgressDialog.h" #include "Settings.h" @@ -73,6 +74,7 @@ CComboBox m_CbnFileType, m_CbnSampleRate, m_CbnChannels, m_CbnDither, m_CbnSampleFormat, m_CbnSampleSlot; CSpinButtonCtrl m_SpinLoopCount, m_SpinMinOrder, m_SpinMaxOrder, m_SpinSubsongIndex; + AccessibleEdit m_EditLoopCount, m_EditSubSong, m_EditMinOrder; CEdit m_EditTitle, m_EditAuthor, m_EditURL, m_EditAlbum, m_EditYear; CComboBox m_CbnGenre; CEdit m_EditGenre; |
|
From: <sv...@op...> - 2026-04-26 11:04:44
|
Author: sagamusix Date: Sun Apr 26 13:04:37 2026 New Revision: 25276 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25276 Log: [Imp] MIDI I/O plugin editor: Init string storage for parameter dropdown. Modified: trunk/OpenMPT/mptrack/plugins/MidiInOutEditor.cpp Modified: trunk/OpenMPT/mptrack/plugins/MidiInOutEditor.cpp ============================================================================== --- trunk/OpenMPT/mptrack/plugins/MidiInOutEditor.cpp Sun Apr 26 12:55:31 2026 (r25275) +++ trunk/OpenMPT/mptrack/plugins/MidiInOutEditor.cpp Sun Apr 26 13:04:37 2026 (r25276) @@ -78,6 +78,8 @@ CheckDlgButton(IDC_CHECK2, plugin.m_alwaysSendInitialDump ? BST_UNCHECKED : BST_CHECKED); UpdateMidiDump(); m_paramCombo.SetRedraw(FALSE); + int numItems = MidiInOut::kMacroParamMax - MidiInOut::kMacroParamMin + 1; + m_paramCombo.InitStorage(numItems, static_cast<UINT>(numItems * 14 * sizeof(TCHAR))); for(unsigned int i = MidiInOut::kMacroParamMin; i <= MidiInOut::kMacroParamMax; i++) { m_paramCombo.AddString(MPT_CFORMAT("Parameter {}")(i)); |
|
From: <sv...@op...> - 2026-04-26 10:55:41
|
Author: sagamusix Date: Sun Apr 26 12:55:31 2026 New Revision: 25275 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25275 Log: [Imp] More accessibility improvements for sample grid configuration, and add similar improvements to the Add Silence dialog (https://bugs.openmpt.org/view.php?id=1968). Modified: trunk/OpenMPT/mptrack/AccessibleControls.h trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp trunk/OpenMPT/mptrack/SampleEditorDialogs.h Modified: trunk/OpenMPT/mptrack/AccessibleControls.h ============================================================================== --- trunk/OpenMPT/mptrack/AccessibleControls.h Sun Apr 26 12:34:48 2026 (r25274) +++ trunk/OpenMPT/mptrack/AccessibleControls.h Sun Apr 26 12:55:31 2026 (r25275) @@ -41,8 +41,19 @@ public: AccessibleEdit() { EnableActiveAccessibility(); } + void SetAccessibleName(const TCHAR *name) { m_name = name; } void SetAccessibleSuffix(const TCHAR *suffix) { m_suffix = suffix; } + HRESULT get_accName(VARIANT varChild, BSTR *pszName) override + { + if(varChild.lVal == CHILDID_SELF) + { + *pszName = m_name.AllocSysString(); + return S_OK; + } + return CEdit::get_accName(varChild, pszName); + } + HRESULT get_accValue(VARIANT varChild, BSTR *pszName) override { if(varChild.lVal == CHILDID_SELF) @@ -55,9 +66,39 @@ return CEdit::get_accValue(varChild, pszName); } + HRESULT get_accDescription(VARIANT varChild, BSTR *pszName) override + { + if(varChild.lVal == CHILDID_SELF) + return get_accValue(varChild, pszName); + return CEdit::get_accDescription(varChild, pszName); + } + private: + CString m_name; CString m_suffix; }; +class AccessibleComboBox : public CComboBox +{ +public: + AccessibleComboBox() { EnableActiveAccessibility(); } + + void SetAccessibleName(const TCHAR *name) { m_name = name; } + + HRESULT get_accName(VARIANT varChild, BSTR *pszName) override + { + if(varChild.lVal == CHILDID_SELF) + { + *pszName = m_name.AllocSysString(); + return S_OK; + } + return CComboBox::get_accName(varChild, pszName); + } + +private: + CString m_name; +}; + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Sun Apr 26 12:34:48 2026 (r25274) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Sun Apr 26 12:55:31 2026 (r25275) @@ -551,6 +551,15 @@ SmpLength AddSilenceDlg::m_addSamples = 32; SmpLength AddSilenceDlg::m_createSamples = 64; +void AddSilenceDlg::DoDataExchange(CDataExchange *pDX) +{ + DialogBase::DoDataExchange(pDX); + //{{AFX_DATA_MAP(AddSilenceDlg) + DDX_Control(pDX, IDC_COMBO1, m_ComboUnit); + //}}AFX_DATA_MAP +} + + AddSilenceDlg::AddSilenceDlg(CWnd *parent, SmpLength origLength, uint32 sampleRate, bool allowOPL) : DialogBase(IDD_ADDSILENCE, parent) , m_numSamples(m_addSamples) @@ -580,15 +589,12 @@ spin->SetPos32(m_numSamples); } - CComboBox *box = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO1)); - if(box) + m_ComboUnit.SetAccessibleName(_T("Length unit")); + PopulateSampleLengthUnitComboBox(m_ComboUnit, m_unit); + if(m_sampleRate == 0) { - PopulateSampleLengthUnitComboBox(*box, m_unit); - if(m_sampleRate == 0) - { - // Can't do any conversions if samplerate is unknown - box->EnableWindow(FALSE); - } + // Can't do any conversions if samplerate is unknown + m_ComboUnit.EnableWindow(FALSE); } int buttonID = IDC_RADIO_ADDSILENCE_END; @@ -604,6 +610,7 @@ m_EditAmount.SubclassDlgItem(IDC_EDIT_ADDSILENCE, this); m_EditAmount.AllowNegative(false); m_EditAmount.AllowFractions(m_unit == SampleLengthUnit::Milliseconds); + m_EditAmount.SetAccessibleSuffix((m_unit == SampleLengthUnit::Samples) ? _T("samples") : _T("ms")); SetDlgItemInt(IDC_EDIT_ADDSILENCE, (m_editOption == kResize) ? m_length : m_numSamples, FALSE); GetDlgItem(IDC_RADIO1)->EnableWindow(m_allowOPL ? TRUE : FALSE); @@ -671,12 +678,12 @@ void AddSilenceDlg::OnUnitChanged() { - CComboBox *box = static_cast<CComboBox *>(GetDlgItem(IDC_COMBO1)); - const auto unit = static_cast<SampleLengthUnit>(box->GetItemData(box->GetCurSel())); + const auto unit = static_cast<SampleLengthUnit>(m_ComboUnit.GetItemData(m_ComboUnit.GetCurSel())); if(m_unit == unit) return; m_EditAmount.AllowFractions(unit == SampleLengthUnit::Milliseconds); + m_EditAmount.SetAccessibleSuffix((m_unit == SampleLengthUnit::Samples) ? _T("samples") : _T("ms")); m_unit = unit; if(unit == SampleLengthUnit::Samples) { @@ -743,6 +750,7 @@ { DialogBase::OnInitDialog(); + m_ComboUnit.SetAccessibleName(_T("Segment length unit")); PopulateSampleLengthUnitComboBox(m_ComboUnit, m_unit); m_SpinSegments.SetRange32(1, m_maxSegments); @@ -751,7 +759,7 @@ m_EditSegments.AllowFractions(true); m_EditSegments.AllowNegative(false); m_EditSegments.SetDecimalValue(m_segments); - m_EditSegments.SetAccessibleSuffix(_T("grid segments")); + m_EditSegments.SetAccessibleName(_T("Grid segments")); m_SpinSpacing.SetRange32(0, m_maxSegments); m_SpinSpacing.SetPos32(mpt::saturate_round<int32>(m_spacing)); @@ -759,6 +767,7 @@ m_EditSpacing.AllowFractions(true); m_EditSpacing.AllowNegative(false); m_EditSpacing.SetDecimalValue(m_spacing); + m_EditSpacing.SetAccessibleName(_T("Segment length")); m_EditSpacing.SetAccessibleSuffix((m_unit == SampleLengthUnit::Samples) ? _T("samples") : _T("ms")); int radioChoice = IDC_RADIO1; Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.h ============================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.h Sun Apr 26 12:34:48 2026 (r25274) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.h Sun Apr 26 12:55:31 2026 (r25275) @@ -140,6 +140,7 @@ AddSilenceOptions m_editOption; // See above protected: + AccessibleComboBox m_ComboUnit; CNumberEdit m_EditAmount; static SmpLength m_addSamples; static SmpLength m_createSamples; @@ -150,6 +151,7 @@ public: AddSilenceDlg(CWnd *parent, SmpLength origLength, uint32 sampleRate, bool allowOPL); + void DoDataExchange(CDataExchange *pDX) override; BOOL OnInitDialog() override; void OnOK() override; @@ -180,7 +182,7 @@ protected: CNumberEdit m_EditSegments, m_EditSpacing; CSpinButtonCtrl m_SpinSegments, m_SpinSpacing; - CComboBox m_ComboUnit; + AccessibleComboBox m_ComboUnit; public: CSampleGridDlg(CWnd *parent, SampleGridMode mode, double segments, double spacing, SampleLengthUnit unit, SmpLength maxSegments, uint32 sampleRate); |
|
From: <sv...@op...> - 2026-04-26 10:35:12
|
Author: sagamusix Date: Sun Apr 26 12:34:48 2026 New Revision: 25274 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25274 Log: [Imp] Sample Tab: Allow a single channel to be copied. Modified: trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp Modified: trunk/OpenMPT/mptrack/View_smp.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp Sun Apr 26 08:58:42 2026 (r25273) +++ trunk/OpenMPT/mptrack/View_smp.cpp Sun Apr 26 12:34:48 2026 (r25274) @@ -2756,6 +2756,7 @@ } SmpLength rangeStart = 0, rangeEnd = sample.nLength; + SampleChannelSelection channelSel = SampleChannelSelection::Both; // First things first: Calculate sample size, taking partial selections into account. LimitMax(m_dwEndSel, sample.nLength); @@ -2763,17 +2764,20 @@ { rangeStart = m_dwBeginSel; rangeEnd = m_dwEndSel; + channelSel = m_channelSelection; } - size_t smpSize = (rangeEnd - rangeStart) * sample.GetBytesPerSample(); - size_t smpOffset = rangeStart * sample.GetBytesPerSample(); + const bool singleChannel = SampleEdit::IsSingleChannel(sample, channelSel); + const uint8 writeNumChannels = singleChannel ? uint8(1) : sample.GetNumChannels(); + const SmpLength rangeLength = rangeEnd - rangeStart; + const size_t sampleDataSize = rangeLength * sample.GetElementarySampleSize() * writeNumChannels; // Ok, now calculate size of the resulting WAV file. - size_t memSize = sizeof(RIFFHeader) // RIFF Header - + sizeof(RIFFChunk) + sizeof(WAVFormatChunk) // Sample format - + sizeof(RIFFChunk) + ((smpSize + 1) & ~1) // Sample data - + sizeof(RIFFChunk) + sizeof(WAVExtraChunk) // Sample metadata - + MAX_SAMPLENAME + MAX_SAMPLEFILENAME; // Sample name + size_t memSize = sizeof(RIFFHeader) // RIFF Header + + sizeof(RIFFChunk) + sizeof(WAVFormatChunk) // Sample format + + sizeof(RIFFChunk) + ((sampleDataSize + 1) & ~1) // Sample data + + sizeof(RIFFChunk) + sizeof(WAVExtraChunk) // Sample metadata + + MAX_SAMPLENAME + MAX_SAMPLEFILENAME; // Sample name static_assert((sizeof(WAVExtraChunk) % 2u) == 0); static_assert((MAX_SAMPLENAME % 2u) == 0); static_assert((MAX_SAMPLEFILENAME % 2u) == 0); @@ -2794,22 +2798,24 @@ WAVSampleWriter file(ff); // Write sample format - file.WriteFormat(sample.GetSampleRate(sndFile.GetType()), sample.GetElementarySampleSize() * 8, sample.GetNumChannels(), WAVFormatChunk::fmtPCM); + file.WriteFormat(sample.GetSampleRate(sndFile.GetType()), sample.GetElementarySampleSize() * 8, writeNumChannels, WAVFormatChunk::fmtPCM); // Write sample data file.StartChunk(RIFFChunk::iddata); - uint8 *sampleData = mpt::byte_cast<uint8 *>(data.data()) + ff.TellWrite(); - memcpy(sampleData, sample.sampleb() + smpOffset, smpSize); - if(sample.GetElementarySampleSize() == 1) + void *sampleData = data.data() + ff.TellWrite(); + const uint8 selectedChn = SampleEdit::SelectedChannel(channelSel); + const uint8 srcChannels = sample.GetNumChannels(); + switch(sample.GetElementarySampleSize()) { - // 8-Bit samples have to be unsigned. - for(size_t i = smpSize; i != 0; i--) - { - *(sampleData++) ^= 0x80u; - } + case 1: + CopySample<SC::ConversionChain<SC::Convert<uint8, int8>, SC::DecodeIdentity<int8>>>(static_cast<uint8 *>(sampleData), rangeLength * (singleChannel ? 1 : srcChannels), 1, sample.sample8() + rangeStart * srcChannels + selectedChn, rangeLength * sample.GetBytesPerSample(), singleChannel ? srcChannels : 1); + break; + case 2: + CopySample<SC::ConversionChain<SC::Convert<int16le, int16>, SC::DecodeIdentity<int16>>>(static_cast<int16le *>(sampleData), rangeLength * (singleChannel ? 1 : srcChannels), 1, sample.sample16() + rangeStart * srcChannels + selectedChn, rangeLength * sample.GetBytesPerSample(), singleChannel ? srcChannels : 1); + break; } - ff.SeekRelative(smpSize); + ff.SeekRelative(sampleDataSize); file.WriteLoopInformation(sample, rangeStart, rangeEnd); file.WriteCueInformation(sample, rangeStart, rangeEnd); Modified: trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp ============================================================================== --- trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp Sun Apr 26 08:58:42 2026 (r25273) +++ trunk/OpenMPT/src/openmpt/soundbase/SampleConvert.hpp Sun Apr 26 12:34:48 2026 (r25274) @@ -11,6 +11,7 @@ #include "mpt/base/math.hpp" #include "mpt/base/saturate_cast.hpp" #include "mpt/base/saturate_round.hpp" +#include "openmpt/base/Endian.hpp" #include "openmpt/base/Int24.hpp" #include "openmpt/base/Types.hpp" @@ -97,6 +98,19 @@ } }; +template <typename Tid, mpt::endian endian> +struct Convert<mpt::packed<Tid, endian>, Tid> +{ + using input_t = Tid; + using output_t = mpt::packed<Tid, endian>; + MPT_ATTR_ALWAYSINLINE MPT_INLINE_FORCE output_t operator()(input_t val) + { + output_t out; + out = val; + return out; + } +}; + template <> struct Convert<uint8, int8> { |