input.cpp
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:6k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. // -----------------------------------------------------------------------------
  2. //
  3. //      THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  4. //      ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  5. //      THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  6. //      PARTICULAR PURPOSE.
  7. //      Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved.
  8. //
  9. // -----------------------------------------------------------------------------
  10. #include "wavemain.h"
  11. // Init input m_DeltaT with (HWSampleRate/SampleRate) calculated in 24.8 fixed point form
  12. // Note that we need to hold the result in a 64-bit value until we're done shifting,
  13. // since the result of the multiply will overflow 32 bits for sample rates greater than
  14. // or equal to the hardware's sample rate.
  15. DWORD InputStreamContext::SetRate(DWORD dwMultiplier)
  16. {
  17.     m_dwMultiplier = dwMultiplier;
  18.     UINT64 Delta = (m_WaveFormat.nSamplesPerSec * m_dwMultiplier) >> 16;
  19.     Delta = ((UINT32)(((1i64<<32)/Delta)+1));
  20.     Delta = (Delta * SAMPLERATE) >> 24;
  21.     m_DeltaT = (DWORD)Delta;
  22.     return MMSYSERR_NOERROR;
  23. }
  24. DWORD InputStreamContext::Stop()
  25. {
  26.     // Stop the stream
  27.     WaveStreamContext::Stop();
  28.     // Return any partially filled buffers to the client
  29.     if ((m_lpWaveHdrCurrent) && (m_lpWaveHdrCurrent->dwBytesRecorded>0))
  30.     {
  31.         GetNextBuffer();
  32.     }
  33.     return MMSYSERR_NOERROR;
  34. }
  35. #if (OUTCHANNELS==2)
  36. PBYTE InputStreamContext::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
  37. {
  38.     PBYTE pCurrData = m_lpCurrData;
  39.     PBYTE pCurrDataEnd = m_lpCurrDataEnd;
  40.     LONG CurrT = m_CurrT;
  41.     LONG DeltaT = m_DeltaT;
  42.     PCM_TYPE SampleType = m_SampleType;
  43.     LONG CurrSamp0 = m_CurrSamp[0];
  44.     LONG PrevSamp0 = m_PrevSamp[0];
  45.     LONG CurrSamp1 = m_CurrSamp[1];
  46.     LONG PrevSamp1 = m_PrevSamp[1];
  47.     LONG InSamp0;
  48.     LONG InSamp1;
  49.     for (;;)
  50.     {
  51.         // Make sure we have a place to put the data
  52.         if (pCurrData>=pCurrDataEnd)
  53.         {
  54.             goto Exit;
  55.         }
  56.         // Get the next sample
  57.         while (CurrT >= 0x100)
  58.         {
  59.             if (pBuffer>=pBufferEnd)
  60.             {
  61.                 goto Exit;
  62.             }
  63.             PrevSamp0 = CurrSamp0;
  64.             PrevSamp1 = CurrSamp1;
  65.             CurrSamp0 = ((HWSAMPLE *)pBuffer)[0];
  66.             CurrSamp1 = ((HWSAMPLE *)pBuffer)[1];
  67.             pBuffer += 2*sizeof(HWSAMPLE);
  68.             // Apply input gain?
  69.             // CurrSamp0 = (CurrSamp0 * fxpGain) >> 16;
  70.             // CurrSamp1 = (CurrSamp1 * fxpGain) >> 16;
  71.             CurrT -= 0x100;
  72.         }
  73.         InSamp0 = (PrevSamp0 + ((CurrT * (CurrSamp0 - PrevSamp0)) >> 8));
  74.         InSamp1 = (PrevSamp1 + ((CurrT * (CurrSamp1 - PrevSamp1)) >> 8));
  75.         CurrT += DeltaT;
  76.         PPCM_SAMPLE pSampleDest = (PPCM_SAMPLE)pCurrData;
  77.         switch (m_SampleType)
  78.         {
  79.         case PCM_TYPE_M8:
  80.         default:
  81.             pSampleDest->m8.sample = (UINT8)( ((InSamp0+InSamp1) >> 9) + 128);
  82.             pCurrData  += 1;
  83.             break;
  84.         case PCM_TYPE_S8:
  85.             pSampleDest->s8.sample_left  = (UINT8)((InSamp0 >> 8) + 128);
  86.             pSampleDest->s8.sample_right = (UINT8)((InSamp1 >> 8) + 128);
  87.             pCurrData  += 2;
  88.             break;
  89.         case PCM_TYPE_M16:
  90.             pSampleDest->m16.sample = (INT16)((InSamp0+InSamp1)>>1);
  91.             pCurrData  += 2;
  92.             break;
  93.         case PCM_TYPE_S16:
  94.             pSampleDest->s16.sample_left  = (INT16)InSamp0;
  95.             pSampleDest->s16.sample_right = (INT16)InSamp1;
  96.             pCurrData  += 4;
  97.             break;
  98.         }
  99.     }
  100. Exit:
  101.     m_lpWaveHdrCurrent->dwBytesRecorded += (pCurrData-m_lpCurrData);
  102.     m_dwByteCount += (pCurrData-m_lpCurrData);
  103.     m_lpCurrData = pCurrData;
  104.     m_CurrT = CurrT;
  105.     m_PrevSamp[0] = PrevSamp0;
  106.     m_CurrSamp[0] = CurrSamp0;
  107.     m_PrevSamp[1] = PrevSamp1;
  108.     m_CurrSamp[1] = CurrSamp1;
  109.     return pBuffer;
  110. }
  111. #else
  112. PBYTE InputStreamContext::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
  113. {
  114.     PBYTE pCurrData = m_lpCurrData;
  115.     PBYTE pCurrDataEnd = m_lpCurrDataEnd;
  116.     LONG CurrT = m_CurrT;
  117.     LONG DeltaT = m_DeltaT;
  118.     LONG CurrSamp0 = m_CurrSamp[0];
  119.     LONG PrevSamp0 = m_PrevSamp[0];
  120.     LONG InSamp0;
  121.     PCM_TYPE SampleType = m_SampleType;
  122.     for (;;)
  123.     {
  124.         // Make sure we have a place to put the data
  125.         if (pCurrData>=pCurrDataEnd)
  126.         {
  127.             goto Exit;
  128.         }
  129.         // Get the next sample
  130.         while (CurrT >= 0x100)
  131.         {
  132.             if (pBuffer>=pBufferEnd)
  133.             {
  134.                 goto Exit;
  135.             }
  136.             PrevSamp0 = CurrSamp0;
  137.             CurrSamp0 = *(HWSAMPLE *)pBuffer;
  138.             pBuffer += sizeof(HWSAMPLE);
  139.             // Apply input gain?
  140.             // CurrSamp0 = (CurrSamp0 * fxpGain) >> 16;
  141.             CurrT -= 0x100;
  142.         }
  143.         InSamp0 = (PrevSamp0 + ((CurrT * (CurrSamp0 - PrevSamp0)) >> 8));
  144.         CurrT += DeltaT;
  145.         PPCM_SAMPLE pSampleDest = (PPCM_SAMPLE)pCurrData;
  146.         switch (m_SampleType)
  147.         {
  148.         case PCM_TYPE_M8:
  149.         default:
  150.             pSampleDest->m8.sample = (UINT8)((InSamp0 >> 8) + 128);
  151.             pCurrData  += 1;
  152.             break;
  153.         case PCM_TYPE_S8:
  154.             pSampleDest->s8.sample_left  = (UINT8)((InSamp0 >> 8) + 128);
  155.             pSampleDest->s8.sample_right = (UINT8)((InSamp0 >> 8) + 128);
  156.             pCurrData  += 2;
  157.             break;
  158.         case PCM_TYPE_M16:
  159.             pSampleDest->m16.sample = (INT16)InSamp0;
  160.             pCurrData  += 2;
  161.             break;
  162.         case PCM_TYPE_S16:
  163.             pSampleDest->s16.sample_left  = (INT16)InSamp0;
  164.             pSampleDest->s16.sample_right = (INT16)InSamp0;
  165.             pCurrData  += 4;
  166.             break;
  167.         }
  168.     }
  169. Exit:
  170.     m_lpWaveHdrCurrent->dwBytesRecorded += (pCurrData-m_lpCurrData);
  171.     m_dwByteCount += (pCurrData-m_lpCurrData);
  172.     m_lpCurrData = pCurrData;
  173.     m_CurrT = CurrT;
  174.     m_PrevSamp[0] = PrevSamp0;
  175.     m_CurrSamp[0] = CurrSamp0;
  176.     return pBuffer;
  177. }
  178. #endif