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

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

?? dsutil.cpp

?? 一款C++小游戲的源代碼
?? CPP
字號:
/*==========================================================================
 *
 *  Copyright (C) 1995-1999 Microsoft Corporation. All Rights Reserved.
 *
 *  File:       dsutil.cpp
 *  Content:    Routines for dealing with sounds from resources
 *
 *
 ***************************************************************************/

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include <dsound.h>

typedef struct
{
    BYTE *pbWaveData;               // pointer into wave resource (for restore)
    DWORD cbWaveSize;               // size of wave data (for restore)
    int iAlloc;                     // number of buffers.
    int iCurrent;                   // current buffer
    IDirectSoundBuffer* Buffers[1]; // list of buffers

} SNDOBJ, *HSNDOBJ;

#define _HSNDOBJ_DEFINED
#include "dsutil.h"

static const char c_szWAV[] = "WAVE";

///////////////////////////////////////////////////////////////////////////////
//
// DSLoadSoundBuffer
//
///////////////////////////////////////////////////////////////////////////////

IDirectSoundBuffer *DSLoadSoundBuffer(IDirectSound *pDS, LPCTSTR lpName)
{
    IDirectSoundBuffer *pDSB = NULL;
    DSBUFFERDESC dsBD = {0};
    BYTE *pbWaveData;

    if (DSGetWaveResource(NULL, lpName, &dsBD.lpwfxFormat, &pbWaveData, &dsBD.dwBufferBytes))
    {
        dsBD.dwSize = sizeof(dsBD);
        dsBD.dwFlags = DSBCAPS_STATIC |  DSBCAPS_GETCURRENTPOSITION2;

        if (SUCCEEDED(IDirectSound_CreateSoundBuffer(pDS, &dsBD, &pDSB, NULL)))
        {
            if (!DSFillSoundBuffer(pDSB, pbWaveData, dsBD.dwBufferBytes))
            {
                IDirectSoundBuffer_Release(pDSB);
                pDSB = NULL;
            }
        }
        else
        {
            pDSB = NULL;
        }
    }

	if( NULL == pDSB )
		OutputDebugString( "Could not load sound buffer!\n" );

    return pDSB;
}

///////////////////////////////////////////////////////////////////////////////
//
// DSReloadSoundBuffer
//
///////////////////////////////////////////////////////////////////////////////

BOOL DSReloadSoundBuffer(IDirectSoundBuffer *pDSB, LPCTSTR lpName)
{
    BOOL result=FALSE;
    BYTE *pbWaveData;
    DWORD cbWaveSize;

    if (DSGetWaveResource(NULL, lpName, NULL, &pbWaveData, &cbWaveSize))
    {
        if (SUCCEEDED(IDirectSoundBuffer_Restore(pDSB)) &&
            DSFillSoundBuffer(pDSB, pbWaveData, cbWaveSize))
		{
		    result = TRUE;
        }
    }

	if( FALSE == result )
		OutputDebugString( "Could not reload sound buffer!\n" );

    return result;
}

///////////////////////////////////////////////////////////////////////////////
//
// DSGetWaveResource
//
///////////////////////////////////////////////////////////////////////////////

BOOL DSGetWaveResource(HMODULE hModule, LPCTSTR lpName,
    WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, DWORD *pcbWaveSize)
{
    HRSRC hResInfo;
    HGLOBAL hResData;
    void *pvRes;

    if (((hResInfo = FindResource(hModule, lpName, c_szWAV)) != NULL) &&
        ((hResData = LoadResource(hModule, hResInfo)) != NULL) &&
        ((pvRes = LockResource(hResData)) != NULL) &&
        DSParseWaveResource(pvRes, ppWaveHeader, ppbWaveData, pcbWaveSize))
    {
        return TRUE;
    }

	OutputDebugString( "Could not get wave resource!\n" );

    return FALSE;
}

///////////////////////////////////////////////////////////////////////////////
// SndObj fns
///////////////////////////////////////////////////////////////////////////////

SNDOBJ *SndObjCreate(IDirectSound *pDS, LPCTSTR lpName, int iConcurrent)
{
    SNDOBJ *pSO = NULL;
    LPWAVEFORMATEX pWaveHeader;
    BYTE *pbData;
    UINT cbData;

    if (DSGetWaveResource(NULL, lpName, &pWaveHeader, &pbData, (ULONG*)&cbData))
    {
        if (iConcurrent < 1)
            iConcurrent = 1;

        if ((pSO = (SNDOBJ *)LocalAlloc(LPTR, sizeof(SNDOBJ) +
	    (iConcurrent-1) * sizeof(IDirectSoundBuffer *))) != NULL)
        {
            int i;

            pSO->iAlloc = iConcurrent;
            pSO->pbWaveData = pbData;
            pSO->cbWaveSize = cbData;
            pSO->Buffers[0] = DSLoadSoundBuffer(pDS, lpName);

	    for (i=1; i<pSO->iAlloc; i++)
	    {
		if (FAILED(IDirectSound_DuplicateSoundBuffer(pDS,
                    pSO->Buffers[0], &pSO->Buffers[i])))
                {
		    pSO->Buffers[i] = DSLoadSoundBuffer(pDS, lpName);
		    if (!pSO->Buffers[i]) {
			SndObjDestroy(pSO);
			pSO = NULL;
			break;
		    }
		}
            }
        }
    }

	if( NULL == pSO )
		OutputDebugString( "Could not create SndObj object\n" );

    return pSO;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

void SndObjDestroy(SNDOBJ *pSO)
{
    if (pSO)
    {
        int i;

        for (i=0; i<pSO->iAlloc; i++)
        {
            if (pSO->Buffers[i])
            {
                IDirectSoundBuffer_Release(pSO->Buffers[i]);
                pSO->Buffers[i] = NULL;
            }
        }
        LocalFree((HANDLE)pSO);
    }
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

IDirectSoundBuffer *SndObjGetFreeBuffer(SNDOBJ *pSO)
{
    IDirectSoundBuffer *pDSB;

    if (pSO == NULL)
        return NULL;

    if (pDSB = pSO->Buffers[pSO->iCurrent])
    {
        HRESULT hres;
        DWORD dwStatus;

        hres = IDirectSoundBuffer_GetStatus(pDSB, &dwStatus);

        if (FAILED(hres))
            dwStatus = 0;

        if ((dwStatus & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING)
        {
            if (pSO->iAlloc > 1)
            {
                if (++pSO->iCurrent >= pSO->iAlloc)
                    pSO->iCurrent = 0;

                pDSB = pSO->Buffers[pSO->iCurrent];
                hres = IDirectSoundBuffer_GetStatus(pDSB, &dwStatus);

                if (SUCCEEDED(hres) && (dwStatus & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING)
                {
                    IDirectSoundBuffer_Stop(pDSB);
                    IDirectSoundBuffer_SetCurrentPosition(pDSB, 0);
                }
            }
            else
            {
                pDSB = NULL;
            }
        }

        if (pDSB && (dwStatus & DSBSTATUS_BUFFERLOST))
        {
            if (FAILED(IDirectSoundBuffer_Restore(pDSB)) ||
                !DSFillSoundBuffer(pDSB, pSO->pbWaveData, pSO->cbWaveSize))
            {
                pDSB = NULL;
            }
        }
    }

	if( NULL == pDSB )
		OutputDebugString( "Could not get free buffer for SndObj!\n" );

    return pDSB;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

BOOL SndObjPlay(SNDOBJ *pSO, DWORD dwPlayFlags)
{
    BOOL result = FALSE;

    if (pSO == NULL)
        return FALSE;

    if ((!(dwPlayFlags & DSBPLAY_LOOPING) || (pSO->iAlloc == 1)))
    {
	IDirectSoundBuffer *pDSB = SndObjGetFreeBuffer(pSO);
	if (pDSB != NULL) {
	    result = SUCCEEDED(IDirectSoundBuffer_Play(pDSB, 0, 0, dwPlayFlags));
	}
    }

    return result;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

BOOL SndObjStop(SNDOBJ *pSO)
{
    int i;

    if (pSO == NULL)
        return FALSE;

    for (i=0; i<pSO->iAlloc; i++)
    {
        IDirectSoundBuffer_Stop(pSO->Buffers[i]);
        IDirectSoundBuffer_SetCurrentPosition(pSO->Buffers[i], 0);
    }

    return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

BOOL DSFillSoundBuffer(IDirectSoundBuffer *pDSB, BYTE *pbWaveData, DWORD cbWaveSize)
{
    if (pDSB && pbWaveData && cbWaveSize)
    {
        LPVOID pMem1, pMem2;
        DWORD dwSize1, dwSize2;

        if (SUCCEEDED(IDirectSoundBuffer_Lock(pDSB, 0, cbWaveSize,
            &pMem1, &dwSize1, &pMem2, &dwSize2, 0)))
        {
            CopyMemory(pMem1, pbWaveData, dwSize1);

            if ( 0 != dwSize2 )
                CopyMemory(pMem2, pbWaveData+dwSize1, dwSize2);

            IDirectSoundBuffer_Unlock(pDSB, pMem1, dwSize1, pMem2, dwSize2);
            return TRUE;
        }
    }

	OutputDebugString( "Could not fill sound buffer!\n" );

    return FALSE;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

BOOL DSParseWaveResource(void *pvRes, WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData,DWORD *pcbWaveSize)
{
    DWORD *pdw;
    DWORD *pdwEnd;
    DWORD dwRiff;
    DWORD dwType;
    DWORD dwLength;

    if (ppWaveHeader)
        *ppWaveHeader = NULL;

    if (ppbWaveData)
        *ppbWaveData = NULL;

    if (pcbWaveSize)
        *pcbWaveSize = 0;

    pdw = (DWORD *)pvRes;
    dwRiff = *pdw++;
    dwLength = *pdw++;
    dwType = *pdw++;

    if (dwRiff != mmioFOURCC('R', 'I', 'F', 'F'))
        goto exit;      // not even RIFF

    if (dwType != mmioFOURCC('W', 'A', 'V', 'E'))
        goto exit;      // not a WAV

    pdwEnd = (DWORD *)((BYTE *)pdw + dwLength-4);

    while (pdw < pdwEnd)
    {
        dwType = *pdw++;
        dwLength = *pdw++;

        switch (dwType)
        {
        case mmioFOURCC('f', 'm', 't', ' '):
            if (ppWaveHeader && !*ppWaveHeader)
            {
                if (dwLength < sizeof(WAVEFORMAT))
                    goto exit;      // not a WAV

                *ppWaveHeader = (WAVEFORMATEX *)pdw;

                if ((!ppbWaveData || *ppbWaveData) &&
                    (!pcbWaveSize || *pcbWaveSize))
                {
                    return TRUE;
                }
            }
            break;

        case mmioFOURCC('d', 'a', 't', 'a'):
            if ((ppbWaveData && !*ppbWaveData) ||
                (pcbWaveSize && !*pcbWaveSize))
            {
                if (ppbWaveData)
                    *ppbWaveData = (LPBYTE)pdw;

                if (pcbWaveSize)
                    *pcbWaveSize = dwLength;

                if (!ppWaveHeader || *ppWaveHeader)
                    return TRUE;
            }
            break;
        }

        pdw = (DWORD *)((BYTE *)pdw + ((dwLength+1)&~1));
    }

exit:
	OutputDebugString( "Could not parse wave resource!\n" );

    return FALSE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲国产bt| 91浏览器打开| 一区二区欧美国产| 91色porny蝌蚪| 亚洲视频在线观看三级| 色综合久久中文综合久久97| 678五月天丁香亚洲综合网| 中文字幕成人av| 全国精品久久少妇| 91污在线观看| 国产亚洲一区字幕| 日韩精品一级中文字幕精品视频免费观看 | 欧美一级在线观看| 亚洲人成网站色在线观看| 国产**成人网毛片九色| 久久精品国产一区二区三| 国产欧美一区二区精品仙草咪| 亚洲精品在线免费观看视频| 亚洲一区二区三区四区在线观看| 国产iv一区二区三区| 欧美一卡二卡在线观看| 亚洲国产精品天堂| 91视频一区二区| 欧美经典一区二区| 韩国一区二区在线观看| 91精品国产手机| 亚洲成av人片一区二区| 在线观看国产91| 亚洲男同性视频| 97久久人人超碰| 国产精品成人免费在线| 国产98色在线|日韩| 久久―日本道色综合久久| 美女高潮久久久| 91精品国产色综合久久不卡蜜臀| 亚洲成人av福利| 欧美乱妇一区二区三区不卡视频| 亚洲午夜激情网页| 欧美人伦禁忌dvd放荡欲情| 午夜视频一区二区三区| 欧美日韩三级一区二区| 午夜一区二区三区在线观看| 欧美日韩国产综合视频在线观看| 亚洲午夜久久久久久久久电影院| 欧美图区在线视频| 日韩成人av影视| 精品黑人一区二区三区久久| 久久精工是国产品牌吗| 久久影视一区二区| 国产高清视频一区| 亚洲欧洲日韩女同| 日本电影欧美片| 日韩avvvv在线播放| 精品99999| 91在线国内视频| 亚洲午夜久久久久中文字幕久| 9191精品国产综合久久久久久| 久久精品国产99| 日本一区二区三区高清不卡| 色视频一区二区| 偷拍日韩校园综合在线| 久久亚洲精品国产精品紫薇| 国产69精品久久久久毛片| 亚洲精品国产a| 日韩三级.com| 91视频精品在这里| 五月天久久比比资源色| 久久久国产精品麻豆| 99精品1区2区| 日本三级韩国三级欧美三级| 国产亚洲综合在线| 欧美午夜一区二区三区 | 久久亚洲综合色一区二区三区| 国产成人h网站| 成人免费视频播放| 久久日韩精品一区二区五区| 欧美年轻男男videosbes| 国产在线日韩欧美| 一区二区三区国产精品| 欧美精品一区二区久久婷婷| 91丝袜国产在线播放| 久久精品噜噜噜成人88aⅴ| 17c精品麻豆一区二区免费| 日韩女优电影在线观看| 在线日韩一区二区| 国产精品69久久久久水密桃 | 日韩欧美久久久| 色欧美日韩亚洲| 国产精品69久久久久水密桃| 亚洲18女电影在线观看| 成人欧美一区二区三区白人| 久久亚洲影视婷婷| 日韩网站在线看片你懂的| 日本韩国一区二区三区视频| 国产suv精品一区二区三区| 日韩av电影天堂| 亚洲一区电影777| 18涩涩午夜精品.www| 久久久国产精华| 欧美变态凌虐bdsm| 欧美精品一级二级三级| 91久久免费观看| 99精品视频在线免费观看| 国产精华液一区二区三区| 久久精品免费看| 蜜桃久久久久久久| 丝袜美腿一区二区三区| 一区二区三区精品视频在线| 午夜激情综合网| 亚洲精品国产一区二区精华液| 国产精品免费网站在线观看| 久久一区二区视频| 精品国产乱码久久久久久牛牛 | 午夜在线成人av| 亚洲第一成年网| 亚洲成人av电影| 日韩成人dvd| 美女www一区二区| 精品一区精品二区高清| 国产一区二区伦理片| 国产综合色在线| 国产精品系列在线观看| 国产美女精品人人做人人爽| 国模少妇一区二区三区| 国产精品99久久久久久久女警 | 日韩在线播放一区二区| 婷婷一区二区三区| 欧美96一区二区免费视频| 日韩av午夜在线观看| 蜜桃视频在线一区| 国产一区二区三区电影在线观看| 国产成人三级在线观看| 成人免费毛片a| 色综合久久综合网97色综合| 在线看不卡av| 欧美一级高清片在线观看| 久久综合色婷婷| 国产精品网站导航| 亚洲制服丝袜在线| 五月天激情综合| 国产综合成人久久大片91| 成人一区二区三区| 91行情网站电视在线观看高清版| 欧美三级三级三级| 亚洲精品一区二区三区福利| 国产精品对白交换视频| 亚洲综合一二三区| 国精产品一区一区三区mba视频| 成人精品亚洲人成在线| 欧美日免费三级在线| 日韩精品一区二| 日韩一区在线看| 日韩在线卡一卡二| 成av人片一区二区| 欧美极品aⅴ影院| 亚洲妇熟xx妇色黄| 国产一区二区三区黄视频 | 国产福利一区在线| 在线亚洲高清视频| 国产偷国产偷精品高清尤物| 一区二区三区欧美亚洲| 国内精品伊人久久久久av影院 | 国产乱子伦一区二区三区国色天香| 成人高清视频在线| 欧美一二三区精品| 综合久久综合久久| 精品一区二区三区免费观看| 91福利在线导航| 国产欧美一二三区| 丝袜诱惑亚洲看片| 91色.com| 国产亚洲精品aa午夜观看| 天使萌一区二区三区免费观看| 岛国av在线一区| 日韩你懂的在线观看| 一二三四社区欧美黄| 国产高清在线精品| 精品欧美一区二区在线观看| 亚洲成人综合网站| 91在线精品一区二区| 欧美激情综合五月色丁香 | 精品国产乱子伦一区| 亚洲成人久久影院| 欧美自拍偷拍午夜视频| 国产婷婷色一区二区三区四区| 秋霞成人午夜伦在线观看| 色94色欧美sute亚洲线路二 | 欧美精品一区二区高清在线观看| 亚洲国产成人高清精品| 色综合视频在线观看| 最新国产の精品合集bt伙计| 高清不卡在线观看av| 久久精品一区八戒影视| 久久99精品久久久久久| 51精品秘密在线观看| 亚洲一区二区三区爽爽爽爽爽| 91久久精品网| 亚洲一区在线看| 精品1区2区3区| 视频在线在亚洲|