亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? strmctxt.cpp

?? 6410BSP3
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
// -----------------------------------------------------------------------------
//
//      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.
//
// -----------------------------------------------------------------------------
#include "wavemain.h"
#ifndef STREAM_ATTEN_MAX
#define STREAM_ATTEN_MAX       100
#endif

#ifndef DEVICE_ATTEN_MAX
#define DEVICE_ATTEN_MAX        35
#endif

#ifndef CLASS_ATTEN_MAX
#define CLASS_ATTEN_MAX         35
#endif


HRESULT StreamContext::Open(DeviceContext *pDeviceContext, LPWAVEOPENDESC lpWOD, DWORD dwFlags)
{
    m_RefCount = 1;
    m_pDeviceContext = pDeviceContext;
    m_pfnCallback = (DRVCALLBACK *)lpWOD->dwCallback;
    m_dwInstance  = lpWOD->dwInstance;
    m_hWave       = lpWOD->hWave;
    m_dwFlags     = dwFlags;
    m_bRunning    = FALSE;
    m_bForceSpeaker = FALSE;

    // If it's a PCMWAVEFORMAT struct, it's smaller than a WAVEFORMATEX struct (it doesn't have the cbSize field),
    // so don't copy too much or we risk a fault if the structure is located on the end of a page.
    // All other non-PCM wave formats share the WAVEFORMATEX base structure
    // Note: I don't keep around anything after the cbSize of the WAVEFORMATEX struct so that I don't need to
    // worry about allocating additional space. If we need to keep this info around in the future, we can either
    // allocate it dynamically here, or keep the information in any derived format-specific classes.
    DWORD dwSize;
    WAVEFORMATEX *pwfx = lpWOD->lpFormat;
    if (pwfx->wFormatTag == WAVE_FORMAT_PCM)
    {
        dwSize = sizeof(PCMWAVEFORMAT);
        m_WaveFormat.cbSize = 0;
    }
    else
    {
        dwSize = sizeof(WAVEFORMATEX);
    }

    memcpy(&m_WaveFormat,pwfx,dwSize);

    m_lpWaveHdrHead    = NULL;
    m_lpWaveHdrTail    = NULL;
    m_lpWaveHdrCurrent = NULL;
    m_lpCurrData       = NULL;
    m_lpCurrDataEnd    = NULL;
    m_dwByteCount      = 0;
    m_dwLoopCount = 0;

    m_SecondaryGainClass=0;
    SetGain(pDeviceContext->GetDefaultStreamGain()); // Set gain to default value

    // Add stream to list. This will start playback.
    pDeviceContext->NewStream(this);

    DoCallbackStreamOpened();

    return S_OK;
}


DWORD StreamContext::Close()
{
    if (StillPlaying())
    {
        return WAVERR_STILLPLAYING;
    }
    // Be sure to turn off speaker if we turned it on.
    ForceSpeaker(FALSE);

    DoCallbackStreamClosed();

    return MMSYSERR_NOERROR;
}


// Assumes lock is taken
LONG StreamContext::AddRef()
{
    LONG RefCount = ++m_RefCount;
    return RefCount;
}


// Assumes lock is taken
LONG StreamContext::Release()
{
    LONG RefCount = --m_RefCount;

    if (RefCount==0)
    {
        // Only remove stream from list when all refcounts are gone.
        m_pDeviceContext->DeleteStream(this);
        delete this;
    }
    return RefCount;
}


DWORD StreamContext::QueueBuffer(LPWAVEHDR lpWaveHdr)
{
    if (!(lpWaveHdr->dwFlags & WHDR_PREPARED))
    {
        return WAVERR_UNPREPARED;
    }

    lpWaveHdr->dwFlags |= WHDR_INQUEUE;
    lpWaveHdr->dwFlags &= ~WHDR_DONE;
    lpWaveHdr->lpNext=NULL;
    lpWaveHdr->dwBytesRecorded=0;

    if (!m_lpWaveHdrHead)
    {
        m_lpWaveHdrHead = lpWaveHdr;
    }
    else
    {
        m_lpWaveHdrTail->lpNext=lpWaveHdr;
    }

    m_lpWaveHdrTail=lpWaveHdr;

    // Note: Even if head & tail are valid, current may be NULL if we're in the middle of
    // a loop and ran out of data. So, we need to check specifically against current to
    // decide if we need to initialize it.
    if (!m_lpWaveHdrCurrent)
    {
        m_lpWaveHdrCurrent = lpWaveHdr;
        m_lpCurrData    = (PBYTE)lpWaveHdr->lpData;
        m_lpCurrDataEnd = (PBYTE)lpWaveHdr->lpData + lpWaveHdr->dwBufferLength;
        if (lpWaveHdr->dwFlags & WHDR_BEGINLOOP)    // if this is the start of a loop block
        {
            m_dwLoopCount = lpWaveHdr->dwLoops;     // save # of loops
        }
    }

    if (m_bRunning)
    {
        m_pDeviceContext->StreamReadyToRender(this);
    }

    return MMSYSERR_NOERROR;
}


// Note: I've found that when we return used buffers, the wave manager may
// call back into the wave driver in the same thread context to close the stream when
// we return the last buffer.
// If it wasn't the last buffer, the close call will return MMSYSERR_STILLPLAYING.
// However, if it was the last buffer, the close will proceed, and the
// stream may be deleted out from under us. Note that a Lock won't help us here,
// since we're in the same thread which already owns the lock.
// The solution to this is the AddRef/Release use on the stream context, which keeps it
// around if we're acessing it, even if it's closed.

// Assumes lock is taken
PBYTE StreamContext::GetNextBuffer()
{
    LPWAVEHDR lpOldHdr;
    LPWAVEHDR lpNewHdr;
    LPSTR pNewBuf=NULL;

    // Get a pointer to the current buffer which is now done being processed
    lpOldHdr=m_lpWaveHdrCurrent;

    if (!lpOldHdr)
    {
        return NULL;
    }

    // Are we in a loop
    // Note: a loopcount of 1 means we're not really in a loop
    if (m_dwLoopCount>1)
    {
        // We're in a loop!
        if (lpOldHdr->dwFlags & WHDR_ENDLOOP)
        {
           // In loop, last buffer
            // If dwLoopCount was set to INFINITE, loop forever
            // (Note: this is not explicitly in the wave driver API spec)
            if (m_dwLoopCount!=INFINITE)
            {
           m_dwLoopCount--;                    // decrement loop count
            }
           lpNewHdr=m_lpWaveHdrHead;           // go back to start of loop
        }
        else
        {
           // In loop, intermediate buffer
           lpNewHdr=lpOldHdr->lpNext;          // just go to next buffer in loop block
        }

        lpOldHdr=NULL;
    }
    else
    {
        // Not in a loop; return old buffer and get new buffer
        lpNewHdr=lpOldHdr->lpNext;

        m_lpWaveHdrHead = lpNewHdr;           // reset list head
        if (!lpNewHdr)
        {
            m_lpWaveHdrTail=NULL;             // no new buffer, reset tail to NULL
        }
        else if (lpNewHdr->dwFlags & WHDR_BEGINLOOP)    // if new buffer is start of a loop block
        {
            m_dwLoopCount=lpNewHdr->dwLoops;  // save # of loops
        }
    }

    m_lpWaveHdrCurrent=lpNewHdr;              // save current buffer pointer

    if (lpNewHdr)
    {
        m_lpCurrData    = (PBYTE)lpNewHdr->lpData;  // reinitialize data pointer
        m_lpCurrDataEnd = m_lpCurrData + lpNewHdr->dwBufferLength;
    }
    else
    {
        m_lpCurrData  = NULL;
        m_lpCurrDataEnd = NULL;
    }

    // Return the old buffer
    // This may cause the stream to be destroyed, so make sure that any calls to this function
    // are within an AddRef/Release block
    if (lpOldHdr)
    {
        ReturnBuffer(lpOldHdr);
    }

    return m_lpCurrData;
}


DWORD StreamContext::BreakLoop()
{
    AddRef();

    if (m_dwLoopCount>0)
    {
        m_dwLoopCount = 0;

        LPWAVEHDR lpHdr;
        while (m_lpWaveHdrHead!=m_lpWaveHdrCurrent)
        {
            lpHdr = m_lpWaveHdrHead;
            m_lpWaveHdrHead = lpHdr->lpNext;
            if (m_lpWaveHdrHead==NULL)
            {
                m_lpWaveHdrTail=NULL;
            }
            ReturnBuffer(lpHdr);
        }
    }

    Release();

    return MMSYSERR_NOERROR;
}


// Gain table
const DWORD GainMap[] =
{
    0xf1ad, // 0: -0.50 dB
    0xe429, // 1: -1.00 dB
    0xd765, // 2: -1.50 dB
    0xcb59, // 3: -2.00 dB
    0xbff9, // 4: -2.50 dB
    0xb53b, // 5: -3.00 dB
    0xab18, // 6: -3.50 dB
    0xa186, // 7: -4.00 dB
    0x987d, // 8: -4.50 dB
    0x8ff5, // 9: -5.00 dB
    0x87e8, // 10: -5.50 dB
    0x804d, // 11: -6.00 dB
    0x7920, // 12: -6.50 dB
    0x7259, // 13: -7.00 dB
    0x6bf4, // 14: -7.50 dB
    0x65ea, // 15: -8.00 dB
    0x6036, // 16: -8.50 dB
    0x5ad5, // 17: -9.00 dB
    0x55c0, // 18: -9.50 dB
    0x50f4, // 19: -10.00 dB
    0x4c6d, // 20: -10.50 dB
    0x4826, // 21: -11.00 dB
    0x441d, // 22: -11.50 dB
    0x404d, // 23: -12.00 dB
    0x3cb5, // 24: -12.50 dB
    0x394f, // 25: -13.00 dB
    0x361a, // 26: -13.50 dB
    0x3314, // 27: -14.00 dB
    0x3038, // 28: -14.50 dB
    0x2d86, // 29: -15.00 dB
    0x2afa, // 30: -15.50 dB
    0x2892, // 31: -16.00 dB
    0x264d, // 32: -16.50 dB
    0x2429, // 33: -17.00 dB
    0x2223, // 34: -17.50 dB
    0x203a, // 35: -18.00 dB
    0x1e6c, // 36: -18.50 dB
    0x1cb9, // 37: -19.00 dB
    0x1b1d, // 38: -19.50 dB
    0x1999, // 39: -20.00 dB
    0x182a, // 40: -20.50 dB
    0x16d0, // 41: -21.00 dB
    0x158a, // 42: -21.50 dB
    0x1455, // 43: -22.00 dB
    0x1332, // 44: -22.50 dB
    0x121f, // 45: -23.00 dB
    0x111c, // 46: -23.50 dB
    0x1027, // 47: -24.00 dB
    0x0f3f, // 48: -24.50 dB
    0x0e65, // 49: -25.00 dB
    0x0d97, // 50: -25.50 dB
    0x0cd4, // 51: -26.00 dB
    0x0c1c, // 52: -26.50 dB
    0x0b6f, // 53: -27.00 dB
    0x0acb, // 54: -27.50 dB
    0x0a31, // 55: -28.00 dB
    0x099f, // 56: -28.50 dB
    0x0915, // 57: -29.00 dB
    0x0893, // 58: -29.50 dB
    0x0818, // 59: -30.00 dB
    0x07a4, // 60: -30.50 dB
    0x0737, // 61: -31.00 dB
    0x06cf, // 62: -31.50 dB
    0x066e, // 63: -32.00 dB
    0x0612, // 64: -32.50 dB
    0x05bb, // 65: -33.00 dB
    0x0569, // 66: -33.50 dB
    0x051b, // 67: -34.00 dB
    0x04d2, // 68: -34.50 dB
    0x048d, // 69: -35.00 dB
    0x044c, // 70: -35.50 dB
    0x040e, // 71: -36.00 dB
    0x03d4, // 72: -36.50 dB

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲免费视频成人| 一区二区三区资源| 51午夜精品国产| 欧美伊人久久大香线蕉综合69| 成人黄色免费短视频| 成人综合婷婷国产精品久久| 高清不卡在线观看| 成人av电影在线观看| av不卡免费电影| 色素色在线综合| 欧美日韩国产片| 69精品人人人人| 欧美精品一区二区三区四区 | 国产精品久久久久久久久免费相片| 精品福利视频一区二区三区| 欧美不卡123| 日本一区免费视频| 一二三区精品福利视频| 午夜精品久久久久久不卡8050| 日本麻豆一区二区三区视频| 精品一区二区免费视频| 国产大片一区二区| 91久久一区二区| 91.成人天堂一区| 久久久欧美精品sm网站| 中文字幕av资源一区| 日韩伦理电影网| 日本不卡的三区四区五区| 国精产品一区一区三区mba视频| 不卡一区二区三区四区| 色综合咪咪久久| 欧美成人一区二区三区片免费| 欧美精彩视频一区二区三区| 亚洲黄色录像片| 久久99精品国产.久久久久| 99久久综合狠狠综合久久| 欧美丰满一区二区免费视频 | 亚洲国产乱码最新视频| 精品一区在线看| 日本黄色一区二区| 亚洲精品一区二区三区影院 | 国产欧美一区视频| 亚洲aaa精品| 99视频精品免费视频| 91麻豆精品国产自产在线| 国产精品国产三级国产有无不卡| 香蕉加勒比综合久久| 成人av网站免费观看| 日韩视频123| 一个色综合网站| 成人动漫中文字幕| 日韩精品资源二区在线| 夜夜嗨av一区二区三区四季av | 天堂午夜影视日韩欧美一区二区| 国产很黄免费观看久久| 欧美精品久久一区| 亚洲一区免费在线观看| 不卡视频在线看| 久久精品一区二区三区不卡 | 色婷婷综合激情| 国产精品毛片a∨一区二区三区| 免费在线观看一区二区三区| 在线观看免费一区| 一区二区欧美在线观看| 不卡的av网站| 欧美国产日韩在线观看| 国产精品自在在线| 国产亚洲短视频| 国产在线不卡一卡二卡三卡四卡| 91精品国产乱码久久蜜臀| 一区二区成人在线| 欧美在线你懂得| 亚洲综合一区二区三区| 色婷婷av一区二区三区大白胸 | 日韩精品一区二区三区在线| 日韩中文欧美在线| 日韩一区二区三区精品视频| 亚洲福中文字幕伊人影院| 欧美性生活大片视频| 亚洲成人av一区二区三区| 欧美日韩在线直播| 日日摸夜夜添夜夜添国产精品 | 北条麻妃国产九九精品视频| 国产欧美精品一区| 99久久久久久| 亚洲国产一区二区三区| 欧美日韩精品系列| 精品综合久久久久久8888| 久久久三级国产网站| 国产99久久久国产精品| 亚洲乱码国产乱码精品精小说| 91成人免费在线视频| 午夜精品免费在线观看| 欧美mv和日韩mv的网站| 岛国av在线一区| 一区二区三区四区视频精品免费 | 亚洲人被黑人高潮完整版| 91香蕉视频污| 青青国产91久久久久久| 久久综合狠狠综合久久综合88| 成人久久18免费网站麻豆| 一区二区成人在线视频| 欧美不卡激情三级在线观看| youjizz久久| 亚洲成人综合网站| 国产视频一区二区在线| 在线观看视频91| 国产一区中文字幕| 亚洲自拍偷拍欧美| 国产三级三级三级精品8ⅰ区| 91行情网站电视在线观看高清版| 久久国产尿小便嘘嘘| 亚洲猫色日本管| 久久欧美一区二区| 欧美三级视频在线播放| 国产精品69毛片高清亚洲| 婷婷中文字幕一区三区| 国产精品久久久久久久裸模| 欧美电视剧免费观看| 色伊人久久综合中文字幕| 狂野欧美性猛交blacked| 亚洲影视在线播放| 中文成人av在线| 欧美精品一区二区久久久| 欧美在线视频日韩| 成人夜色视频网站在线观看| 免费视频一区二区| 一区二区三区中文在线| 国产精品久久久久天堂| 欧美tickling网站挠脚心| 欧美精品九九99久久| 一本色道综合亚洲| av资源网一区| 国产精品77777| 国产精品一区二区三区四区| 蜜臀av国产精品久久久久| 亚洲一区二区三区在线看| 亚洲欧洲制服丝袜| 中文字幕欧美一区| 国产精品色哟哟网站| 久久久91精品国产一区二区精品| 日韩欧美中文字幕一区| 在线播放91灌醉迷j高跟美女| 在线视频欧美精品| 色天天综合色天天久久| 色综合久久综合网| 91在线视频播放地址| 成人av中文字幕| av男人天堂一区| 成人午夜短视频| 成人av高清在线| 99精品视频中文字幕| 99久久精品国产一区| 99久久国产综合精品麻豆| 色综合久久88色综合天天免费| k8久久久一区二区三区| 一本色道**综合亚洲精品蜜桃冫| 成人av在线资源网| 色先锋aa成人| 欧美丰满少妇xxxxx高潮对白| 91精品国模一区二区三区| 日韩视频免费观看高清完整版在线观看 | 97久久精品人人做人人爽| 一本大道综合伊人精品热热| 97se狠狠狠综合亚洲狠狠| 色哟哟日韩精品| 欧美一区二区视频网站| 精品国产成人在线影院 | 日韩亚洲欧美综合| 欧美精品一区二区三区蜜桃视频| 久久午夜免费电影| 亚洲视频1区2区| 日韩制服丝袜av| 国产不卡在线一区| 色香蕉久久蜜桃| 日韩精品一区在线| 中文字幕日本乱码精品影院| 亚洲午夜日本在线观看| 精品亚洲国产成人av制服丝袜| 波多野结衣中文字幕一区二区三区| 色综合天天综合网天天看片| 成人综合婷婷国产精品久久蜜臀| 色国产精品一区在线观看| 欧美日本在线播放| 国产亚洲欧洲一区高清在线观看| 亚洲欧美激情插 | 亚洲v精品v日韩v欧美v专区| 另类小说视频一区二区| 成人精品视频.| 日韩午夜激情电影| 成人欧美一区二区三区黑人麻豆| 日韩和欧美一区二区三区| 国产成人自拍高清视频在线免费播放| 日本精品一级二级| 久久一日本道色综合| 日韩国产欧美在线播放| av中文字幕不卡| 日韩欧美国产麻豆| 亚洲成av人片在线观看无码| 粉嫩av一区二区三区在线播放|