output.cpp
资源名称:SMDK2440.rar [点击查看]
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:16k
源码类别:
Windows CE
开发平台:
Windows_Unix
- // -----------------------------------------------------------------------------
- //
- // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
- // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
- // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
- // PARTICULAR PURPOSE.
- // Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved.
- //
- // -----------------------------------------------------------------------------
- #include "wavemain.h"
- HRESULT OutputStreamContext::Open(DeviceContext *pDeviceContext, LPWAVEOPENDESC lpWOD, DWORD dwFlags)
- {
- HRESULT Result;
- Result = WaveStreamContext::Open(pDeviceContext, lpWOD, dwFlags);
- if (Result==MMSYSERR_NOERROR)
- {
- // Note: Output streams should be initialized in the run state.
- Run();
- }
- return Result;
- }
- DWORD OutputStreamContext::Reset()
- {
- HRESULT Result;
- Result = WaveStreamContext::Reset();
- if (Result==MMSYSERR_NOERROR)
- {
- // Note: Output streams should be reset to the run state.
- Run();
- }
- return Result;
- };
- // Init m_DeltaT with (SampleRate/HWSampleRate) calculated in 24.8 fixed point form
- // Note that we need to hold the result in a 64-bit value until we're done shifting,
- // since the result of the multiply will overflow 32 bits for sample rates greater than
- // or equal to the hardware's sample rate.
- DWORD OutputStreamContext::SetRate(DWORD dwMultiplier)
- {
- m_dwMultiplier = dwMultiplier;
- UINT64 Delta = (m_WaveFormat.nSamplesPerSec * m_dwMultiplier) >> 16;
- Delta = (Delta * INVSAMPLERATE) >> 24; // Convert to 24.8 format
- m_DeltaT = (DWORD)Delta;
- return MMSYSERR_NOERROR;
- }
- // Originally, this code used to be in each renderer, and each one would call GetNextBuffer as needed.
- // Pulling this code out of each low level renderer allows the inner loop to be in a leaf routine (ie no
- // subroutine calls out of that routine), which helps the compiler optimize the inner loop.
- PBYTE WaveStreamContext::Render(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
- {
- if (!m_bRunning || !m_lpCurrData)
- {
- return pBuffer;
- }
- while (pBuffer < pBufferEnd)
- {
- while (m_lpCurrData>=m_lpCurrDataEnd)
- {
- if (!GetNextBuffer())
- {
- return pBuffer;
- }
- }
- pBuffer = Render2(pBuffer,pBufferEnd,pBufferLast);
- }
- return pBuffer;
- }
- PBYTE OutputStreamContextM8::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
- {
- LONG CurrT = m_CurrT;
- LONG DeltaT = m_DeltaT;
- LONG CurrSamp0 = m_CurrSamp[0];
- LONG PrevSamp0 = m_PrevSamp[0];
- PBYTE pCurrData = m_lpCurrData;
- PBYTE pCurrDataEnd = m_lpCurrDataEnd;
- LONG fxpGain = m_fxpGain;
- while (pBuffer < pBufferEnd)
- {
- while (CurrT >= 0x100)
- {
- if (pCurrData>=pCurrDataEnd)
- {
- goto Exit;
- }
- CurrT -= 0x100;
- PrevSamp0 = CurrSamp0;
- PPCM_SAMPLE pSampleSrc = (PPCM_SAMPLE)pCurrData;
- CurrSamp0 = (LONG)pSampleSrc->m8.sample;
- CurrSamp0 = (CurrSamp0 - 128) << 8;
- pCurrData+=1;
- }
- LONG OutSamp0;
- OutSamp0 = PrevSamp0 + (((CurrSamp0 - PrevSamp0) * CurrT) >> 8);
- OutSamp0 = (OutSamp0 * fxpGain) >> VOLSHIFT;
- CurrT += DeltaT;
- #if (OUTCHANNELS==2)
- LONG OutSamp1;
- OutSamp1=OutSamp0;
- if (pBuffer < pBufferLast)
- {
- OutSamp0 += ((HWSAMPLE *)pBuffer)[0];
- OutSamp1 += ((HWSAMPLE *)pBuffer)[1];
- #if USE_MIX_SATURATE
- // Handle saturation
- if (OutSamp0>AUDIO_SAMPLE_MAX)
- {
- OutSamp0=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp0<AUDIO_SAMPLE_MIN)
- {
- OutSamp0=AUDIO_SAMPLE_MIN;
- }
- if (OutSamp1>AUDIO_SAMPLE_MAX)
- {
- OutSamp1=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp1<AUDIO_SAMPLE_MIN)
- {
- OutSamp1=AUDIO_SAMPLE_MIN;
- }
- #endif
- }
- ((HWSAMPLE *)pBuffer)[0] = (HWSAMPLE)OutSamp0;
- ((HWSAMPLE *)pBuffer)[1] = (HWSAMPLE)OutSamp1;
- pBuffer += 2*sizeof(HWSAMPLE);
- #else
- if (pBuffer < pBufferLast)
- {
- OutSamp0 += ((HWSAMPLE *)pBuffer)[0];
- #if USE_MIX_SATURATE
- // Handle saturation
- if (OutSamp0>AUDIO_SAMPLE_MAX)
- {
- OutSamp0=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp0<AUDIO_SAMPLE_MIN)
- {
- OutSamp0=AUDIO_SAMPLE_MIN;
- }
- #endif
- }
- ((HWSAMPLE *)pBuffer)[0] = (HWSAMPLE)OutSamp0;
- pBuffer += sizeof(HWSAMPLE);
- #endif
- }
- Exit:
- m_dwByteCount += (pCurrData - m_lpCurrData);
- m_lpCurrData = pCurrData;
- m_CurrT = CurrT;
- m_PrevSamp[0] = PrevSamp0;
- m_CurrSamp[0] = CurrSamp0;
- return pBuffer;
- }
- PBYTE OutputStreamContextM16::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
- {
- LONG CurrT = m_CurrT;
- LONG DeltaT = m_DeltaT;
- LONG CurrSamp0 = m_CurrSamp[0];
- LONG PrevSamp0 = m_PrevSamp[0];
- PBYTE pCurrData = m_lpCurrData;
- PBYTE pCurrDataEnd = m_lpCurrDataEnd;
- LONG fxpGain = m_fxpGain;
- LONG OutSamp0;
- while (pBuffer < pBufferEnd)
- {
- while (CurrT >= 0x100)
- {
- if (pCurrData>=pCurrDataEnd)
- {
- goto Exit;
- }
- CurrT -= 0x100;
- PrevSamp0 = CurrSamp0;
- PPCM_SAMPLE pSampleSrc = (PPCM_SAMPLE)pCurrData;
- CurrSamp0 = (LONG)pSampleSrc->m16.sample;
- pCurrData+=2;
- }
- OutSamp0 = PrevSamp0 + (((CurrSamp0 - PrevSamp0) * CurrT) >> 8);
- OutSamp0 = (OutSamp0 * fxpGain) >> VOLSHIFT;
- CurrT += DeltaT;
- // DEBUGMSG(1, (TEXT("PrevSamp0=0x%x, CurrSamp0=0x%x, CurrT=0x%x, OutSamp0=0x%xrn"), PrevSamp0,CurrSamp0,CurrT,OutSamp0));
- #if (OUTCHANNELS==2)
- LONG OutSamp1;
- OutSamp1=OutSamp0;
- if (pBuffer < pBufferLast)
- {
- OutSamp0 += ((HWSAMPLE *)pBuffer)[0];
- OutSamp1 += ((HWSAMPLE *)pBuffer)[1];
- #if USE_MIX_SATURATE
- // Handle saturation
- if (OutSamp0>AUDIO_SAMPLE_MAX)
- {
- OutSamp0=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp0<AUDIO_SAMPLE_MIN)
- {
- OutSamp0=AUDIO_SAMPLE_MIN;
- }
- if (OutSamp1>AUDIO_SAMPLE_MAX)
- {
- OutSamp1=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp1<AUDIO_SAMPLE_MIN)
- {
- OutSamp1=AUDIO_SAMPLE_MIN;
- }
- #endif
- }
- ((HWSAMPLE *)pBuffer)[0] = (HWSAMPLE)OutSamp0;
- ((HWSAMPLE *)pBuffer)[1] = (HWSAMPLE)OutSamp1;
- pBuffer += 2*sizeof(HWSAMPLE);
- #else
- if (pBuffer < pBufferLast)
- {
- OutSamp0 += ((HWSAMPLE *)pBuffer)[0];
- #if USE_MIX_SATURATE
- // Handle saturation
- if (OutSamp0>AUDIO_SAMPLE_MAX)
- {
- OutSamp0=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp0<AUDIO_SAMPLE_MIN)
- {
- OutSamp0=AUDIO_SAMPLE_MIN;
- }
- #endif
- }
- ((HWSAMPLE *)pBuffer)[0] = (HWSAMPLE)OutSamp0;
- pBuffer += sizeof(HWSAMPLE);
- #endif
- }
- Exit:
- m_dwByteCount += (pCurrData - m_lpCurrData);
- m_lpCurrData = pCurrData;
- m_CurrT = CurrT;
- m_PrevSamp[0] = PrevSamp0;
- m_CurrSamp[0] = CurrSamp0;
- return pBuffer;
- }
- #if (OUTCHANNELS==2)
- PBYTE OutputStreamContextS8::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
- {
- LONG CurrT = m_CurrT;
- LONG DeltaT = m_DeltaT;
- LONG CurrSamp0 = m_CurrSamp[0];
- LONG CurrSamp1 = m_CurrSamp[1];
- LONG PrevSamp0 = m_PrevSamp[0];
- LONG PrevSamp1 = m_PrevSamp[1];
- PBYTE pCurrData = m_lpCurrData;
- PBYTE pCurrDataEnd = m_lpCurrDataEnd;
- LONG fxpGain = m_fxpGain;
- LONG OutSamp0;
- LONG OutSamp1;
- while (pBuffer < pBufferEnd)
- {
- while (CurrT >= 0x100)
- {
- if (pCurrData>=pCurrDataEnd)
- {
- goto Exit;
- }
- CurrT -= 0x100;
- PrevSamp0 = CurrSamp0;
- PrevSamp1 = CurrSamp1;
- PPCM_SAMPLE pSampleSrc = (PPCM_SAMPLE)pCurrData;
- CurrSamp0 = (LONG)pSampleSrc->s8.sample_left;
- CurrSamp0 = (CurrSamp0 - 128) << 8;
- CurrSamp1 = (LONG)pSampleSrc->s8.sample_right;
- CurrSamp1 = (CurrSamp1 - 128) << 8;
- pCurrData+=2;
- }
- OutSamp0 = PrevSamp0 + (((CurrSamp0 - PrevSamp0) * CurrT) >> 8);
- OutSamp0 = (OutSamp0 * fxpGain) >> VOLSHIFT;
- OutSamp1 = PrevSamp1 + (((CurrSamp1 - PrevSamp1) * CurrT) >> 8);
- OutSamp1 = (OutSamp1 * fxpGain) >> VOLSHIFT;
- CurrT += DeltaT;
- // DEBUGMSG(1, (TEXT("PrevSamp0=0x%x, CurrSamp0=0x%x, CurrT=0x%x, OutSamp0=0x%xrn"), PrevSamp0,CurrSamp0,CurrT,OutSamp0));
- if (pBuffer < pBufferLast)
- {
- OutSamp0 += ((HWSAMPLE *)pBuffer)[0];
- OutSamp1 += ((HWSAMPLE *)pBuffer)[1];
- #if USE_MIX_SATURATE
- // Handle saturation
- if (OutSamp0>AUDIO_SAMPLE_MAX)
- {
- OutSamp0=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp0<AUDIO_SAMPLE_MIN)
- {
- OutSamp0=AUDIO_SAMPLE_MIN;
- }
- if (OutSamp1>AUDIO_SAMPLE_MAX)
- {
- OutSamp1=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp1<AUDIO_SAMPLE_MIN)
- {
- OutSamp1=AUDIO_SAMPLE_MIN;
- }
- #endif
- }
- ((HWSAMPLE *)pBuffer)[0] = (HWSAMPLE)OutSamp0;
- ((HWSAMPLE *)pBuffer)[1] = (HWSAMPLE)OutSamp1;
- pBuffer += 2*sizeof(HWSAMPLE);
- }
- Exit:
- m_dwByteCount += (pCurrData - m_lpCurrData);
- m_lpCurrData = pCurrData;
- m_CurrT = CurrT;
- m_PrevSamp[0] = PrevSamp0;
- m_PrevSamp[1] = PrevSamp1;
- m_CurrSamp[0] = CurrSamp0;
- m_CurrSamp[1] = CurrSamp1;
- return pBuffer;
- }
- PBYTE OutputStreamContextS16::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
- {
- LONG CurrT = m_CurrT;
- LONG DeltaT = m_DeltaT;
- LONG CurrSamp0 = m_CurrSamp[0];
- LONG CurrSamp1 = m_CurrSamp[1];
- LONG PrevSamp0 = m_PrevSamp[0];
- LONG PrevSamp1 = m_PrevSamp[1];
- PBYTE pCurrData = m_lpCurrData;
- PBYTE pCurrDataEnd = m_lpCurrDataEnd;
- LONG fxpGain = m_fxpGain;
- LONG OutSamp0;
- LONG OutSamp1;
- while (pBuffer < pBufferEnd)
- {
- while (CurrT >= 0x100)
- {
- if (pCurrData>=pCurrDataEnd)
- {
- goto Exit;
- }
- CurrT -= 0x100;
- PrevSamp0 = CurrSamp0;
- PrevSamp1 = CurrSamp1;
- PPCM_SAMPLE pSampleSrc = (PPCM_SAMPLE)pCurrData;
- CurrSamp0 = (LONG)pSampleSrc->s16.sample_left;
- CurrSamp1 = (LONG)pSampleSrc->s16.sample_right;
- pCurrData+=4;
- }
- OutSamp0 = PrevSamp0 + (((CurrSamp0 - PrevSamp0) * CurrT) >> 8);
- OutSamp0 = (OutSamp0 * fxpGain) >> VOLSHIFT;
- OutSamp1 = PrevSamp1 + (((CurrSamp1 - PrevSamp1) * CurrT) >> 8);
- OutSamp1 = (OutSamp1 * fxpGain) >> VOLSHIFT;
- CurrT += DeltaT;
- // DEBUGMSG(1, (TEXT("PrevSamp0=0x%x, CurrSamp0=0x%x, CurrT=0x%x, OutSamp0=0x%xrn"), PrevSamp0,CurrSamp0,CurrT,OutSamp0));
- if (pBuffer < pBufferLast)
- {
- OutSamp0 += ((HWSAMPLE *)pBuffer)[0];
- OutSamp1 += ((HWSAMPLE *)pBuffer)[1];
- #if USE_MIX_SATURATE
- // Handle saturation
- if (OutSamp0>AUDIO_SAMPLE_MAX)
- {
- OutSamp0=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp0<AUDIO_SAMPLE_MIN)
- {
- OutSamp0=AUDIO_SAMPLE_MIN;
- }
- if (OutSamp1>AUDIO_SAMPLE_MAX)
- {
- OutSamp1=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp1<AUDIO_SAMPLE_MIN)
- {
- OutSamp1=AUDIO_SAMPLE_MIN;
- }
- #endif
- }
- ((HWSAMPLE *)pBuffer)[0] = (HWSAMPLE)OutSamp0;
- ((HWSAMPLE *)pBuffer)[1] = (HWSAMPLE)OutSamp1;
- pBuffer += 2*sizeof(HWSAMPLE);
- }
- Exit:
- m_dwByteCount += (pCurrData - m_lpCurrData);
- m_lpCurrData = pCurrData;
- m_CurrT = CurrT;
- m_PrevSamp[0] = PrevSamp0;
- m_PrevSamp[1] = PrevSamp1;
- m_CurrSamp[0] = CurrSamp0;
- m_CurrSamp[1] = CurrSamp1;
- return pBuffer;
- }
- #else
- PBYTE OutputStreamContextS8::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
- {
- LONG CurrT = m_CurrT;
- LONG DeltaT = m_DeltaT;
- LONG CurrSamp0 = m_CurrSamp[0];
- LONG PrevSamp0 = m_PrevSamp[0];
- PBYTE pCurrData = m_lpCurrData;
- PBYTE pCurrDataEnd = m_lpCurrDataEnd;
- LONG fxpGain = m_fxpGain;
- LONG OutSamp0;
- while (pBuffer < pBufferEnd)
- {
- while (CurrT >= 0x100)
- {
- if (pCurrData>=pCurrDataEnd)
- {
- goto Exit;
- }
- CurrT -= 0x100;
- PrevSamp0 = CurrSamp0;
- PPCM_SAMPLE pSampleSrc = (PPCM_SAMPLE)pCurrData;
- CurrSamp0 = (LONG)pSampleSrc->s8.sample_left;
- CurrSamp0 += (LONG)pSampleSrc->s8.sample_right;
- CurrSamp0 = (CurrSamp0 - 256) << 7;
- pCurrData+=2;
- }
- OutSamp0 = PrevSamp0 + (((CurrSamp0 - PrevSamp0) * CurrT) >> 8);
- OutSamp0 = (OutSamp0 * fxpGain) >> VOLSHIFT;
- CurrT += DeltaT;
- // DEBUGMSG(1, (TEXT("PrevSamp0=0x%x, CurrSamp0=0x%x, CurrT=0x%x, OutSamp0=0x%xrn"), PrevSamp0,CurrSamp0,CurrT,OutSamp0));
- if (pBuffer < pBufferLast)
- {
- OutSamp0 += *(HWSAMPLE *)pBuffer;
- #if USE_MIX_SATURATE
- // Handle saturation
- if (OutSamp0>AUDIO_SAMPLE_MAX)
- {
- OutSamp0=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp0<AUDIO_SAMPLE_MIN)
- {
- OutSamp0=AUDIO_SAMPLE_MIN;
- }
- #endif
- }
- *(HWSAMPLE *)pBuffer = (HWSAMPLE)OutSamp0;
- pBuffer += sizeof(HWSAMPLE);
- }
- Exit:
- m_dwByteCount += (pCurrData - m_lpCurrData);
- m_lpCurrData = pCurrData;
- m_CurrT = CurrT;
- m_PrevSamp[0] = PrevSamp0;
- m_CurrSamp[0] = CurrSamp0;
- return pBuffer;
- }
- PBYTE OutputStreamContextS16::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
- {
- LONG CurrT = m_CurrT;
- LONG DeltaT = m_DeltaT;
- LONG CurrSamp0 = m_CurrSamp[0];
- LONG PrevSamp0 = m_PrevSamp[0];
- PBYTE pCurrData = m_lpCurrData;
- PBYTE pCurrDataEnd = m_lpCurrDataEnd;
- LONG fxpGain = m_fxpGain;
- LONG OutSamp0;
- while (pBuffer < pBufferEnd)
- {
- while (CurrT >= 0x100)
- {
- if (pCurrData>=pCurrDataEnd)
- {
- goto Exit;
- }
- CurrT -= 0x100;
- PrevSamp0 = CurrSamp0;
- PPCM_SAMPLE pSampleSrc = (PPCM_SAMPLE)pCurrData;
- CurrSamp0 = (LONG)pSampleSrc->s16.sample_left;
- CurrSamp0 += (LONG)pSampleSrc->s16.sample_right;
- CurrSamp0 = CurrSamp0>>1;
- pCurrData+=4;
- }
- OutSamp0 = PrevSamp0 + (((CurrSamp0 - PrevSamp0) * CurrT) >> 8);
- OutSamp0 = (OutSamp0 * fxpGain) >> VOLSHIFT;
- CurrT += DeltaT;
- // DEBUGMSG(1, (TEXT("PrevSamp0=0x%x, CurrSamp0=0x%x, CurrT=0x%x, OutSamp0=0x%xrn"), PrevSamp0,CurrSamp0,CurrT,OutSamp0));
- if (pBuffer < pBufferLast)
- {
- OutSamp0 += *(HWSAMPLE *)pBuffer;
- #if USE_MIX_SATURATE
- // Handle saturation
- if (OutSamp0>AUDIO_SAMPLE_MAX)
- {
- OutSamp0=AUDIO_SAMPLE_MAX;
- }
- else if (OutSamp0<AUDIO_SAMPLE_MIN)
- {
- OutSamp0=AUDIO_SAMPLE_MIN;
- }
- #endif
- }
- *(HWSAMPLE *)pBuffer = (HWSAMPLE)OutSamp0;
- pBuffer += sizeof(HWSAMPLE);
- }
- Exit:
- m_dwByteCount += (pCurrData - m_lpCurrData);
- m_lpCurrData = pCurrData;
- m_CurrT = CurrT;
- m_PrevSamp[0] = PrevSamp0;
- m_CurrSamp[0] = CurrSamp0;
- return pBuffer;
- }
- #endif