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. #if (INCHANNELS==2)
  37. PBYTE InputStreamContext::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
  38. {
  39.     PBYTE pCurrData = m_lpCurrData;
  40.     PBYTE pCurrDataEnd = m_lpCurrDataEnd;
  41.     LONG CurrT = m_CurrT;
  42.     LONG DeltaT = m_DeltaT;
  43.     PCM_TYPE SampleType = m_SampleType;
  44.     LONG CurrSamp0 = m_CurrSamp[0];
  45.     LONG PrevSamp0 = m_PrevSamp[0];
  46.     LONG CurrSamp1 = m_CurrSamp[1];
  47.     LONG PrevSamp1 = m_PrevSamp[1];
  48.     LONG InSamp0;
  49.     LONG InSamp1;
  50.     for (;;)
  51.     {
  52.         // Make sure we have a place to put the data
  53.         if (pCurrData>=pCurrDataEnd)
  54.         {
  55.             goto Exit;
  56.         }
  57.         // Get the next sample
  58.         while (CurrT >= 0x100)
  59.         {
  60.             if (pBuffer>=pBufferEnd)
  61.             {
  62.                 goto Exit;
  63.             }
  64.             PrevSamp0 = CurrSamp0;
  65.             PrevSamp1 = CurrSamp1;
  66.             CurrSamp0 = ((HWSAMPLE *)pBuffer)[0];
  67.             CurrSamp1 = ((HWSAMPLE *)pBuffer)[1];
  68.             pBuffer += 2*sizeof(HWSAMPLE);
  69.             // Apply input gain?
  70.             // CurrSamp0 = (CurrSamp0 * fxpGain) >> 16;
  71.             // CurrSamp1 = (CurrSamp1 * fxpGain) >> 16;
  72.             CurrT -= 0x100;
  73.         }
  74.         InSamp0 = (PrevSamp0 + ((CurrT * (CurrSamp0 - PrevSamp0)) >> 8));
  75.         InSamp1 = (PrevSamp1 + ((CurrT * (CurrSamp1 - PrevSamp1)) >> 8));
  76.         CurrT += DeltaT;
  77.         PPCM_SAMPLE pSampleDest = (PPCM_SAMPLE)pCurrData;
  78.         switch (m_SampleType)
  79.         {
  80.         case PCM_TYPE_M8:
  81.         default:
  82.             //pSampleDest->m8.sample = (UINT8)( ((InSamp0+InSamp1) >> 9) + 128);
  83.             pSampleDest->m8.sample = (UINT8)( ((InSamp0+InSamp0) >> 9) + 128);
  84.             pCurrData  += 1;
  85.             break;
  86.         case PCM_TYPE_S8:
  87.             //pSampleDest->s8.sample_left  = (UINT8)((InSamp0 >> 8) + 128);
  88.             pSampleDest->s8.sample_left  = (UINT8)((InSamp0 >> 8) + 128);
  89.             pSampleDest->s8.sample_right = (UINT8)((InSamp0 >> 8) + 128);
  90.             pCurrData  += 2;
  91.             break;
  92.         case PCM_TYPE_M16:
  93.             //pSampleDest->m16.sample = (INT16)((InSamp0+InSamp1)>>1);
  94.             pSampleDest->m16.sample = (INT16)((InSamp0+InSamp0)>>1);
  95.             pCurrData  += 2;
  96.             break;
  97.         case PCM_TYPE_S16:
  98.             //pSampleDest->s16.sample_left  = (INT16)InSamp0;
  99.             pSampleDest->s16.sample_left  = (INT16)InSamp0;
  100.             pSampleDest->s16.sample_right = (INT16)InSamp0;
  101.             pCurrData  += 4;
  102.             break;
  103.         }
  104.     }
  105. Exit:
  106.     m_lpWaveHdrCurrent->dwBytesRecorded += (pCurrData-m_lpCurrData);
  107.     m_dwByteCount += (pCurrData-m_lpCurrData);
  108.     m_lpCurrData = pCurrData;
  109.     m_CurrT = CurrT;
  110.     m_PrevSamp[0] = PrevSamp0;
  111.     m_CurrSamp[0] = CurrSamp0;
  112.     m_PrevSamp[1] = PrevSamp1;
  113.     m_CurrSamp[1] = CurrSamp1;
  114.     return pBuffer;
  115. }
  116. #else
  117. PBYTE InputStreamContext::Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)
  118. {
  119.     PBYTE pCurrData = m_lpCurrData;
  120.     PBYTE pCurrDataEnd = m_lpCurrDataEnd;
  121.     LONG CurrT = m_CurrT;
  122.     LONG DeltaT = m_DeltaT;
  123.     LONG CurrSamp0 = m_CurrSamp[0];
  124.     LONG PrevSamp0 = m_PrevSamp[0];
  125.     LONG InSamp0;
  126.     PCM_TYPE SampleType = m_SampleType;
  127.     for (;;)
  128.     {
  129.         // Make sure we have a place to put the data
  130.         if (pCurrData>=pCurrDataEnd)
  131.         {
  132.             goto Exit;
  133.         }
  134.         // Get the next sample
  135.         while (CurrT >= 0x100)
  136.         {
  137.             if (pBuffer>=pBufferEnd)
  138.             {
  139.                 goto Exit;
  140.             }
  141.             PrevSamp0 = CurrSamp0;
  142.             CurrSamp0 = *(HWSAMPLE *)pBuffer;
  143.             pBuffer += sizeof(HWSAMPLE);
  144.             // Apply input gain?
  145.             // CurrSamp0 = (CurrSamp0 * fxpGain) >> 16;
  146.             CurrT -= 0x100;
  147.         }
  148.         InSamp0 = (PrevSamp0 + ((CurrT * (CurrSamp0 - PrevSamp0)) >> 8));
  149.         CurrT += DeltaT;
  150.         PPCM_SAMPLE pSampleDest = (PPCM_SAMPLE)pCurrData;
  151.         switch (m_SampleType)
  152.         {
  153.         case PCM_TYPE_M8:
  154.         default:
  155.             pSampleDest->m8.sample = (UINT8)((InSamp0 >> 8) + 128);
  156.             pCurrData  += 1;
  157.             break;
  158.         case PCM_TYPE_S8:
  159.             pSampleDest->s8.sample_left  = (UINT8)((InSamp0 >> 8) + 128);
  160.             pSampleDest->s8.sample_right = (UINT8)((InSamp0 >> 8) + 128);
  161.             pCurrData  += 2;
  162.             break;
  163.         case PCM_TYPE_M16:
  164.             pSampleDest->m16.sample = (INT16)InSamp0;
  165.             pCurrData  += 2;
  166.             break;
  167.         case PCM_TYPE_S16:
  168.             pSampleDest->s16.sample_left  = (INT16)InSamp0;
  169.             pSampleDest->s16.sample_right = (INT16)InSamp0;
  170.             pCurrData  += 4;
  171.             break;
  172.         }
  173.     }
  174. Exit:
  175.     m_lpWaveHdrCurrent->dwBytesRecorded += (pCurrData-m_lpCurrData);
  176.     m_dwByteCount += (pCurrData-m_lpCurrData);
  177.     m_lpCurrData = pCurrData;
  178.     m_CurrT = CurrT;
  179.     m_PrevSamp[0] = PrevSamp0;
  180.     m_CurrSamp[0] = CurrSamp0;
  181.     return pBuffer;
  182. }
  183. #endif