From: <sag...@us...> - 2015-05-25 15:11:36
|
Revision: 5173 http://sourceforge.net/p/modplug/code/5173 Author: saga-games Date: 2015-05-25 15:11:30 +0000 (Mon, 25 May 2015) Log Message: ----------- [Mod] Make CSoundFile::songArtist unicode and add support for reading and writing it in OpenMPT extensions (no UI support yet, though) Modified Paths: -------------- trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_dmf.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2015-05-25 14:43:26 UTC (rev 5172) +++ trunk/OpenMPT/libopenmpt/libopenmpt_impl.cpp 2015-05-25 15:11:30 UTC (rev 5173) @@ -884,7 +884,7 @@ } else if ( key == std::string("tracker") ) { return m_sndFile->madeWithTracker; } else if ( key == std::string("artist") ) { - return mod_string_to_utf8( m_sndFile->songArtist ); + return mpt::ToCharset( mpt::CharsetUTF8, m_sndFile->songArtist ); } else if ( key == std::string("title") ) { return mod_string_to_utf8( m_sndFile->GetTitle() ); } else if ( key == std::string("date") ) { Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2015-05-25 14:43:26 UTC (rev 5172) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2015-05-25 15:11:30 UTC (rev 5173) @@ -204,7 +204,7 @@ { m_Settings.Tags.title = mpt::ToUnicode(mpt::CharsetLocale, m_SndFile.GetTitle()); m_Settings.Tags.comments = mpt::ToUnicode(mpt::CharsetLocale, m_SndFile.songMessage.GetFormatted(SongMessage::leLF)); - m_Settings.Tags.artist = m_Settings.storedTags.artist; + m_Settings.Tags.artist = m_SndFile.songArtist; m_Settings.Tags.album = m_Settings.storedTags.album; m_Settings.Tags.trackno = m_Settings.storedTags.trackno; m_Settings.Tags.year = m_Settings.storedTags.year; Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2015-05-25 14:43:26 UTC (rev 5172) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2015-05-25 15:11:30 UTC (rev 5173) @@ -892,9 +892,7 @@ { std::string str; file.ReadString<mpt::String::spacePadded>(str, composerLength); - str = mpt::ToCharset(mpt::CharsetCP437, mpt::CharsetCP437AMS2, str); - songMessage.Read(str.c_str(), str.length(), SongMessage::leAutodetect); - songArtist = str; + songArtist = mpt::ToUnicode(mpt::CharsetCP437AMS2, str); } // Channel names Modified: trunk/OpenMPT/soundlib/Load_dmf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_dmf.cpp 2015-05-25 14:43:26 UTC (rev 5172) +++ trunk/OpenMPT/soundlib/Load_dmf.cpp 2015-05-25 15:11:30 UTC (rev 5173) @@ -973,7 +973,11 @@ InitializeGlobals(); mpt::String::Read<mpt::String::spacePadded>(songName, fileHeader.songname); - mpt::String::Read<mpt::String::spacePadded>(songArtist, fileHeader.composer); + { + std::string artist; + mpt::String::Read<mpt::String::spacePadded>(artist, fileHeader.composer); + songArtist = mpt::ToUnicode(mpt::CharsetCP437, artist); + } FileHistory mptHistory; MemsetZero(mptHistory); Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2015-05-25 14:43:26 UTC (rev 5172) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2015-05-25 15:11:30 UTC (rev 5173) @@ -160,8 +160,14 @@ mpt::String::Read<mpt::String::maybeNullTerminated>(songName, fileHeader.songTitle); // Artist name - mpt::String::Read<mpt::String::maybeNullTerminated>(songArtist, fileHeader.songMusician); - if(songArtist == "Unknown") songArtist.clear(); + { + std::string artist; + mpt::String::Read<mpt::String::maybeNullTerminated>(artist, fileHeader.songMusician); + if(artist != "Unknown") + { + songArtist = mpt::ToUnicode(mpt::CharsetCP437, artist); + } + } // Read channel pan map... 0...15 = channel panning, 16 = surround channel, 255 = channel does not exist m_nChannels = 32; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2015-05-25 14:43:26 UTC (rev 5172) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2015-05-25 15:11:30 UTC (rev 5173) @@ -170,7 +170,7 @@ //Read & set tunings for instruments std::vector<std::string> notFoundTunings; - for(UINT i = 1; i<=csf.GetNumInstruments(); i++) + for(INSTRUMENTINDEX i = 1; i<=csf.GetNumInstruments(); i++) { uint16 ui; iStrm.read(reinterpret_cast<char*>(&ui), sizeof(ui)); @@ -2008,42 +2008,39 @@ void CSoundFile::SaveExtendedSongProperties(FILE* f) const //-------------------------------------------------------- { - //Extra song data - Yet Another Hack. - { - const uint32 code = MAGIC4BE('M','P','T','S'); - mpt::IO::WriteIntLE(f, code); - } + // Extra song data - Yet Another Hack. + mpt::IO::WriteIntLE<uint32>(f, MAGIC4BE('M','P','T','S')); -#define WRITEMODULARHEADER(c1, c2, c3, c4, fsize) \ +#define WRITEMODULARHEADER(code, fsize) \ { \ - const uint32 code = MAGIC4BE(c1, c2, c3, c4); \ mpt::IO::WriteIntLE<uint32>(f, code); \ MPT_ASSERT(fsize <= uint16_max); \ const uint16 _size = fsize; \ mpt::IO::WriteIntLE<uint16>(f, _size); \ } -#define WRITEMODULAR(c1, c2, c3, c4, field) \ +#define WRITEMODULAR(code, field) \ { \ - WRITEMODULARHEADER(c1, c2, c3, c4, sizeof(field)) \ + WRITEMODULARHEADER(code, sizeof(field)) \ mpt::IO::WriteIntLE(f, field); \ } if(m_nDefaultTempo > 255) { - WRITEMODULAR('D','T','.','.', m_nDefaultTempo); + WRITEMODULAR(MAGIC4BE('D','T','.','.'), m_nDefaultTempo); } - WRITEMODULAR('R','P','B','.', m_nDefaultRowsPerBeat); - WRITEMODULAR('R','P','M','.', m_nDefaultRowsPerMeasure); + WRITEMODULAR(MAGIC4BE('R','P','B','.'), m_nDefaultRowsPerBeat); + WRITEMODULAR(MAGIC4BE('R','P','M','.'), m_nDefaultRowsPerMeasure); if(GetType() != MOD_TYPE_XM) { - WRITEMODULAR('C','.','.','.', m_nChannels); + WRITEMODULAR(MAGIC4BE('C','.','.','.'), m_nChannels); } - if(TypeIsIT_MPT() && GetNumChannels() > 64) //IT header has room only for 64 channels. Save the - { //settings that do not fit to the header here as an extension. - WRITEMODULARHEADER('C','h','n','S', (GetNumChannels() - 64) * 2); + if(TypeIsIT_MPT() && GetNumChannels() > 64) + { + // IT header has only room for 64 channels. Save the settings that do not fit to the header here as an extension. + WRITEMODULARHEADER(MAGIC4BE('C','h','n','S'), (GetNumChannels() - 64) * 2); for(CHANNELINDEX chn = 64; chn < GetNumChannels(); chn++) { uint8 panvol[2]; @@ -2056,31 +2053,31 @@ } { - WRITEMODULARHEADER('T','M','.','.', 1); + WRITEMODULARHEADER(MAGIC4BE('T','M','.','.'), 1); uint8 mode = static_cast<uint8>(m_nTempoMode); fwrite(&mode, sizeof(mode), 1, f); } const int32 tmpMixLevels = static_cast<int32>(m_nMixLevels); - WRITEMODULAR('P','M','M','.', tmpMixLevels); + WRITEMODULAR(MAGIC4BE('P','M','M','.'), tmpMixLevels); if(m_dwCreatedWithVersion) { - WRITEMODULAR('C','W','V','.', m_dwCreatedWithVersion); + WRITEMODULAR(MAGIC4BE('C','W','V','.'), m_dwCreatedWithVersion); } - WRITEMODULAR('L','S','W','V', m_dwLastSavedWithVersion); - WRITEMODULAR('S','P','A','.', m_nSamplePreAmp); - WRITEMODULAR('V','S','T','V', m_nVSTiVolume); + WRITEMODULAR(MAGIC4BE('L','S','W','V'), m_dwLastSavedWithVersion); + WRITEMODULAR(MAGIC4BE('S','P','A','.'), m_nSamplePreAmp); + WRITEMODULAR(MAGIC4BE('V','S','T','V'), m_nVSTiVolume); if(GetType() == MOD_TYPE_XM && m_nDefaultGlobalVolume != MAX_GLOBAL_VOLUME) { - WRITEMODULAR('D','G','V','.', m_nDefaultGlobalVolume); + WRITEMODULAR(MAGIC4BE('D','G','V','.'), m_nDefaultGlobalVolume); } if(GetType() != MOD_TYPE_XM && m_nRestartPos != 0) { - WRITEMODULAR('R','P','.','.', m_nRestartPos); + WRITEMODULAR(MAGIC4BE('R','P','.','.'), m_nRestartPos); } // Sample cues @@ -2094,7 +2091,7 @@ // Write one chunk for every sample. // Rationale: chunks are limited to 65536 bytes, which can easily be reached // with the amount of samples that OpenMPT supports. - WRITEMODULARHEADER('S','E','U','C', 2 + CountOf(sample.cues) * 4); + WRITEMODULARHEADER(MAGIC4LE('C','U','E','S'), 2 + CountOf(sample.cues) * 4); mpt::IO::WriteIntLE<uint16>(f, smp); for(std::size_t i = 0; i < CountOf(sample.cues); i++) { @@ -2107,20 +2104,28 @@ //Additional flags for XM/IT/MPTM if(m_ModFlags) { - WRITEMODULAR('M','S','F','.', m_ModFlags.GetRaw()); + WRITEMODULAR(MAGIC4BE('M','S','F','.'), m_ModFlags.GetRaw()); } + if(!songArtist.empty()) + { + std::string songArtistU8 = mpt::ToCharset(mpt::CharsetUTF8, songArtist); + uint16 length = mpt::saturate_cast<uint16>(songArtistU8.length()); + WRITEMODULARHEADER(MAGIC4LE('A','U','T','H'), length); + mpt::IO::WriteRaw(f, songArtistU8.c_str(), length); + } + #ifdef MODPLUG_TRACKER - //MIMA, MIDI mapping directives + // MIDI mapping directives if(GetMIDIMapper().GetCount() > 0) { const size_t objectsize = GetMIDIMapper().GetSerializationSize(); if(objectsize > size_t(int16_max)) { - AddToLog("Datafield overflow with MIDI to plugparam mappings; data won't be written."); + AddToLog("Too many MIDI Mapping directives to save; data won't be written."); } else { - WRITEMODULARHEADER('M','I','M','A', static_cast<uint16>(objectsize)); + WRITEMODULARHEADER(MAGIC4BE('M','I','M','A'), static_cast<uint16>(objectsize)); GetMIDIMapper().Serialize(f); } } @@ -2240,6 +2245,13 @@ #ifdef MODPLUG_TRACKER case MAGIC4BE('M','I','M','A'): GetMIDIMapper().Deserialize(chunk); break; #endif + case MAGIC4LE('A','U','T','H'): + { + std::string artist; + chunk.ReadString<mpt::String::spacePadded>(artist, chunk.GetLength()); + songArtist = mpt::ToUnicode(mpt::CharsetUTF8, artist); + } + break; case MAGIC4BE('C','h','n','S'): if(size <= (MAX_BASECHANNELS - 64) * 2 && (size % 2u) == 0) { Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2015-05-25 14:43:26 UTC (rev 5172) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2015-05-25 15:11:30 UTC (rev 5173) @@ -354,7 +354,11 @@ #endif pmib = (const MDLInfoBlock *)(lpStream+dwMemPos); mpt::String::Read<mpt::String::maybeNullTerminated>(songName, pmib->songname); - mpt::String::Read<mpt::String::maybeNullTerminated>(songArtist, pmib->composer); + { + std::string artist; + mpt::String::Read<mpt::String::maybeNullTerminated>(artist, pmib->composer); + songArtist = mpt::ToUnicode(mpt::CharsetCP437, artist); + } norders = pmib->norders; if (norders > MAX_ORDERS) norders = MAX_ORDERS; Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mt2.cpp 2015-05-25 14:43:26 UTC (rev 5172) +++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2015-05-25 15:11:30 UTC (rev 5173) @@ -610,8 +610,12 @@ { uint8 summaryMask[6]; chunk.ReadArray(summaryMask); - chunk.ReadNullString(songArtist); - if(songArtist == "Unregistered") songArtist.clear(); + std::string artist; + chunk.ReadNullString(artist); + if(artist != "Unregistered") + { + songArtist = mpt::ToUnicode(mpt::CharsetWindows1252, artist); + } } break; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2015-05-25 14:43:26 UTC (rev 5172) +++ trunk/OpenMPT/soundlib/Sndfile.h 2015-05-25 15:11:30 UTC (rev 5173) @@ -520,7 +520,7 @@ public: std::string songName; - std::string songArtist; + mpt::ustring songArtist; // Song message SongMessage songMessage; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |