|
From: <Rel...@us...> - 2006-12-21 15:02:49
|
Revision: 169
http://svn.sourceforge.net/modplug/?rev=169&view=rev
Author: Relabsoluness
Date: 2006-12-21 07:02:44 -0800 (Thu, 21 Dec 2006)
Log Message:
-----------
+ <Relabs> Multiple samples/instruments/mods can be loaded from the load dialogs.
+ <Relabs> Pending solo channel and pending unmute all channels.
+ <Relabs> 32 bit float sample import
. <Relabs> 24/32 bit PCM sample import.
(+ <Relabs> Option to try to play files in a IT-compatible manner; affects only a couple of things for the time being.)
? Miscellaneous changes in the code
Modified Paths:
--------------
branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h
branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h
branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h
branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h
branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h
branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h
branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc
branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h
branches/OpenMPT_MPTm_Tuning/mptrack/resource.h
branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h
branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp
branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp
branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp
branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp
branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h
branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp
Added Paths:
-----------
branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp
branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h
branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h
branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -181,7 +181,7 @@
EnterCriticalSection(&applying);
- MODCOMMAND *p,*newp;
+ MODCOMMAND *p = NULL,*newp = NULL;
MODCHANNELSETTINGS settings[MAX_BASECHANNELS];
UINT i,j,k,nChannels,newpat[MAX_BASECHANNELS],newMemory[4][MAX_BASECHANNELS];
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/ChannelManagerDlg.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -12,6 +12,7 @@
public:
static CChannelManagerDlg * sharedInstance(BOOL autoCreate = TRUE);
+ static void DestroySharedInstance() {delete sharedInstance_; sharedInstance_ = NULL;}
void SetDocument(void * parent);
BOOL IsOwner(void * ctrl);
BOOL IsDisplayed(void);
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -2258,6 +2258,16 @@
commands[kcFileExportCompat].isHidden = false;
commands[kcFileExportCompat].isDummy = false;
+ commands[kcUnmuteAllChnOnPatTransition].UID = 1778;
+ commands[kcUnmuteAllChnOnPatTransition].isHidden = false;
+ commands[kcUnmuteAllChnOnPatTransition].isDummy = false;
+ commands[kcUnmuteAllChnOnPatTransition].Message = "Unmute all channels on pattern transition";
+
+ commands[kcSoloChnOnPatTransition].UID = 1779;
+ commands[kcSoloChnOnPatTransition].isHidden = false;
+ commands[kcSoloChnOnPatTransition].isDummy = false;
+ commands[kcSoloChnOnPatTransition].Message = "Solo channel on pattern transition";
+
#ifdef _DEBUG
for (int i=0; i<kcNumCommands; i++) {
if (commands[i].UID != 0) { // ignore unset UIDs
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/CommandSet.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -226,6 +226,8 @@
kcChannelSolo,
kcChannelUnmuteAll,
kcToggleChanMuteOnPatTransition,
+ kcUnmuteAllChnOnPatTransition,
+ kcSoloChnOnPatTransition,
kcCopyAndLoseSelection,
kcTransposeUp,
kcTransposeDown,
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_ins.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -1334,7 +1334,7 @@
BOOL CCtrlInstruments::GetToolTipText(UINT uId, LPSTR pszText)
//------------------------------------------------------------
{
- //NOTE: pszText seems to point to char array of length 256.
+ //NOTE: pszText seems to point to char array of length 256 (Noverber 2006).
if ((pszText) && (uId))
{
switch(uId)
@@ -1472,7 +1472,7 @@
CFileDialog dlg(TRUE,
NULL,
NULL,
- OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
+ OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT,
"All Instruments|*.xi;*.pat;*.iti;*.wav;*.aif;*.aiff|"
"FastTracker II Instruments (*.xi)|*.xi|"
"GF1 Patches (*.pat)|*.pat|"
@@ -1483,8 +1483,36 @@
{
dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurInsDir;
}
+ const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size.
+ vector<char> filenameBuffer(bufferSize, 0);
+ dlg.GetOFN().lpstrFile = &filenameBuffer[0];
+ dlg.GetOFN().nMaxFile = bufferSize;
+
if (dlg.DoModal() != IDOK) return;
- if (!OpenInstrument(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this);
+
+ POSITION pos = dlg.GetStartPosition();
+ size_t counter = 0;
+ while(pos != NULL)
+ {
+ //If loading multiple instruments, advancing to next instrument and creating
+ //new instrument if necessary.
+ if(counter > 0)
+ {
+ if(m_nInstrument >= MAX_INSTRUMENTS-1)
+ break;
+ else
+ m_nInstrument++;
+
+ if(m_nInstrument > m_pSndFile->GetNumInstruments())
+ OnInstrumentNew();
+ }
+
+ if(!OpenInstrument(dlg.GetNextPathName(pos)))
+ ErrorBox(IDS_ERR_FILEOPEN, this);
+
+ counter++;
+ }
+ filenameBuffer.clear();
if (m_pParent) m_pParent->InstrumentChanged(m_nInstrument);
SwitchToView();
}
@@ -2386,7 +2414,7 @@
return;
size_t sel = m_ComboTuning.GetCurSel();
- if(sel == 0) //Setting IT behavior.
+ if(sel == 0) //Setting IT behavior
{
BEGIN_CRITICAL();
pInstH->SetTuning(NULL);
@@ -2591,7 +2619,7 @@
while(m_ComboTuning.GetCount() > 0)
m_ComboTuning.DeleteString(0);
- m_ComboTuning.AddString("IT behavior"); //<-> Instrument pTuning pointer == NULL
+ m_ComboTuning.AddString("OMPT IT behavior"); //<-> Instrument pTuning pointer == NULL
for(size_t i = 0; i<CSoundFile::s_TuningsSharedStandard.GetNumTunings(); i++)
{
m_ComboTuning.AddString(CSoundFile::s_TuningsSharedStandard.GetTuning(i).GetName().c_str());
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/Ctrl_smp.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -893,7 +893,7 @@
CFileDialog dlg(TRUE,
NULL,
NULL,
- OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
+ OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT,
"All Samples|*.wav;*.pat;*.s3i;*.smp;*.snd;*.raw;*.xi;*.aif;*.aiff;*.its;*.8sv;*.8svx;*.svx;*.pcm|"
"Wave Files (*.wav)|*.wav|"
"XI Samples (*.xi)|*.xi|"
@@ -909,9 +909,38 @@
dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurSmpDir;
}
dlg.m_ofn.nFilterIndex = nLastIndex;
+ const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006).
+ vector<char> filenameBuffer(bufferSize, 0);
+ dlg.GetOFN().lpstrFile = &filenameBuffer[0];
+ dlg.GetOFN().nMaxFile = bufferSize;
+
if (dlg.DoModal() != IDOK) return;
+
nLastIndex = dlg.m_ofn.nFilterIndex;
- if (!OpenSample(dlg.GetPathName())) ErrorBox(IDS_ERR_FILEOPEN, this);
+
+ POSITION pos = dlg.GetStartPosition();
+ size_t counter = 0;
+ while(pos != NULL)
+ {
+ //If loading multiple samples, advancing to next sample and creating
+ //new one if necessary.
+ if(counter > 0)
+ {
+ if(m_nSample >= MAX_SAMPLES-1)
+ break;
+ else
+ m_nSample++;
+
+ if(m_nSample > m_pSndFile->GetNumSamples())
+ OnSampleNew();
+ }
+
+ if(!OpenSample(dlg.GetNextPathName(pos)))
+ ErrorBox(IDS_ERR_FILEOPEN, this);
+
+ counter++;
+ }
+ filenameBuffer.clear();
SwitchToView();
}
@@ -2790,6 +2819,7 @@
}
LRESULT CCtrlSamples::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam)
+//----------------------------------------------------------------
{
if (wParam == kcNull)
return NULL;
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/KeyConfigDlg.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -229,9 +229,9 @@
for (int c=kcClearRow; c<=kcInsertAllRows; c++)
newCat->commands.Add(c);
newCat->separators.Add(kcInsertAllRows); //--------------------------------------
- for (int c=kcChannelMute; c<=kcToggleChanMuteOnPatTransition; c++)
+ for (int c=kcChannelMute; c<=kcSoloChnOnPatTransition; c++)
newCat->commands.Add(c);
- newCat->separators.Add(kcToggleChanMuteOnPatTransition); //--------------------------------------
+ newCat->separators.Add(kcSoloChnOnPatTransition); //--------------------------------------
for (int c=kcTransposeUp; c<=kcTransposeOctDown; c++)
newCat->commands.Add(c);
newCat->separators.Add(kcTransposeOctDown); //--------------------------------------
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/MainFrm.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -647,6 +647,9 @@
delete m_pAutoSaver; //rewbs.autosaver
delete m_pPerfCounter;
+ CChannelManagerDlg::DestroySharedInstance();
+
+
//Saving statictunings here.
CSoundFile::SaveStaticTunings();
}
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/Mainfrm.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -630,7 +630,8 @@
};
-const CHAR gszBuildDate[] = __TIMESTAMP__;
+//const CHAR gszBuildDate[] = __TIMESTAMP__;
+const string buildDateTime = string(__DATE__) + string(" ") + string(__TIME__);
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/Mptrack.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -982,7 +982,7 @@
CFileDialog dlg(TRUE,
NULL,
NULL,
- OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN,
+ OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_FORCESHOWHIDDEN | OFN_ALLOWMULTISELECT,
// -> CODE#0023
// -> DESC="IT project files (.itp)"
// "All Modules|*.mod;*.nst;*.wow;*.s3m;*.stm;*.669;*.mtm;*.xm;*.it;*.ult;*.mdz;*.s3z;*.xmz;*.itz;mod.*;*.far;*.mdl;*.okt;*.dmf;*.ptm;*.mdr;*.med;*.ams;*.dbm;*.dsm;*.mid;*.rmi;*.smf;*.bak;*.umx;*.amf;*.psm;*.mt2|"
@@ -1008,15 +1008,25 @@
{
dlg.m_ofn.lpstrInitialDir = CMainFrame::m_szCurModDir;
}
- if (dlg.DoModal() == IDOK)
+ const size_t bufferSize = 2048; //Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006).
+ vector<char> filenameBuffer(bufferSize, 0);
+ dlg.GetOFN().lpstrFile = &filenameBuffer[0];
+ dlg.GetOFN().nMaxFile = bufferSize;
+ if (dlg.DoModal() == IDOK)
{
- CHAR szDrive[_MAX_PATH], szDir[_MAX_PATH];
- _splitpath(dlg.GetPathName(), szDrive, szDir, NULL, NULL);
- strcpy(CMainFrame::m_szCurModDir, szDrive);
- strcat(CMainFrame::m_szCurModDir, szDir);
- CMainFrame::m_nFilterIndex = dlg.m_ofn.nFilterIndex;
- OpenDocumentFile(dlg.GetPathName());
+ POSITION pos = dlg.GetStartPosition();
+ while(pos != NULL)
+ {
+ CHAR szDrive[_MAX_PATH], szDir[_MAX_PATH];
+ CString pathName = dlg.GetNextPathName(pos);
+ _splitpath(pathName, szDrive, szDir, NULL, NULL);
+ strcpy(CMainFrame::m_szCurModDir, szDrive);
+ strcat(CMainFrame::m_szCurModDir, szDir);
+ CMainFrame::m_nFilterIndex = dlg.m_ofn.nFilterIndex;
+ OpenDocumentFile(pathName);
+ }
}
+ filenameBuffer.clear();
}
@@ -1370,7 +1380,7 @@
CDialog::OnInitDialog();
m_bmp.SubclassDlgItem(IDC_BITMAP1, this);
m_bmp.LoadBitmap(MAKEINTRESOURCE(IDB_MPTRACK));
- wsprintf(s, "Build Date: %s", gszBuildDate);
+ wsprintf(s, "Build Date: %s", buildDateTime.c_str());
SetDlgItemText(IDC_EDIT2, s);
SetDlgItemText(IDC_EDIT3, CMainFrame::GetFullVersionString());
Added: branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp (rev 0)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -0,0 +1,31 @@
+#include "stdafx.h"
+#include "PlaybackEventer.h"
+#include "sndfile.h"
+
+CPlaybackEventer::~CPlaybackEventer()
+//---------------------------------
+{
+}
+
+void CPlaybackEventer::PatternTranstionChnSolo(const CHANNELINDEX chnIndex)
+//-------------------------------------------------------------------------
+{
+ if(chnIndex >= m_rSndFile.m_nChannels)
+ return;
+
+ for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++)
+ {
+ m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? false : true;
+ }
+ m_rSndFile.m_bChannelMuteTogglePending[chnIndex] = (m_rSndFile.ChnSettings[chnIndex].dwFlags & CHN_MUTE) ? true : false;
+}
+
+
+void CPlaybackEventer::PatternTransitionChnUnmuteAll()
+//----------------------------------------------------
+{
+ for(CHANNELINDEX i = 0; i<m_rSndFile.m_nChannels; i++)
+ {
+ m_rSndFile.m_bChannelMuteTogglePending[i] = (m_rSndFile.ChnSettings[i].dwFlags & CHN_MUTE) ? true : false;
+ }
+}
\ No newline at end of file
Added: branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h (rev 0)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/PlaybackEventer.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -0,0 +1,25 @@
+#ifndef PLAYBACKEVENTER_H
+#define PLAYBACKEVENTER_H
+
+#include "pattern.h"
+
+class CSoundFile;
+
+//====================
+class CPlaybackEventer
+//====================
+{
+public:
+ CPlaybackEventer(CSoundFile& sndf) : m_rSndFile(sndf) {}
+ ~CPlaybackEventer();
+
+ //SetPatternEvent(const PATTERNINDEX pattern, const ROWINDEX row, const CHANNELINDEX column);
+
+ void PatternTranstionChnSolo(const CHANNELINDEX chnIndex);
+ void PatternTransitionChnUnmuteAll();
+
+private:
+ CSoundFile& m_rSndFile;
+};
+
+#endif
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -1,11 +1,7 @@
-// TuningDialog.cpp : implementation file
-//
-
#include "stdafx.h"
#include "mptrack.h"
#include "TuningDialog.h"
#include <algorithm>
-#include ".\tuningdialog.h"
#include "misc_util.h"
const string CTuningDialog::s_stringTypeGEN = "General";
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/TuningDialog.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -2,9 +2,9 @@
#define TUNINGDIALOG_H
#include "tuningratiomapwnd.h"
+#include "tuningcollection.h"
#include <vector>
#include <string>
-#include "afxwin.h"
using std::vector;
using std::string;
@@ -111,6 +111,7 @@
//to those edit boxes(they are modified by non-user
//activies and in these cases the value should be applied
//to the tuning data.
+
};
#endif
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -68,6 +68,8 @@
ON_COMMAND(ID_PATTERN_MUTE, OnMuteFromClick) //rewbs.customKeys
ON_COMMAND(ID_PATTERN_SOLO, OnSoloFromClick) //rewbs.customKeys
ON_COMMAND(ID_PATTERN_TRANSITIONMUTE, OnTogglePendingMuteFromClick)
+ ON_COMMAND(ID_PATTERN_TRANSITIONSOLO, OnPendingSoloChnFromClick)
+ ON_COMMAND(ID_PATTERN_TRANSITION_UNMUTEALL, OnPendingUnmuteAllChnFromClick)
ON_COMMAND(ID_PATTERN_UNMUTEALL,OnUnmuteAll)
ON_COMMAND(ID_PATTERN_DELETEROW,OnDeleteRows)
ON_COMMAND(ID_PATTERN_DELETEALLROW,OnDeleteRowsEx)
@@ -1092,7 +1094,6 @@
{
CModDoc *pModDoc = GetDocument();
CSoundFile *pSndFile;
- CHAR s[256]; //rewbs.patPlugNames
HMENU hMenu;
// Too far left to get a ctx menu:
@@ -2813,6 +2814,7 @@
InvalidateRow();
}
+ return 0;
}
@@ -3144,6 +3146,8 @@
case kcChannelSolo: OnSoloChannel(true); return wParam;
case kcChannelUnmuteAll: OnUnmuteAll(); return wParam;
case kcToggleChanMuteOnPatTransition: TogglePendingMute((m_dwCursor&0xFFFF)>>3); return wParam;
+ case kcUnmuteAllChnOnPatTransition: OnPendingUnmuteAllChnFromClick(); return wParam;
+ case kcSoloChnOnPatTransition: PendingSoloChn(GetCurrentChannel()); return wParam;
case kcTransposeUp: OnTransposeUp(); return wParam;
case kcTransposeDown: OnTransposeDown(); return wParam;
case kcTransposeOctUp: OnTransposeOctUp(); return wParam;
@@ -3797,7 +3801,7 @@
UINT instr = p->instr;
instr = ((instr * 10) + val) % 1000;
- if (instr > MAX_INSTRUMENTS) instr = instr % 100;
+ if (instr >= MAX_INSTRUMENTS) instr = instr % 100;
if ( ((pSndFile->m_nInstruments==0) && (pSndFile->m_nSamples<100)) || // if we're using samples & have less than 100 samples
(pSndFile->m_nInstruments < 100)) { // or if we're using instruments and have less than 100 instruments
instr = instr % 100; // --> ensure the entered instrument value is less than 100.
@@ -4247,6 +4251,7 @@
void CViewPattern::OnSelectPlugin(UINT nID)
+//-----------------------------------------
{
CModDoc *pModDoc = GetDocument(); if (!pModDoc) return;
CSoundFile *pSndFile = pModDoc->GetSoundFile(); if (!pSndFile) return;
@@ -4342,15 +4347,18 @@
}
if (b) AppendMenu(hMenu, MF_STRING, ID_PATTERN_SOLO, "Solo Channel\t" + ih->GetKeyTextFromCommand(kcChannelSolo));
if (bAll) AppendMenu(hMenu, MF_STRING, ID_PATTERN_UNMUTEALL, "Unmute All\t" + ih->GetKeyTextFromCommand(kcChannelUnmuteAll));
-
+
AppendMenu(hMenu,
pSndFile->m_bChannelMuteTogglePending[nChn] ?
(MF_STRING|MF_CHECKED) : MF_STRING,
ID_PATTERN_TRANSITIONMUTE,
(pSndFile->ChnSettings[nChn].dwFlags & CHN_MUTE) ?
- "Unmute on Transition\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition) :
- "Mute on Transition\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition));
+ "On transition: Unmute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition) :
+ "On transition: Mute\t" + ih->GetKeyTextFromCommand(kcToggleChanMuteOnPatTransition));
+ AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITION_UNMUTEALL, "On transition: Unmute all\t" + ih->GetKeyTextFromCommand(kcUnmuteAllChnOnPatTransition));
+ AppendMenu(hMenu, MF_STRING, ID_PATTERN_TRANSITIONSOLO, "On transition: Solo\t" + ih->GetKeyTextFromCommand(kcSoloChnOnPatTransition));
+
return true;
}
@@ -4587,10 +4595,9 @@
HMENU instrumentChangeMenu = ::CreatePopupMenu();
AppendMenu(hMenu, MF_POPUP|greyed, (UINT)instrumentChangeMenu, "Change Instrument\t" + ih->GetKeyTextFromCommand(kcPatternSetInstrument));
- CMainFrame *pMainFrm = CMainFrame::GetMainFrame();
- CModDoc *pModDoc = GetDocument();
- CSoundFile* pSndFile;
- if(pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return true;
+ if(pSndFile == NULL)
+ return false;
+
if (pSndFile->m_nInstruments) {
for (UINT i=1; i<=pSndFile->m_nInstruments; i++) {
@@ -4652,7 +4659,7 @@
if (GetColTypeFromCursor(m_dwBeginSel) <= colType) {
chans.Add(startChan); //first selected chan includes this col type
}
- for (int chan=startChan+1; chan<endChan; chan++) {
+ for (UINT chan=startChan+1; chan<endChan; chan++) {
chans.Add(chan); //All chans between first & last must include this col type
}
if ((startChan != endChan) && colType <= GetColTypeFromCursor(m_dwEndSel)) {
@@ -4723,6 +4730,26 @@
TogglePendingMute((m_nMenuParam&0xFFFF)>>3);
}
+void CViewPattern::OnPendingSoloChnFromClick()
+//-----------------------------------------------
+{
+ PendingSoloChn(GetChanFromCursor(m_nMenuParam));
+}
+
+void CViewPattern::OnPendingUnmuteAllChnFromClick()
+//----------------------------------------------
+{
+ GetDocument()->GetSoundFile()->GetPlaybackEventer().PatternTransitionChnUnmuteAll();
+ InvalidateChannelsHeaders();
+}
+
+void CViewPattern::PendingSoloChn(const CHANNELINDEX nChn)
+//---------------------------------------------
+{
+ GetDocument()->GetSoundFile()->GetPlaybackEventer().PatternTranstionChnSolo(nChn);
+ InvalidateChannelsHeaders();
+}
+
void CViewPattern::TogglePendingMute(UINT nChn)
//---------------------------------------------
{
@@ -4745,15 +4772,11 @@
CPoint pt = GetPointFromPosition(m_dwCursor);
- //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "Record is disabled(editing blocked).");
- //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "--------------------");
AppendMenu(hMenu, MF_STRING, IDC_PATTERN_RECORD, "Editing(record) is disabled; click here to enable it.");
- //AppendMenu(hMenu, MF_STRING|MF_GRAYED, 0, "--------------------");
//To check: It seems to work the way it should, but still is it ok to use IDC_PATTERN_RECORD here since it is not
//'aimed' to be used here.
ClientToScreen(&pt);
- //::TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_NONOTIFY, pt.x, pt.y, 0, m_hWnd, NULL);
::TrackPopupMenu(hMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, m_hWnd, NULL);
::DestroyMenu(hMenu);
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/View_pat.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -239,6 +239,8 @@
afx_msg void OnMuteFromClick(); //rewbs.customKeys
afx_msg void OnSoloFromClick(); //rewbs.customKeys
afx_msg void OnTogglePendingMuteFromClick(); //rewbs.customKeys
+ afx_msg void OnPendingSoloChnFromClick();
+ afx_msg void OnPendingUnmuteAllChnFromClick();
afx_msg void OnSoloChannel(BOOL current); //rewbs.customKeys
afx_msg void OnMuteChannel(BOOL current); //rewbs.customKeys
afx_msg void OnUnmuteAll();
@@ -336,6 +338,8 @@
private:
void TogglePendingMute(UINT nChn);
+ void PendingSoloChn(const CHANNELINDEX nChn);
+ void PendingUnmuteAllChn();
public:
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/Vstplug.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -1305,7 +1305,10 @@
if (result) *result = 0;
}
-#define MAX_FILEOPEN_BUFSIZE 32000
+#define MAX_FILEOPEN_BUFSIZE 2048
+//Note: Above value might be the maximum size the buffer can be;
+//it might be worthwhile to check the CFileDialog documentation
+//if wanting the increase that.
VOID CSelectPluginDlg::OnAddPlugin()
//----------------------------------
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -169,6 +169,7 @@
// -> CODE#0023
// -> DESC="IT project files (.itp)"
ON_COMMAND(IDC_CHECK6, OnCheck6)
+ ON_COMMAND(IDC_IT_STANDARD, OnITStandard)
ON_CBN_SELCHANGE(IDC_COMBO1,UpdateDialog)
// -! NEW_FEATURE#0023
//}}AFX_MSG_MAP
@@ -193,6 +194,7 @@
// -> DESC="IT project files (.itp)"
DDX_Control(pDX, IDC_CHECK6, m_CheckBox6);
// -! NEW_FEATURE#0023
+ DDX_Control(pDX, IDC_IT_STANDARD, m_CheckBoxITStandard);
//}}AFX_DATA_MAP
}
@@ -284,6 +286,7 @@
m_CheckBox3.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITOLDEFFECTS) ? MF_CHECKED : 0);
m_CheckBox4.SetCheck((m_pSndFile->m_dwSongFlags & SONG_ITCOMPATMODE) ? MF_CHECKED : 0);
m_CheckBox5.SetCheck((m_pSndFile->m_dwSongFlags & SONG_EXFILTERRANGE) ? MF_CHECKED : 0);
+ m_CheckBoxITStandard.SetCheck( (m_pSndFile->GetModSpecificFlag(IT_STANDARD) && m_pSndFile->GetType() == MOD_TYPE_IT) ? MF_CHECKED : MF_UNCHECKED);
// -> CODE#0023
// -> DESC="IT project files (.itp)"
@@ -300,6 +303,8 @@
// -> DESC="IT project files (.itp)"
m_CheckBox6.EnableWindow(m_TypeBox.GetCurSel() == 4 ? TRUE : FALSE);
// -! NEW_FEATURE#0023
+
+ m_CheckBoxITStandard.EnableWindow((m_pSndFile->GetType() == MOD_TYPE_IT) ? TRUE : FALSE);
m_TempoModeBox.EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE);
GetDlgItem(IDC_ROWSPERBEAT)->EnableWindow((m_pSndFile->m_nType & (MOD_TYPE_XM|MOD_TYPE_IT|MOD_TYPE_MPT)) ? TRUE : FALSE);
@@ -370,6 +375,12 @@
}
// -! NEW_FEATURE#0023
+void CModTypeDlg::OnITStandard()
+//------------------------------
+{
+ m_pSndFile->SetModSpecificFlag(IT_STANDARD, m_CheckBoxITStandard.GetCheck());
+}
+
BOOL CModTypeDlg::VerifyData()
//---------------------------------
{
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/dlg_misc.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -20,6 +20,8 @@
CButton m_CheckBox6;
// -! NEW_FEATURE#0023
+ CButton m_CheckBoxITStandard;
+
public:
CModTypeDlg(CSoundFile *pSndFile, CWnd *parent):CDialog(IDD_MODDOC_MODTYPE, parent) { m_pSndFile = pSndFile; m_nType = m_nChannels = 0; }
BOOL VerifyData();
@@ -42,6 +44,7 @@
// -> DESC="IT project files (.itp)"
afx_msg void OnCheck6();
// -! NEW_FEATURE#0023
+ afx_msg void OnITStandard();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/mptrack.rc 2006-12-21 15:02:44 UTC (rev 169)
@@ -903,51 +903,54 @@
GROUPBOX "Sample Map",IDC_STATIC,461,27,62,141
END
-IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 243, 198
+IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 247, 215
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "Song Properties"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
- DEFPUSHBUTTON "OK",IDOK,189,8,50,14
- PUSHBUTTON "Cancel",IDCANCEL,189,26,50,14
- GROUPBOX "Type",IDC_STATIC,4,4,174,41
+ DEFPUSHBUTTON "OK",IDOK,193,8,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,193,26,50,14
+ GROUPBOX "Type",IDC_STATIC,4,4,174,45
COMBOBOX IDC_COMBO1,8,16,101,51,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
COMBOBOX IDC_COMBO2,114,16,60,77,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
CONTROL "Linear Frequency Slides",IDC_CHECK1,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,7,106,93,10
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,113,93,10
CONTROL "Fast Volume Slides",IDC_CHECK2,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,7,118,75,10
+ WS_TABSTOP,7,124,75,10
CONTROL "IT Old Effects",IDC_CHECK3,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,111,106,76,10
+ WS_TABSTOP,111,113,76,10
CONTROL "IT Compatible Gxx",IDC_CHECK4,"Button",BS_AUTOCHECKBOX |
- WS_TABSTOP,111,118,76,10
+ WS_TABSTOP,111,124,76,10
CONTROL "Extended filter range",IDC_CHECK5,"Button",
- BS_AUTOCHECKBOX | WS_TABSTOP,7,130,82,10
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,137,82,10
CONTROL "Embed instrument parameters in ITP",IDC_CHECK6,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,8,33,128,10
- EDITTEXT IDC_ROWSPERBEAT,114,60,16,12,ES_AUTOHSCROLL | ES_NUMBER
- EDITTEXT IDC_ROWSPERMEASURE,114,72,16,12,ES_AUTOHSCROLL |
+ EDITTEXT IDC_ROWSPERBEAT,114,65,16,12,ES_AUTOHSCROLL | ES_NUMBER
+ EDITTEXT IDC_ROWSPERMEASURE,114,76,16,12,ES_AUTOHSCROLL |
ES_NUMBER
- LTEXT "Rows/beat",IDC_STATIC,132,62,36,8
- LTEXT "Rows/measure",IDC_STATIC,132,74,49,8
- COMBOBOX IDC_COMBO3,7,72,99,77,CBS_DROPDOWNLIST | WS_VSCROLL |
+ LTEXT "Rows/beat",IDC_STATIC,132,65,36,8
+ LTEXT "Rows/measure",IDC_STATIC,132,78,49,8
+ COMBOBOX IDC_COMBO3,7,76,99,77,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
- GROUPBOX "Tempo",IDC_STATIC,4,51,235,38
- LTEXT "Mode:",IDC_STATIC,7,62,21,8
- COMBOBOX IDC_COMBO4,156,129,81,51,CBS_DROPDOWNLIST | WS_VSCROLL |
+ GROUPBOX "Tempo",IDC_STATIC,4,55,235,38
+ LTEXT "Mode:",IDC_STATIC,7,65,21,8
+ COMBOBOX IDC_COMBO4,156,135,81,51,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
- GROUPBOX "Playback",IDC_STATIC,4,95,235,51
- LTEXT "Plugin levels:",IDC_STATIC,111,131,43,10
- GROUPBOX "OpenMPT Version Info",IDC_STATIC,4,150,235,42
- EDITTEXT IDC_EDIT1,67,161,166,13,ES_AUTOHSCROLL | ES_READONLY,
+ GROUPBOX "Playback",IDC_STATIC,4,99,240,62
+ LTEXT "Plugin levels:",IDC_STATIC,111,138,43,10
+ GROUPBOX "OpenMPT Version Info",IDC_STATIC,4,165,235,44
+ EDITTEXT IDC_EDIT1,67,175,166,13,ES_AUTOHSCROLL | ES_READONLY,
WS_EX_STATICEDGE
- EDITTEXT IDC_EDIT2,67,175,166,13,ES_AUTOHSCROLL | ES_READONLY,
+ EDITTEXT IDC_EDIT2,67,190,166,13,ES_AUTOHSCROLL | ES_READONLY,
WS_EX_STATICEDGE
- EDITTEXT IDC_EDIT5,7,161,58,13,ES_AUTOHSCROLL | ES_READONLY
- EDITTEXT IDC_EDIT6,7,175,58,13,ES_AUTOHSCROLL | ES_READONLY
+ EDITTEXT IDC_EDIT5,7,175,58,13,ES_AUTOHSCROLL | ES_READONLY
+ EDITTEXT IDC_EDIT6,7,190,58,13,ES_AUTOHSCROLL | ES_READONLY
+ CONTROL "Aim for Impulse Tracker playback (for IT)",
+ IDC_IT_STANDARD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,
+ 149,143,10
END
IDD_SHOWLOG DIALOG 0, 0, 300, 106
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/pattern.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -1,17 +1,15 @@
-#ifndef __SNDFILE_H
-#include "../soundlib/sndfile.h"
-#endif
-
#ifndef PATTERN_H
#define PATTERN_H
#include <vector>
+#include "modcommand.h"
using std::vector;
class CPatternContainer;
-typedef UINT ROWINDEX;
+typedef size_t ROWINDEX;
+typedef size_t CHANNELINDEX;
//============
class CPattern
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/resource.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/resource.h 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/resource.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -438,7 +438,7 @@
#define IDC_CHECK67 1767
#define IDC_CHECK68 1768
#define IDC_CHECK69 1769
-#define IDC_CHECK70 1770
+#define IDC_IT_STANDARD 1770
#define IDC_CHECK71 1771
#define IDC_CHECK72 1772
#define IDC_CHECK73 1773
@@ -946,6 +946,8 @@
#define ID_EDIT_GOTO 36018
#define ID_VIEW_GRAPH 36019
#define ID_PATTERN_TRANSITIONMUTE 36020
+#define ID_PATTERN_TRANSITIONSOLO 36021
+#define ID_PATTERN_TRANSITION_UNMUTEALL 36022
#define ID_SELECTINST 36100
#define ID_NETLINK_MPTFR 37001
#define ID_PLUG_RECORDAUTOMATION 37003
Modified: branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/mptrack/serialization_utils.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -39,7 +39,7 @@
}
//Gets called on seekg
- pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::binary)
+ pos_type seekpos(pos_type sp, ios_base::openmode) // which = ios_base::in | ios_base::binary)
{
DWORD offset = static_cast<DWORD>(sp);
if(offset >= 0 && offset < GetStrmSize())
@@ -52,7 +52,7 @@
}
//Gets called on tellg
- pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::binary)
+ pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode) // which = ios_base::in | ios_base::binary)
{
DWORD beginOffset = 0;
if(way == ios::cur)
Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/soundlib/Load_it.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -4478,7 +4478,11 @@
cbs.pubsetbuf((char*)cpcMPTStart, dwMemLength-mptStartPos);
istream fin(&cbs);
- m_TuningsTuneSpecific.UnSerializeBinary(fin);
+ if(m_TuningsTuneSpecific.UnSerializeBinary(fin))
+ {
+ ::MessageBox(NULL, "Error occured - loading failed while trying to load tune specific tunings.", 0, MB_OK);
+ return FALSE;
+ }
//2. Reading tuning id <-> tuning name map.
typedef map<WORD, string> MAP;
Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/soundlib/Sampleio.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -10,6 +10,7 @@
#include "stdafx.h"
#include "sndfile.h"
#include "it_defs.h"
+#include "wavConverter.h"
#pragma warning(disable:4244)
@@ -421,26 +422,28 @@
|| (pfmtpk->channels != 1)) return FALSE;
} else pfmtpk = NULL;
}
- // WAVE_FORMAT_PCM, WAVE_FORMAT_EXTENSIBLE
- if (((pfmt->format != 1) && (pfmt->format != 0xFFFE))
+ // WAVE_FORMAT_PCM, WAVE_FORMAT_IEEE_FLOAT, WAVE_FORMAT_EXTENSIBLE
+ if ((((pfmt->format != 1) && (pfmt->format != 0xFFFE))
+ && (pfmt->format != 3 || pfmt->bitspersample != 32)) //Microsoft IEEE FLOAT
|| (pfmt->channels > 2)
|| (!pfmt->channels)
|| (pfmt->bitspersample & 7)
|| (!pfmt->bitspersample)
|| (pfmt->bitspersample > 32)
) return FALSE;
+
DestroySample(nSample);
UINT nType = RS_PCM8U;
if (pfmt->channels == 1)
{
if (pfmt->bitspersample == 24) nType = RS_PCM24S;
- if (pfmt->bitspersample == 32) nType = RS_PCM32S;
- else nType = (pfmt->bitspersample == 16) ? RS_PCM16S : RS_PCM8U;
+ else if (pfmt->bitspersample == 32) nType = RS_PCM32S;
+ else nType = (pfmt->bitspersample == 16) ? RS_PCM16S : RS_PCM8U;
} else
{
if (pfmt->bitspersample == 24) nType = RS_STIPCM24S;
else if (pfmt->bitspersample == 32) nType = RS_STIPCM32S;
- else nType = (pfmt->bitspersample == 16) ? RS_STIPCM16S : RS_STIPCM8U;
+ else nType = (pfmt->bitspersample == 16) ? RS_STIPCM16S : RS_STIPCM8U;
}
UINT samplesize = pfmt->channels * (pfmt->bitspersample >> 3);
MODINSTRUMENT *pins = &Ins[nSample];
@@ -477,7 +480,7 @@
AdjustSampleLoop(pins);
} else
{
- ReadSample(pins, nType, (LPSTR)(lpMemFile+dwDataPos), dwFileLength-dwDataPos);
+ ReadSample(pins, nType, (LPSTR)(lpMemFile+dwDataPos), dwFileLength-dwDataPos, pfmt->format);
}
// smpl field
if (psh)
Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/soundlib/Snd_fx.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -1045,7 +1045,7 @@
note = instr = 0;
}
}
- if ((!note) && (instr))
+ if ((!note) && (instr)) //Case: instrument with no note data.
{
if (m_nInstruments)
{
@@ -1059,9 +1059,11 @@
pChn->dwFlags &= ~CHN_NOTEFADE;
pChn->nFadeOutVol = 65536;
}
- } else
+ } else //Case: Only samples are used; no instruments.
{
if (instr < MAX_SAMPLES) pChn->nVolume = Ins[instr].nVolume;
+ if (m_nType == MOD_TYPE_IT && GetModSpecificFlag(IT_STANDARD))
+ note = pChn->nNote;
}
if (!(m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT))) instr = 0;
}
@@ -1089,7 +1091,6 @@
InstrumentChange(pChn, instr, bPorta, TRUE);
pChn->nNewIns = 0;
// Special IT case: portamento+note causes sample change -> ignore portamento
- //if ((m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT))
if ((m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT))
&& (psmp != pChn->pInstrument) && (note) && (note < 0x80))
{
@@ -3281,7 +3282,7 @@
}
// Channel mutes
- for (int chan=0; chan<m_nChannels; chan++) {
+ for (UINT chan=0; chan<m_nChannels; chan++) {
if (m_bChannelMuteTogglePending[chan]) {
m_pModDoc->MuteChannel(chan, !m_pModDoc->IsChannelMuted(chan));
m_bChannelMuteTogglePending[chan]=false;
Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -13,6 +13,7 @@
#include "../mptrack/moddoc.h"
#include "sndfile.h"
#include "aeffectx.h"
+#include "wavConverter.h"
#include <vector>
#include <algorithm>
@@ -26,6 +27,7 @@
#define UNLHA_SUPPORT
#define ZIPPED_MOD_SUPPORT
LPCSTR glpszModExtensions = "mod|s3m|xm|it|stm|nst|ult|669|wow|mtm|med|far|mdl|ams|dsm|amf|okt|dmf|ptm|psm|mt2|umx";
+//Should there be mptm?
#endif // NO_ARCHIVE_SUPPORT
#else // NO_COPYRIGHT: EarSaver only loads mod/s3m/xm/it/wav
#define MODPLUG_BASIC_SUPPORT
@@ -375,7 +377,7 @@
CTuningCollection CSoundFile::s_TuningsSharedLocal("Local Tunings");
-CSoundFile::CSoundFile() : m_TuningsTuneSpecific("Tune specific tunings"), PatternSize(*this), Patterns(*this), Order(*this)
+CSoundFile::CSoundFile() : m_TuningsTuneSpecific("Tune specific tunings"), PatternSize(*this), Patterns(*this), Order(*this), m_PlaybackEventer(*this)
//----------------------
{
m_nType = MOD_TYPE_NONE;
@@ -400,6 +402,8 @@
m_bIsRendering = false;
m_nMaxSample = 0;
+ m_ModFlags.reset();
+
m_pModDoc = NULL;
m_dwLastSavedWithVersion=0;
m_dwCreatedWithVersion=0;
@@ -698,7 +702,7 @@
BOOL CSoundFile::Destroy()
//------------------------
{
- int i;
+ size_t i;
for (i=0; i<Patterns.Size(); i++) if (Patterns[i])
{
FreePattern(Patterns[i]);
@@ -1422,7 +1426,7 @@
UINT nRemainingChannels = newOrder.size();
- if(nRemainingChannels > min(MAX_CHANNELS, MAX_BASECHANNELS) || nRemainingChannels < 4)
+ if(nRemainingChannels > min(MAX_CHANNELS, MAX_BASECHANNELS) || nRemainingChannels < GetNumChannelMin())
{
CString str = "Error: Bad newOrder vector in CSoundFile::ReArrangeChannels(...)";
CMainFrame::GetMainFrame()->MessageBox(str , "ReArrangeChannels", MB_OK | MB_ICONINFORMATION);
@@ -1856,9 +1860,8 @@
// 5 = signed 16-bit PCM data
// 6 = unsigned 16-bit PCM data
-
-UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength)
-//------------------------------------------------------------------------------------------------
+UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength, const WORD format)
+//-----------------------------------------------------------------------------------------------------------------------
{
UINT len = 0, mem = pIns->nLength+6;
@@ -1888,7 +1891,7 @@
len = pIns->nLength;
if (len > dwMemLength) len = pIns->nLength = dwMemLength;
LPSTR pSample = pIns->pSample;
- for (UINT j=0; j<len; j++) pSample[j] = (char)(lpMemFile[j] - 0x80);
+ for (UINT j=0; j<len; j++) pSample[j] = (char)(lpMemFile[j] - 0x80);
}
break;
@@ -2207,7 +2210,7 @@
break;
#ifdef MODPLUG_TRACKER
- // PCM 24-bit signed -> load sample, and normalize it to 16-bit
+ // Mono PCM 24/32-bit signed & 32 bit float -> load sample, and normalize it to 16-bit
case RS_PCM24S:
case RS_PCM32S:
len = pIns->nLength * 3;
@@ -2215,56 +2218,66 @@
if (len > dwMemLength) break;
if (len > 4*8)
{
- UINT slsize = (nFlags == RS_PCM32S) ? 4 : 3;
- LPBYTE pSrc = (LPBYTE)lpMemFile;
- LONG max = 255;
- if (nFlags == RS_PCM32S) pSrc++;
- for (UINT j=0; j<len; j+=slsize)
+ if(nFlags == RS_PCM24S)
{
- LONG l = ((((pSrc[j+2] << 8) + pSrc[j+1]) << 8) + pSrc[j]) << 8;
- l /= 256;
- if (l > max) max = l;
- if (-l > max) max = -l;
+ char* pSrc = (char*)lpMemFile;
+ char* pDest = (char*)pIns->pSample;
+ CopyWavBuffer<3, 2, WavSigned24To16, MaxFinderInt<3> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes());
}
- max = (max / 128) + 1;
- signed short *pDest = (signed short *)pIns->pSample;
- for (UINT k=0; k<len; k+=slsize)
+ else //RS_PCM32S
{
- LONG l = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8;
- *pDest++ = (signed short)(l / max);
+ char* pSrc = (char*)lpMemFile;
+ char* pDest = (char*)pIns->pSample;
+ if(format == 3)
+ CopyWavBuffer<4, 2, WavFloat32To16, MaxFinderFloat32>(pSrc, len, pDest, pIns->GetSampleSizeInBytes());
+ else
+ CopyWavBuffer<4, 2, WavSigned32To16, MaxFinderInt<4> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes());
}
}
break;
- // Stereo PCM 24-bit signed -> load sample, and normalize it to 16-bit
+ // Stereo PCM 24/32-bit signed & 32 bit float -> convert sample to 16 bit
case RS_STIPCM24S:
case RS_STIPCM32S:
- len = pIns->nLength * 6;
- if (nFlags == RS_STIPCM32S) len += pIns->nLength * 2;
- if (len > dwMemLength) break;
- if (len > 8*8)
+ if(format == 3 && nFlags == RS_STIPCM32S) //Microsoft IEEE float
{
- UINT slsize = (nFlags == RS_STIPCM32S) ? 4 : 3;
- LPBYTE pSrc = (LPBYTE)lpMemFile;
- LONG max = 255;
- if (nFlags == RS_STIPCM32S) pSrc++;
- for (UINT j=0; j<len; j+=slsize)
+ len = pIns->nLength * 6;
+ //pIns->nLength tells(?) the number of frames there
+ //are. One 'frame' of 1 byte(== 8 bit) mono data requires
+ //1 byte of space, while one frame of 3 byte(24 bit)
+ //stereo data requires 3*2 = 6 bytes. This is(?)
+ //why there is factor 6.
+
+ len += pIns->nLength * 2;
+ //Compared to 24 stereo, 32 bit stereo needs 16 bits(== 2 bytes)
+ //more per frame.
+
+ if(len > dwMemLength) break;
+ char* pSrc = (char*)lpMemFile;
+ char* pDest = (char*)pIns->pSample;
+ if (len > 8*8)
{
- LONG l = ((((pSrc[j+2] << 8) + pSrc[j+1]) << 8) + pSrc[j]) << 8;
- l /= 256;
- if (l > max) max = l;
- if (-l > max) max = -l;
+ CopyWavBuffer<4, 2, WavFloat32To16, MaxFinderFloat32>(pSrc, len, pDest, pIns->GetSampleSizeInBytes());
}
- max = (max / 128) + 1;
- signed short *pDest = (signed short *)pIns->pSample;
- for (UINT k=0; k<len; k+=slsize)
+ }
+ else
+ {
+ len = pIns->nLength * 6;
+ if (nFlags == RS_STIPCM32S) len += pIns->nLength * 2;
+ if (len > dwMemLength) break;
+ if (len > 8*8)
{
- LONG lr = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8;
- k += slsize;
- LONG ll = ((((pSrc[k+2] << 8) + pSrc[k+1]) << 8) + pSrc[k]) << 8;
- pDest[0] = (signed short)ll;
- pDest[1] = (signed short)lr;
- pDest += 2;
+ char* pSrc = (char*)lpMemFile;
+ char* pDest = (char*)pIns->pSample;
+ if(nFlags == RS_STIPCM32S)
+ {
+ CopyWavBuffer<4,2,WavSigned32To16, MaxFinderInt<4> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes());
+ }
+ if(nFlags == RS_STIPCM24S)
+ {
+ CopyWavBuffer<3,2,WavSigned24To16, MaxFinderInt<3> >(pSrc, len, pDest, pIns->GetSampleSizeInBytes());
+ }
+
}
}
break;
@@ -2800,12 +2813,33 @@
ROWINDEX CSoundFile::GetRowMax() const {return MAX_PATTERN_ROWS;}
ROWINDEX CSoundFile::GetRowMin() const {return 2;}
+CHANNELINDEX CSoundFile::GetNumChannelMax() const
+//-----------------------------------
+{
+ if(m_nType == MOD_TYPE_MPT) return MPTM_SPECS.channelsMax;
+ if(m_nType == MOD_TYPE_IT) return max_chans_IT;
+ if(m_nType == MOD_TYPE_XM) return max_chans_XM;
+ if(m_nType == MOD_TYPE_MOD) return max_chans_MOD;
+ if(m_nType == MOD_TYPE_S3M) return max_chans_S3M;
+ return 4;
+}
+
+CHANNELINDEX CSoundFile::GetNumChannelMin() const
+//-----------------------------------
+{
+ if(m_nType == MOD_TYPE_MPT) return MPTM_SPECS.channelsMin;
+ else return 4;
+}
+
void CSoundFile::ChangeModTypeTo(const int& newType)
//---------------------------------------------------
{
const UINT oldInvalidIndex = Patterns.GetInvalidIndex();
const UINT oldIgnoreIndex = Patterns.GetIgnoreIndex();
m_nType = newType;
+
+ m_ModFlags.reset();
+
replace(Order.begin(), Order.end(), oldInvalidIndex, Patterns.GetInvalidIndex());
replace(Order.begin(), Order.end(), oldIgnoreIndex, Patterns.GetIgnoreIndex());
}
Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndfile.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -261,9 +261,12 @@
// 24-bit signed
#define RS_PCM24S (RS_PCM16S|0x80) // mono 24-bit signed
#define RS_STIPCM24S (RS_PCM16S|0x80|RSF_STEREO) // stereo 24-bit signed
-#define RS_PCM32S (RS_PCM16S|0xC0) // mono 24-bit signed
-#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 24-bit signed
+// 32-bit
+#define RS_PCM32S (RS_PCM16S|0xC0) // mono 32-bit signed
+#define RS_STIPCM32S (RS_PCM16S|0xC0|RSF_STEREO) // stereo 32-bit signed
+
+
// NNA types
#define NNA_NOTECUT 0
#define NNA_CONTINUE 1
@@ -469,6 +472,7 @@
typedef struct _MODINSTRUMENT
{
UINT nLength,nLoopStart,nLoopEnd;
+ //nLength <-> Number of 'frames'?
UINT nSustainStart, nSustainEnd;
LPSTR pSample;
UINT nC4Speed;
@@ -483,6 +487,16 @@
BYTE nVibDepth;
BYTE nVibRate;
CHAR name[22];
+
+ //Returns size which pSample is at least.
+ //Very dirty implementation.
+ DWORD GetSampleSizeInBytes() const
+ {
+ DWORD len = nLength;
+ if(uFlags & CHN_16BIT) len *= 2;
+ if(uFlags & CHN_STEREO) len *= 2;
+ return len;
+ }
} MODINSTRUMENT;
@@ -678,17 +692,8 @@
CHAR szName[MAX_CHANNELNAME];
} MODCHANNELSETTINGS;
+#include "modcommand.h"
-typedef struct _MODCOMMAND
-{
- BYTE note;
- BYTE instr;
- BYTE volcmd;
- BYTE command;
- BYTE vol;
- BYTE param;
-} MODCOMMAND, *LPMODCOMMAND;
-
////////////////////////////////////////////////////////////////////
// Mix Plugins
#define MIXPLUG_MIXREADY 0x01 // Set when cleared
@@ -836,6 +841,12 @@
#include "../mptrack/patternContainer.h"
#include "../mptrack/ordertopatterntable.h"
+typedef CPatternContainer::PATTERNINDEX PATTERNINDEX;
+
+#include "../mptrack/playbackEventer.h"
+
+
+
class CSoundFile;
//======================
@@ -849,6 +860,9 @@
const CSoundFile& m_rSndFile;
};
+
+const BYTE IT_STANDARD = 0;
+
//==============
class CSoundFile
//==============
@@ -862,8 +876,22 @@
ROWINDEX GetRowMax() const;
ROWINDEX GetRowMin() const;
+ CHANNELINDEX GetNumChannelMax() const;
+ CHANNELINDEX GetNumChannelMin() const;
+
void ChangeModTypeTo(const int& newType);
UINT GetModType() const {return m_nType;}
+
+ bitset<8> m_ModFlags;
+ virtual bool GetModSpecificFlag(BYTE i)
+ {
+ return (i < m_ModFlags.size()) ? m_ModFlags[i] : false;
+ }
+ virtual void SetModSpecificFlag(BYTE i, bool val)
+ {
+ if(i < m_ModFlags.size())
+ m_ModFlags[i] = val;
+ }
//Tuning-->
public:
@@ -877,12 +905,20 @@
static CTuningCollection s_TuningsSharedLocal;
//<--Tuning
+public:
+ CPlaybackEventer& GetPlaybackEventer() {return m_PlaybackEventer;}
+ //const CPlaybackEventer& GetPlaybackEventer() const {return m_playbackEventer;}
+
private:
void PortamentoMPT(MODCHANNEL*, int);
void PortamentoFineMPT(MODCHANNEL*, int);
+private:
+ CPlaybackEventer m_PlaybackEventer;
+
+
public: // Static Members
static UINT m_nXBassDepth, m_nXBassRange;
static float m_nMaxSample;
@@ -1172,7 +1208,7 @@
char GetDeltaValue(char prev, UINT n) const { return (char)(prev + CompressionTable[n & 0x0F]); }
UINT PackSample(int &sample, int next);
BOOL CanPackSample(LPSTR pSample, UINT nLen, UINT nPacking, BYTE *result=NULL);
- UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength);
+ UINT ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR pMemFile, DWORD dwMemLength, const WORD format = 1);
BOOL DestroySample(UINT nSample);
// -> CODE#0020
Modified: branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp
===================================================================
--- branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp 2006-10-02 21:41:06 UTC (rev 168)
+++ branches/OpenMPT_MPTm_Tuning/soundlib/Sndmix.cpp 2006-12-21 15:02:44 UTC (rev 169)
@@ -1099,11 +1099,27 @@
}
else //Original
{
- switch(m_nTickCount % 3)
+ BYTE note = pChn->nNote;
+ bool apply = true;
+
+ if(m_nType == MOD_TYPE_IT && GetModSpecificFlag(IT_STANDARD))
{
- case 1: period = GetPeriodFromNote(pChn->nNote + (pChn->nArpeggio >> 4), pChn->nFineTune, pChn->nC4Speed); break;
- case 2: period = GetPeriodFromNote(pChn->nNote + (pChn->nArpeggio & 0x0F), pChn->nFineTune, pChn->nC4Speed); break;
+ if(pChn->nArpeggio >> 4 == 0 && (pChn->nArpeggio & 0x0F) == 0)
+ apply = false;
+ //Ignoring J00.
+
+ if(apply) note = GetNoteFromPeriod(pChn->nPeriod);
+ //Using actual note instead of channel note.
}
+
+ if(apply)
+ {
+ switch(m_nTickCount % 3)
+ {
+ case 1: period = GetPeriodFromNote(note + (pChn->nArpeggio >> 4), pChn->nFineTune, pChn->nC4Speed); break;
+ case 2: period = GetPeriodFromNote(note + (pChn->nArpeggio & 0x0F), pChn->nFineTune, pChn->nC4Speed); break;
+ }
+ }
}
}
Added: branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h (rev 0)
+++ branches/OpenMPT_MPTm_Tuning/soundlib/modcommand.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -0,0 +1,14 @@
+#ifndef MODCOMMAND_H
+#define MODCOMMAND_H
+
+typedef struct _MODCOMMAND
+{
+ BYTE note;
+ BYTE instr;
+ BYTE volcmd;
+ BYTE command;
+ BYTE vol;
+ BYTE param;
+} MODCOMMAND, *LPMODCOMMAND;
+
+#endif
Added: branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h
===================================================================
--- branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h (rev 0)
+++ branches/OpenMPT_MPTm_Tuning/soundlib/wavConverter.h 2006-12-21 15:02:44 UTC (rev 169)
@@ -0,0 +1,137 @@
+#ifndef WAVCONVERTER_H
+#define WAVCONVERTER_H
+
+#include <limits>
+
+typedef void (*DATACONV)(char* const, char*, const double);
+//srcBuffer, destBuffer, maximum value in srcBuffer.
+
+typedef double MAXFINDER(const char* const, const size_t);
+//Buffer, bufferSize.
+
+inline void WavSigned8To16(char* const inBuffer, char* outBuffer, const double max)
+//----------------------------------------------------------------------
+{
+ outBuffer[0] = 0;
+ outBuffer[1] = inBuffer[0];
+}
+
+
+template<BYTE INBYTES>
+inline double MaxFinderInt(const char* const buffer, const size_t bs)
+//----------------------------------------------------------------------
+{
+ if(INBYTES > 8) return 0;
+ if(bs < INBYTES) return 0;
+
+ __int64 max = 0;
+ for(size_t i = 0; i <= bs-INBYTES; i += INBYTES)
+ {
+ __int64 temp = 0;
+ memcpy((char*)(&temp)+(8-INBYTES), buffer + i, INBYTES);
+ if(temp < 0) temp = -temp;
+ temp >>= 8*INBYTES;
+ if(temp > max)
+ max = temp;
+ }
+ return static_cast<double>(max);
+}
+
+
+inline double MaxFinderFloat32(const char* const buffer, const size_t bs)
+//----------------------------------------------------------------------
+{
+ float max = 0;
+ for(size_t i = 0; i<=bs-4; i+=4)
+ {
+ float temp = *reinterpret_cast<const float*>(buffer+i);
+ temp = fabs(temp);
+ if(temp > max)
+ max = temp;
+ }
+ return max;
+}
+
+
+inline void WavSigned24To16(char* const inBuffer, char* outBuffer, const double max)
+//--------------------------------------------------------------------------------
+{
+ __int32 val = 0;
+ memcpy((char*)(&val)+1, inBuffer, 3);
+ //Reading 24 bit data to three last bytes in 32 bit int.
+
+ ASSERT((val << 24) == 0);
+
+ bool negative = (val < 0) ? true : false;
+ if(negative) val = -val;
+ if(val < 0) val = (std::numeric_limits<__int32>::max)();
+ //Handling special case that val is at minimum of int32 limit.
+
+ val >>= 8;
+
+ const __int64 NC = 32766; //Normalisation constant (2^16 / 2)-1.
+ const __int64 maxInt = static_cast<__int64>(max);
+ val = static_cast<__int32>(val*NC/maxInt);
+
+ ASSERT((val >> 15) == 0);
+
+ __int16 outVal = static_cast<__int16>(val);
+
+ if(negative) outVal = -outVal;
+
+ memcpy(outBuffer, &outVal, 2);
+}
+
+inline void WavFloat32To16(char* const inBuffer, char* outBuffer, double max)
+//----------------------------------------------------------------------
+{
+ __int16* pOut = reinterpret_cast<__int16*>(outBuffer);
+ float* pIn = reinterpret_cast<float*>(inBuffer);
+ *pOut = static_cast<__int16>((*pIn / max) * 32766);
+}
+
+inline void WavSigned32To16(char* const inBuffer, char* outBuffer, double max)
+//----------------------------------------------------------------------
+{
+ if(max >= 1)
+ {
+ double temp = *reinterpret_cast<const __int32*>(inBuffer);
+ __int16& pOut = *reinterpret_cast<__int16*>(outBuffer);
+ ASSERT(static_cast<__int16>(fabs(temp) / max * 32766) <= 32766);
+ pOut = static_cast<__int16>(temp / max * 32766);
+ }
+ else //No normalisation
+ {
+ outBuffer[0] = inBuffer[2];
+ outBuffer[1] = inBuffer[3];
+ }
+}
+
+
+template<size_t inBytes, size_t outBytes, DATACONV CopyAndConvert, MAXFINDER MaxFinder>
+bool CopyWavBuffer(char* const readBuffer, const size_t rbSize, char* writeBuffer, const size_t wbSize)
+//----------------------------------------------------------------------
+{
+ if(inBytes > rbSize || outBytes > wbSize) return true;
+ if(inBytes > 8) return true;
+ size_t rbCounter = 0;
+ size_t wbCounter = 0;
+
+ //Finding max value
+ const double max = MaxFinder(readBuffer, rbSize);
+
+ if(max == 0) return true;
+
+ //Copying buffer.
+ while(rbCounter <= rbSize-inBytes && wbCounter <= wbSize-outBytes)
+ {
+ CopyAndConvert(readBuffer+rbCounter, writeBuffer+wbCounter, max);
+ rbCounter += inBytes;
+ wbCounter += outBytes;
+ }
+ return false;
+}
+
+
+
+#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|