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

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

?? strmctxt.cpp

?? realtek562x系列驅動源碼。wince
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
/* 
** Copyright 2000-2003 Intel Corporation All Rights Reserved.
**
** Portions of the source code contained or described herein and all documents
** related to such source code (Material) are owned by Intel Corporation
** or its suppliers or licensors and is licensed by Microsoft Corporation for distribution.  
** Title to the Material remains with Intel Corporation or its suppliers and licensors. 
** Use of the Materials is subject to the terms of the Microsoft license agreement which accompanied the Materials.  
** No other license under any patent, copyright, trade secret or other intellectual
** property right is granted to or conferred upon you by disclosure or
** delivery of the Materials, either expressly, by implication, inducement,
** estoppel or otherwise 
** Some portion of the Materials may be copyrighted by Microsoft Corporation.
*/
#include "wavemain.h"

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

    // DEBUGMSG(1, (TEXT("Opening stream 0x%x\r\n"),this));

    // 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);

    // DEBUGMSG(1, (TEXT("Closing stream 0x%x\r\n"),this));
    DoCallbackStreamClosed();

    return MMSYSERR_NOERROR;
}

// Assumes lock is taken
LONG StreamContext::AddRef()
{
    LONG RefCount = ++m_RefCount;
//    DEBUGMSG(1, (TEXT("AddRef stream 0x%x, RefCount=%d\r\n"),this,RefCount));
    return RefCount;
}

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

//    DEBUGMSG(1, (TEXT("Releasing stream 0x%x, RefCount=%d\r\n"),this,RefCount));
    if (RefCount==0)
    {
        // DEBUGMSG(1, (TEXT("Deleting stream 0x%x\r\n"),this));
        // 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);
        }
    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久四虎| 国产一区欧美二区| 免费高清在线视频一区·| 国产乱一区二区| 欧美日韩你懂得| 中文字幕乱码亚洲精品一区| 青草国产精品久久久久久| 国产成人综合在线观看| 91.com在线观看| 一级特黄大欧美久久久| 国产91精品一区二区| 欧美sm极限捆绑bd| 亚洲1区2区3区视频| 91亚洲精品一区二区乱码| 久久婷婷综合激情| 伦理电影国产精品| 欧美日韩高清不卡| 亚洲精品成a人| 91在线视频官网| 国产精品福利在线播放| 国产成人午夜视频| 久久亚洲一区二区三区四区| 另类专区欧美蜜桃臀第一页| 欧美日韩mp4| 亚洲一区在线电影| 欧美性大战xxxxx久久久| 一区二区三区欧美亚洲| 色香蕉久久蜜桃| 国产精品久久久久久福利一牛影视| 国产精品资源在线观看| 久久久久综合网| 国产精品夜夜嗨| 国产区在线观看成人精品| 福利电影一区二区| 国产精品乱人伦中文| 国产不卡高清在线观看视频| 欧美国产激情二区三区| 国产成人精品三级麻豆| 国产精品沙发午睡系列990531| 国产成人一区在线| 国产精品不卡一区| 欧美亚洲国产一区二区三区va| 亚洲成人动漫精品| 91精品国产综合久久久久久漫画 | 国产精品美女久久久久aⅴ| 国产河南妇女毛片精品久久久 | 亚洲精品欧美综合四区| 91丨九色丨蝌蚪丨老版| 亚洲一区二区三区影院| 日韩一级二级三级| 国产成人在线网站| 一区二区在线观看免费视频播放| 欧美亚洲动漫精品| 激情图片小说一区| 欧美高清在线视频| 91麻豆精品秘密| 五月天亚洲婷婷| 精品国产91乱码一区二区三区 | 国产欧美1区2区3区| 91视频观看免费| 亚洲va韩国va欧美va精品| 日韩欧美三级在线| 99国产一区二区三精品乱码| 亚洲一区二区高清| 久久毛片高清国产| 欧美综合欧美视频| 国产毛片精品国产一区二区三区| 国产精品女人毛片| 91精品黄色片免费大全| 成人动漫一区二区在线| 喷白浆一区二区| 国产精品国产三级国产aⅴ中文| 欧美视频完全免费看| 国产麻豆成人精品| 亚洲高清免费在线| 国产精品久久久久影院亚瑟 | 中文字幕在线不卡| 91精品久久久久久久久99蜜臂| 成人午夜免费电影| 久久国内精品视频| 亚洲激情成人在线| 日本一区二区三区四区| 欧美老年两性高潮| 一本大道综合伊人精品热热| 国产一区在线观看麻豆| 日韩高清一级片| 亚洲欧美一区二区不卡| 久久久精品日韩欧美| 777久久久精品| 色综合久久88色综合天天6| 国产麻豆精品在线| 日本aⅴ亚洲精品中文乱码| 亚洲精品视频在线看| 国产精品三级久久久久三级| 欧美一激情一区二区三区| 在线观看日韩一区| 99久久精品国产网站| 成人自拍视频在线观看| 精品一区二区日韩| 免费成人av资源网| 视频一区二区三区中文字幕| 亚洲欧美偷拍另类a∨色屁股| 中文字幕国产一区| 欧美国产一区二区| 亚洲国产精华液网站w| 国产肉丝袜一区二区| 欧美videos大乳护士334| 日韩一级大片在线观看| 欧美一区二区二区| 日韩免费观看高清完整版| 制服.丝袜.亚洲.另类.中文| 精品视频1区2区| 精品视频全国免费看| 欧美日韩国产经典色站一区二区三区| 在线亚洲欧美专区二区| 色婷婷av一区二区三区大白胸| 99国产精品国产精品久久| 成人a区在线观看| 成人免费av在线| 97成人超碰视| 欧美少妇bbb| 3atv一区二区三区| 91精品国产色综合久久ai换脸 | 亚洲免费观看视频| 亚洲一区视频在线观看视频| 亚洲妇熟xx妇色黄| 蜜桃av一区二区在线观看| 加勒比av一区二区| 国产精品91xxx| 99久久精品国产一区二区三区| 91蝌蚪国产九色| 欧美伊人久久久久久久久影院 | 欧美优质美女网站| 欧美日韩一区小说| 欧美一区二区在线视频| 欧美变态口味重另类| 国产精品日产欧美久久久久| 亚洲乱码日产精品bd| 亚洲成人你懂的| 韩国一区二区三区| 色综合久久天天综合网| 7777精品伊人久久久大香线蕉 | 日本乱码高清不卡字幕| 欧美日韩的一区二区| 久久久91精品国产一区二区三区| 中文字幕av一区二区三区| 亚洲福利视频导航| 国产一区91精品张津瑜| 在线亚洲人成电影网站色www| 在线综合视频播放| 国产精品免费人成网站| 日韩电影在线一区二区三区| 国产大陆a不卡| 7777精品伊人久久久大香线蕉的| 国产亚洲精品资源在线26u| 一区二区三区欧美激情| 人人精品人人爱| 99视频有精品| 精品国产凹凸成av人导航| 亚洲综合色丁香婷婷六月图片| 狠狠色丁香久久婷婷综合丁香| 91高清视频免费看| 国产日韩精品一区| 午夜欧美在线一二页| av动漫一区二区| 精品国产百合女同互慰| 亚洲成av人片一区二区三区| 岛国一区二区三区| 日韩欧美一区中文| 亚洲国产成人porn| 99精品久久免费看蜜臀剧情介绍| www国产成人免费观看视频 深夜成人网| 综合久久久久久| 成人综合婷婷国产精品久久蜜臀| 欧美一卡在线观看| 性做久久久久久| 欧美性生活久久| 国产精品夫妻自拍| 国产iv一区二区三区| 日韩免费电影一区| 日本人妖一区二区| 制服.丝袜.亚洲.中文.综合| 一片黄亚洲嫩模| 色香蕉久久蜜桃| 亚洲精品乱码久久久久久| 成人丝袜18视频在线观看| 国产日韩欧美高清| 丰满白嫩尤物一区二区| 久久久久久一二三区| 精品一区在线看| 精品粉嫩aⅴ一区二区三区四区| 日精品一区二区| 在线电影一区二区三区| 亚洲高清免费一级二级三级| 欧洲生活片亚洲生活在线观看| 亚洲视频一区二区在线| 99久久精品免费看国产免费软件| 亚洲欧美综合在线精品| 94-欧美-setu| 一区二区三区日韩精品视频|