From: <sag...@us...> - 2013-11-10 01:20:45
|
Revision: 3161 http://sourceforge.net/p/modplug/code/3161 Author: saga-games Date: 2013-11-10 01:20:37 +0000 (Sun, 10 Nov 2013) Log Message: ----------- [Ref] Convert complete file I/O chain in sample/instrument editor to mpt::PathString. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Ctrl_smp.h trunk/OpenMPT/soundlib/SampleFormats.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-11-10 00:27:57 UTC (rev 3160) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2013-11-10 01:20:37 UTC (rev 3161) @@ -1077,7 +1077,7 @@ break; case CTRLMSG_INS_OPENFILE: - if (lParam) return OpenInstrument((LPCSTR)lParam); + if (lParam) return OpenInstrument(mpt::PathString::FromCString((LPCSTR)lParam)); break; case CTRLMSG_INS_SONGDROP: @@ -1392,14 +1392,14 @@ } -BOOL CCtrlInstruments::OpenInstrument(LPCSTR lpszFileName) -//-------------------------------------------------------- +BOOL CCtrlInstruments::OpenInstrument(const mpt::PathString &fileName) +//-------------------------------------------------------------------- { CMappedFile f; BOOL bFirst, bOk; BeginWaitCursor(); - if ((!lpszFileName) || (!f.Open(mpt::PathString::FromLocale(lpszFileName)))) + if(!f.Open(fileName)) { EndWaitCursor(); return FALSE; @@ -1424,7 +1424,7 @@ m_modDoc.UpdateAllViews(NULL, HINT_SAMPLEINFO | HINT_MODTYPE, NULL); // -> CODE#0023 // -> DESC="IT project files (.itp)" - m_sndFile.m_szInstrumentPath[m_nInstrument - 1] = lpszFileName; + m_sndFile.m_szInstrumentPath[m_nInstrument - 1] = fileName.ToLocale(); SetInstrumentModified(false); // -! NEW_FEATURE#0023 bOk = TRUE; @@ -1434,21 +1434,21 @@ EndWaitCursor(); if (bOk) { + TrackerDirectories::Instance().SetWorkingDirectory(fileName, DIR_INSTRUMENTS, true); ModInstrument *pIns = m_sndFile.Instruments[m_nInstrument]; if (pIns) { - TCHAR szName[_MAX_FNAME], szExt[_MAX_EXT]; - _tsplitpath(lpszFileName, nullptr, nullptr, szName, szExt); - TrackerDirectories::Instance().SetWorkingDirectory(mpt::PathString::FromCString(lpszFileName), DIR_INSTRUMENTS, true); + mpt::PathString name, ext; + fileName.SplitPath(nullptr, nullptr, &name, &ext); if (!pIns->name[0] && m_sndFile.GetModSpecifications().instrNameLengthMax > 0) { - mpt::String::CopyN(pIns->name, szName, m_sndFile.GetModSpecifications().instrNameLengthMax); + mpt::String::CopyN(pIns->name, name.ToLocale().c_str(), m_sndFile.GetModSpecifications().instrNameLengthMax); } if (!pIns->filename[0] && m_sndFile.GetModSpecifications().instrFilenameLengthMax > 0) { - strcat(szName, szExt); - mpt::String::CopyN(pIns->filename, szName, m_sndFile.GetModSpecifications().instrFilenameLengthMax); + name += ext; + mpt::String::CopyN(pIns->filename, name.ToLocale().c_str(), m_sndFile.GetModSpecifications().instrFilenameLengthMax); } SetCurrentInstrument(m_nInstrument); @@ -1711,7 +1711,7 @@ OnInstrumentNew(); } - if(!OpenInstrument(files[counter].ToCString())) + if(!OpenInstrument(files[counter])) ErrorBox(IDS_ERR_FILEOPEN, this); } @@ -1723,7 +1723,7 @@ void CCtrlInstruments::OnInstrumentSave() //--------------------------------------- { - TCHAR szFileName[_MAX_PATH] = "", drive[_MAX_DRIVE], path[_MAX_PATH], ext[_MAX_EXT]; + TCHAR szFileName[_MAX_PATH] = ""; ModInstrument *pIns = m_sndFile.Instruments[m_nInstrument]; if (!pIns) return; @@ -1753,12 +1753,11 @@ BeginWaitCursor(); - _splitpath(dlg.GetFirstFile().ToLocale().c_str(), drive, path, NULL, ext); bool ok = false; - if (!lstrcmpi(ext, ".iti")) + if(!mpt::PathString::CompareNoCase(dlg.GetExtension(), MPT_PATHSTRING("xi"))) + ok = m_sndFile.SaveXIInstrument(m_nInstrument, dlg.GetFirstFile()); + else ok = m_sndFile.SaveITIInstrument(m_nInstrument, dlg.GetFirstFile(), index == (m_sndFile.GetType() == MOD_TYPE_XM ? 3 : 2)); - else - ok = m_sndFile.SaveXIInstrument(m_nInstrument, dlg.GetFirstFile()); // -> CODE#0023 // -> DESC="IT project files (.itp)" @@ -1769,9 +1768,6 @@ EndWaitCursor(); if (!ok) ErrorBox(IDS_ERR_SAVEINS, this); else { - strcpy(szFileName, drive); - strcat(szFileName, path); - TrackerDirectories::Instance().SetWorkingDirectory(dlg.GetWorkingDirectory(), DIR_INSTRUMENTS); // -> CODE#0023 Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2013-11-10 00:27:57 UTC (rev 3160) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2013-11-10 01:20:37 UTC (rev 3161) @@ -124,7 +124,7 @@ public: void SetInstrumentModified(const bool modified = true); BOOL SetCurrentInstrument(UINT nIns, BOOL bUpdNum=TRUE); - BOOL OpenInstrument(LPCSTR lpszFileName); + BOOL OpenInstrument(const mpt::PathString &fileName); BOOL OpenInstrument(CSoundFile &sndFile, INSTRUMENTINDEX nInstr); BOOL EditSample(UINT nSample); VOID UpdateFilterText(); Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-11-10 00:27:57 UTC (rev 3160) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2013-11-10 01:20:37 UTC (rev 3161) @@ -426,7 +426,7 @@ break; case CTRLMSG_SMP_OPENFILE: - if (lParam) return OpenSample((LPCSTR)lParam) ? TRUE : FALSE; + if (lParam) return OpenSample(mpt::PathString::FromCString((LPCSTR)lParam)) ? TRUE : FALSE; break; case CTRLMSG_SMP_SONGDROP: @@ -733,12 +733,12 @@ } -bool CCtrlSamples::OpenSample(LPCSTR lpszFileName) -//------------------------------------------------ +bool CCtrlSamples::OpenSample(const mpt::PathString &fileName) +//------------------------------------------------------------ { CMappedFile f; BeginWaitCursor(); - if ((!lpszFileName) || (!f.Open(mpt::PathString::FromLocale(lpszFileName)))) + if(!f.Open(fileName)) { EndWaitCursor(); return false; @@ -753,6 +753,7 @@ m_modDoc.GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); bool bOk = m_sndFile.ReadSampleFromFile(m_nSample, file, TrackerSettings::Instance().m_MayNormalizeSamplesOnLoad); + ModSample &sample = m_sndFile.GetSample(m_nSample); if (!bOk) { @@ -769,7 +770,6 @@ rememberRawFormat = dlg.GetRemeberFormat(); BeginWaitCursor(); - ModSample &sample = m_sndFile.GetSample(m_nSample); m_sndFile.DestroySampleThreadsafe(m_nSample); sample.nLength = file.GetLength(); @@ -818,17 +818,16 @@ EndWaitCursor(); if (bOk) { - ModSample &sample = m_sndFile.GetSample(m_nSample); - TrackerDirectories::Instance().SetWorkingDirectory(mpt::PathString::FromLocale(lpszFileName), DIR_SAMPLES, true); + TrackerDirectories::Instance().SetWorkingDirectory(fileName, DIR_SAMPLES, true); if (!sample.filename[0]) { - CHAR szName[_MAX_PATH], szExt[_MAX_EXT]; - _splitpath(lpszFileName, 0, 0, szName, szExt); + mpt::PathString name, ext; + fileName.SplitPath(nullptr, nullptr, &name, &ext); - if(!m_sndFile.m_szNames[m_nSample][0]) mpt::String::Copy(m_sndFile.m_szNames[m_nSample], szName); + if(!m_sndFile.m_szNames[m_nSample][0]) mpt::String::Copy(m_sndFile.m_szNames[m_nSample], name.ToLocale()); - if (strlen(szName) < 9) strcat(szName, szExt); - mpt::String::Copy(sample.filename, szName); + if(name.AsNative().length() < 9) name += ext; + mpt::String::Copy(sample.filename, name.ToLocale()); } if ((m_sndFile.GetType() & MOD_TYPE_XM) && !sample.uFlags[CHN_PANNING]) { @@ -976,7 +975,7 @@ OnSampleNew(); } - if(!OpenSample(files[counter].ToCString())) + if(!OpenSample(files[counter])) ErrorBox(IDS_ERR_FILEOPEN, this); } SwitchToView(); @@ -986,7 +985,7 @@ void CCtrlSamples::OnSampleSave() //------------------------------- { - TCHAR szFileName[_MAX_PATH] = ""; + mpt::PathString fileName; bool doBatchSave = CMainFrame::GetInputHandler()->ShiftPressed(); bool defaultFLAC = false; @@ -1000,33 +999,24 @@ } if(m_sndFile.GetType() & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) { - mpt::String::Copy(szFileName, m_sndFile.GetSample(m_nSample).filename); + fileName = mpt::PathString::FromLocale(m_sndFile.GetSample(m_nSample).filename); } - if(!szFileName[0]) - { - mpt::String::Copy(szFileName, m_sndFile.m_szNames[m_nSample]); - } - if(!szFileName[0]) strcpy(szFileName, "untitled"); - if(strlen(szFileName) >= 5 && !_strcmpi(szFileName + strlen(szFileName) - 5, ".flac")) - { - defaultFLAC = true; - } + if(fileName.empty()) fileName = mpt::PathString::FromLocale(m_sndFile.m_szNames[m_nSample]); + if(fileName.empty()) fileName = MPT_PATHSTRING("untitled"); + if(mpt::PathString::CompareNoCase(fileName.GetFileExt(), MPT_PATHSTRING(".flac"))) defaultFLAC = true; } else { // save all samples - CString sPath = m_sndFile.GetpModDoc()->GetPathName(); - if(sPath.IsEmpty()) sPath = "untitled"; + fileName = mpt::PathString::FromCString(m_sndFile.GetpModDoc()->GetPathName()).GetFileName(); + if(fileName.empty()) fileName = MPT_PATHSTRING("untitled"); - sPath += " - %sample_number% - "; + fileName += MPT_PATHSTRING(" - %sample_number% - "); if(m_sndFile.GetType() & (MOD_TYPE_XM|MOD_TYPE_MOD)) - sPath += "%sample_name%.wav"; + fileName += MPT_PATHSTRING("%sample_name%"); else - sPath += "%sample_filename%.wav"; - sPath += ".wav"; - _splitpath(sPath, NULL, NULL, szFileName, NULL); + fileName += MPT_PATHSTRING("%sample_filename%"); } - mpt::String::SetNullTerminator(szFileName); - SanitizeFilename(szFileName); + SanitizeFilename(fileName); CString format = theApp.GetSettings().Read<CString>("Sample Editor", "DefaultFormat", defaultFLAC ? "flac" : "wav"); int filter = 1; @@ -1036,8 +1026,8 @@ filter = 3; FileDialog dlg = SaveFileDialog() - .DefaultExtension(std::string(format)) - .DefaultFilename(szFileName) + .DefaultExtension(mpt::PathString::FromCString(format)) + .DefaultFilename(fileName) .ExtensionFilter("Wave File (*.wav)|*.wav|" "FLAC File (*.flac)|*.flac|" "RAW Audio (*.raw)|*.raw||") @@ -1047,50 +1037,49 @@ BeginWaitCursor(); - CString ext = dlg.GetFirstFile().GetFileExt().ToCString(); + const mpt::PathString ext = dlg.GetExtension(); - bool bOk = false; - SAMPLEINDEX iMinSmp = m_nSample, iMaxSmp = m_nSample; - mpt::PathString sFilename = dlg.GetFirstFile(); + SAMPLEINDEX minSmp = m_nSample, maxSmp = m_nSample; CString sNumberFormat; if(doBatchSave) { - iMinSmp = 1; - iMaxSmp = m_sndFile.GetNumSamples(); - sNumberFormat.Format("%s%d%s", "%.", ((int)log10((float)iMaxSmp)) + 1, "d"); + minSmp = 1; + maxSmp = m_sndFile.GetNumSamples(); + sNumberFormat.Format("%s%d%s", "%.", ((int)log10((float)maxSmp)) + 1, "d"); } - for(SAMPLEINDEX iSmp = iMinSmp; iSmp <= iMaxSmp; iSmp++) + bool ok = false; + for(SAMPLEINDEX smp = minSmp; smp <= maxSmp; smp++) { - if (m_sndFile.GetSample(iSmp).pSample) + if (m_sndFile.GetSample(smp).pSample) { + mpt::PathString fileName = dlg.GetFirstFile(); if(doBatchSave) { CString sSampleNumber; TCHAR sSampleName[64], sSampleFilename[64]; - sSampleNumber.Format(sNumberFormat, iSmp); + sSampleNumber.Format(sNumberFormat, smp); - strcpy(sSampleName, (m_sndFile.m_szNames[iSmp]) ? m_sndFile.m_szNames[iSmp] : "untitled"); - strcpy(sSampleFilename, (m_sndFile.GetSample(iSmp).filename[0]) ? m_sndFile.GetSample(iSmp).filename : m_sndFile.m_szNames[iSmp]); + strcpy(sSampleName, (m_sndFile.m_szNames[smp]) ? m_sndFile.m_szNames[smp] : "untitled"); + strcpy(sSampleFilename, (m_sndFile.GetSample(smp).filename[0]) ? m_sndFile.GetSample(smp).filename : m_sndFile.m_szNames[smp]); SanitizeFilename(sSampleName); SanitizeFilename(sSampleFilename); - sFilename = dlg.GetFirstFile(); - sFilename = mpt::PathString::FromWide(mpt::String::Replace(sFilename.ToWide(), L"%sample_number%", mpt::String::FromCString(sSampleNumber))); - sFilename = mpt::PathString::FromWide(mpt::String::Replace(sFilename.ToWide(), L"%sample_filename%", mpt::String::FromCString(sSampleFilename))); - sFilename = mpt::PathString::FromWide(mpt::String::Replace(sFilename.ToWide(), L"%sample_name%", mpt::String::FromCString(sSampleName))); + fileName = mpt::PathString::FromWide(mpt::String::Replace(fileName.ToWide(), L"%sample_number%", mpt::String::FromCString(sSampleNumber))); + fileName = mpt::PathString::FromWide(mpt::String::Replace(fileName.ToWide(), L"%sample_filename%", mpt::String::FromCString(sSampleFilename))); + fileName = mpt::PathString::FromWide(mpt::String::Replace(fileName.ToWide(), L"%sample_name%", mpt::String::FromCString(sSampleName))); } - if(!ext.CompareNoCase(".raw")) - bOk = m_sndFile.SaveRAWSample(iSmp, sFilename); - else if(!ext.CompareNoCase(".flac")) - bOk = m_sndFile.SaveFLACSample(iSmp, sFilename); + if(!mpt::PathString::CompareNoCase(ext, MPT_PATHSTRING("raw"))) + ok = m_sndFile.SaveRAWSample(smp, fileName); + else if(!mpt::PathString::CompareNoCase(ext, MPT_PATHSTRING("flac"))) + ok = m_sndFile.SaveFLACSample(smp, fileName); else - bOk = m_sndFile.SaveWAVSample(iSmp, sFilename); + ok = m_sndFile.SaveWAVSample(smp, fileName); } } EndWaitCursor(); - if (!bOk) + if (!ok) { ErrorBox(IDS_ERR_SAVESMP, this); } else Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.h 2013-11-10 00:27:57 UTC (rev 3160) +++ trunk/OpenMPT/mptrack/Ctrl_smp.h 2013-11-10 01:20:37 UTC (rev 3161) @@ -67,7 +67,7 @@ ~CCtrlSamples(); bool SetCurrentSample(SAMPLEINDEX nSmp, LONG lZoom = -1, bool bUpdNum = true); - bool OpenSample(LPCSTR lpszFileName); + bool OpenSample(const mpt::PathString &fileName); bool OpenSample(const CSoundFile &sndFile, SAMPLEINDEX nSample); Setting<LONG>* GetSplitPosRef() {return &TrackerSettings::Instance().glSampleWindowHeight;} //rewbs.varWindowSize Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-11-10 00:27:57 UTC (rev 3160) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp 2013-11-10 01:20:37 UTC (rev 3161) @@ -2040,6 +2040,23 @@ dst[i] = in[i]; } }; + +// RAII-style helper struct for FLAC encoder +struct FLAC__StreamEncoder_RAII +{ + FLAC__StreamEncoder *encoder; + FILE *f; + + operator FLAC__StreamEncoder *() { return encoder; } + + FLAC__StreamEncoder_RAII() : encoder(FLAC__stream_encoder_new()), f(nullptr) { } + ~FLAC__StreamEncoder_RAII() + { + FLAC__stream_encoder_delete(encoder); + if(f != nullptr) fclose(f); + } +}; + #endif @@ -2048,7 +2065,7 @@ //----------------------------------------------------------------------------------------- { #ifndef NO_FLAC - FLAC__StreamEncoder *encoder = FLAC__stream_encoder_new(); + FLAC__StreamEncoder_RAII encoder; if(encoder == nullptr) { return false; @@ -2144,7 +2161,8 @@ FLAC__stream_encoder_set_compression_level(encoder, compression); #endif // MODPLUG_TRACKER - if(FLAC__stream_encoder_init_file(encoder, filename.ToLocale().c_str(), nullptr, nullptr) != FLAC__STREAM_ENCODER_INIT_STATUS_OK) + encoder.f = mpt_fopen(filename, "wb"); + if(encoder.f == nullptr || FLAC__stream_encoder_init_FILE(encoder, encoder.f, nullptr, nullptr) != FLAC__STREAM_ENCODER_INIT_STATUS_OK) { return false; } @@ -2178,7 +2196,6 @@ FLAC__metadata_object_delete(metadata[i]); } - FLAC__stream_encoder_delete(encoder); return true; #else MPT_UNREFERENCED_PARAMETER(nSample); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |