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

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

?? soundmanager.cpp

?? 分布式坦克大戰游戲,多機運行
?? CPP
字號:
/*****************************************************************************
*                                                                             
*   SoundManager.cpp
*                                                                             
*   Electrical Engineering Faculty - Software Lab                             
*   Spring semester 1998                                                      
*                                                                             
*   Tanks game                                                                
*                                                                             
*   Module description: Manages the DirectSound objects.
*                       
*                                                                             
*   Authors: Eran Yariv - 28484475                                           
*            Moshe Zur  - 24070856                                           
*                                                                            
*                                                                            
*   Date: 23/09/98                                                           
*                                                                            
******************************************************************************/
#include "stdafx.h"
#include "mmsystem.h"
#include "SoundManager.h"

LPCSTR CSoundManager::m_aszSoundFileNames[] =
{
    "FIRE_BULLET", 
    "FIRE_SHELL", 
    "SHELL_EXPLODE",
    "MINE_EXPLODE",
    "TANK_EXPLODE",
    "DROP_BOMB",
    "PICK_BONUS",
    "GAME_OVER"
};

CSoundManager::CSoundManager() :
m_pDirectSound(NULL),
m_bMuteMode(FALSE)
{}

/*------------------------------------------------------------------------------

  Function: Init

  Purpose:  Initialize DirectSound objects.

  Input:    hWnd - Handle to main window

  Output:   Return TRUE if initializtion succeeded.

  Remarks:  
------------------------------------------------------------------------------*/
BOOL
CSoundManager::Init(HWND hWnd)
{
    ASSERT (! m_pDirectSound);
    if (m_pDirectSound)
        m_pDirectSound->Release();
    // Create DirectSound object
    if (DirectSoundCreate (NULL, &m_pDirectSound, NULL) == DS_OK)
    {
        // Set cooperative level for DirectSound. Normal means our
        // sounds will be silenced when our window loses input focus.
        if (m_pDirectSound->SetCooperativeLevel (hWnd, //AfxGetMainWnd()->m_hWnd,
                DSSCL_NORMAL) != DS_OK)
        {
            m_pDirectSound->Release();
            m_pDirectSound = NULL;
            return FALSE;
        }
    } else
    {
        m_pDirectSound = NULL;
        return FALSE;
    }
    // Load each wav files into DirectSound buffers:
    for (UINT i = 0; i < LAST_SOUND_TYPE; i++)
    {
        LoadWavToBuffer((SoundType)i);
    }

    return TRUE;
}

CSoundManager::~CSoundManager()
{
    // Release DirectSound interface (auto. release the sec. buffers):
    if (m_pDirectSound)
        m_pDirectSound->Release();
}

/*------------------------------------------------------------------------------

  Function: Play

  Purpose:  Play the 2nd buffer specified.

  Input:    ind - Index to 2nd buffer.

  Output:   None.

  Remarks:  Restarts to play buffer if called while buffer is playing.
------------------------------------------------------------------------------*/
void
CSoundManager::Play(CSoundManager::SoundType ind)
{
    // Check if play is anabled:
    if (m_bMuteMode || !m_pDirectSound)
        return;

    ASSERT (ind < LAST_SOUND_TYPE);
    if (ind >= LAST_SOUND_TYPE)
        return;

    // Play buffer(ind):
    if (m_aSoundBuffers[ind])
    {
//        m_aSoundBuffers[ind]->Stop();
        m_aSoundBuffers[ind]->SetCurrentPosition(0);
        m_aSoundBuffers[ind]->Play(0, 0, 0);
    }
}

/*------------------------------------------------------------------------------

  Function: LoadWavToBuffer

  Purpose:  Do all the dirty job - open the wav file and load it into its buffer.

  Input:    ind - Index to 2nd buffer.

  Output:   None.

  Remarks:  
------------------------------------------------------------------------------*/
void
CSoundManager::LoadWavToBuffer(CSoundManager::SoundType ind)
{
    HMMIO           hmmio       = NULL;
    MMCKINFO        mmckinfoParent;
    MMCKINFO        mmckinfoSubchunk;
    DWORD           dwFmtSize;
    LPCSTR          szFileName;
    HANDLE          hFormat     = NULL;
    WAVEFORMATEX   *pFormat     = NULL;
    HANDLE          hData       = NULL;
    HPSTR           lpData      = NULL;
    BYTE           *pbData      = NULL;
    BYTE           *pbData2     = NULL;
    DWORD           dwDataSize;
    WORD            wBlockSize;
    DWORD           dwLength;
    DWORD           dwLength2;

    m_aSoundBuffers[ind] = NULL;
    szFileName = m_aszSoundFileNames[ind];
    //
    //  Load WAVE files from resource
    //
    HANDLE      hRes    = NULL;
    HANDLE      hBuffer = NULL;
    LPSTR       lpRes   = NULL;
    HRSRC       hResInfo;
    HINSTANCE   hInst   = AfxGetInstanceHandle();
    MMIOINFO    mmioInfo;

    // Find the wav resource
    hResInfo = FindResource(hInst, (LPSTR)szFileName, "WAVE");
    if (!hResInfo)
    {
        TRACE("SoundManager: Failed to find resource file %s.\n", szFileName);
        return;
    }

    // Load the wav resource
    hRes = LoadResource(hInst, hResInfo);
    if (!hRes)
    {
        TRACE("SoundManager: Failed to load resource file %s.\n", szFileName);
        return;
    }

    // Lock the wav resource
    lpRes = (LPSTR)LockResource(hRes);
    if (!lpRes)
    {
        TRACE("SoundManager: Failed to lock resource.\n");
        goto CLEANUP;
    }

    //
    //  Read the wav file into memory:
    //

    // Prepare memory for reading using buffered I/O:
    ZeroMemory (&mmioInfo, sizeof(mmioInfo));
    mmioInfo.fccIOProc = FOURCC_MEM;
    mmioInfo.pchBuffer = (LPSTR)lpRes;
    mmioInfo.cchBuffer = SizeofResource(hInst, hResInfo);
    hBuffer = GlobalAlloc (LMEM_MOVEABLE, mmioInfo.cchBuffer);
    if (!hBuffer)
    {
        TRACE("SoundManager: Out of memory.\n");
        goto CLEANUP;
    }
    mmioInfo.pchBuffer = (LPSTR) GlobalLock(hBuffer);
    if (!mmioInfo.pchBuffer)
    {
        TRACE("SoundManager: Failed to lock memory for buffer.\n");
        goto CLEANUP;
    }
    memcpy (mmioInfo.pchBuffer, lpRes, mmioInfo.cchBuffer);

    if (!mmioInfo.cchBuffer)
    {
        TRACE("SoundManager: Failed to get resource size (Error=%d).\n", 
            GetLastError());
        goto CLEANUP;
    }

    hmmio = mmioOpen(NULL, &mmioInfo, MMIO_READWRITE /*| MMIO_ALLOCBUF*/);
    if(!hmmio)
    {
        TRACE("SoundManager: Failed to open file %s.\n", szFileName);
        return;
    }

    // Locate a 'RIFF' chunk with a 'WAVE' form type
    // to make sure it's a WAVE file.
    mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E');
    if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, MMIO_FINDRIFF))
    {
        TRACE("SoundManager: This is not a WAVE file.\n");
        goto CLEANUP;
    }

    // Now, find the format chunk (form type 'fmt '). It should be
    // a subchunk of the 'RIFF' parent chunk.
    mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' ');
    if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
        MMIO_FINDCHUNK))
    {
        TRACE("SoundManager: WAVE file is corrupted.\n");
        goto CLEANUP;
    }

    // Get the size of the format chunk, allocate and lock memory for it.
    dwFmtSize = mmckinfoSubchunk.cksize;
    hFormat = GlobalAlloc(LMEM_MOVEABLE, LOWORD(dwFmtSize));
    if (!hFormat)
    {
        TRACE("SoundManager: Out of memory.\n");
        goto CLEANUP;
    }
    pFormat = (WAVEFORMATEX *) GlobalLock(hFormat);
    if (!pFormat)
    {
        TRACE("SoundManager: Failed to lock memory for format chunk.\n");
        goto CLEANUP;
    }

    // Read the format chunk.
    if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize) != (LONG) dwFmtSize)
    {
        TRACE("SoundManager: Failed to read format chunk.\n");
        goto CLEANUP;
    }

    // Make sure it's a PCM file.
    if (pFormat->wFormatTag != WAVE_FORMAT_PCM)
    {
        TRACE("SoundManager: The file is not a PCM file.\n");
        goto CLEANUP;
    }

    // Ascend out of the format subchunk.
    mmioAscend(hmmio, &mmckinfoSubchunk, 0);

    // Find the data subchunk.
    mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a');
    if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
        MMIO_FINDCHUNK))
    {
        TRACE("SoundManager: WAVE file has no data chunk.\n");
        goto CLEANUP;
    }

    // Get the size of the data subchunk.
    dwDataSize = mmckinfoSubchunk.cksize;
    if (dwDataSize == 0L)
    {
        TRACE("SoundManager: The data chunk has no data.\n");
        goto CLEANUP;
    }


    // Save block alignment info for later use.
    wBlockSize = pFormat->nBlockAlign;


    // Allocate and lock memory for the waveform data.
    hData = GlobalAlloc(GMEM_MOVEABLE , dwDataSize );
                       // GMEM_SHARE is not needed on 32 bits
    if (!hData)
    {
        TRACE("SoundManager: Out of memory.\n");
        goto CLEANUP;
    }
    lpData = (char *)GlobalLock(hData);
    if (!lpData)
    {
        TRACE("SoundManager: Failed to lock memory for data chunk.\n");
        goto CLEANUP;
    }

    // Read the waveform data subchunk.
    if(mmioRead(hmmio, (HPSTR) lpData, dwDataSize) != (LONG) dwDataSize)
    {
        TRACE("SoundManager: Failed to read data chunk.\n");
        goto CLEANUP;
    }

    //
    //  Create DirectSoundBuffer:
    //

    DSBUFFERDESC dsbd;
    
    //DS Now create the secondary buffer
    memset(&dsbd, 0, sizeof(DSBUFFERDESC));
    dsbd.dwSize       = sizeof(DSBUFFERDESC);
    dsbd.dwFlags      = DSBCAPS_CTRLDEFAULT ;
    dsbd.dwBufferBytes= dwDataSize; // size of the audio data in bytes
    dsbd.lpwfxFormat  = pFormat;    
    if (m_pDirectSound->CreateSoundBuffer(
        &dsbd, 
        &m_aSoundBuffers[ind],
        NULL) != 0)
    {
        TRACE("SoundManager: Direct Sound Buffer Creation Failed\n");
        goto CLEANUP;
    }
    ASSERT (m_aSoundBuffers[ind]);    

    //
    //  Copy data to buffer:
    //

    if (m_aSoundBuffers[ind]->Lock
                  ( 0,                      // the position to start to lock
                    dwDataSize,             // number of bytes to lock
                    (PVOID *)&pbData,       // pbData will point to the memory area
                    &dwLength,              // number of bytes to use under pbData
                    (PVOID *)&pbData2,      // not used since no wrap around
                    &dwLength2,             // not used since no wrap around
                    0L) != DS_OK)
    {
        TRACE("SoundManager: Sound buffer Lock Failed.\n");
        goto CLEANUP;
    }

    // Now we can copy data into the area by, say, memcpy function
    memcpy(pbData, lpData, dwLength);

    // Unlock it
    if (m_aSoundBuffers[ind]->Unlock(pbData, dwLength, NULL, 0) != DS_OK)
    {
        TRACE("SoundManager: Sound buffer Unlock Failed.\n");
    }

CLEANUP:
    if (hRes)
        FreeResource(hRes);

    if (hFormat)
    {
        LocalUnlock( hFormat );
        LocalFree( hFormat );
    }
    if (hData)
    {
        GlobalUnlock( hData );
        GlobalFree( hData );
    }
    if (hBuffer)
    {
        GlobalUnlock( hBuffer );
        GlobalFree( hBuffer );
    }
    if (hmmio)
        mmioClose(hmmio, 0);

    return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品一区二区三区影院 | 国产成人精品一区二区三区四区 | 91麻豆精品国产自产在线观看一区| 国产亚洲综合av| 亚洲第一福利一区| 99久久精品国产观看| 337p粉嫩大胆色噜噜噜噜亚洲| 亚洲午夜电影在线观看| 99久久久无码国产精品| 26uuu成人网一区二区三区| 午夜电影网一区| 91色.com| 亚洲欧洲国产日韩| 国产乱色国产精品免费视频| 日韩三级免费观看| 亚洲v中文字幕| 91首页免费视频| 久久精品亚洲乱码伦伦中文 | 午夜精品久久久久久久| 色就色 综合激情| 国产精品欧美一级免费| 国产中文字幕一区| 日韩你懂的电影在线观看| 亚洲h在线观看| 欧美日韩精品一区二区三区四区| 亚洲欧美另类图片小说| 99久久综合国产精品| 国产欧美日韩精品a在线观看| 极品美女销魂一区二区三区免费| 欧美一级片在线| 青青草国产精品亚洲专区无| 欧美日本高清视频在线观看| 亚洲小说春色综合另类电影| 在线观看日韩国产| 有码一区二区三区| 在线播放91灌醉迷j高跟美女| 成人国产免费视频| 国产亚洲成av人在线观看导航| 激情久久五月天| 精品av久久707| 国产精品影视在线观看| 久久精品一区蜜桃臀影院| 国产在线精品免费| 精品国产免费久久| 国产毛片精品一区| 国产视频一区二区在线观看| 成人国产视频在线观看| 亚洲人成网站影音先锋播放| 日本精品一区二区三区高清 | 久久久久久久久伊人| 国产精品538一区二区在线| 国产偷国产偷精品高清尤物 | 国产精品一区免费在线观看| 中文字幕高清不卡| 91丨九色porny丨蝌蚪| 夜夜嗨av一区二区三区网页| 欧洲在线/亚洲| 日韩激情在线观看| 欧美成人a∨高清免费观看| 国产高清亚洲一区| 中文字幕在线不卡一区二区三区| 日本乱人伦一区| 婷婷成人激情在线网| 日韩欧美一级精品久久| 国产成人午夜精品影院观看视频| 成人免费一区二区三区在线观看| 在线观看日韩高清av| 免费的国产精品| 国产亚洲一区字幕| 色综合久久综合网欧美综合网| 亚洲第一激情av| 久久综合中文字幕| 97久久久精品综合88久久| 亚洲va在线va天堂| 精品成人佐山爱一区二区| 波多野结衣欧美| 亚洲.国产.中文慕字在线| 久久亚洲精品小早川怜子| 色哟哟在线观看一区二区三区| 婷婷开心激情综合| 国产欧美日韩亚州综合 | av电影天堂一区二区在线观看| 一区二区三区欧美日| 欧美一级黄色片| 成人黄色av电影| 婷婷久久综合九色综合绿巨人| 国产三级精品在线| 在线视频国内自拍亚洲视频| 精品一区二区三区免费毛片爱| 亚洲欧洲精品一区二区三区| 日韩三级伦理片妻子的秘密按摩| 成人免费视频caoporn| 午夜av一区二区| 国产精品视频一二三| 91精品国产丝袜白色高跟鞋| 成人污视频在线观看| 欧美bbbbb| 亚洲欧洲一区二区在线播放| 91国在线观看| 亚洲福利视频一区| 国产亚洲成av人在线观看导航| 欧美日韩一区国产| 成人做爰69片免费看网站| 视频精品一区二区| 日韩毛片一二三区| 日韩欧美国产午夜精品| 91高清视频在线| 国产剧情在线观看一区二区| 性久久久久久久久| 亚洲视频资源在线| 国产亚洲午夜高清国产拍精品| 欧美精品一二三区| 91啪九色porn原创视频在线观看| 国产自产2019最新不卡| 丝袜国产日韩另类美女| 亚洲婷婷综合久久一本伊一区| 久久精品一级爱片| 日韩一区二区不卡| 欧美日韩国产综合一区二区三区| av在线不卡免费看| 国产一二三精品| 免费国产亚洲视频| 亚洲国产另类av| 成人免费在线播放视频| 国产日韩欧美精品一区| 精品国产一区久久| 欧美疯狂性受xxxxx喷水图片| 色菇凉天天综合网| 成av人片一区二区| 成人天堂资源www在线| 国产综合久久久久影院| 蜜桃视频一区二区| 日韩精品五月天| 五月天中文字幕一区二区| 亚洲柠檬福利资源导航| 国产精品国产a级| 中文字幕欧美区| 久久久国产综合精品女国产盗摄| 日韩精品一区二区三区在线观看 | 精品国产91乱码一区二区三区| 欧美群妇大交群中文字幕| 欧美午夜精品久久久久久超碰| 91在线无精精品入口| 成人自拍视频在线| 成人在线综合网| 成人黄色a**站在线观看| 成人性视频免费网站| 成人综合在线观看| 成人午夜激情片| 成人精品免费网站| 国产白丝网站精品污在线入口| 国产精品综合久久| 国产精品一级黄| 国产激情一区二区三区| 国产电影一区在线| 国产成人福利片| 国产xxx精品视频大全| 国产成人a级片| 成人免费视频免费观看| av在线一区二区| 色悠悠亚洲一区二区| 欧美在线免费观看亚洲| 欧美日韩一区视频| 91精品国产欧美一区二区18| 日韩三级电影网址| 久久久亚洲午夜电影| 国产日韩成人精品| 亚洲欧洲色图综合| 一区二区三区蜜桃网| 亚洲超碰97人人做人人爱| 日韩制服丝袜av| 精品在线观看免费| 亚洲欧美一区二区视频| 国产精品久久久久影院色老大| 亚洲丝袜制服诱惑| 亚洲永久精品国产| 午夜精品123| 久久精品久久99精品久久| 国产精品自拍av| www.亚洲精品| 91激情在线视频| 日韩视频免费直播| 久久久久久久精| 国产精品福利电影一区二区三区四区| 亚洲乱码国产乱码精品精的特点| 亚洲线精品一区二区三区八戒| 日韩国产一二三区| 极品少妇一区二区三区精品视频| 国产成人精品影视| 色88888久久久久久影院按摩 | 99精品国产99久久久久久白柏| 91免费视频网址| 91精品中文字幕一区二区三区| 久久先锋资源网| 一区二区三区视频在线看| 日韩精品成人一区二区三区| 国产精品一区二区不卡| 91视频国产资源| 日韩美女视频在线| 中文字幕av不卡|