From: <sv...@op...> - 2024-11-04 17:57:50
|
Author: sagamusix Date: Mon Nov 4 18:57:43 2024 New Revision: 22094 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22094 Log: [Fix] After loading a file with missing external samples, OpenMPT still prompted to save those empty sample slots to disk when closing the module. Doing that resulted in a crash. Modified: trunk/OpenMPT/mptrack/ExternalSamples.cpp trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp trunk/OpenMPT/soundlib/SampleFormats.cpp Modified: trunk/OpenMPT/mptrack/ExternalSamples.cpp ============================================================================== --- trunk/OpenMPT/mptrack/ExternalSamples.cpp Mon Nov 4 18:38:39 2024 (r22093) +++ trunk/OpenMPT/mptrack/ExternalSamples.cpp Mon Nov 4 18:57:43 2024 (r22094) @@ -271,6 +271,8 @@ if(m_sndFile.GetSample(smp).uFlags[SMP_MODIFIED]) status = _T("modified"); + else if(!m_sndFile.GetSample(smp).HasSampleData()) + continue; // Sample was already missing when the file was loaded, nothing we can do here else if(!mpt::native_fs{}.is_file(m_sndFile.GetSamplePath(smp))) status = _T("missing"); else Modified: trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp ============================================================================== --- trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp Mon Nov 4 18:38:39 2024 (r22093) +++ trunk/OpenMPT/soundlib/SampleFormatFLAC.cpp Mon Nov 4 18:57:43 2024 (r22094) @@ -558,7 +558,7 @@ { #ifdef MPT_WITH_FLAC const ModSample &sample = Samples[nSample]; - if(sample.uFlags[CHN_ADLIB]) + if(sample.uFlags[CHN_ADLIB] || !sample.HasSampleData()) return false; FLAC__StreamEncoder_RAII encoder(f); Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp ============================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp Mon Nov 4 18:38:39 2024 (r22093) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp Mon Nov 4 18:57:43 2024 (r22094) @@ -559,7 +559,7 @@ bool CSoundFile::SaveWAVSample(SAMPLEINDEX nSample, std::ostream &f) const { const ModSample &sample = Samples[nSample]; - if(sample.uFlags[CHN_ADLIB]) + if(sample.uFlags[CHN_ADLIB] || !sample.HasSampleData()) return false; mpt::IO::OFile<std::ostream> ff(f); @@ -843,6 +843,8 @@ bool CSoundFile::SaveRAWSample(SAMPLEINDEX nSample, std::ostream &f) const { const ModSample &sample = Samples[nSample]; + if(!sample.HasSampleData()) + return false; SampleIO( sample.uFlags[CHN_16BIT] ? SampleIO::_16bit : SampleIO::_8bit, sample.uFlags[CHN_STEREO] ? SampleIO::stereoInterleaved : SampleIO::mono, @@ -1188,6 +1190,8 @@ bool CSoundFile::SaveS3ISample(SAMPLEINDEX smp, std::ostream &f) const { const ModSample &sample = Samples[smp]; + if(!sample.uFlags[CHN_ADLIB] && !sample.HasSampleData()) + return false; S3MSampleHeader sampleHeader{}; SmpLength length = sampleHeader.ConvertToS3M(sample); mpt::String::WriteBuf(mpt::String::nullTerminated, sampleHeader.name) = m_szNames[smp]; @@ -2774,7 +2778,7 @@ bool CSoundFile::SaveIFFSample(SAMPLEINDEX smp, std::ostream &f) const { const ModSample &sample = Samples[smp]; - if(sample.uFlags[CHN_ADLIB]) + if(sample.uFlags[CHN_ADLIB] || !sample.HasSampleData()) return false; mpt::IO::OFile<std::ostream> ff(f); |