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

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

?? direct~1.cpp

?? 《vc游戲編程導學》一書的原代碼
?? CPP
字號:
/////////////////////////////////////////////////////////////////////////////
// This file is part of the completely free tetris clone "CGTetris".
//
// This is free software.
// You may redistribute it by any means providing it is not sold for profit
// without the authors written consent.
//
// No warrantee of any kind, expressed or implied, is included with this
// software; use at your own risk, responsibility for damages (if any) to
// anyone resulting from the use of this software rests entirely with the
// user.
/////////////////////////////////////////////////////////////////////////////


// DirectSound.cpp: implementation of the CDirectSound class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DirectSound.h"

// The following macro is defined since DirectX 5, but will work with
// older versions too.
#ifndef DSBLOCK_ENTIREBUFFER
	#define DSBLOCK_ENTIREBUFFER        0x00000002
#endif

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

static void DSError( HRESULT hRes ) {
	switch(hRes) {
		case DS_OK: TRACE0("NO ERROR\n"); break;
		case DSERR_ALLOCATED: TRACE0("ALLOCATED\n"); break;
		case DSERR_INVALIDPARAM: TRACE0("INVALIDPARAM\n"); break;
		case DSERR_OUTOFMEMORY: TRACE0("OUTOFMEMORY\n"); break;
		case DSERR_UNSUPPORTED: TRACE0("UNSUPPORTED\n"); break;
		case DSERR_NOAGGREGATION: TRACE0("NOAGGREGATION\n"); break;
		case DSERR_UNINITIALIZED: TRACE0("UNINITIALIZED\n"); break;
		case DSERR_BADFORMAT: TRACE0("BADFORMAT\n"); break;
		case DSERR_ALREADYINITIALIZED: TRACE0("ALREADYINITIALIZED\n"); break;
		case DSERR_BUFFERLOST: TRACE0("BUFFERLOST\n"); break;
		case DSERR_CONTROLUNAVAIL: TRACE0("CONTROLUNAVAIL\n"); break;
		case DSERR_GENERIC: TRACE0("GENERIC\n"); break;
		case DSERR_INVALIDCALL: TRACE0("INVALIDCALL\n"); break;
		case DSERR_OTHERAPPHASPRIO: TRACE0("OTHERAPPHASPRIO\n"); break;
		case DSERR_PRIOLEVELNEEDED: TRACE0("PRIOLEVELNEEDED\n"); break;
		default: TRACE1("%lu\n",hRes);break;
	}
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

LPDIRECTSOUND CDirectSound::m_lpDirectSound;
DWORD CDirectSound::m_dwInstances;


CDirectSound::CDirectSound()
{
	m_lpDirectSound = 0;
	m_pDsb = 0;
	m_pTheSound = 0;
	m_dwTheSound = 0;
	m_bEnabled = TRUE;

	++m_dwInstances;
}

CDirectSound::~CDirectSound()
{
	if( m_pDsb )
		m_pDsb->Release();

	if( !--m_dwInstances && m_lpDirectSound ) {
		m_lpDirectSound->Release();
		m_lpDirectSound = 0;
	}
}

BOOL CDirectSound::Create(LPCTSTR pszResource, CWnd * pWnd)
{
	//////////////////////////////////////////////////////////////////
	// load resource
	HINSTANCE hApp = ::GetModuleHandle(0);
	ASSERT(hApp);

	HRSRC hResInfo = ::FindResource(hApp, pszResource, TEXT("WAVE"));
	if(hResInfo == 0)
		return FALSE;

	HGLOBAL hRes = ::LoadResource(hApp, hResInfo);
	if(hRes == 0)
		return FALSE;

	LPVOID pTheSound = ::LockResource(hRes);
	if(pTheSound == 0)
		return FALSE;

	return Create(pTheSound, pWnd);
}


BOOL CDirectSound :: Create(LPVOID pSoundData, CWnd * pWnd) {
	if(pWnd == 0)
		pWnd = AfxGetApp()->GetMainWnd();

	ASSERT(pWnd != 0);
	ASSERT(::IsWindow(pWnd->GetSafeHwnd()));

	ASSERT(pSoundData != 0);

	//////////////////////////////////////////////////////////////////
	// create direct sound object
	
	if( m_lpDirectSound == 0 ) {
		// Someone might use sounds for starting apps. This may cause
		// DirectSoundCreate() to fail because the driver is used by
		// anyone else. So wait a little before starting with the work ...
		HRESULT hRes = DS_OK;
		short nRes = 0;

		do {
			if( nRes )
				::Sleep(500);
			hRes = ::DirectSoundCreate(0, &m_lpDirectSound, 0);
			++nRes;
		} while( nRes < 10 && (hRes == DSERR_ALLOCATED || hRes == DSERR_NODRIVER) );

		if( hRes != DS_OK )
			return FALSE;
	
		m_lpDirectSound->SetCooperativeLevel(pWnd->GetSafeHwnd(), DSSCL_NORMAL);
	}

	ASSERT(m_lpDirectSound != 0);

	WAVEFORMATEX * pcmwf;
	if( ! GetWaveData(pSoundData, pcmwf, m_pTheSound, m_dwTheSound) ||
		! CreateSoundBuffer(pcmwf) ||
		! SetSoundData(m_pTheSound, m_dwTheSound) )
		return FALSE;

	return TRUE;
}


BOOL CDirectSound :: GetWaveData(void * pRes, WAVEFORMATEX * & pWaveHeader, void * & pbWaveData, DWORD & cbWaveSize) {
	pWaveHeader = 0;
	pbWaveData = 0;
	cbWaveSize = 0;

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

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

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

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

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

		switch( dwType ) {
			case mmioFOURCC('f', 'm', 't', ' '):
				if( !pWaveHeader ) {
					if( dwLength < sizeof(WAVEFORMAT) )
						return FALSE;      // not a WAV

					pWaveHeader = (WAVEFORMATEX *)pdw;

					if( pbWaveData && cbWaveSize )
						return TRUE;
				}
				break;

			case mmioFOURCC('d', 'a', 't', 'a'):
				pbWaveData = LPVOID(pdw);
				cbWaveSize = dwLength;

				if( pWaveHeader )
					return TRUE;
				break;
		}
		pdw = (DWORD *)((BYTE *)pdw + ((dwLength+1)&~1));
	}

	return FALSE;
}


BOOL CDirectSound::CreateSoundBuffer(WAVEFORMATEX * pcmwf)
{
	DSBUFFERDESC dsbdesc;

	// Set up DSBUFFERDESC structure.
	memset(&dsbdesc, 0, sizeof(DSBUFFERDESC)); // Zero it out.
	dsbdesc.dwSize = sizeof(DSBUFFERDESC);
	// Need no controls (pan, volume, frequency).
	dsbdesc.dwFlags = DSBCAPS_STATIC;		// assumes that the sound is played often
	dsbdesc.dwBufferBytes = m_dwTheSound;
	dsbdesc.lpwfxFormat = pcmwf;    // Create buffer.
	HRESULT hRes;
	if( DS_OK != (hRes = m_lpDirectSound->CreateSoundBuffer(&dsbdesc, &m_pDsb, 0)) ) {
		// Failed.
		DSError(hRes);
		m_pDsb = 0;
		return FALSE;
	}

	return TRUE;
}


BOOL CDirectSound::SetSoundData(void * pSoundData, DWORD dwSoundSize) {
	LPVOID lpvPtr1;
	DWORD dwBytes1;
	// Obtain write pointer.
	HRESULT hr = m_pDsb->Lock(0, 0, &lpvPtr1, &dwBytes1, 0, 0, DSBLOCK_ENTIREBUFFER);    
    // If DSERR_BUFFERLOST is returned, restore and retry lock.
	if(DSERR_BUFFERLOST == hr) {
		m_pDsb->Restore();
		hr = m_pDsb->Lock(0, 0, &lpvPtr1, &dwBytes1, 0, 0, DSBLOCK_ENTIREBUFFER);
	}
	if(DS_OK == hr) {
		// Write to pointers.
		::CopyMemory(lpvPtr1, pSoundData, dwBytes1);
		// Release the data back to DirectSound.
		hr = m_pDsb->Unlock(lpvPtr1, dwBytes1, 0, 0);
		if(DS_OK == hr)
            return TRUE;
	}
	// Lock, Unlock, or Restore failed.
	return FALSE;
}

void CDirectSound::Play(DWORD dwStartPosition, BOOL bLoop)
{
	if( ! IsValid() || ! IsEnabled() )
		return;		// no chance to play the sound ...

	if( dwStartPosition > m_dwTheSound )
		dwStartPosition = m_dwTheSound;
	m_pDsb->SetCurrentPosition(dwStartPosition);
	if( DSERR_BUFFERLOST == m_pDsb->Play(0, 0, bLoop ? DSBPLAY_LOOPING : 0) ) {
		// another application had stolen our buffer
		// Note that a "Restore()" is not enough, because
		// the sound data is invalid after Restore().
		SetSoundData(m_pTheSound, m_dwTheSound);

		// Try playing again
		m_pDsb->Play(0, 0, bLoop ? DSBPLAY_LOOPING : 0);
	}
}

void CDirectSound::Stop()
{
	if( IsValid() )
		m_pDsb->Stop();
}

void CDirectSound::Pause()
{
	Stop();
}

void CDirectSound::Continue()
{
	if( IsValid() ) {
		DWORD dwPlayCursor, dwWriteCursor;
		m_pDsb->GetCurrentPosition(&dwPlayCursor, &dwWriteCursor);
		Play(dwPlayCursor);
	}
}

BOOL CDirectSound::IsValid() const
{
	return (m_lpDirectSound && m_pDsb && m_pTheSound && m_dwTheSound) ? TRUE : FALSE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品九九99久久| 国产河南妇女毛片精品久久久| 欧美精品一区二区三区四区| 在线观看视频91| 色婷婷av一区二区三区软件| 不卡一区二区三区四区| 国产精品18久久久久久久久 | 国产宾馆实践打屁股91| 久久99精品一区二区三区| 麻豆一区二区三| 国产精品456| 成人高清伦理免费影院在线观看| 成人福利视频在线看| 色哟哟国产精品| 欧美美女黄视频| 欧美tickling网站挠脚心| 精品成人一区二区三区四区| 久久综合九色综合97婷婷| 久久亚洲综合色一区二区三区| 久久久激情视频| 国产精品久线在线观看| 亚洲免费观看高清完整| 亚洲国产精品一区二区久久| 日本在线不卡视频| 国产一区不卡在线| 色素色在线综合| 日韩亚洲欧美在线| 国产精品私房写真福利视频| 亚洲午夜影视影院在线观看| 六月丁香综合在线视频| 国产ts人妖一区二区| 91久久精品一区二区三区| 日韩欧美一区二区久久婷婷| 国产精品久久久久7777按摩| 天天操天天综合网| 国产盗摄女厕一区二区三区| 欧美中文字幕一二三区视频| 久久精品视频在线看| 亚洲美女免费视频| 国产一区激情在线| 欧美色综合影院| 中文字幕乱码一区二区免费| 天天操天天色综合| 91女神在线视频| 日韩精品中文字幕一区二区三区| 中文字幕一区二区三区在线播放| 图片区小说区区亚洲影院| 成人午夜免费av| 日韩欧美亚洲另类制服综合在线| 成人免费在线播放视频| 美女视频黄频大全不卡视频在线播放| 成人h版在线观看| 欧美电影免费观看高清完整版在线| 成人免费小视频| 国产大陆亚洲精品国产| 日韩女优av电影| 日韩成人午夜精品| 91成人网在线| 成人免费一区二区三区在线观看| 激情深爱一区二区| 91精品国产91热久久久做人人| 亚洲欧美成人一区二区三区| 国产91清纯白嫩初高中在线观看| 日韩欧美www| 日产国产高清一区二区三区| 欧美午夜影院一区| 一区二区理论电影在线观看| av不卡一区二区三区| 国产免费成人在线视频| 黑人巨大精品欧美一区| 精品久久久三级丝袜| 久久精品国产免费| 4438x亚洲最大成人网| 亚洲一区二区三区四区五区中文 | 国产精品毛片久久久久久| 久久99久久久久| 日韩一卡二卡三卡| 青草国产精品久久久久久| 欧美一区二区黄| 蜜臀精品一区二区三区在线观看 | 国产aⅴ综合色| 国产欧美日韩不卡| 国产成a人亚洲精品| 国产欧美日韩精品在线| 成人黄色综合网站| 亚洲欧美偷拍另类a∨色屁股| 北岛玲一区二区三区四区| 国产精品国产三级国产专播品爱网| 成人动漫一区二区| 亚洲精品国产精华液| 欧美日本一区二区三区四区| 日本不卡1234视频| 精品久久久久久久久久久久包黑料 | 国产激情偷乱视频一区二区三区| 亚洲精品一区二区三区精华液| 国产一区91精品张津瑜| 国产精品成人免费精品自在线观看| av在线综合网| 亚洲国产日韩a在线播放性色| 欧美肥妇bbw| 国产精品系列在线观看| 亚洲人123区| 欧美精品1区2区3区| 韩国在线一区二区| 亚洲免费色视频| 日韩免费福利电影在线观看| 成人丝袜视频网| 婷婷国产在线综合| 国产欧美日韩三级| 69精品人人人人| 国产成人在线视频播放| 亚洲成av人**亚洲成av**| 欧美变态tickling挠脚心| 成人高清视频免费观看| 香蕉加勒比综合久久| 国产亚洲欧美在线| 欧美日韩一区在线观看| 成人午夜视频网站| 奇米精品一区二区三区在线观看一 | 从欧美一区二区三区| 日韩精品乱码免费| 国产精品久久夜| 日韩欧美中文字幕制服| 91蜜桃传媒精品久久久一区二区| 日本中文字幕一区二区视频| 18欧美乱大交hd1984| www欧美成人18+| 欧美午夜精品久久久| 成人午夜激情片| 国产美女一区二区三区| 日韩精品乱码免费| 一区二区三区国产豹纹内裤在线 | 色婷婷亚洲精品| 粉嫩av亚洲一区二区图片| 日本成人中文字幕在线视频| 亚洲视频网在线直播| 久久久久久夜精品精品免费| 7799精品视频| 精品视频一区二区三区免费| 91色乱码一区二区三区| 国产高清久久久| 蜜桃av一区二区三区电影| 亚洲一区二区三区中文字幕| 综合在线观看色| 亚洲国产成人自拍| 国产亚洲污的网站| 久久综合一区二区| 欧美成人午夜电影| 日韩欧美一区电影| 欧美一级高清大全免费观看| 欧美精品三级日韩久久| 精品视频在线视频| 欧美视频在线一区二区三区| 欧美亚洲动漫精品| 日本高清不卡在线观看| av一区二区三区| 一本大道久久a久久综合婷婷 | 蜜臀va亚洲va欧美va天堂 | 亚洲1区2区3区视频| 一区二区三区免费在线观看| 亚洲视频电影在线| 亚洲人成7777| 亚洲成va人在线观看| 日本欧洲一区二区| 国产一区二区三区视频在线播放| 日本亚洲免费观看| 黑人巨大精品欧美黑白配亚洲| 国产经典欧美精品| 不卡av在线免费观看| 在线亚洲免费视频| 欧美福利视频导航| 精品粉嫩aⅴ一区二区三区四区| 久久这里只有精品首页| 国产精品久99| 亚洲国产精品欧美一二99| 亚洲国产成人高清精品| 免费在线观看精品| 成人免费毛片app| 欧美亚洲国产一卡| 久久夜色精品国产噜噜av| 国产精品无遮挡| 亚洲国产日韩在线一区模特 | 国产一区在线视频| 成人激情av网| 51精品国自产在线| 国产婷婷精品av在线| 一区二区高清免费观看影视大全| 亚洲精品日韩一| 国模一区二区三区白浆| 91在线视频在线| 精品成人私密视频| 亚洲国产精品人人做人人爽| 国产一区二区免费在线| 欧美在线观看一二区| 久久免费视频色| 午夜久久福利影院| 99国产精品久久久久久久久久 | 久久97超碰国产精品超碰| 91视频观看免费| 久久青草欧美一区二区三区|