From: <man...@us...> - 2013-04-11 20:15:29
|
Revision: 1848 http://sourceforge.net/p/modplug/code/1848 Author: manxorist Date: 2013-04-11 20:15:19 +0000 (Thu, 11 Apr 2013) Log Message: ----------- [Imp] Support output of unclippped 32bit floats in CSoundFile::Read(). Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mpdlgs.h trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/MixerSettings.cpp trunk/OpenMPT/soundlib/MixerSettings.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -859,14 +859,14 @@ if(!err) { err = !audioTryOpeningDevice(TrackerSettings::Instance().m_MixerSettings.gnChannels, - TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample, + TrackerSettings::Instance().m_MixerSettings.m_SampleFormat, TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq); nFixedBitsPerSample = (gpSoundDevice) ? gpSoundDevice->HasFixedBitsPerSample() : 0; - if(err && (nFixedBitsPerSample && (nFixedBitsPerSample != TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample))) + if(err && (nFixedBitsPerSample && (nFixedBitsPerSample != TrackerSettings::Instance().m_MixerSettings.m_SampleFormat))) { - if(nFixedBitsPerSample) TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample = nFixedBitsPerSample; + if(nFixedBitsPerSample) TrackerSettings::Instance().m_MixerSettings.m_SampleFormat = (SampleFormat)nFixedBitsPerSample; err = !audioTryOpeningDevice(TrackerSettings::Instance().m_MixerSettings.gnChannels, - TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample, + TrackerSettings::Instance().m_MixerSettings.m_SampleFormat, TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq); } } @@ -1665,8 +1665,8 @@ } -BOOL CMainFrame::SetupSoundCard(DWORD q, DWORD rate, UINT nBits, UINT nChns, UINT latency_ms, UINT updateinterval_ms, LONG wd) -//---------------------------------------------------------------------------------------------------------------------------- +BOOL CMainFrame::SetupSoundCard(DWORD q, DWORD rate, SampleFormat sampleformat, UINT nChns, UINT latency_ms, UINT updateinterval_ms, LONG wd) +//--------------------------------------------------------------------------------------------------------------------------------------------- { const bool isPlaying = IsPlaying(); if (((TrackerSettings::Instance().m_MixerSettings.MixerFlags & SOUNDSETUP_RESTARTMASK) != (q & SOUNDSETUP_RESTARTMASK)) @@ -1674,7 +1674,7 @@ || (TrackerSettings::Instance().m_nWaveDevice != wd) || (TrackerSettings::Instance().m_LatencyMS != latency_ms) || (TrackerSettings::Instance().m_UpdateIntervalMS != updateinterval_ms) - || (TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample != nBits) + || (TrackerSettings::Instance().m_MixerSettings.m_SampleFormat != sampleformat) || (TrackerSettings::Instance().m_MixerSettings.gnChannels != nChns)) { CModDoc *pActiveMod = NULL; @@ -1688,7 +1688,7 @@ TrackerSettings::Instance().m_MixerSettings.MixerFlags = q; TrackerSettings::Instance().m_LatencyMS = latency_ms; TrackerSettings::Instance().m_UpdateIntervalMS = updateinterval_ms; - TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample = nBits; + TrackerSettings::Instance().m_MixerSettings.m_SampleFormat = sampleformat; TrackerSettings::Instance().m_MixerSettings.gnChannels = nChns; { CriticalSection cs; @@ -1850,7 +1850,7 @@ CPropertySheet dlg("OpenMPT Setup", this, m_nLastOptionsPage); COptionsGeneral general; - COptionsSoundcard sounddlg(TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq, TrackerSettings::Instance().m_MixerSettings.MixerFlags, TrackerSettings::Instance().m_MixerSettings.gnBitsPerSample, TrackerSettings::Instance().m_MixerSettings.gnChannels, TrackerSettings::Instance().m_LatencyMS, TrackerSettings::Instance().m_UpdateIntervalMS, TrackerSettings::Instance().m_nWaveDevice); + COptionsSoundcard sounddlg(TrackerSettings::Instance().m_MixerSettings.gdwMixingFreq, TrackerSettings::Instance().m_MixerSettings.MixerFlags, TrackerSettings::Instance().m_MixerSettings.m_SampleFormat, TrackerSettings::Instance().m_MixerSettings.gnChannels, TrackerSettings::Instance().m_LatencyMS, TrackerSettings::Instance().m_UpdateIntervalMS, TrackerSettings::Instance().m_nWaveDevice); COptionsKeyboard keyboard; COptionsColors colors; COptionsPlayer playerdlg; Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-04-11 20:15:19 UTC (rev 1848) @@ -439,7 +439,7 @@ BOOL StopRenderer(CSoundFile*); void SwitchToActiveView(); - BOOL SetupSoundCard(DWORD q, DWORD rate, UINT nbits, UINT chns, UINT latency_ms, UINT updateinterval_ms, LONG wd); + BOOL SetupSoundCard(DWORD q, DWORD rate, SampleFormat sampleformat, UINT chns, UINT latency_ms, UINT updateinterval_ms, LONG wd); BOOL SetupMiscOptions(); BOOL SetupPlayer(); Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -695,7 +695,7 @@ MixerSettings oldmixersettings = m_pSndFile->m_MixerSettings; MixerSettings mixersettings = TrackerSettings::Instance().m_MixerSettings; mixersettings.gdwMixingFreq = m_pWaveFormat->nSamplesPerSec; - mixersettings.gnBitsPerSample = m_pWaveFormat->wBitsPerSample; + mixersettings.m_SampleFormat = (SampleFormat)m_pWaveFormat->wBitsPerSample; mixersettings.gnChannels = m_pWaveFormat->nChannels; m_pSndFile->m_SongFlags.reset(SONG_PAUSED | SONG_STEP); // -> CODE#0024 @@ -704,7 +704,7 @@ if ((m_bNormalize) && (m_pWaveFormat->wBitsPerSample <= 24)) // -! NEW_FEATURE#0024 { - mixersettings.gnBitsPerSample = 24; + mixersettings.m_SampleFormat = SampleFormatInt24; #ifndef NO_AGC mixersettings.DSPMask &= ~SNDDSP_AGC; #endif @@ -769,7 +769,7 @@ m_pSndFile->m_PatternCuePoints.reserve(m_pSndFile->Order.GetLength()); // Process the conversion - UINT nBytesPerSample = (m_pSndFile->m_MixerSettings.gnBitsPerSample * m_pSndFile->m_MixerSettings.gnChannels) / 8; + UINT nBytesPerSample = (m_pSndFile->m_MixerSettings.GetBitsPerSample() * m_pSndFile->m_MixerSettings.gnChannels) / 8; // For calculating the remaining time DWORD dwStartTime = timeGetTime(); // For giving away some processing time every now and then @@ -778,7 +778,7 @@ CMainFrame::GetMainFrame()->InitRenderer(m_pSndFile); //rewbs.VSTTimeInfo for (UINT n = 0; ; n++) { - UINT lRead = m_pSndFile->Read(buffer, sizeof(buffer)/(m_pSndFile->m_MixerSettings.gnChannels*m_pSndFile->m_MixerSettings.gnBitsPerSample/8)); + UINT lRead = m_pSndFile->Read(buffer, sizeof(buffer)/(m_pSndFile->m_MixerSettings.gnChannels*m_pSndFile->m_MixerSettings.GetBitsPerSample()/8)); // Process cue points (add base offset), if there are any to process. vector<PatternCuePoint>::reverse_iterator iter; @@ -1108,7 +1108,7 @@ oldrepeat = m_pSndFile->GetRepeatCount(); const DWORD dwSongTime = m_pSndFile->GetSongTime(); mixersettings.gdwMixingFreq = wfxSrc.nSamplesPerSec; - mixersettings.gnBitsPerSample = 16; + mixersettings.m_SampleFormat = SampleFormatInt16; mixersettings.gnChannels = wfxSrc.nChannels; m_pSndFile->SetRepeatCount(0); m_pSndFile->ResetChannels(); @@ -1152,7 +1152,7 @@ UINT lRead = 0; if (!bFinished) { - lRead = m_pSndFile->Read(pcmBuffer + WAVECONVERTBUFSIZE - pcmBufSize, pcmBufSize/(m_pSndFile->m_MixerSettings.gnChannels*m_pSndFile->m_MixerSettings.gnBitsPerSample/8)); + lRead = m_pSndFile->Read(pcmBuffer + WAVECONVERTBUFSIZE - pcmBufSize, pcmBufSize/(m_pSndFile->m_MixerSettings.gnChannels*m_pSndFile->m_MixerSettings.GetBitsPerSample()/8)); if (!lRead) bFinished = true; } ullSamples += lRead; Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -263,7 +263,7 @@ wsprintf(s, "%s, %d Bit", gszChnCfgNames[j/3], nBits); UINT ndx = m_CbnQuality.AddString(s); m_CbnQuality.SetItemData( ndx, (nChannels << 8) | nBits ); - if ((nBits == m_nBitsPerSample) && (nChannels == m_nChannels)) n = ndx; + if (((SampleFormat)nBits == m_SampleFormat) && (nChannels == m_nChannels)) n = ndx; } } m_CbnQuality.SetCurSel(n); @@ -426,9 +426,8 @@ { UINT n = m_CbnQuality.GetItemData( m_CbnQuality.GetCurSel() ); m_nChannels = n >> 8; - m_nBitsPerSample = n & 0xFF; + m_SampleFormat = (SampleFormat)(n & 0xFF); if ((m_nChannels != 1) && (m_nChannels != 4)) m_nChannels = 2; - if ((m_nBitsPerSample != 8) && (m_nBitsPerSample != 32)) m_nBitsPerSample = 16; } // Polyphony { @@ -472,7 +471,7 @@ { TrackerSettings::Instance().m_MixerSettings.MixerFlags &= ~SNDMIX_SOFTPANNING; } - CMainFrame::GetMainFrame()->SetupSoundCard(m_dwSoundSetup, m_dwRate, m_nBitsPerSample, m_nChannels, m_LatencyMS, m_UpdateIntervalMS, m_nSoundDevice); + CMainFrame::GetMainFrame()->SetupSoundCard(m_dwSoundSetup, m_dwRate, m_SampleFormat, m_nChannels, m_LatencyMS, m_UpdateIntervalMS, m_nSoundDevice); UpdateStatistics(); CPropertyPage::OnOK(); } Modified: trunk/OpenMPT/mptrack/Mpdlgs.h =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.h 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/Mpdlgs.h 2013-04-11 20:15:19 UTC (rev 1848) @@ -24,15 +24,17 @@ CComboBox m_CbnLatencyMS, m_CbnUpdateIntervalMS, m_CbnMixingFreq, m_CbnPolyphony, m_CbnQuality; CSliderCtrl m_SliderStereoSep, m_SliderPreAmp; CEdit m_EditStatistics; - DWORD m_dwRate, m_dwSoundSetup, m_nBitsPerSample, m_nChannels; + DWORD m_dwRate, m_dwSoundSetup; + SampleFormat m_SampleFormat; + DWORD m_nChannels; DWORD m_LatencyMS; DWORD m_UpdateIntervalMS; DWORD m_nSoundDevice; bool m_PreAmpNoteShowed; public: - COptionsSoundcard(DWORD rate, DWORD q, DWORD bits, DWORD chns, DWORD latency_ms, DWORD updateinterval_ms, DWORD sd):CPropertyPage(IDD_OPTIONS_SOUNDCARD) - { m_dwRate = rate; m_dwSoundSetup = q; m_nBitsPerSample = bits; m_nChannels = chns; + COptionsSoundcard(DWORD rate, DWORD q, SampleFormat sampleformat, DWORD chns, DWORD latency_ms, DWORD updateinterval_ms, DWORD sd):CPropertyPage(IDD_OPTIONS_SOUNDCARD) + { m_dwRate = rate; m_dwSoundSetup = q; m_SampleFormat = sampleformat; m_nChannels = chns; m_LatencyMS = latency_ms; m_UpdateIntervalMS = updateinterval_ms; m_nSoundDevice = sd; m_PreAmpNoteShowed = false; } void UpdateStatistics(); Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -321,7 +321,7 @@ m_MixerSettings.DSPMask = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Quality", m_MixerSettings.DSPMask, iniFile); m_ResamplerSettings.SrcMode = (ResamplingMode)CMainFrame::GetPrivateProfileDWord("Sound Settings", "SrcMode", m_ResamplerSettings.SrcMode, iniFile); m_MixerSettings.gdwMixingFreq = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Mixing_Rate", 0, iniFile); - m_MixerSettings.gnBitsPerSample = CMainFrame::GetPrivateProfileDWord("Sound Settings", "BitsPerSample", m_MixerSettings.gnBitsPerSample, iniFile); + m_MixerSettings.m_SampleFormat = (SampleFormat)CMainFrame::GetPrivateProfileDWord("Sound Settings", "BitsPerSample", (DWORD)m_MixerSettings.m_SampleFormat, iniFile); m_MixerSettings.gnChannels = CMainFrame::GetPrivateProfileDWord("Sound Settings", "ChannelMode", m_MixerSettings.gnChannels, iniFile); DWORD LatencyMS = CMainFrame::GetPrivateProfileDWord("Sound Settings", "Latency", 0, iniFile); DWORD UpdateIntervalMS = CMainFrame::GetPrivateProfileDWord("Sound Settings", "UpdateInterval", 0, iniFile); @@ -648,7 +648,9 @@ RegQueryValueEx(key, "RowSpacing", NULL, &dwREG_DWORD, (LPBYTE)&m_nRowHighlightMeasures, &dwDWORDSize); RegQueryValueEx(key, "RowSpacing2", NULL, &dwREG_DWORD, (LPBYTE)&m_nRowHighlightBeats, &dwDWORDSize); RegQueryValueEx(key, "LoopSong", NULL, &dwREG_DWORD, (LPBYTE)&gbLoopSong, &dwDWORDSize); - RegQueryValueEx(key, "BitsPerSample", NULL, &dwREG_DWORD, (LPBYTE)&m_MixerSettings.gnBitsPerSample, &dwDWORDSize); + DWORD dummy_sampleformat = (DWORD)m_MixerSettings.m_SampleFormat; + RegQueryValueEx(key, "BitsPerSample", NULL, &dwREG_DWORD, (LPBYTE)&dummy_sampleformat, &dwDWORDSize); + m_MixerSettings.m_SampleFormat = (SampleFormat)dummy_sampleformat; RegQueryValueEx(key, "ChannelMode", NULL, &dwREG_DWORD, (LPBYTE)&m_MixerSettings.gnChannels, &dwDWORDSize); RegQueryValueEx(key, "MidiImportSpeed", NULL, &dwREG_DWORD, (LPBYTE)&midiImportSpeed, &dwDWORDSize); RegQueryValueEx(key, "MidiImportPatLen", NULL, &dwREG_DWORD, (LPBYTE)&midiImportPatternLen, &dwDWORDSize); @@ -792,7 +794,7 @@ CMainFrame::WritePrivateProfileDWord("Sound Settings", "Quality", m_MixerSettings.DSPMask, iniFile); CMainFrame::WritePrivateProfileDWord("Sound Settings", "SrcMode", m_ResamplerSettings.SrcMode, iniFile); CMainFrame::WritePrivateProfileDWord("Sound Settings", "Mixing_Rate", m_MixerSettings.gdwMixingFreq, iniFile); - CMainFrame::WritePrivateProfileDWord("Sound Settings", "BitsPerSample", m_MixerSettings.gnBitsPerSample, iniFile); + CMainFrame::WritePrivateProfileDWord("Sound Settings", "BitsPerSample", (DWORD)m_MixerSettings.m_SampleFormat, iniFile); CMainFrame::WritePrivateProfileDWord("Sound Settings", "ChannelMode", m_MixerSettings.gnChannels, iniFile); CMainFrame::WritePrivateProfileDWord("Sound Settings", "Latency", m_LatencyMS, iniFile); CMainFrame::WritePrivateProfileDWord("Sound Settings", "UpdateInterval", m_UpdateIntervalMS, iniFile); Modified: trunk/OpenMPT/soundlib/Fastmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/soundlib/Fastmix.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -2043,6 +2043,20 @@ } +// convert to 32 bit floats and do NOT clip to [-1,1] +DWORD MPPASMCALL Convert32ToFloat32(LPVOID lpBuffer, int *pBuffer, DWORD lSampleCount) +//------------------------------------------------------------------------------------ +{ + const float factor = (1.0f/(float)MIXING_CLIPMAX); + float *out = (float*)lpBuffer; + for(DWORD i=0; i<lSampleCount; i++) + { + out[i] = pBuffer[i] * factor; + } + return lSampleCount * 4; +} + + void MPPASMCALL X86_InitMixBuffer(int *pBuffer, UINT nSamples) //------------------------------------------------------------ { Modified: trunk/OpenMPT/soundlib/MixerSettings.cpp =================================================================== --- trunk/OpenMPT/soundlib/MixerSettings.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/soundlib/MixerSettings.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -24,7 +24,7 @@ // Mixing Configuration gnChannels = 2; gdwMixingFreq = 44100; - gnBitsPerSample = 16; + m_SampleFormat = SampleFormatInt16; m_nPreAmp = 128; Modified: trunk/OpenMPT/soundlib/MixerSettings.h =================================================================== --- trunk/OpenMPT/soundlib/MixerSettings.h 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/soundlib/MixerSettings.h 2013-04-11 20:15:19 UTC (rev 1848) @@ -10,6 +10,16 @@ #pragma once +enum SampleFormat +{ + SampleFormatUnsigned8 = 8, // do not change value (for compatibility with old configuration settings) + SampleFormatInt16 = 16, // do not change value (for compatibility with old configuration settings) + SampleFormatInt24 = 24, // do not change value (for compatibility with old configuration settings) + SampleFormatInt32 = 32, // do not change value (for compatibility with old configuration settings) + SampleFormatFloat32 = 32 + 128, // Only supported as mixer output and NOT supported by Mod2Wave or ISoundDevice or settings dialog yet. Keep in mind to update all 3 cases at once. + SampleFormatInvalid = 0 +}; + struct MixerSettings { @@ -17,13 +27,46 @@ UINT m_nMaxMixChannels; DWORD DSPMask; DWORD MixerFlags; - DWORD gdwMixingFreq, gnBitsPerSample, gnChannels; + DWORD gdwMixingFreq; + SampleFormat m_SampleFormat; + DWORD gnChannels; DWORD m_nPreAmp; //rewbs.resamplerConf long glVolumeRampUpSamples, glVolumeRampDownSamples; //end rewbs.resamplerConf + bool IsUnsignedSampleFormat() const + { + return m_SampleFormat == SampleFormatUnsigned8; + } + bool IsFloatSampleFormat() const + { + return m_SampleFormat == SampleFormatFloat32; + } + uint8 GetBitsPerSample() const + { + switch(m_SampleFormat) + { + case SampleFormatUnsigned8: + return 8; + break; + case SampleFormatInt16: + return 16; + break; + case SampleFormatInt24: + return 24; + break; + case SampleFormatInt32: + return 32; + break; + case SampleFormatFloat32: + return 32; + break; + default: return 8; break; + } + } + MixerSettings(); }; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2013-04-11 18:38:07 UTC (rev 1847) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2013-04-11 20:15:19 UTC (rev 1848) @@ -39,6 +39,7 @@ extern DWORD MPPASMCALL X86_Convert32To16(LPVOID lpBuffer, int *, DWORD nSamples); extern DWORD MPPASMCALL X86_Convert32To24(LPVOID lpBuffer, int *, DWORD nSamples); extern DWORD MPPASMCALL X86_Convert32To32(LPVOID lpBuffer, int *, DWORD nSamples); +extern DWORD MPPASMCALL Convert32ToFloat32(LPVOID lpBuffer, int *pBuffer, DWORD lSampleCount); extern UINT MPPASMCALL X86_AGC(int *pBuffer, UINT nSamples, UINT nAGC); extern VOID MPPASMCALL X86_Dither(int *pBuffer, UINT nSamples, UINT nBits); extern VOID MPPASMCALL X86_InterleaveFrontRear(int *pFrontBuf, int *pRearBuf, DWORD nSamples); @@ -94,7 +95,7 @@ if( (mixersettings.gdwMixingFreq != m_MixerSettings.gdwMixingFreq) || - (mixersettings.gnBitsPerSample != m_MixerSettings.gnBitsPerSample) + (mixersettings.m_SampleFormat != m_MixerSettings.m_SampleFormat) || (mixersettings.gnChannels != m_MixerSettings.gnChannels) || @@ -178,7 +179,7 @@ //------------------------------------------------------- { LPBYTE lpBuffer = (LPBYTE)lpDestBuffer; - LPCONVERTPROC pCvt = X86_Convert32To8; + LPCONVERTPROC pCvt = nullptr; samplecount_t lMax, lCount, lSampleCount; size_t lSampleSize; UINT nStat = 0; @@ -189,9 +190,15 @@ m_nMixStat = 0; lSampleSize = m_MixerSettings.gnChannels; - if(m_MixerSettings.gnBitsPerSample == 16) { lSampleSize *= 2; pCvt = X86_Convert32To16; } - else if(m_MixerSettings.gnBitsPerSample == 24) { lSampleSize *= 3; pCvt = X86_Convert32To24; } - else if(m_MixerSettings.gnBitsPerSample == 32) { lSampleSize *= 4; pCvt = X86_Convert32To32; } + switch(m_MixerSettings.m_SampleFormat) + { + case SampleFormatUnsigned8: pCvt = X86_Convert32To8 ; break; + case SampleFormatInt16: pCvt = X86_Convert32To16; break; + case SampleFormatInt24: pCvt = X86_Convert32To24; break; + case SampleFormatInt32: pCvt = X86_Convert32To32; break; + case SampleFormatFloat32: pCvt = Convert32ToFloat32; break; + } + lSampleSize *= m_MixerSettings.GetBitsPerSample()/8; lMax = count; if ((!lMax) || (!lpBuffer) || (!m_nChannels)) return 0; @@ -324,10 +331,10 @@ } // Noise Shaping - if (m_MixerSettings.gnBitsPerSample <= 16) + if (m_MixerSettings.GetBitsPerSample() <= 16) { if(m_Resampler.IsHQ()) - X86_Dither(MixSoundBuffer, lTotalSampleCount, m_MixerSettings.gnBitsPerSample); + X86_Dither(MixSoundBuffer, lTotalSampleCount, m_MixerSettings.GetBitsPerSample()); } #ifdef MODPLUG_TRACKER @@ -350,7 +357,7 @@ gnVolumeRampUpSamplesActual = m_MixerSettings.glVolumeRampUpSamples; } MixDone: - if (lRead) memset(lpBuffer, (m_MixerSettings.gnBitsPerSample == 8) ? 0x80 : 0, lRead * lSampleSize); + if (lRead) memset(lpBuffer, (m_MixerSettings.m_SampleFormat == SampleFormatUnsigned8) ? 0x80 : 0, lRead * lSampleSize); if (nStat) { m_nMixStat += nStat-1; m_nMixStat /= nStat; } return lMax - lRead; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |