Update libopenmpt to version 0.3.10.
parent
2b6248dc75
commit
489c329a21
|
@ -61,7 +61,9 @@
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
|
|
||||||
#define MPT_COMPILER_MSVC 1
|
#define MPT_COMPILER_MSVC 1
|
||||||
#if (_MSC_VER >= 1912)
|
#if (_MSC_VER >= 1913)
|
||||||
|
#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017,6)
|
||||||
|
#elif (_MSC_VER >= 1912)
|
||||||
#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017,5)
|
#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017,5)
|
||||||
#elif (_MSC_VER >= 1911)
|
#elif (_MSC_VER >= 1911)
|
||||||
#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017,3)
|
#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017,3)
|
||||||
|
|
|
@ -255,6 +255,7 @@ static std::atomic<uint32> NextIndex(0);
|
||||||
static uint32 ThreadIdGUI = 0;
|
static uint32 ThreadIdGUI = 0;
|
||||||
static uint32 ThreadIdAudio = 0;
|
static uint32 ThreadIdAudio = 0;
|
||||||
static uint32 ThreadIdNotify = 0;
|
static uint32 ThreadIdNotify = 0;
|
||||||
|
static uint32 ThreadIdWatchdir = 0;
|
||||||
|
|
||||||
void Enable(std::size_t numEntries)
|
void Enable(std::size_t numEntries)
|
||||||
{
|
{
|
||||||
|
@ -379,6 +380,9 @@ bool Dump(const mpt::PathString &filename)
|
||||||
} else if(entry.ThreadId == ThreadIdNotify)
|
} else if(entry.ThreadId == ThreadIdNotify)
|
||||||
{
|
{
|
||||||
f << " --Notify ";
|
f << " --Notify ";
|
||||||
|
} else if(entry.ThreadId == ThreadIdWatchdir)
|
||||||
|
{
|
||||||
|
f << " WatchDir ";
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
f << " " << mpt::fmt::hex0<8>(entry.ThreadId) << " ";
|
f << " " << mpt::fmt::hex0<8>(entry.ThreadId) << " ";
|
||||||
|
@ -406,9 +410,33 @@ void SetThreadId(mpt::log::Trace::ThreadKind kind, uint32 id)
|
||||||
case ThreadKindNotify:
|
case ThreadKindNotify:
|
||||||
ThreadIdNotify = id;
|
ThreadIdNotify = id;
|
||||||
break;
|
break;
|
||||||
|
case ThreadKindWatchdir:
|
||||||
|
ThreadIdWatchdir = id;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32 GetThreadId(mpt::log::Trace::ThreadKind kind)
|
||||||
|
{
|
||||||
|
uint32 result = 0;
|
||||||
|
switch(kind)
|
||||||
|
{
|
||||||
|
case ThreadKindGUI:
|
||||||
|
result = ThreadIdGUI;
|
||||||
|
break;
|
||||||
|
case ThreadKindAudio:
|
||||||
|
result = ThreadIdAudio;
|
||||||
|
break;
|
||||||
|
case ThreadKindNotify:
|
||||||
|
result = ThreadIdNotify;
|
||||||
|
break;
|
||||||
|
case ThreadKindWatchdir:
|
||||||
|
result = ThreadIdWatchdir;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // MPT_OS_WINDOWS
|
#endif // MPT_OS_WINDOWS
|
||||||
|
|
||||||
} // namespace Trace
|
} // namespace Trace
|
||||||
|
|
|
@ -235,12 +235,14 @@ enum ThreadKind {
|
||||||
ThreadKindGUI,
|
ThreadKindGUI,
|
||||||
ThreadKindAudio,
|
ThreadKindAudio,
|
||||||
ThreadKindNotify,
|
ThreadKindNotify,
|
||||||
|
ThreadKindWatchdir,
|
||||||
};
|
};
|
||||||
|
|
||||||
void Enable(std::size_t numEntries);
|
void Enable(std::size_t numEntries);
|
||||||
void Disable();
|
void Disable();
|
||||||
|
|
||||||
void SetThreadId(mpt::log::Trace::ThreadKind kind, uint32 id);
|
void SetThreadId(mpt::log::Trace::ThreadKind kind, uint32 id);
|
||||||
|
uint32 GetThreadId(mpt::log::Trace::ThreadKind kind);
|
||||||
|
|
||||||
void Seal();
|
void Seal();
|
||||||
bool Dump(const mpt::PathString &filename);
|
bool Dump(const mpt::PathString &filename);
|
||||||
|
|
|
@ -305,7 +305,7 @@ mpt::random_device & global_random_device()
|
||||||
|
|
||||||
mpt::thread_safe_prng<mpt::best_prng> & global_prng()
|
mpt::thread_safe_prng<mpt::best_prng> & global_prng()
|
||||||
{
|
{
|
||||||
static mpt::thread_safe_prng<mpt::best_prng> g_best_prng(global_random_device());
|
static mpt::thread_safe_prng<mpt::best_prng> g_best_prng(mpt::make_prng<mpt::best_prng>(global_random_device()));
|
||||||
return g_best_prng;
|
return g_best_prng;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ OPENMPT_NAMESPACE_BEGIN
|
||||||
//Version definitions. The only thing that needs to be changed when changing version number.
|
//Version definitions. The only thing that needs to be changed when changing version number.
|
||||||
#define VER_MAJORMAJOR 1
|
#define VER_MAJORMAJOR 1
|
||||||
#define VER_MAJOR 27
|
#define VER_MAJOR 27
|
||||||
#define VER_MINOR 07
|
#define VER_MINOR 08
|
||||||
#define VER_MINORMINOR 02
|
#define VER_MINORMINOR 02
|
||||||
|
|
||||||
//Version string. For example "1.17.02.28"
|
//Version string. For example "1.17.02.28"
|
||||||
|
|
|
@ -5,6 +5,17 @@ Changelog {#changelog}
|
||||||
For fully detailed change log, please see the source repository directly. This
|
For fully detailed change log, please see the source repository directly. This
|
||||||
is just a high-level summary.
|
is just a high-level summary.
|
||||||
|
|
||||||
|
### libopenmpt 0.3.10 (2018-06-17)
|
||||||
|
|
||||||
|
* [**Bug**] Internal mixer state was not initialized properly when initially
|
||||||
|
rendering in 44100kHz stereo format.
|
||||||
|
* [**Bug**] AMF: Undefined behaviour in loader code could lead to files
|
||||||
|
playing silent.
|
||||||
|
|
||||||
|
* Switching between instruments with portamento did not update the NNA
|
||||||
|
settings for the new instrument.
|
||||||
|
* FAR: Properly import volume commands.
|
||||||
|
|
||||||
### libopenmpt 0.3.9 (2018-04-29)
|
### libopenmpt 0.3.9 (2018-04-29)
|
||||||
|
|
||||||
* [**Sec**] Possible write near address 0 in out-of-memory situations when
|
* [**Sec**] Possible write near address 0 in out-of-memory situations when
|
||||||
|
|
|
@ -415,11 +415,14 @@ void module_impl::apply_mixer_settings( std::int32_t samplerate, int channels )
|
||||||
mixersettings.SetVolumeRampUpMicroseconds( volrampin_us );
|
mixersettings.SetVolumeRampUpMicroseconds( volrampin_us );
|
||||||
mixersettings.SetVolumeRampDownMicroseconds( volrampout_us );
|
mixersettings.SetVolumeRampDownMicroseconds( volrampout_us );
|
||||||
m_sndFile->SetMixerSettings( mixersettings );
|
m_sndFile->SetMixerSettings( mixersettings );
|
||||||
|
} else if ( !m_mixer_initialized ) {
|
||||||
|
m_sndFile->InitPlayer( true );
|
||||||
}
|
}
|
||||||
if ( samplerate_changed ) {
|
if ( samplerate_changed ) {
|
||||||
m_sndFile->SuspendPlugins();
|
m_sndFile->SuspendPlugins();
|
||||||
m_sndFile->ResumePlugins();
|
m_sndFile->ResumePlugins();
|
||||||
}
|
}
|
||||||
|
m_mixer_initialized = true;
|
||||||
}
|
}
|
||||||
void module_impl::apply_libopenmpt_defaults() {
|
void module_impl::apply_libopenmpt_defaults() {
|
||||||
set_render_param( module::RENDER_STEREOSEPARATION_PERCENT, 100 );
|
set_render_param( module::RENDER_STEREOSEPARATION_PERCENT, 100 );
|
||||||
|
@ -447,6 +450,7 @@ bool module_impl::has_subsongs_inited() const {
|
||||||
void module_impl::ctor( const std::map< std::string, std::string > & ctls ) {
|
void module_impl::ctor( const std::map< std::string, std::string > & ctls ) {
|
||||||
m_sndFile = mpt::make_unique<CSoundFile>();
|
m_sndFile = mpt::make_unique<CSoundFile>();
|
||||||
m_loaded = false;
|
m_loaded = false;
|
||||||
|
m_mixer_initialized = false;
|
||||||
m_Dither = mpt::make_unique<Dither>(mpt::global_prng());
|
m_Dither = mpt::make_unique<Dither>(mpt::global_prng());
|
||||||
m_LogForwarder = mpt::make_unique<log_forwarder>( *m_Log );
|
m_LogForwarder = mpt::make_unique<log_forwarder>( *m_Log );
|
||||||
m_sndFile->SetCustomLog( m_LogForwarder.get() );
|
m_sndFile->SetCustomLog( m_LogForwarder.get() );
|
||||||
|
|
|
@ -87,6 +87,7 @@ protected:
|
||||||
double m_currentPositionSeconds;
|
double m_currentPositionSeconds;
|
||||||
std::unique_ptr<OpenMPT::CSoundFile> m_sndFile;
|
std::unique_ptr<OpenMPT::CSoundFile> m_sndFile;
|
||||||
bool m_loaded;
|
bool m_loaded;
|
||||||
|
bool m_mixer_initialized;
|
||||||
std::unique_ptr<OpenMPT::Dither> m_Dither;
|
std::unique_ptr<OpenMPT::Dither> m_Dither;
|
||||||
subsongs_type m_subsongs;
|
subsongs_type m_subsongs;
|
||||||
float m_Gain;
|
float m_Gain;
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
/*! \brief libopenmpt minor version number */
|
/*! \brief libopenmpt minor version number */
|
||||||
#define OPENMPT_API_VERSION_MINOR 3
|
#define OPENMPT_API_VERSION_MINOR 3
|
||||||
/*! \brief libopenmpt patch version number */
|
/*! \brief libopenmpt patch version number */
|
||||||
#define OPENMPT_API_VERSION_PATCH 9
|
#define OPENMPT_API_VERSION_PATCH 10
|
||||||
/*! \brief libopenmpt pre-release tag */
|
/*! \brief libopenmpt pre-release tag */
|
||||||
#define OPENMPT_API_VERSION_PREREL ""
|
#define OPENMPT_API_VERSION_PREREL ""
|
||||||
/*! \brief libopenmpt pre-release flag */
|
/*! \brief libopenmpt pre-release flag */
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
LIBOPENMPT_VERSION_MAJOR=0
|
LIBOPENMPT_VERSION_MAJOR=0
|
||||||
LIBOPENMPT_VERSION_MINOR=3
|
LIBOPENMPT_VERSION_MINOR=3
|
||||||
LIBOPENMPT_VERSION_PATCH=9
|
LIBOPENMPT_VERSION_PATCH=10
|
||||||
LIBOPENMPT_VERSION_PREREL=
|
LIBOPENMPT_VERSION_PREREL=
|
||||||
|
|
||||||
LIBOPENMPT_LTVER_CURRENT=1
|
LIBOPENMPT_LTVER_CURRENT=1
|
||||||
LIBOPENMPT_LTVER_REVISION=9
|
LIBOPENMPT_LTVER_REVISION=10
|
||||||
LIBOPENMPT_LTVER_AGE=1
|
LIBOPENMPT_LTVER_AGE=1
|
||||||
|
|
|
@ -888,10 +888,16 @@ static const char * const channel_tags[4][4] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string channel_to_string( int channels, int channel, const meter_channel & meter, bool tiny = false ) {
|
static std::string channel_to_string( int channels, int channel, const meter_channel & meter, bool tiny = false ) {
|
||||||
|
int val = std::numeric_limits<int>::min();
|
||||||
|
int hold_pos = std::numeric_limits<int>::min();
|
||||||
|
if ( meter.peak > 0.0f ) {
|
||||||
float db = 20.0f * std::log10( meter.peak );
|
float db = 20.0f * std::log10( meter.peak );
|
||||||
|
val = static_cast<int>( db + 48.0f );
|
||||||
|
}
|
||||||
|
if ( meter.hold > 0.0f ) {
|
||||||
float db_hold = 20.0f * std::log10( meter.hold );
|
float db_hold = 20.0f * std::log10( meter.hold );
|
||||||
int val = static_cast<int>( db + 48.0f );
|
hold_pos = static_cast<int>( db_hold + 48.0f );
|
||||||
int hold_pos = static_cast<int>( db_hold + 48.0f );
|
}
|
||||||
if ( val < 0 ) {
|
if ( val < 0 ) {
|
||||||
val = 0;
|
val = 0;
|
||||||
}
|
}
|
||||||
|
@ -911,13 +917,13 @@ static std::string channel_to_string( int channels, int channel, const meter_cha
|
||||||
headroom = 0;
|
headroom = 0;
|
||||||
}
|
}
|
||||||
if ( tiny ) {
|
if ( tiny ) {
|
||||||
if ( meter.clip != 0.0f || db >= 0.0f ) {
|
if ( meter.clip != 0.0f || meter.peak >= 1.0f ) {
|
||||||
return "#";
|
return "#";
|
||||||
} else if ( db > -6.0f ) {
|
} else if ( meter.peak > std::pow( 10.0f, -6.0f / 20.0f ) ) {
|
||||||
return "O";
|
return "O";
|
||||||
} else if ( db > -12.0f ) {
|
} else if ( meter.peak > std::pow( 10.0f, -12.0f / 20.0f ) ) {
|
||||||
return "o";
|
return "o";
|
||||||
} else if ( db > -18.0f ) {
|
} else if ( meter.peak > std::pow( 10.0f, -18.0f / 20.0f ) ) {
|
||||||
return ".";
|
return ".";
|
||||||
} else {
|
} else {
|
||||||
return " ";
|
return " ";
|
||||||
|
|
|
@ -64,6 +64,8 @@ CReverbSettings::CReverbSettings()
|
||||||
|
|
||||||
CReverb::CReverb()
|
CReverb::CReverb()
|
||||||
{
|
{
|
||||||
|
m_currentPreset = nullptr;
|
||||||
|
|
||||||
// Shared reverb state
|
// Shared reverb state
|
||||||
InitMixBuffer(MixReverbBuffer, static_cast<uint32>(mpt::size(MixReverbBuffer)));
|
InitMixBuffer(MixReverbBuffer, static_cast<uint32>(mpt::size(MixReverbBuffer)));
|
||||||
gnRvbROfsVol = 0;
|
gnRvbROfsVol = 0;
|
||||||
|
@ -326,18 +328,17 @@ void CReverb::Shutdown()
|
||||||
void CReverb::Initialize(bool bReset, uint32 MixingFreq)
|
void CReverb::Initialize(bool bReset, uint32 MixingFreq)
|
||||||
{
|
{
|
||||||
if (m_Settings.m_nReverbType >= NUM_REVERBTYPES) m_Settings.m_nReverbType = 0;
|
if (m_Settings.m_nReverbType >= NUM_REVERBTYPES) m_Settings.m_nReverbType = 0;
|
||||||
static SNDMIX_REVERB_PROPERTIES *spCurrentPreset = nullptr;
|
const SNDMIX_REVERB_PROPERTIES *rvbPreset = &gRvbPresets[m_Settings.m_nReverbType].Preset;
|
||||||
SNDMIX_REVERB_PROPERTIES *pRvbPreset = &gRvbPresets[m_Settings.m_nReverbType].Preset;
|
|
||||||
|
|
||||||
if ((pRvbPreset != spCurrentPreset) || (bReset))
|
if ((rvbPreset != m_currentPreset) || (bReset))
|
||||||
{
|
{
|
||||||
// Reverb output frequency is half of the dry output rate
|
// Reverb output frequency is half of the dry output rate
|
||||||
float flOutputFrequency = (float)MixingFreq;
|
float flOutputFrequency = (float)MixingFreq;
|
||||||
EnvironmentReverb rvb;
|
EnvironmentReverb rvb;
|
||||||
|
|
||||||
// Reset reverb parameters
|
// Reset reverb parameters
|
||||||
spCurrentPreset = pRvbPreset;
|
m_currentPreset = rvbPreset;
|
||||||
I3dl2_to_Generic(pRvbPreset, &rvb, flOutputFrequency,
|
I3dl2_to_Generic(rvbPreset, &rvb, flOutputFrequency,
|
||||||
RVBMINREFDELAY, RVBMAXREFDELAY,
|
RVBMINREFDELAY, RVBMAXREFDELAY,
|
||||||
RVBMINRVBDELAY, RVBMAXRVBDELAY,
|
RVBMINRVBDELAY, RVBMAXRVBDELAY,
|
||||||
( RVBDIF1L_LEN + RVBDIF1R_LEN
|
( RVBDIF1L_LEN + RVBDIF1R_LEN
|
||||||
|
|
|
@ -59,6 +59,8 @@ struct SWRvbRefDelay
|
||||||
LR16 RefOut[SNDMIX_REVERB_DELAY_MASK + 1]; // stereo output of reflections
|
LR16 RefOut[SNDMIX_REVERB_DELAY_MASK + 1]; // stereo output of reflections
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SNDMIX_REVERB_PROPERTIES;
|
||||||
|
|
||||||
|
|
||||||
// Late reverberation
|
// Late reverberation
|
||||||
// Tank diffusers lengths
|
// Tank diffusers lengths
|
||||||
|
@ -145,6 +147,7 @@ public:
|
||||||
mixsample_t gnRvbROfsVol, gnRvbLOfsVol;
|
mixsample_t gnRvbROfsVol, gnRvbLOfsVol;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
const SNDMIX_REVERB_PROPERTIES *m_currentPreset;
|
||||||
|
|
||||||
uint32 gnReverbSend;
|
uint32 gnReverbSend;
|
||||||
|
|
||||||
|
|
|
@ -574,8 +574,9 @@ bool CSoundFile::ReadAMF_DSMI(FileReader &file, ModLoadingFlags loadFlags)
|
||||||
for(uint16 i = 0; i < trackCount; i++)
|
for(uint16 i = 0; i < trackCount; i++)
|
||||||
{
|
{
|
||||||
// Track size is a 24-Bit value describing the number of byte triplets in this track.
|
// Track size is a 24-Bit value describing the number of byte triplets in this track.
|
||||||
uint32 trackSize = file.ReadUint16LE() | (file.ReadUint8() << 16);
|
uint8 trackSize[3];
|
||||||
trackData[i] = file.ReadChunk(trackSize * 3);
|
file.ReadArray(trackSize);
|
||||||
|
trackData[i] = file.ReadChunk((trackSize[0] | (trackSize[1] << 8) | (trackSize[2] << 16)) * 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(loadFlags & loadSampleData)
|
if(loadFlags & loadSampleData)
|
||||||
|
|
|
@ -234,7 +234,7 @@ bool CSoundFile::ReadFAR(FileReader &file, ModLoadingFlags loadFlags)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read break row and unused value
|
// Read break row and unused value (used to be pattern tempo)
|
||||||
ROWINDEX breakRow = patternChunk.ReadUint8();
|
ROWINDEX breakRow = patternChunk.ReadUint8();
|
||||||
patternChunk.Skip(1);
|
patternChunk.Skip(1);
|
||||||
if(breakRow > 0 && breakRow < numRows - 2)
|
if(breakRow > 0 && breakRow < numRows - 2)
|
||||||
|
@ -262,10 +262,10 @@ bool CSoundFile::ReadFAR(FileReader &file, ModLoadingFlags loadFlags)
|
||||||
m.instr = data[1] + 1;
|
m.instr = data[1] + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data[2] & 0x0F)
|
if(m.note != NOTE_NONE || data[2] > 0)
|
||||||
{
|
{
|
||||||
m.volcmd = VOLCMD_VOLUME;
|
m.volcmd = VOLCMD_VOLUME;
|
||||||
m.vol = (data[2] & 0x0F) << 2;
|
m.vol = (Clamp(data[2], uint8(1), uint8(16)) - 1u) * 4u;
|
||||||
}
|
}
|
||||||
|
|
||||||
m.param = data[3] & 0x0F;
|
m.param = data[3] & 0x0F;
|
||||||
|
|
|
@ -1083,7 +1083,7 @@ bool CSoundFile::ReadMID(FileReader &file, ModLoadingFlags loadFlags)
|
||||||
chn = 9;
|
chn = 9;
|
||||||
else if(chn < 10)
|
else if(chn < 10)
|
||||||
chn--;
|
chn--;
|
||||||
drumChns.set(chn, xg[7] != 0);
|
drumChns.set(chn, sysex.ReadUint8() != 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -435,12 +435,16 @@ bool CSoundFile::ReadPSM(FileReader &file, ModLoadingFlags loadFlags)
|
||||||
// Output of PLAY.EXE: "SMapTabl from pos 0 to pos -1 starting at 0 and adding 1 to it each time"
|
// Output of PLAY.EXE: "SMapTabl from pos 0 to pos -1 starting at 0 and adding 1 to it each time"
|
||||||
// It appears that this maps e.g. what is "I0" in the file to sample 1.
|
// It appears that this maps e.g. what is "I0" in the file to sample 1.
|
||||||
// If we were being fancy, we could implement this, but in practice it won't matter.
|
// If we were being fancy, we could implement this, but in practice it won't matter.
|
||||||
if (subChunk.ReadUint8() != 0x00 || subChunk.ReadUint8() != 0xFF || // "0 to -1" (does not seem to do anything)
|
{
|
||||||
subChunk.ReadUint8() != 0x00 || subChunk.ReadUint8() != 0x00 || // "at 0" (actually this appears to be the adding part - changing this to 0x01 0x00 offsets all samples by 1)
|
uint8 mapTable[6];
|
||||||
subChunk.ReadUint8() != 0x01 || subChunk.ReadUint8() != 0x00) // "adding 1" (does not seem to do anything)
|
if(!subChunk.ReadArray(mapTable)
|
||||||
|
|| mapTable[0] != 0x00 || mapTable[1] != 0xFF // "0 to -1" (does not seem to do anything)
|
||||||
|
|| mapTable[2] != 0x00 || mapTable[3] != 0x00 // "at 0" (actually this appears to be the adding part - changing this to 0x01 0x00 offsets all samples by 1)
|
||||||
|
|| mapTable[4] != 0x01 || mapTable[5] != 0x00) // "adding 1" (does not seem to do anything)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x0D: // Channel panning table - can be set using CONVERT.EXE /E
|
case 0x0D: // Channel panning table - can be set using CONVERT.EXE /E
|
||||||
|
|
|
@ -439,7 +439,7 @@ bool CSoundFile::ReadS3M(FileReader &file, ModLoadingFlags loadFlags)
|
||||||
|
|
||||||
if(hasAdlibPatches)
|
if(hasAdlibPatches)
|
||||||
{
|
{
|
||||||
AddToLog("This track uses Adlib instruments, which are not supported by OpenMPT.");
|
AddToLog("This track uses Adlib instruments, which are not supported by this version of OpenMPT.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -454,6 +454,12 @@ bool CSoundFile::ReadMediaFoundationSample(SAMPLEINDEX sample, FileReader &file,
|
||||||
|
|
||||||
result = true;
|
result = true;
|
||||||
|
|
||||||
|
if(!mo3Decode)
|
||||||
|
{
|
||||||
|
Samples[sample].Convert(MOD_TYPE_IT, GetType());
|
||||||
|
Samples[sample].PrecomputeLoops(*this, false);
|
||||||
|
}
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|
||||||
mptMFSafeRelease(&buffer);
|
mptMFSafeRelease(&buffer);
|
||||||
|
|
|
@ -254,7 +254,7 @@ bool CSoundFile::ReadInstrumentFromSong(INSTRUMENTINDEX targetInstr, const CSoun
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MODPLUG_TRACKER
|
#ifdef MODPLUG_TRACKER
|
||||||
if(!strcmp(pIns->filename, "") && srcSong.GetpModDoc() != nullptr)
|
if(!strcmp(pIns->filename, "") && srcSong.GetpModDoc() != nullptr && &srcSong != this)
|
||||||
{
|
{
|
||||||
mpt::String::Copy(pIns->filename, srcSong.GetpModDoc()->GetPathNameMpt().GetFullFileName().ToLocale());
|
mpt::String::Copy(pIns->filename, srcSong.GetpModDoc()->GetPathNameMpt().GetFullFileName().ToLocale());
|
||||||
}
|
}
|
||||||
|
@ -307,7 +307,7 @@ bool CSoundFile::ReadSampleFromSong(SAMPLEINDEX targetSample, const CSoundFile &
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MODPLUG_TRACKER
|
#ifdef MODPLUG_TRACKER
|
||||||
if(!strcmp(targetSmp.filename, "") && srcSong.GetpModDoc() != nullptr)
|
if(!strcmp(targetSmp.filename, "") && srcSong.GetpModDoc() != nullptr && &srcSong != this)
|
||||||
{
|
{
|
||||||
mpt::String::Copy(targetSmp.filename, mpt::ToCharset(GetCharsetInternal(), srcSong.GetpModDoc()->GetTitle()));
|
mpt::String::Copy(targetSmp.filename, mpt::ToCharset(GetCharsetInternal(), srcSong.GetpModDoc()->GetTitle()));
|
||||||
}
|
}
|
||||||
|
@ -446,7 +446,11 @@ bool CSoundFile::ReadWAVSample(SAMPLEINDEX nSample, FileReader &file, bool mayNo
|
||||||
} else if(wavFile.GetSampleFormat() == WAVFormatChunk::fmtMP3)
|
} else if(wavFile.GetSampleFormat() == WAVFormatChunk::fmtMP3)
|
||||||
{
|
{
|
||||||
// MP3 in WAV
|
// MP3 in WAV
|
||||||
return ReadMP3Sample(nSample, sampleChunk, true) || ReadMediaFoundationSample(nSample, sampleChunk, true);
|
bool loadedMP3 = ReadMP3Sample(nSample, sampleChunk, true) || ReadMediaFoundationSample(nSample, sampleChunk, true);
|
||||||
|
if(!loadedMP3)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else if(!wavFile.IsExtensibleFormat() && wavFile.MayBeCoolEdit16_8() && wavFile.GetSampleFormat() == WAVFormatChunk::fmtPCM && wavFile.GetBitsPerSample() == 32 && wavFile.GetBlockAlign() == wavFile.GetNumChannels() * 4)
|
} else if(!wavFile.IsExtensibleFormat() && wavFile.MayBeCoolEdit16_8() && wavFile.GetSampleFormat() == WAVFormatChunk::fmtPCM && wavFile.GetBitsPerSample() == 32 && wavFile.GetBlockAlign() == wavFile.GetNumChannels() * 4)
|
||||||
{
|
{
|
||||||
// Syntrillium Cool Edit hack to store IEEE 32bit floating point
|
// Syntrillium Cool Edit hack to store IEEE 32bit floating point
|
||||||
|
|
|
@ -1416,7 +1416,7 @@ void CSoundFile::InstrumentChange(ModChannel *pChn, uint32 instr, bool bPorta, b
|
||||||
pChn->nNewIns = 0;
|
pChn->nNewIns = 0;
|
||||||
|
|
||||||
// IT Compatiblity: NNA is reset on every note change, not every instrument change (fixes s7xinsnum.it).
|
// IT Compatiblity: NNA is reset on every note change, not every instrument change (fixes s7xinsnum.it).
|
||||||
if (pIns && ((!m_playBehaviour[kITNNAReset] && pSmp) || pIns->nMixPlug))
|
if (pIns && ((!m_playBehaviour[kITNNAReset] && pSmp) || pIns->nMixPlug || instrumentChanged))
|
||||||
pChn->nNNA = pIns->nNNA;
|
pChn->nNNA = pIns->nNNA;
|
||||||
|
|
||||||
// Update volume
|
// Update volume
|
||||||
|
|
Loading…
Reference in New Issue