From: <sag...@us...> - 2011-11-22 19:46:51
|
Revision: 1141 http://modplug.svn.sourceforge.net/modplug/?rev=1141&view=rev Author: saga-games Date: 2011-11-22 19:46:44 +0000 (Tue, 22 Nov 2011) Log Message: ----------- [Fix] Sample copying / saving: Extra sample settings (autovibrato and such) are now saved / copied correctly in all cases. Previously, they were f.e. lost when copying a sample that has loops and were ignored outright in WAV files. [Mod] OpenMPT: Version is now 1.20.00.55 Modified Paths: -------------- trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/Sampleio.cpp Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2011-11-21 20:58:57 UTC (rev 1140) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2011-11-22 19:46:44 UTC (rev 1141) @@ -1399,7 +1399,7 @@ m_dwStatus |= SMPSTATUS_MOUSEDRAG; SetFocus(); SetCapture(); - bool oldsel = (m_dwBeginSel != m_dwEndSel) ? true : false; + bool oldsel = (m_dwBeginSel != m_dwEndSel); // shift + click = update selection if(!m_bDrawingEnabled && CMainFrame::GetInputHandler()->ShiftPressed()) @@ -1870,10 +1870,10 @@ EmptyClipboard(); LPBYTE p = (LPBYTE)GlobalLock(hCpy); WAVEFILEHEADER *phdr = (WAVEFILEHEADER *)p; - WAVEFORMATHEADER *pfmt = (WAVEFORMATHEADER *)(p+sizeof(WAVEFILEHEADER)); - WAVEDATAHEADER *pdata = (WAVEDATAHEADER *)(p+sizeof(WAVEFILEHEADER)+sizeof(WAVEFORMATHEADER)); + WAVEFORMATHEADER *pfmt = (WAVEFORMATHEADER *)(p + sizeof(WAVEFILEHEADER)); + WAVEDATAHEADER *pdata = (WAVEDATAHEADER *)(p + sizeof(WAVEFILEHEADER) + sizeof(WAVEFORMATHEADER)); phdr->id_RIFF = IFFID_RIFF; - phdr->filesize = sizeof(WAVEFILEHEADER)+sizeof(WAVEFORMATHEADER)+sizeof(WAVEDATAHEADER)-8; + phdr->filesize = sizeof(WAVEFILEHEADER) + sizeof(WAVEFORMATHEADER) + sizeof(WAVEDATAHEADER) - 8; phdr->id_WAVE = IFFID_WAVE; pfmt->id_fmt = IFFID_fmt; pfmt->hdrlen = 16; @@ -1929,26 +1929,34 @@ WAVEEXTRAHEADER *pxh = (WAVEEXTRAHEADER *)(psamples+dwSmpLen+psh->smpl_len+8); pxh->xtra_id = IFFID_xtra; pxh->xtra_len = sizeof(WAVEEXTRAHEADER)-8; + pxh->dwFlags = sample.uFlags; pxh->wPan = sample.nPan; pxh->wVolume = sample.nVolume; pxh->wGlobalVol = sample.nGlobalVol; + pxh->nVibType = sample.nVibType; pxh->nVibSweep = sample.nVibSweep; pxh->nVibDepth = sample.nVibDepth; pxh->nVibRate = sample.nVibRate; + if(pSndFile->GetType() & MOD_TYPE_XM && (pxh->nVibDepth | pxh->nVibRate)) + { + // XM vibrato is upside down + pxh->nVibSweep = 255 - pxh->nVibSweep; + } + if ((pSndFile->m_szNames[m_nSample][0]) || (sample.filename[0])) { LPSTR pszText = (LPSTR)(pxh+1); - memcpy(pszText, pSndFile->m_szNames[m_nSample], 32); - pxh->xtra_len += 32; + memcpy(pszText, pSndFile->m_szNames[m_nSample], MAX_SAMPLENAME); + pxh->xtra_len += MAX_SAMPLENAME; if (sample.filename[0]) { - memcpy(pszText + 32, sample.filename, MAX_SAMPLEFILENAME); + memcpy(pszText + MAX_SAMPLENAME, sample.filename, MAX_SAMPLEFILENAME); pxh->xtra_len += MAX_SAMPLEFILENAME; } } - phdr->filesize += sizeof(WAVESMPLHEADER) + pxh->xtra_len + 8; + phdr->filesize += (psh->smpl_len + 8) + (pxh->xtra_len + 8); } GlobalUnlock(hCpy); SetClipboardData (CF_WAVE, (HANDLE) hCpy); Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-11-21 20:58:57 UTC (rev 1140) +++ trunk/OpenMPT/mptrack/version.h 2011-11-22 19:46:44 UTC (rev 1141) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 54 +#define VER_MINORMINOR 55 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2011-11-21 20:58:57 UTC (rev 1140) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2011-11-22 19:46:44 UTC (rev 1141) @@ -431,10 +431,8 @@ pSmp->nVolume = 256; pSmp->nGlobalVol = 64; pSmp->uFlags = (pfmt->bitspersample > 8) ? CHN_16BIT : 0; - if (m_nType & MOD_TYPE_XM) pSmp->uFlags |= CHN_PANNING; pSmp->RelativeTone = 0; pSmp->nFineTune = 0; - if (m_nType & MOD_TYPE_XM) FrequencyToTranspose(pSmp); pSmp->nVibType = pSmp->nVibSweep = pSmp->nVibDepth = pSmp->nVibRate = 0; pSmp->filename[0] = 0; MemsetZero(m_szNames[nSample]); @@ -530,16 +528,19 @@ LPSTR pszTextEx = (LPSTR)(pxh+1); if (xtrabytes >= MAX_SAMPLENAME) { - memcpy(m_szNames[nSample], pszTextEx, MAX_SAMPLENAME - 1); + memcpy(m_szNames[nSample], pszTextEx, MAX_SAMPLENAME); + StringFixer::SetNullTerminator(m_szNames[nSample]); pszTextEx += MAX_SAMPLENAME; xtrabytes -= MAX_SAMPLENAME; if (xtrabytes >= MAX_SAMPLEFILENAME) { memcpy(pSmp->filename, pszTextEx, MAX_SAMPLEFILENAME); + StringFixer::SetNullTerminator(pSmp->filename); xtrabytes -= MAX_SAMPLEFILENAME; } } } + ConvertSample(nSample, MOD_TYPE_IT); return true; } @@ -561,11 +562,11 @@ FILE *f; if ((f = fopen(lpszFileName, "wb")) == NULL) return false; - memset(&extra, 0, sizeof(extra)); - memset(&smpl, 0, sizeof(smpl)); + MemsetZero(extra); + MemsetZero(smpl); header.id_RIFF = IFFID_RIFF; - header.filesize = sizeof(header)+sizeof(format)+sizeof(data)+sizeof(extra)-8; - header.filesize += 12+8+16+8+32; // LIST(INAM, ISFT) + header.filesize = sizeof(header) + sizeof(format) + sizeof(data) + sizeof(smpl) + sizeof(extra) - 8; + header.filesize += sizeof(list) + 8 + 16 + 8 + 32; // LIST(INAM, ISFT) header.id_WAVE = IFFID_WAVE; format.id_fmt = IFFID_fmt; format.hdrlen = 16; @@ -636,15 +637,23 @@ // "xtra" field extra.xtra_id = IFFID_xtra; extra.xtra_len = sizeof(extra) - 8; + extra.dwFlags = pSmp->uFlags; extra.wPan = pSmp->nPan; extra.wVolume = pSmp->nVolume; extra.wGlobalVol = pSmp->nGlobalVol; extra.wReserved = 0; + extra.nVibType = pSmp->nVibType; extra.nVibSweep = pSmp->nVibSweep; extra.nVibDepth = pSmp->nVibDepth; extra.nVibRate = pSmp->nVibRate; + if(GetType() & MOD_TYPE_XM && (extra.nVibDepth | extra.nVibRate)) + { + // XM vibrato is upside down + extra.nVibSweep = 255 - extra.nVibSweep; + } + fwrite(&extra, 1, sizeof(extra), f); fclose(f); return true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |