|
From: <rel...@us...> - 2008-10-13 15:19:24
|
Revision: 228
http://modplug.svn.sourceforge.net/modplug/?rev=228&view=rev
Author: relabsoluness
Date: 2008-10-13 15:19:08 +0000 (Mon, 13 Oct 2008)
Log Message:
-----------
/ PitchShift and time stretching are back. PitchShift wasn't affected by the license problem so its back as it was, and time stretching is now implemented with SoundTouch-library. SoundTouch is used from delay loaded DLL so the main program should work even if the library is not available.
/ Pitchshifting/Time Stretching of 8-bit samples is now disabled (didn't seem to work).
+ A few new methods added to MODINSTRUMENT for readability and easier usage.
/ Restored default orderlist margins to two.
+ Added new inisetting that can be used to show/hide some hack GUI controls.
/ Rearranged control tab order in sample control to make tooltips work in it(don't know why it matters).
/ mptrack now produces program database(pdb-file) also on release build.
Modified Paths:
--------------
trunk/OpenMPT/mptrack/Ctrl_pat.cpp
trunk/OpenMPT/mptrack/Ctrl_pat.h
trunk/OpenMPT/mptrack/Ctrl_smp.cpp
trunk/OpenMPT/mptrack/Ctrl_smp.h
trunk/OpenMPT/mptrack/MPTRACK.sln
trunk/OpenMPT/mptrack/MainFrm.cpp
trunk/OpenMPT/mptrack/Mainfrm.h
trunk/OpenMPT/mptrack/mptrack.rc
trunk/OpenMPT/mptrack/mptrack.vcproj
trunk/OpenMPT/mptrack/res/MPTRACK.RC2
trunk/OpenMPT/mptrack/resource.h
trunk/OpenMPT/soundlib/Sndfile.h
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2008-10-13 15:19:08 UTC (rev 228)
@@ -13,7 +13,6 @@
//////////////////////////////////////////////////////////////
// CCtrlPatterns
-bool CCtrlPatterns::s_ShowSequenceMarginsControls = false;
BEGIN_MESSAGE_MAP(CCtrlPatterns, CModControlDlg)
//{{AFX_MSG_MAP(CCtrlPatterns)
@@ -172,7 +171,7 @@
m_SpinInstrument.SetRange(-1, 1);
m_SpinInstrument.SetPos(0);
- if(s_ShowSequenceMarginsControls == true)
+ if(CMainFrame::gbShowHackControls == true)
{
m_SpinOrderListMargins.ShowWindow(SW_SHOW);
m_EditOrderListMargins.ShowWindow(SW_SHOW);
Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_pat.h 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2008-10-13 15:19:08 UTC (rev 228)
@@ -144,9 +144,6 @@
// -! NEW_FEATURE#0012
public:
- static bool s_ShowSequenceMarginsControls;
-
-public:
CCtrlPatterns();
LONG* GetSplitPosRef() {return &CMainFrame::glPatternWindowHeight;} //rewbs.varWindowSize
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2008-10-13 15:19:08 UTC (rev 228)
@@ -9,10 +9,14 @@
#include "dlg_misc.h"
#include "PSRatioCalc.h" //rewbs.timeStretchMods
#include "mpdlgs.h"
+#include "soundtouch/SoundTouch.h"
+#include "soundtouch/TDStretch.h"
+#pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data"
+#include "smbPitchShift.cpp"
+#pragma warning(default:4244) //"conversion from 'type1' to 'type2', possible loss of data"
-#ifndef NO_XSOUNDLIB
- #include "smbPitchShift.h"
- #include "samplerate.h"
+#ifdef _DEBUG
+ #define new DEBUG_NEW
#endif
#ifdef _DEBUG
@@ -64,15 +68,11 @@
ON_COMMAND(IDC_CHECK1, OnSetPanningChanged)
ON_COMMAND(ID_PREVINSTRUMENT, OnPrevInstrument)
ON_COMMAND(ID_NEXTINSTRUMENT, OnNextInstrument)
-
-#ifndef NO_XSOUNDLIB
ON_COMMAND(IDC_BUTTON1, OnPitchShiftTimeStretch)
ON_COMMAND(IDC_BUTTON2, OnEstimateSampleSize)
ON_COMMAND(IDC_BUTTON3, OnPitchShiftTimeStretchAccept)
ON_COMMAND(IDC_BUTTON4, OnPitchShiftTimeStretchCancel)
ON_COMMAND(IDC_CHECK3, OnEnableStretchToSize)
-#endif
-
ON_EN_CHANGE(IDC_SAMPLE_NAME, OnNameChanged)
ON_EN_CHANGE(IDC_SAMPLE_FILENAME, OnFileNameChanged)
ON_EN_CHANGE(IDC_EDIT_SAMPLE, OnSampleChanged)
@@ -138,43 +138,39 @@
DDX_Control(pDX, IDC_EDIT14, m_EditVibSweep);
DDX_Control(pDX, IDC_EDIT15, m_EditVibDepth);
DDX_Control(pDX, IDC_EDIT16, m_EditVibRate);
-
-#ifndef NO_XSOUNDLIB
DDX_Control(pDX, IDC_COMBO4, m_ComboPitch);
DDX_Control(pDX, IDC_COMBO5, m_ComboQuality);
DDX_Control(pDX, IDC_COMBO6, m_ComboFFT);
DDX_Text(pDX, IDC_EDIT6, m_dTimeStretchRatio); //rewbs.timeStretchMods
-#endif
-
//}}AFX_DATA_MAP
}
-CCtrlSamples::CCtrlSamples()
-//--------------------------
+CCtrlSamples::CCtrlSamples() :
+//----------------------------
+ m_nStretchProcessStepLength(nDefaultStretchChunkSize),
+ m_nSequenceMs(DEFAULT_SEQUENCE_MS),
+ m_nSeekWindowMs(DEFAULT_SEEKWINDOW_MS),
+ m_nOverlapMs(DEFAULT_OVERLAP_MS)
{
m_nSample = 1;
m_nLockCount = 1;
-
-#ifndef NO_XSOUNDLIB
pSampleUndoBuffer = NULL;
UndoBufferSize = 0;
-#endif
-
}
-#ifndef NO_XSOUNDLIB
- CCtrlSamples::~CCtrlSamples()
- {
- if(pSampleUndoBuffer) CSoundFile::FreeSample(pSampleUndoBuffer);
- pSampleUndoBuffer = NULL;
- UndoBufferSize = 0;
- }
-#endif
+CCtrlSamples::~CCtrlSamples()
+//---------------------------
+{
+ if(pSampleUndoBuffer) CSoundFile::FreeSample(pSampleUndoBuffer);
+ pSampleUndoBuffer = NULL;
+ UndoBufferSize = 0;
+}
+
CRuntimeClass *CCtrlSamples::GetAssociatedViewClass()
//---------------------------------------------------
{
@@ -241,7 +237,6 @@
}
-#ifndef NO_XSOUNDLIB
m_ComboFFT.ShowWindow(SW_SHOW);
m_ComboPitch.ShowWindow(SW_SHOW);
m_ComboQuality.ShowWindow(SW_SHOW);
@@ -315,7 +310,6 @@
// Stretch to size check box
OnEnableStretchToSize();
-#endif // NO_XSOUNDLIB
return TRUE;
}
@@ -337,9 +331,7 @@
if (pSndFile->m_nSamples < 1) pSndFile->m_nSamples = 1;
if ((nSmp < 1) || (nSmp > pSndFile->m_nSamples)) return FALSE;
-#ifndef NO_XSOUNDLIB
if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel();
-#endif
LockControls();
if (m_nSample != nSmp)
@@ -511,6 +503,9 @@
return TRUE;
}
break;
+ case IDC_EDIT_STRETCHPARAMS:
+ wsprintf(pszText, "SequenceMs SeekwindowMs OverlapMs ProcessStepLength");
+ return TRUE;
}
}
return FALSE;
@@ -683,11 +678,8 @@
DWORD len;
BOOL bOk;
-#ifndef NO_XSOUNDLIB
if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel();
-#endif
-
BeginWaitCursor();
if ((!lpszFileName) || (!f.Open(lpszFileName)))
{
@@ -803,11 +795,8 @@
{
if ((!pSndFile) || (!nSample) || (nSample > pSndFile->m_nSamples)) return FALSE;
-#ifndef NO_XSOUNDLIB
if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel();
-#endif
-
BeginWaitCursor();
BEGIN_CRITICAL();
m_pSndFile->DestroySample(m_nSample);
@@ -835,10 +824,7 @@
{
if ((!IsLocked()) && (m_pSndFile))
{
-
-#ifndef NO_XSOUNDLIB
if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel();
-#endif
UINT n = GetDlgItemInt(IDC_EDIT_SAMPLE);
if ((n > 0) && (n <= m_pSndFile->m_nSamples) && (n != m_nSample))
@@ -878,10 +864,7 @@
LONG smp = m_pModDoc->InsertSample(TRUE);
if (smp > 0)
{
-
- #ifndef NO_XSOUNDLIB
if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel();
- #endif
CSoundFile *pSndFile = m_pModDoc->GetSoundFile();
SetCurrentSample(smp);
@@ -1431,25 +1414,68 @@
}
-#ifndef NO_XSOUNDLIB
-
#define MAX_BUFFER_LENGTH 8192
#define CLIP_SOUND(v) v = v < -1.0f ? -1.0f : v > 1.0f ? 1.0f : v
+void CCtrlSamples::ReadTimeStretchParameters()
+//--------------------------------------------
+{
+ CString str;
+ GetDlgItemText(IDC_EDIT_STRETCHPARAMS, str);
+ _stscanf(str, __TEXT("%u %u %u %u"),
+ &m_nSequenceMs, &m_nSeekWindowMs, &m_nOverlapMs, &m_nStretchProcessStepLength);
+}
+
+
+void CCtrlSamples::UpdateTimeStretchParameterString()
+//---------------------------------------------------
+{
+ CString str;
+ str.Format(__TEXT("%u %u %u %u"),
+ m_nSequenceMs,
+ m_nSeekWindowMs,
+ m_nOverlapMs,
+ m_nStretchProcessStepLength
+ );
+ SetDlgItemText(IDC_EDIT_STRETCHPARAMS, str);
+}
+
void CCtrlSamples::OnEnableStretchToSize()
+//----------------------------------------
{
// Enable time-stretching / disable unused pitch-shifting UI elements
if(IsDlgButtonChecked(IDC_CHECK3)){
((CComboBox *)GetDlgItem(IDC_COMBO4))->EnableWindow(FALSE);
((CEdit *)GetDlgItem(IDC_EDIT6))->EnableWindow(TRUE);
((CButton *)GetDlgItem(IDC_BUTTON2))->EnableWindow(TRUE); //rewbs.timeStretchMods
+ GetDlgItem(IDC_TEXT_QUALITY)->ShowWindow(SW_HIDE);
+ GetDlgItem(IDC_COMBO5)->ShowWindow(SW_HIDE);
+ GetDlgItem(IDC_TEXT_FFT)->ShowWindow(SW_HIDE);
+ GetDlgItem(IDC_COMBO6)->ShowWindow(SW_HIDE);
+ GetDlgItem(IDC_TEXT_PITCH)->ShowWindow(SW_HIDE);
+ GetDlgItem(IDC_COMBO4)->ShowWindow(SW_HIDE);
+ if(CMainFrame::gbShowHackControls == true)
+ {
+ GetDlgItem(IDC_TEXT_STRETCHPARAMS)->ShowWindow(SW_SHOW);
+ GetDlgItem(IDC_EDIT_STRETCHPARAMS)->ShowWindow(SW_SHOW);
+ }
SetDlgItemText(IDC_BUTTON1, "Time Stretch");
+ UpdateTimeStretchParameterString();
}
// Enable pitch-shifting / disable unused time-stretching UI elements
else{
+ ReadTimeStretchParameters();
+ GetDlgItem(IDC_TEXT_QUALITY)->ShowWindow(SW_SHOW);
+ GetDlgItem(IDC_COMBO5)->ShowWindow(SW_SHOW);
+ GetDlgItem(IDC_TEXT_FFT)->ShowWindow(SW_SHOW);
+ GetDlgItem(IDC_COMBO6)->ShowWindow(SW_SHOW);
((CComboBox *)GetDlgItem(IDC_COMBO4))->EnableWindow(TRUE);
((CEdit *)GetDlgItem(IDC_EDIT6))->EnableWindow(FALSE);
((CButton *)GetDlgItem(IDC_BUTTON2))->EnableWindow(FALSE); //rewbs.timeStretchMods
+ GetDlgItem(IDC_TEXT_STRETCHPARAMS)->ShowWindow(SW_HIDE);
+ GetDlgItem(IDC_EDIT_STRETCHPARAMS)->ShowWindow(SW_HIDE);
+ GetDlgItem(IDC_TEXT_PITCH)->ShowWindow(SW_SHOW);
+ GetDlgItem(IDC_COMBO4)->ShowWindow(SW_SHOW);
SetDlgItemText(IDC_BUTTON1, "Pitch Shift");
}
}
@@ -1519,11 +1545,14 @@
UpdateData(TRUE); //Ensure m_dTimeStretchRatio is up-to-date with textbox content
errorcode = TimeStretch(m_dTimeStretchRatio/100.0);
- //Update loop points
- pins->nLoopStart *= m_dTimeStretchRatio/100.0;
- pins->nLoopEnd *= m_dTimeStretchRatio/100.0;
- pins->nSustainStart *= m_dTimeStretchRatio/100.0;
- pins->nSustainEnd *= m_dTimeStretchRatio/100.0;
+ //Update loop points only if no error occured.
+ if(errorcode == 0)
+ {
+ pins->nLoopStart *= m_dTimeStretchRatio/100.0;
+ pins->nLoopEnd *= m_dTimeStretchRatio/100.0;
+ pins->nSustainStart *= m_dTimeStretchRatio/100.0;
+ pins->nSustainEnd *= m_dTimeStretchRatio/100.0;
+ }
//end rewbs.timeStretchMods
}
@@ -1574,6 +1603,12 @@
break;
case 3 : wsprintf(str,"Not enough memory...");
break;
+ case 4 : wsprintf(str, "Action can be applied only to 16-bit samples.");
+ break;
+ case 5 : wsprintf(str, "Too low sample rate");
+ break;
+ case 6 : wsprintf(str, "Too short sample");
+ break;
default: wsprintf(str,"Unknown Error...");
break;
}
@@ -1586,6 +1621,7 @@
}
void CCtrlSamples::OnPitchShiftTimeStretchAccept()
+//------------------------------------------------
{
// Free sample undo buffer
if(pSampleUndoBuffer) CSoundFile::FreeSample(pSampleUndoBuffer);
@@ -1662,12 +1698,25 @@
m_pModDoc->SetModified();
}
+
int CCtrlSamples::TimeStretch(double ratio)
+//-----------------------------------------
{
if((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return -1;
MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample];
if(!pins) return -1;
+ // Stretching is implemented only for 16-bit samples. Return with
+ // error if trying to use wtih non 16-bit samples.
+ if(pins->GetElementarySampleSize() != 2)
+ return 4;
+
+ // SoundTouch seems to crash with short samples. Don't know what
+ // the actual limit or whether it depends on sample rate,
+ // but simply set some semiarbitrary threshold here.
+ if(pins->nLength < 256)
+ return 6;
+
// Refuse processing when ratio is negative, equal to zero or equal to 1.0
if(ratio <= 0.0 || ratio == 1.0) return -1;
@@ -1676,42 +1725,31 @@
if(pitch < 0.5f) return 2 + (1<<8);
if(pitch > 2.0f) return 2 + (2<<8);
+ soundtouch::SoundTouch* pSoundTouch = 0;
+ try
+ {
+ pSoundTouch = new soundtouch::SoundTouch;
+ }
+ catch(...)
+ { // Assuming that thrown exception means that soundtouch library could not be loaded.
+ MessageBox("Failed to load soundtouch library.", 0, MB_ICONERROR);
+ return -1;
+ }
+
// Get number of channels & sample size
- BYTE smpsize = (pins->uFlags & CHN_16BIT) ? 2 : 1;
- UINT nChn = (pins->uFlags & CHN_STEREO) ? 2 : 1;
+ const BYTE smpsize = pins->GetElementarySampleSize();
+ const UINT nChn = pins->GetNumChannels();
// Allocate new sample
- DWORD newsize = (DWORD)(0.5 + ratio * (double)pins->nLength);
+ const DWORD nNewSampleLength = (DWORD)(0.5 + ratio * (double)pins->nLength);
PVOID pSample = pins->pSample;
- PVOID pNewSample = CSoundFile::AllocateSample(newsize * nChn * smpsize);
- if(pNewSample == NULL) return 3;
+ PVOID pNewSample = CSoundFile::AllocateSample(nNewSampleLength * nChn * smpsize);
+ if(pNewSample == NULL)
+ {
+ delete pSoundTouch;
+ return 3;
+ }
- // Apply pitch-shifting step
- PitchShift(pitch);
-
- // Allocate working buffers
- UINT outputsize = (UINT)(0.5 + ratio * (double)MAX_BUFFER_LENGTH);
- if( (outputsize & 1) && (smpsize == 2 || nChn == 2) ) outputsize++;
-
- float * buffer = new float[MAX_BUFFER_LENGTH * nChn];
- float * outbuf = new float[outputsize * nChn];
-
- // Create resampler
- int error;
- SRC_STATE * resampler = src_new(SRC_SINC_BEST_QUALITY, nChn, &error) ;
-
- // Fill in resampler data struct
- SRC_DATA data;
- data.data_in = &buffer[0];
- data.input_frames = MAX_BUFFER_LENGTH;
- data.data_out = &outbuf[0];
- data.output_frames = outputsize;
- data.src_ratio = ratio;
- data.end_of_input = 0;
-
- // Deduce max sample value (float conversion step)
- float maxSampleValue = ( 1 << (smpsize * 8 - 1) ) - 1;
-
// Save process button text (to be used as "progress bar" indicator while processing)
CHAR oldText[255];
GetDlgItemText(IDC_BUTTON1, oldText, 255);
@@ -1732,16 +1770,58 @@
// Show wait mouse cursor
BeginWaitCursor();
- SetDlgItemText(IDC_STATIC1,"Resampling...");
+ SetDlgItemText(IDC_STATIC1, "Stretching...");
- // Apply stretching (resampling) step
- UINT pos = 0, posnew = 0;
- UINT len = MAX_BUFFER_LENGTH;
+ UINT pos = 0;
+ UINT len = 0; //To contain length of processing step.
- // Process sample buffer using MAX_BUFFER_LENGTH (max) sized chunk steps (in order to allow
- // the processing of BIG samples...)
- while(pos < pins->nLength){
+ // Initialize soundtouch object.
+ {
+ const uint32 nSampleRate = pins->GetSampleRate(m_pSndFile->GetType());
+ if(nSampleRate < 300) // Too low samplerate crashes soundtouch.
+ { // Limiting it to value 300(quite arbitrarily chosen).
+ delete pSoundTouch;
+ return 5;
+ }
+ pSoundTouch->setSampleRate(nSampleRate);
+ pSoundTouch->setChannels(nChn);
+ // Given ratio is time stretch ratio, and must be converted to
+ // tempo change ratio: for example time stretch ratio 2 means
+ // tempo change ratio 0.5.
+ pSoundTouch->setTempoChange( (1.0f / ratio - 1.0f) * 100.0f);
+ pSoundTouch->setSetting(SETTING_USE_QUICKSEEK, 0);
+ // Read settings from GUI.
+ ReadTimeStretchParameters();
+
+ if(m_nStretchProcessStepLength == 0) m_nStretchProcessStepLength = nDefaultStretchChunkSize;
+ if(m_nStretchProcessStepLength < 64) m_nStretchProcessStepLength = nDefaultStretchChunkSize;
+ len = m_nStretchProcessStepLength;
+
+ // Set settings to soundtouch. Zero value means 'use default', and
+ // setting value is read back after setting because not all settings are accepted.
+ if(m_nSequenceMs == 0) m_nSequenceMs = DEFAULT_SEQUENCE_MS;
+ pSoundTouch->setSetting(SETTING_SEQUENCE_MS, m_nSequenceMs);
+ m_nSequenceMs = pSoundTouch->getSetting(SETTING_SEQUENCE_MS);
+
+ if(m_nSeekWindowMs == 0) m_nSeekWindowMs = DEFAULT_SEEKWINDOW_MS;
+ pSoundTouch->setSetting(SETTING_SEEKWINDOW_MS, m_nSeekWindowMs);
+ m_nSeekWindowMs = pSoundTouch->getSetting(SETTING_SEEKWINDOW_MS);
+
+ if(m_nOverlapMs == 0) m_nOverlapMs = DEFAULT_OVERLAP_MS;
+ pSoundTouch->setSetting(SETTING_OVERLAP_MS, m_nOverlapMs);
+ m_nOverlapMs = pSoundTouch->getSetting(SETTING_OVERLAP_MS);
+
+ // Update GUI with the actual SoundTouch parameters in effect.
+ UpdateTimeStretchParameterString();
+ }
+
+ // Keeps count of the sample length received from stretching process.
+ UINT nLengthCounter = 0;
+
+ // Process sample in steps.
+ while(pos < pins->nLength)
+ {
// Current chunk size limit test
if(pos + len >= pins->nLength) len = pins->nLength - pos;
@@ -1759,58 +1839,26 @@
::DrawText(processButtonDC,progress,strlen(progress),&processButtonRect,DT_CENTER | DT_SINGLELINE | DT_VCENTER);
::GdiFlush();
- // Convert current channel's data chunk to float
- BYTE * ptr = (BYTE *)pSample + pos * smpsize * nChn;
+ // Send sampledata for processing.
+ pSoundTouch->putSamples(reinterpret_cast<int16*>(pins->pSample + pos * smpsize * nChn), len);
- for(UINT j = 0 ; j < len ; j++){
- switch(smpsize){
- case 2:
- buffer[j*nChn] = ((float)(*(SHORT *)ptr)) / maxSampleValue;
- if(nChn == 2) { ptr += 2; buffer[j*nChn+1] = ((float)(*(SHORT *)ptr)) / maxSampleValue; }
- break;
- case 1:
- buffer[j*nChn] = ((float)*ptr) / maxSampleValue;
- if(nChn == 2) { ptr++; buffer[j*nChn+1] = ((float)*ptr) / maxSampleValue; }
- break;
- }
- ptr += smpsize;
- }
+ // Receive some processed samples (it's not guaranteed that there is any available).
+ nLengthCounter += pSoundTouch->receiveSamples(reinterpret_cast<int16*>(pNewSample) + nChn * nLengthCounter, nNewSampleLength - nLengthCounter);
- // Wake up resampler...
- if(pos + MAX_BUFFER_LENGTH >= pins->nLength) data.end_of_input = 1;
- src_process(resampler, &data);
-
- // New buffer limit test (seems like, whatever the size of the last chunk, the resampler return buffer size instead of processed size)
- if(data.end_of_input && posnew + (UINT)data.output_frames_gen >= newsize) data.output_frames_gen = newsize - posnew;
-
- // Convert resampled float buffer into new sample buffer
- ptr = (BYTE *)pNewSample + posnew * smpsize * nChn;
-
- for(UINT j = 0 ; j < (UINT)data.output_frames_gen ; j++){
- // Just perform a little bit of clipping...
- float v = outbuf[j*nChn]; CLIP_SOUND(v);
- // ...before converting back to buffer
- switch(smpsize){
- case 2:
- *(SHORT *)ptr = (SHORT)(v * maxSampleValue);
- if(nChn == 2) { ptr += 2; v = outbuf[j*nChn+1]; CLIP_SOUND(v); *(SHORT *)ptr = (SHORT)(v * maxSampleValue); }
- break;
- case 1:
- *ptr = (BYTE)(v * maxSampleValue);
- if(nChn == 2) { ptr++; v = outbuf[j*nChn+1]; CLIP_SOUND(v); *ptr = (BYTE)(v * maxSampleValue); }
- break;
- }
- ptr += smpsize;
- }
-
// Next buffer chunk
- posnew += data.output_frames_gen;
- pos += MAX_BUFFER_LENGTH;
+ pos += len;
}
- // Update newsize with generated size
- newsize = posnew;
+ // The input sample should now be processed. Receive remaining samples.
+ pSoundTouch->flush();
+ while(pSoundTouch->numSamples() > 0 && nNewSampleLength > nLengthCounter)
+ {
+ nLengthCounter += pSoundTouch->receiveSamples(reinterpret_cast<int16*>(pNewSample) + nChn * nLengthCounter, nNewSampleLength - nLengthCounter);
+ }
+ delete pSoundTouch; pSoundTouch = 0;
+ ASSERT(nNewSampleLength >= nLengthCounter);
+
// Swap sample buffer pointer to new buffer, update song + sample data & free old sample buffer
BEGIN_CRITICAL();
for(UINT i=0 ; i < MAX_CHANNELS ; i++){
@@ -1822,17 +1870,9 @@
}
pins->pSample = (LPSTR)pNewSample;
CSoundFile::FreeSample(pSample);
- pins->nLength = newsize;
+ pins->nLength = min(nLengthCounter, nNewSampleLength);
END_CRITICAL();
- // Free working buffers
- data.data_in = data.data_out = NULL;
- if(buffer) delete [] buffer;
- if(outbuf) delete [] outbuf;
-
- // Free resampler
- if(resampler) src_delete(resampler);
-
// Free progress bar brushes
DeleteObject((HBRUSH)green);
DeleteObject((HBRUSH)red);
@@ -1848,6 +1888,7 @@
}
int CCtrlSamples::PitchShift(float pitch)
+//---------------------------------------
{
if((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return -1;
if(pitch < 0.5f) return 1 + (1<<8);
@@ -1857,6 +1898,11 @@
MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample];
if(!pins) return 2;
+ // PitchShift seems to work only with 16-bit samples. Return with
+ // error if trying to use non 16-bit samples.
+ if(pins->GetElementarySampleSize() != 2)
+ return 4;
+
// Get number of channels & sample size
BYTE smpsize = (pins->uFlags & CHN_16BIT) ? 2 : 1;
UINT nChn = (pins->uFlags & CHN_STEREO) ? 2 : 1;
@@ -2013,9 +2059,7 @@
return 0;
}
-#endif // NO_XSOUNDLIB
-
void CCtrlSamples::OnReverse()
//----------------------------
{
Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h
===================================================================
--- trunk/OpenMPT/mptrack/Ctrl_smp.h 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/Ctrl_smp.h 2008-10-13 15:19:08 UTC (rev 228)
@@ -1,10 +1,7 @@
#ifndef _CONTROL_SAMPLES_H_
#define _CONTROL_SAMPLES_H_
-// If defined, disables pitch shifting - time stretching.
-#define NO_XSOUNDLIB
-
//=======================================
class CCtrlSamples: public CModControlDlg
//=======================================
@@ -22,25 +19,25 @@
CButton m_CheckPanning;
UINT m_nSample;
double m_dTimeStretchRatio; //rewbs.timeStretchMods
-
+ uint32 m_nStretchProcessStepLength;
+ uint32 m_nSequenceMs;
+ uint32 m_nSeekWindowMs;
+ uint32 m_nOverlapMs;
+ enum {nDefaultStretchChunkSize = 8192};
-#ifndef NO_XSOUNDLIB
CComboBox m_ComboPitch, m_ComboQuality, m_ComboFFT;
PVOID pSampleUndoBuffer;
UINT UndoBufferSize;
int PitchShift(float pitch);
int TimeStretch(double ratio);
-#endif
+ void UpdateTimeStretchParameterString();
+ void ReadTimeStretchParameters();
public:
CCtrlSamples();
-
-#ifndef NO_XSOUNDLIB
~CCtrlSamples();
-#endif
-public:
BOOL SetCurrentSample(UINT n, LONG lZoom=-1, BOOL bUpdNum=TRUE);
BOOL OpenSample(LPCSTR lpszFileName);
BOOL OpenSample(CSoundFile *pSndFile, UINT nSample);
@@ -96,13 +93,11 @@
afx_msg void OnVScroll(UINT, UINT, CScrollBar *);
afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys
-#ifndef NO_XSOUNDLIB
afx_msg void OnPitchShiftTimeStretch();
afx_msg void OnEnableStretchToSize();
afx_msg void OnEstimateSampleSize();
afx_msg void OnPitchShiftTimeStretchAccept();
afx_msg void OnPitchShiftTimeStretchCancel();
-#endif
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
Modified: trunk/OpenMPT/mptrack/MPTRACK.sln
===================================================================
--- trunk/OpenMPT/mptrack/MPTRACK.sln 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/MPTRACK.sln 2008-10-13 15:19:08 UTC (rev 228)
@@ -3,6 +3,7 @@
ProjectSection(ProjectDependencies) = postProject
{1FF4AB04-B22F-4CB8-AA2A-0C5095B5FEE4} = {1FF4AB04-B22F-4CB8-AA2A-0C5095B5FEE4}
{71531076-78C7-488D-8FD6-9D841F20AADE} = {71531076-78C7-488D-8FD6-9D841F20AADE}
+ {CF3C2CA5-5D45-4635-BBA4-C1F435E10896} = {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}
{3C7281B0-D0E2-48ED-AE4D-A181FC77D8F7} = {3C7281B0-D0E2-48ED-AE4D-A181FC77D8F7}
EndProjectSection
EndProject
@@ -22,6 +23,10 @@
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "soundtouch", "..\soundtouch\soundtouch.vcproj", "{CF3C2CA5-5D45-4635-BBA4-C1F435E10896}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
@@ -50,6 +55,10 @@
{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}.Debug.Build.0 = Debug|Win32
{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}.Release.ActiveCfg = Release|Win32
{DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}.Release.Build.0 = Release|Win32
+ {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Debug.ActiveCfg = Debug|Win32
+ {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Debug.Build.0 = Debug|Win32
+ {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Release.ActiveCfg = Release|Win32
+ {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
Modified: trunk/OpenMPT/mptrack/MainFrm.cpp
===================================================================
--- trunk/OpenMPT/mptrack/MainFrm.cpp 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/MainFrm.cpp 2008-10-13 15:19:08 UTC (rev 228)
@@ -133,6 +133,7 @@
UINT CMainFrame::m_nFilterIndex = 0;
UINT CMainFrame::m_nLastOptionsPage = 0;
BOOL CMainFrame::gbMdiMaximize = FALSE;
+bool CMainFrame::gbShowHackControls = false;
//rewbs.varWindowSize
LONG CMainFrame::glCtrlWindowHeight = 188; //obsolete, for backwards compat only
LONG CMainFrame::glGeneralWindowHeight = 178;
@@ -427,8 +428,8 @@
gbPatternPluginNames = GetPrivateProfileDWord("Pattern Editor", "Plugin-Names", true, iniFile);
gbPatternRecord = GetPrivateProfileDWord("Pattern Editor", "Record", true, iniFile);
gnAutoChordWaitTime = GetPrivateProfileDWord("Pattern Editor", "AutoChordWaitTime", 60, iniFile);
- CCtrlPatterns::s_ShowSequenceMarginsControls = (0 != GetPrivateProfileDWord("Pattern Editor", "ShowSequenceMarginsControls", 0, iniFile));
- COrderList::s_nDefaultMargins = static_cast<BYTE>(GetPrivateProfileInt("Pattern Editor", "DefaultSequenceMargins", 0, iniFile));
+ COrderList::s_nDefaultMargins = static_cast<BYTE>(GetPrivateProfileInt("Pattern Editor", "DefaultSequenceMargins", 2, iniFile));
+ gbShowHackControls = (0 != GetPrivateProfileDWord("Misc", "ShowHackControls", 0, iniFile));
GetPrivateProfileString("Paths", "Songs_Directory", m_szModDir, m_szModDir, INIBUFFERSIZE, iniFile);
GetPrivateProfileString("Paths", "Samples_Directory", m_szSmpDir, m_szSmpDir, INIBUFFERSIZE, iniFile);
Modified: trunk/OpenMPT/mptrack/Mainfrm.h
===================================================================
--- trunk/OpenMPT/mptrack/Mainfrm.h 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/Mainfrm.h 2008-10-13 15:19:08 UTC (rev 228)
@@ -365,6 +365,7 @@
// Globals
static UINT m_nLastOptionsPage, m_nFilterIndex;
static BOOL gbMdiMaximize;
+ static bool gbShowHackControls;
static LONG glCtrlWindowHeight, glTreeWindowWidth, glTreeSplitRatio;
static LONG glGeneralWindowHeight, glPatternWindowHeight, glSampleWindowHeight,
glInstrumentWindowHeight, glCommentsWindowHeight, glGraphWindowHeight; //rewbs.varWindowSize
Modified: trunk/OpenMPT/mptrack/mptrack.rc
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.rc 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/mptrack.rc 2008-10-13 15:19:08 UTC (rev 228)
@@ -675,23 +675,15 @@
BEGIN
CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP |
0x4d,4,4,55,17
- RTEXT "Sample",IDC_STATIC,62,8,24,8
EDITTEXT IDC_EDIT_SAMPLE,90,6,35,12,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "Spin6",IDC_SPIN_SAMPLE,"msctls_updown32",UDS_WRAP |
UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
UDS_NOTHOUSANDS,118,4,11,14
COMBOBOX IDC_COMBO_ZOOM,131,6,41,89,CBS_DROPDOWNLIST | WS_VSCROLL
- CTEXT "Length: 000000 (16-bit)",IDC_TEXT5,175,6,90,13,
- SS_CENTERIMAGE,WS_EX_STATICEDGE
- CONTROL "Toolbar2",IDC_TOOLBAR2,"ToolbarWindow32",WS_GROUP |
- 0x4d,268,4,136,17
- GROUPBOX "",IDC_STATIC,3,22,94,78
- LTEXT "Default Volume",IDC_STATIC,8,32,49,8
EDITTEXT IDC_EDIT7,57,30,36,12,ES_NUMBER
CONTROL "Spin1",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT |
UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,29,
11,11
- LTEXT "Global Volume",IDC_STATIC,8,45,46,8
EDITTEXT IDC_EDIT8,57,43,36,12,ES_NUMBER
CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT |
UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,42,
@@ -702,79 +694,46 @@
CONTROL "Spin1",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT |
UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,56,
11,11
- LTEXT "FineTune",IDC_TEXT7,8,73,37,8
EDITTEXT IDC_EDIT5,48,70,45,12,ES_AUTOHSCROLL
CONTROL "Spin1",IDC_SPIN5,"msctls_updown32",UDS_ALIGNRIGHT |
UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,69,11,11
- LTEXT "Transpose",IDC_TEXT6,8,86,38,8
COMBOBOX IDC_COMBO_BASENOTE,48,83,45,89,CBS_DROPDOWNLIST |
WS_VSCROLL
- CTEXT "Name",IDC_STATIC,102,26,28,12,SS_CENTERIMAGE | NOT
- WS_GROUP,WS_EX_STATICEDGE
EDITTEXT IDC_SAMPLE_NAME,129,26,135,12,ES_AUTOHSCROLL
- CTEXT "File",IDC_STATIC,269,26,23,13,SS_CENTERIMAGE | NOT
- WS_GROUP | WS_TABSTOP,WS_EX_STATICEDGE
EDITTEXT IDC_SAMPLE_FILENAME,292,26,72,13,ES_AUTOHSCROLL
- GROUPBOX "Loop",IDC_STATIC,102,43,79,57
- LTEXT "Type",IDC_STATIC,107,57,17,8
COMBOBOX IDC_COMBO1,130,54,45,46,CBS_DROPDOWNLIST | WS_TABSTOP
- LTEXT "Start",IDC_STATIC,107,73,16,8
EDITTEXT IDC_EDIT1,130,70,45,12,ES_NUMBER
CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ALIGNRIGHT |
UDS_AUTOBUDDY | UDS_NOTHOUSANDS,169,69,11,11
- LTEXT "End",IDC_STATIC,107,86,14,8
EDITTEXT IDC_EDIT2,130,83,45,12,ES_NUMBER
CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_ALIGNRIGHT |
UDS_AUTOBUDDY | UDS_NOTHOUSANDS,169,84,11,11
- GROUPBOX "Sustain Loop",IDC_STATIC,185,43,79,57
- LTEXT "Type",IDC_STATIC,189,57,17,8
COMBOBOX IDC_COMBO2,212,54,45,46,CBS_DROPDOWNLIST | WS_TABSTOP
- LTEXT "Start",IDC_STATIC,189,73,16,8
EDITTEXT IDC_EDIT3,212,70,45,12,ES_NUMBER
CONTROL "Spin1",IDC_SPIN3,"msctls_updown32",UDS_ALIGNRIGHT |
UDS_AUTOBUDDY | UDS_NOTHOUSANDS,253,70,11,11
- LTEXT "End",IDC_STATIC,189,86,14,8
EDITTEXT IDC_EDIT4,212,83,45,12,ES_NUMBER
CONTROL "Spin1",IDC_SPIN4,"msctls_updown32",UDS_ALIGNRIGHT |
UDS_AUTOBUDDY | UDS_NOTHOUSANDS,253,83,11,11
- GROUPBOX "",IDC_STATIC,269,43,96,57
COMBOBOX IDC_COMBO3,275,59,47,70,CBS_DROPDOWNLIST | WS_TABSTOP
- LTEXT "Depth",IDC_STATIC,327,50,20,8
EDITTEXT IDC_EDIT15,327,59,32,12,ES_NUMBER
CONTROL "Depth",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT |
UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,353,59,
11,11
- LTEXT "Sweep",IDC_STATIC,275,74,23,8
EDITTEXT IDC_EDIT14,275,83,38,12,ES_NUMBER
CONTROL "Sweep",IDC_SPIN11,"msctls_updown32",UDS_SETBUDDYINT |
UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,305,84,
11,11
- LTEXT "Rate",IDC_STATIC,321,74,16,8
EDITTEXT IDC_EDIT16,321,83,38,12,ES_NUMBER
CONTROL "Rate",IDC_SPIN13,"msctls_updown32",UDS_SETBUDDYINT |
UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,353,83,
11,11
- LTEXT "Auto-Vibrato",IDC_STATIC,275,50,41,8
- GROUPBOX "Pitch shifting / Time stretching",
- IDC_GROUPBOX_PITCH_TIME,370,22,150,78,NOT WS_VISIBLE
- LTEXT "Pitch",IDC_TEXT_PITCH,374,38,23,10,NOT WS_VISIBLE
- LTEXT "Quality",IDC_TEXT_QUALITY,374,54,23,10,NOT WS_VISIBLE
- LTEXT "FFT",IDC_TEXT_FFT,374,70,23,10,NOT WS_VISIBLE
+ CONTROL "Time stretching",IDC_CHECK3,"Button",BS_AUTOCHECKBOX |
+ BS_LEFTTEXT | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,446,
+ 36,68,11
CONTROL "Preview mode",IDC_CHECK2,"Button",BS_AUTOCHECKBOX |
BS_LEFTTEXT | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,373,
83,65,11
- CONTROL "Time stretching",IDC_CHECK3,"Button",BS_AUTOCHECKBOX |
- BS_LEFTTEXT | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,446,
- 36,68,11
- EDITTEXT IDC_EDIT6,446,51,45,13,ES_RIGHT | ES_AUTOHSCROLL | NOT
- WS_VISIBLE,WS_EX_RIGHT
- CTEXT "Static",IDC_TEXT_PREVIEW,448,69,67,10,NOT WS_VISIBLE
- PUSHBUTTON "Process",IDC_BUTTON1,448,80,67,16,NOT WS_VISIBLE,
- WS_EX_CLIENTEDGE
- PUSHBUTTON "...",IDC_BUTTON2,502,51,13,13,NOT WS_VISIBLE,
- WS_EX_CLIENTEDGE
- PUSHBUTTON "Keep",IDC_BUTTON3,448,82,32,13,NOT WS_VISIBLE,
- WS_EX_CLIENTEDGE
PUSHBUTTON "Restore",IDC_BUTTON4,482,82,33,13,NOT WS_VISIBLE,
WS_EX_CLIENTEDGE
COMBOBOX IDC_COMBO4,400,35,39,61,CBS_DROPDOWNLIST | NOT
@@ -783,7 +742,50 @@
WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP
COMBOBOX IDC_COMBO6,400,67,39,61,CBS_DROPDOWNLIST | NOT
WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP
+ EDITTEXT IDC_EDIT_STRETCHPARAMS,374,51,64,12,ES_AUTOHSCROLL
+ EDITTEXT IDC_EDIT6,446,51,45,12,ES_RIGHT | ES_AUTOHSCROLL | NOT
+ WS_VISIBLE,WS_EX_RIGHT
+ PUSHBUTTON "...",IDC_BUTTON2,502,51,13,13,NOT WS_VISIBLE,
+ WS_EX_CLIENTEDGE
+ RTEXT "Sample",IDC_STATIC,62,8,24,8
+ CTEXT "Length: 000000 (16-bit)",IDC_TEXT5,175,6,90,13,
+ SS_CENTERIMAGE,WS_EX_STATICEDGE
+ CONTROL "Toolbar2",IDC_TOOLBAR2,"ToolbarWindow32",WS_GROUP |
+ 0x4d,268,4,136,17
+ GROUPBOX "",IDC_STATIC,3,22,94,78
+ LTEXT "Default Volume",IDC_STATIC,8,32,49,8
+ LTEXT "Global Volume",IDC_STATIC,8,45,46,8
+ LTEXT "FineTune",IDC_TEXT7,8,73,37,8
+ LTEXT "Transpose",IDC_TEXT6,8,86,38,8
+ CTEXT "Name",IDC_STATIC,102,26,28,12,SS_CENTERIMAGE | NOT
+ WS_GROUP,WS_EX_STATICEDGE
+ CTEXT "File",IDC_STATIC,269,26,23,13,SS_CENTERIMAGE | NOT
+ WS_GROUP | WS_TABSTOP,WS_EX_STATICEDGE
+ GROUPBOX "Loop",IDC_STATIC,102,43,79,57
+ LTEXT "Type",IDC_STATIC,107,57,17,8
+ LTEXT "Start",IDC_STATIC,107,73,16,8
+ LTEXT "End",IDC_STATIC,107,86,14,8
+ GROUPBOX "Sustain Loop",IDC_STATIC,185,43,79,57
+ LTEXT "Type",IDC_STATIC,189,57,17,8
+ LTEXT "Start",IDC_STATIC,189,73,16,8
+ LTEXT "End",IDC_STATIC,189,86,14,8
+ GROUPBOX "",IDC_STATIC,269,43,96,57
+ LTEXT "Auto-Vibrato",IDC_STATIC,275,50,41,8
+ LTEXT "Sweep",IDC_STATIC,275,74,23,8
+ LTEXT "Depth",IDC_STATIC,327,50,20,8
+ LTEXT "Rate",IDC_STATIC,321,74,16,8
+ GROUPBOX "Pitch shifting / Time stretching",
+ IDC_GROUPBOX_PITCH_TIME,370,22,150,78,NOT WS_VISIBLE
+ PUSHBUTTON "Process",IDC_BUTTON1,448,80,67,16,NOT WS_VISIBLE,
+ WS_EX_CLIENTEDGE
+ LTEXT "Pitch",IDC_TEXT_PITCH,373,36,23,10,NOT WS_VISIBLE
+ LTEXT "Quality",IDC_TEXT_QUALITY,374,54,23,10,NOT WS_VISIBLE
+ LTEXT "FFT",IDC_TEXT_FFT,374,68,23,10,NOT WS_VISIBLE
+ CTEXT "Static",IDC_TEXT_PREVIEW,448,69,67,10,NOT WS_VISIBLE
+ PUSHBUTTON "Keep",IDC_BUTTON3,448,82,32,13,NOT WS_VISIBLE,
+ WS_EX_CLIENTEDGE
LTEXT "%",IDC_TEXT_PERCENT,494,53,8,10,NOT WS_VISIBLE
+ LTEXT "Parameters",IDC_TEXT_STRETCHPARAMS,385,38,39,8
END
IDD_CONTROL_INSTRUMENTS DIALOGEX 0, 0, 558, 173
Modified: trunk/OpenMPT/mptrack/mptrack.vcproj
===================================================================
--- trunk/OpenMPT/mptrack/mptrack.vcproj 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/mptrack.vcproj 2008-10-13 15:19:08 UTC (rev 228)
@@ -24,7 +24,7 @@
AdditionalOptions="/EHsc"
Optimization="0"
OptimizeForProcessor="1"
- AdditionalIncludeDirectories="..\unlha,..\unzip,..\unrar,..\soundlib,..\include,..\xsoundlib"
+ AdditionalIncludeDirectories="..\unlha,..\unzip,..\unrar,..\soundlib,..\include,..\xsoundlib,..\"
PreprocessorDefinitions="_DEBUG,WIN32,_WINDOWS,ENABLE_EQ,MODPLUG_TRACKER,NO_PACKING,HAVE_DOT_NET,ENABLE_AMD,ENABLE_SSE,ENABLE_AMDNOW,ENABLE_MMX"
StringPooling="TRUE"
BasicRuntimeChecks="3"
@@ -48,13 +48,13 @@
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
- AdditionalDependencies="winmm.lib strmiids.lib dmoguids.lib version.lib opengl32.lib glu32.lib Rpcrt4.lib"
+ AdditionalDependencies="winmm.lib strmiids.lib dmoguids.lib version.lib opengl32.lib glu32.lib Rpcrt4.lib delayimp.lib"
OutputFile=".\Debug/mptrack.exe"
Version="5.0"
LinkIncremental="2"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories=""
- DelayLoadDLLs=""
+ DelayLoadDLLs="OpenMPT_soundtouch.dll"
GenerateDebugInformation="TRUE"
AssemblyDebug="1"
ProgramDatabaseFile=".\Debug/mptrack.pdb"
@@ -104,7 +104,7 @@
GlobalOptimizations="TRUE"
InlineFunctionExpansion="2"
OptimizeForWindowsApplication="TRUE"
- AdditionalIncludeDirectories="..\unlha,..\unzip,..\unrar,..\soundlib,..\include,..\xsoundlib"
+ AdditionalIncludeDirectories="..\unlha,..\unzip,..\unrar,..\soundlib,..\include,..\xsoundlib,..\"
PreprocessorDefinitions="NDEBUG,WIN32,_WINDOWS,ENABLE_MMX,ENABLE_EQ,MODPLUG_TRACKER,NO_PACKING,HAVE_DOT_NET,ENABLE_AMD,ENABLE_SSE,ENABLE_AMDNOW"
StringPooling="TRUE"
RuntimeLibrary="0"
@@ -119,21 +119,26 @@
ProgramDataBaseFileName=".\Release/"
WarningLevel="3"
SuppressStartupBanner="FALSE"
+ DebugInformationFormat="3"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
- AdditionalDependencies="winmm.lib strmiids.lib dmoguids.lib version.lib opengl32.lib glu32.lib Rpcrt4.lib"
+ AdditionalDependencies="winmm.lib strmiids.lib dmoguids.lib version.lib opengl32.lib glu32.lib Rpcrt4.lib delayimp.lib"
OutputFile=".\Bin/mptrack.exe"
Version="5.0"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories=""
+ DelayLoadDLLs="OpenMPT_soundtouch.dll"
+ GenerateDebugInformation="TRUE"
GenerateMapFile="FALSE"
MapFileName=".\Release/mptrack.map"
- SubSystem="2"/>
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
Modified: trunk/OpenMPT/mptrack/res/MPTRACK.RC2
===================================================================
--- trunk/OpenMPT/mptrack/res/MPTRACK.RC2 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/res/MPTRACK.RC2 2008-10-13 15:19:08 UTC (rev 228)
@@ -43,7 +43,7 @@
VALUE "FileDescription", "OpenMPT / ModPlug Tracker"
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", "Modplug Tracker"
- VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2007 GPL."
+ VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2008 contributors."
VALUE "LegalTrademarks", "M.O.D.P.L.U.G"
VALUE "OriginalFilename", "mptrack.exe"
VALUE "PrivateBuild", ""
Modified: trunk/OpenMPT/mptrack/resource.h
===================================================================
--- trunk/OpenMPT/mptrack/resource.h 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/mptrack/resource.h 2008-10-13 15:19:08 UTC (rev 228)
@@ -818,6 +818,8 @@
#define IDC_TEXT_QUALITY 2330
#define IDC_TEXT_FFT 2331
#define IDC_TEXT_PERCENT 2332
+#define IDC_TEXT_STRETCHPARAMS 2337
+#define IDC_EDIT_STRETCHPARAMS 2338
#define ID_FILE_NEWMOD 32771
#define ID_FILE_NEWXM 32772
#define ID_FILE_NEWS3M 32773
@@ -1049,7 +1051,7 @@
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 516
#define _APS_NEXT_COMMAND_VALUE 59212
-#define _APS_NEXT_CONTROL_VALUE 2333
+#define _APS_NEXT_CONTROL_VALUE 2339
#define _APS_NEXT_SYMED_VALUE 901
#endif
#endif
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2008-10-13 14:25:58 UTC (rev 227)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2008-10-13 15:19:08 UTC (rev 228)
@@ -427,14 +427,18 @@
BYTE nVibRate;
CHAR name[22];
- //Should return the size which pSample is at least.
- DWORD GetSampleSizeInBytes() const
- {
- DWORD len = nLength;
- if(uFlags & CHN_16BIT) len *= 2;
- if(uFlags & CHN_STEREO) len *= 2;
- return len;
- }
+ // Return the size of one (elementary) sample in bytes.
+ uint8 GetElementarySampleSize() const {return (uFlags & CHN_16BIT) ? 2 : 1;}
+
+ // Return the number of channels in the sample.
+ uint8 GetNumChannels() const {return (uFlags & CHN_STEREO) ? 2 : 1;}
+
+ // Return the size which pSample is at least.
+ DWORD GetSampleSizeInBytes() const {return nLength * GetNumChannels() * GetElementarySampleSize();}
+
+ // Returns sample rate of the sample. The argument is needed because
+ // the sample rate is obtained differently for different module types.
+ uint32 GetSampleRate(const MODTYPE type) const;
};
@@ -1293,7 +1297,18 @@
long GetSampleOffset();
};
+inline uint32 MODINSTRUMENT::GetSampleRate(const MODTYPE type) const
+//------------------------------------------------------------------
+{
+ uint32 nRate;
+ if(type & (MOD_TYPE_MOD|MOD_TYPE_XM))
+ nRate = CSoundFile::TransposeToFrequency(RelativeTone, nFineTune);
+ else
+ nRate = nC4Speed;
+ return (nRate > 0) ? nRate : 8363;
+}
+
inline IMixPlugin* CSoundFile::GetInstrumentPlugin(INSTRUMENTINDEX instr)
//----------------------------------------------------------------
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|