From: <man...@us...> - 2013-10-04 22:59:07
|
Revision: 2823 http://sourceforge.net/p/modplug/code/2823 Author: manxorist Date: 2013-10-04 22:58:58 +0000 (Fri, 04 Oct 2013) Log Message: ----------- [Mod] Split mod container type from mod type and expose the container type (if available) in libopenmpt, xmp-openmpt and openmpt123. Modified Paths: -------------- trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp trunk/OpenMPT/openmpt123/openmpt123.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_mo3.cpp trunk/OpenMPT/soundlib/Load_umx.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Tables.cpp Modified: trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2013-10-04 20:42:52 UTC (rev 2822) +++ trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2013-10-04 22:58:58 UTC (rev 2823) @@ -540,6 +540,8 @@ std::vector<std::string> retval; retval.push_back("type"); retval.push_back("type_long"); + retval.push_back("container"); + retval.push_back("container_long"); retval.push_back("tracker"); retval.push_back("author"); retval.push_back("title"); @@ -552,6 +554,10 @@ return CSoundFile::ModTypeToString( m_sndFile->GetType() ); } else if ( key == std::string("type_long") ) { return CSoundFile::ModTypeToTracker( m_sndFile->GetType() ); + } else if ( key == std::string("container") ) { + return CSoundFile::ModContainerTypeToString( m_sndFile->GetContainerType() ); + } else if ( key == std::string("container_long") ) { + return CSoundFile::ModContainerTypeToTracker( m_sndFile->GetContainerType() ); } else if ( key == std::string("tracker") ) { return m_sndFile->madeWithTracker; } else if ( key == std::string("title") ) { Modified: trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp 2013-10-04 20:42:52 UTC (rev 2822) +++ trunk/OpenMPT/libopenmpt/libopenmpt_xmplay.cpp 2013-10-04 22:58:58 UTC (rev 2823) @@ -660,7 +660,11 @@ std::ostringstream str; str << "\r" - << "Format" << "\t" << self->mod->get_metadata("type") << " (" << self->mod->get_metadata("type_long") << ")" << "\r" + << "Format" << "\t" << self->mod->get_metadata("type") << " (" << self->mod->get_metadata("type_long") << ")" << "\r"; + if ( !self->mod->get_metadata("container").empty() ) { + str << "Container" << "\t" << self->mod->get_metadata("container") << " (" << self->mod->get_metadata("container_long") << ")" << "\r"; + } + str << "Channels" << "\t" << self->mod->get_num_channels() << "\r" << "Orders" << "\t" << self->mod->get_num_orders() << "\r" << "Patterns" << "\t" << self->mod->get_num_patterns() << "\r" Modified: trunk/OpenMPT/openmpt123/openmpt123.cpp =================================================================== --- trunk/OpenMPT/openmpt123/openmpt123.cpp 2013-10-04 20:42:52 UTC (rev 2822) +++ trunk/OpenMPT/openmpt123/openmpt123.cpp 2013-10-04 22:58:58 UTC (rev 2823) @@ -1027,6 +1027,7 @@ if ( flags.show_details ) { log << "Filename...: " << get_filename( filename ) << std::endl; log << "Size.......: " << bytes_to_string( filesize ) << std::endl; + log << "Container..: " << ( mod.get_metadata( "container" ).empty() ? std::string("none") : ( mod.get_metadata( "container" ) + " (" + mod.get_metadata( "container_long" ) + ")" ) ) << std::endl; log << "Type.......: " << mod.get_metadata( "type" ) << " (" << mod.get_metadata( "type_long" ) << ")" << std::endl; log << "Tracker....: " << mod.get_metadata( "tracker" ) << std::endl; } Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-10-04 20:42:52 UTC (rev 2822) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2013-10-04 22:58:58 UTC (rev 2823) @@ -158,6 +158,7 @@ InitializeGlobals(); m_nType = gdmFormatOrigin[fileHeader.originalFormat]; + m_ContainerType = MOD_CONTAINERTYPE_GDM; madeWithTracker = mpt::String::Format("BWSB 2GDM %d.%d (converted from %s)", fileHeader.trackerMajorVer, fileHeader.formatMinorVer, ModTypeToTracker(GetType()).c_str()); // Song name Modified: trunk/OpenMPT/soundlib/Load_mo3.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mo3.cpp 2013-10-04 20:42:52 UTC (rev 2822) +++ trunk/OpenMPT/soundlib/Load_mo3.cpp 2013-10-04 22:58:58 UTC (rev 2823) @@ -90,6 +90,10 @@ || ReadMTM(unpackedFile, loadFlags) || ReadMod(unpackedFile, loadFlags) || ReadM15(unpackedFile, loadFlags); + if(result) + { + m_ContainerType = MOD_CONTAINERTYPE_MO3; + } } UNMO3_Free(stream); Modified: trunk/OpenMPT/soundlib/Load_umx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_umx.cpp 2013-10-04 20:42:52 UTC (rev 2822) +++ trunk/OpenMPT/soundlib/Load_umx.cpp 2013-10-04 22:58:58 UTC (rev 2823) @@ -291,6 +291,7 @@ || ReadMod(fileChunk, loadFlags) || ReadM15(fileChunk, loadFlags)) { + m_ContainerType = MOD_CONTAINERTYPE_UMX; return true; } #ifdef MODPLUG_TRACKER @@ -314,7 +315,7 @@ if(m_nSamples != 0) { InitializeChannels(); - m_nType = MOD_TYPE_UMX; + m_nType = MOD_TYPE_UAX; m_nChannels = 4; Patterns.Insert(0, 64); Order[0] = 0; Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2013-10-04 20:42:52 UTC (rev 2822) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2013-10-04 22:58:58 UTC (rev 2823) @@ -87,7 +87,7 @@ MOD_TYPE_ULT = 0x80, MOD_TYPE_STM = 0x100, MOD_TYPE_FAR = 0x200, - MOD_TYPE_WAV = 0x400, + MOD_TYPE_WAV = 0x400, // PCM as module MOD_TYPE_AMF = 0x800, MOD_TYPE_AMS = 0x1000, MOD_TYPE_DSM = 0x2000, @@ -105,14 +105,21 @@ MOD_TYPE_IMF = 0x2000000, MOD_TYPE_AMS2 = 0x4000000, MOD_TYPE_DIGI = 0x8000000, + MOD_TYPE_UAX = 0x10000000, // sampleset as module // Container formats (not used at the moment) - MOD_TYPE_MO3 = 0x20000000, - MOD_TYPE_GDM = 0x40000000, - MOD_TYPE_UMX = 0x80000000, }; DECLARE_FLAGSET(MODTYPE) +enum MODCONTAINERTYPE +{ + MOD_CONTAINERTYPE_NONE = 0x0, + MOD_CONTAINERTYPE_MO3 = 0x1, + MOD_CONTAINERTYPE_GDM = 0x2, + MOD_CONTAINERTYPE_UMX = 0x3, +}; + + enum MOD_CHARSET_CERTAINTY { MOD_CHARSET_UNKNOWN, Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2013-10-04 20:42:52 UTC (rev 2822) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2013-10-04 22:58:58 UTC (rev 2823) @@ -515,6 +515,7 @@ gnDryLOfsVol = 0; gnDryROfsVol = 0; m_nType = MOD_TYPE_NONE; + m_ContainerType = MOD_CONTAINERTYPE_NONE; m_nChannels = 0; m_nMixChannels = 0; m_nSamples = 0; @@ -594,6 +595,7 @@ { // Do not add or change any of these values! And if you do, review each and every loader to check if they require these defaults! m_nType = MOD_TYPE_NONE; + m_ContainerType = MOD_CONTAINERTYPE_NONE; m_nChannels = 0; m_nInstruments = 0; m_nSamples = 0; @@ -730,6 +732,7 @@ && !ReadM15(file, loadFlags)) { m_nType = MOD_TYPE_NONE; + m_ContainerType = MOD_CONTAINERTYPE_NONE; } if(madeWithTracker.empty()) @@ -952,6 +955,7 @@ } m_nType = MOD_TYPE_NONE; + m_ContainerType = MOD_CONTAINERTYPE_NONE; m_nChannels = m_nSamples = m_nInstruments = 0; return TRUE; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-10-04 20:42:52 UTC (rev 2822) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-10-04 22:58:58 UTC (rev 2823) @@ -321,6 +321,9 @@ CModDoc *m_pModDoc; // Can be a null pointer for example when previewing samples from the treeview. #endif // MODPLUG_TRACKER FlagSet<MODTYPE> m_nType; +private: + MODCONTAINERTYPE m_ContainerType; +public: CHANNELINDEX m_nChannels; SAMPLEINDEX m_nSamples; INSTRUMENTINDEX m_nInstruments; @@ -449,6 +452,8 @@ bool TypeIsIT_MPT_XM() const { return (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM)) != 0; } bool TypeIsS3M_IT_MPT() const { return (m_nType & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT)) != 0; } + MODCONTAINERTYPE GetContainerType() const { return m_ContainerType; } + // rough heuristic, could be improved std::pair<MOD_CHARSET_CERTAINTY, std::string> GetCharset() const { return GetCharsetFromModType(GetType()); } @@ -551,7 +556,9 @@ static std::vector<const char *> GetSupportedExtensions(bool otherFormats); static std::pair<MOD_CHARSET_CERTAINTY, std::string> GetCharsetFromModType(MODTYPE modtype); static const char * ModTypeToString(MODTYPE modtype); + static std::string CSoundFile::ModContainerTypeToString(MODCONTAINERTYPE containertype); static std::string ModTypeToTracker(MODTYPE modtype); + static std::string CSoundFile::ModContainerTypeToTracker(MODCONTAINERTYPE containertype); void UpgradeModFlags(); void UpgradeSong(); Modified: trunk/OpenMPT/soundlib/Tables.cpp =================================================================== --- trunk/OpenMPT/soundlib/Tables.cpp 2013-10-04 20:42:52 UTC (rev 2822) +++ trunk/OpenMPT/soundlib/Tables.cpp 2013-10-04 22:58:58 UTC (rev 2823) @@ -90,14 +90,6 @@ { MOD_TYPE_IMF, "Imago Orpheus", "imf" }, { MOD_TYPE_J2B, "Galaxy Sound System", "j2b" }, - // Container formats - { MOD_TYPE_GDM, "General Digital Music", "gdm" }, - { MOD_TYPE_UMX, "Unreal Music", "umx" }, - { MOD_TYPE_UMX, "Unreal Sounds", "uax" }, -#ifndef NO_MO3 - { MOD_TYPE_MO3, "MO3", "mo3" }, -#endif // NO_MO3 - #ifndef NO_ARCHIVE_SUPPORT // Compressed modules { MOD_TYPE_MOD, "ProTracker", "mdz" }, @@ -109,11 +101,32 @@ #endif }; + +struct ModContainerInfo +{ + MODCONTAINERTYPE format; // MOD_CONTAINERTYPE_XXXX + const char *name; // "Unreal Music" + const char *extension; // "umx" +}; + +// remember to also update libopenmpt/libopenmpt_foobar2000.cpp (all other plugins read these dynamically) +static const ModContainerInfo modContainerInfo[] = +{ + // Container formats + { MOD_CONTAINERTYPE_GDM, "General Digital Music", "gdm" }, + { MOD_CONTAINERTYPE_UMX, "Unreal Music", "umx" }, +#ifndef NO_MO3 + { MOD_CONTAINERTYPE_MO3, "Un4seen MO3", "mo3" }, +#endif // NO_MO3 +}; + + #ifdef MODPLUG_TRACKER static const ModFormatInfo otherFormatInfo[] = { // Other stuff - { MOD_TYPE_WAV, "Wave", "wav" }, + { MOD_TYPE_WAV, "Wave", "wav" }, // PCM as module + { MOD_TYPE_UAX, "Unreal Sounds", "uax" }, // sampleset as module { MOD_TYPE_MID, "MIDI", "mid" }, { MOD_TYPE_MID, "MIDI", "rmi" }, { MOD_TYPE_MID, "MIDI", "smf" }, @@ -196,6 +209,14 @@ exts.push_back(modFormatInfo[i].extension); } } + for(size_t i = 0; i < CountOf(modContainerInfo); i++) + { + // Avoid dupes in list + if(i == 0 || strcmp(modContainerInfo[i].extension, modContainerInfo[i - 1].extension)) + { + exts.push_back(modContainerInfo[i].extension); + } + } #ifdef MODPLUG_TRACKER if(otherFormats) { @@ -225,6 +246,20 @@ } +std::string CSoundFile::ModContainerTypeToString(MODCONTAINERTYPE containertype) +//------------------------------------------------------------------------------ +{ + for(size_t i = 0; i < CountOf(modContainerInfo); i++) + { + if(modContainerInfo[i].format == containertype) + { + return modContainerInfo[i].extension; + } + } + return ""; +} + + std::string CSoundFile::ModTypeToTracker(MODTYPE modtype) //------------------------------------------------------- { @@ -250,6 +285,32 @@ } +std::string CSoundFile::ModContainerTypeToTracker(MODCONTAINERTYPE containertype) +//------------------------------------------------------------------------------- +{ + std::set<std::string> retvals; + std::string retval; + for(size_t i = 0; i < CountOf(modContainerInfo); i++) + { + if(modContainerInfo[i].format == containertype) + { + std::string name = modContainerInfo[i].name; + if(retvals.find(name) == retvals.end()) + { + retvals.insert(name); + if(!retval.empty()) + { + retval += " / "; + } + retval += name; + } + } + } + return retval; +} + + + /////////////////////////////////////////////////////////////////////// const uint8 ImpulseTrackerPortaVolCmd[16] = This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |