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

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

?? sound.c

?? 著名物理引擎Hawk的源代碼
?? C
字號:
/* sound.c, HAWK game engine
*
* Copyright 1997-1998 by Phil Frisbie, Jr.
* for Hawk Software
*
*/

#include <windows.h>
#include <fcntl.h>
#include "wave.h"
#include "internal.h"
#include "sound.h"

LPDIRECTSOUND	lpDS = NULL;

#define MAX_STATIC_SOUNDS	32
#define MAX_TEMP_SOUNDS		8
#define MAX_SOUNDS	(MAX_STATIC_SOUNDS+MAX_TEMP_SOUNDS)
#define FOURCC_PAK      mmioFOURCC('P', 'A', 'K', ' ')

SNDWAVEFILE		sounds[MAX_STATIC_SOUNDS+MAX_TEMP_SOUNDS];

LRESULT (CALLBACK sndMMIOProc)(LPSTR lpmmioinfo, UINT uMsg,
							   LONG lParam1, LONG lParam2);

/* Sound functions */
int soundLoad(char *name)
{
	return(sndLoadWave(name, TRUE));
}

void playSoundi(int sound, float pan, float volume, BOOL looped)
{
	int s;

	s = sndPlay3D(sound, looped, NULL);
	pan = MAX(1.0f, pan);
	pan = MAX(-1.0f, pan);
	sndSetBalance(s, 10000 * pan);
	volume = MAX(1.0f, volume);
	volume = MIN(0.0f, volume);
	if(volume != 1.0f)
		sndSetVolume(s, (int)((1.0f - volume) * -10000));
}

void playSound3Di(int sound, OBJECT *obj, float volume, BOOL looped)
{
	int s;

	s = sndPlay3D(sound, looped, obj);
	volume = MAX(1.0f, volume);
	volume = MIN(0.0f, volume);
}

void playSound(char *name, float pan, float volume)
{
	int sound;

	sound = sndLoadWave(name, FALSE);
	if(!sound)
		return;
	playSoundi(sound, pan, volume, FALSE);
}

/* Helper function */

void    stripExtension (char *path)
{
	int             length;
	
	length = strlen(path)-1;
	while (length > 0 && path[length] != '.')
	{
		length--;
		if (path[length] == '/')
			return;		/* no extension */
	}
	if (length)
		path[length] = 0;
}


BOOL sndEnable(HWND	hwnd)
{
	DSBUFFERDESC		dsbd;
	HRESULT				dsrval;
	LPDIRECTSOUNDBUFFER primary;
	
	atexit(sndDisable);
	
	dsrval = DirectSoundCreate(NULL, &lpDS, NULL);
	if(dsrval != DS_OK)
	{
		MessageBox(NULL, "DirectSoundCreate FAILED", "Error", MB_OK);
		return FALSE;
	}
	
	dsrval = IDirectSound_SetCooperativeLevel(lpDS, hwnd, DSSCL_NORMAL);
	if(dsrval != DS_OK)
	{
        IDirectSound_Release(lpDS);
		MessageBox(NULL, "SetCooperativeLevel FAILED", "Error", MB_OK);
		return FALSE;
    }
	memset(&sounds, 0, sizeof(sounds[0]) * (MAX_STATIC_SOUNDS+MAX_TEMP_SOUNDS));
	
	/* start the primary sound buffer playing */
	memset(&dsbd, 0, sizeof(DSBUFFERDESC));
	dsbd.dwSize = sizeof(DSBUFFERDESC);
	dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER;
	dsrval = IDirectSound_CreateSoundBuffer(lpDS, &dsbd, &primary, NULL);
	if(dsrval != DS_OK)
	{
		MessageBox(NULL, "CreateSoundBuffer FAILED", "Error", MB_OK);
	}
	IDirectSoundBuffer_Play(primary, 0, 0, DSBPLAY_LOOPING);
	IDirectSoundBuffer_Release(primary);
	
	/* set up the custom MMIO function */
	if(!mmioInstallIOProc(FOURCC_PAK, sndMMIOProc, MMIO_INSTALLPROC));
	
	return TRUE;
}

void sndDisable(void)
{
	int		i;
	
	for(i=0;i<MAX_STATIC_SOUNDS+MAX_TEMP_SOUNDS;i++)
		sndUnload(i);
	if(lpDS != NULL)
	{
		IDirectSound_Release(lpDS);
	}
}

int sndLoadWave(char *name, BOOL is_static)
{
	SNDWAVEFILE		*sound = NULL;
	DSBUFFERDESC	dsbd;
	DWORD			*samples = NULL;
	HRESULT			dsrval;
	BYTE			*data = NULL;
	BYTE			*data2 = NULL;
	DWORD			length;
	DWORD			length2;
	int				i;
	
	if(is_static)
	{
		/* find a free static sound structure */
		for(i=0; i<MAX_STATIC_SOUNDS; i++)
		{
			if(!sounds[i].DSB)/* found one */
			{
				sound = &sounds[i];
				break;
			}
		}
		if(!sound)
			return -1;
	}
	else
	{
		/* find a free temp sound structure */
		for(i=MAX_STATIC_SOUNDS; i<MAX_SOUNDS; i++)
		{
			if(!sounds[i].DSB)/* found one */
			{
				sound = &sounds[i];
				break;
			}
		}
		if(!sound)
			return -1;
	}
	
	/* load the wave file */
	stripExtension(name);		/* remove the .wav extension */
	strcat(name, ".PAK+wav");	/* add our extension */
	if(WaveLoadFile(name, &sound->waveFile.size,
		samples, &sound->waveFile.wfxInfo,
		&sound->waveFile.data))
	{
		return -1;
	}
	
	/* create the sound buffer */
	memset(&dsbd, 0, sizeof(DSBUFFERDESC));
	dsbd.dwSize = sizeof(DSBUFFERDESC);
	dsbd.dwFlags = DSBCAPS_CTRLDEFAULT | DSBCAPS_STATIC;
	dsbd.dwBufferBytes = sound->waveFile.size;
	dsbd.lpwfxFormat = sound->waveFile.wfxInfo;
	
	dsrval = IDirectSound_CreateSoundBuffer(lpDS, &dsbd, &sound->DSB, NULL);
	if(dsrval != DS_OK)
	{
		MessageBox(NULL, "CreateSoundBuffer FAILED", "Error", MB_OK);
	}
	
	/* copy the sound bytes */
	dsrval = IDirectSoundBuffer_Lock(sound->DSB,
		0,
		sound->waveFile.size,
		&data,
		&length,
		&data2,
		&length2,
		0L);
	if(dsrval == DS_OK)
	{
		memcpy(data, sound->waveFile.data, length);
		if(length2)
			memcpy(data2, sound->waveFile.data+length, length2);
		GlobalFree(sound->waveFile.data);
		dsrval = IDirectSoundBuffer_Unlock(sound->DSB,
				data,
				length,
				data2,
				length2);
		if(dsrval != DS_OK)
		{
			/*			MessageBox(NULL, "Unlock FAILED", "Error", MB_OK); */
			return -1;
		}
	}
	else
	{
		/*		MessageBox(NULL, "Lock FAILED", "Error", MB_OK); */
		return -1;
	}
	
	IDirectSoundBuffer_GetFrequency(sound->DSB, &sound->freq);
	return i;
}

void sndUnload(int wave)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	
	if(wave < 0)
		return;
	if(sound->DSB)
	{
		IDirectSoundBuffer_Release(sound->DSB);
		memset(sound, 0, sizeof(SNDWAVEFILE));
	}
}

int sndCopy(int wave)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	SNDWAVEFILE		*newsound = NULL;
	HRESULT			dsrval;
	int				i;
	
	/* find a free temp sound structure */
	if(wave < 0)
		return -1;
	for(i=MAX_STATIC_SOUNDS; i<MAX_SOUNDS; i++)
	{
		if(!sounds[i].DSB)/* found one */
		{
			newsound = &sounds[i];
			break;
		}
	}
	if(!newsound)
		return -1;
	dsrval = IDirectSound_DuplicateSoundBuffer(lpDS,
					sound->DSB, &newsound->DSB);
	if(dsrval == DS_OK)
		return i;
	else
		return -1;
}

#define SND_FALL_OFF 1000

void sndUpdate3D(int wave, OBJECT *obj)
{
	OBJECT	*player = GLevel.view[0]->object;
	vec3_t	v, look;
	float	dist, vol, pan, temp;
	
	VectorSubtract(obj->origin, player->origin, v);
	dist = VectorLength(v);
	vol = 1.0f - dist / SND_FALL_OFF;
	vol = MAX(0.1f, vol);
	/* set the volume */
	if(vol == 0.1f)
	{
		sndSetVolume(wave, -10000);
		return;
	}
	else
		sndSetVolume(wave, (int)((1.0f - vol) * -10000));
	/* set the panning */
	/* find the amount left/right */
	v[Z] = 0.0f;
	VectorNormalize(v, v);
	VectorCopy(GLevel.view[0]->look, look);
	pan = 1.0f - DotProduct(v, look);
	/* find if left or right */
	temp = v[X]; v[X] = v[Y]; v[Y] = (-1.0f) * temp;
	if(DotProduct(v, look) > 0.0f)
	{
		sndSetBalance(wave, (int)(-10000 * pan));
	}
	else
	{
		sndSetBalance(wave, (int)(10000 * pan));
	}
}

int sndPlay3D(int wave, BOOL looped, OBJECT *obj)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	int				nwave;
	
	if(wave < 0)
		return wave;
	if(sndIsPlaying(wave))
	{
		if(sound->looped)
			return wave;			/* don't duplicate a looped sound */
		nwave = sndCopy(wave);
		if(nwave >=0)
		{
			sound = &sounds[nwave];
			IDirectSoundBuffer_Play(sound->DSB, 0, 0, 0);
			sound->looped = FALSE;	/* don't loop a temp sound buffer */
			sound->obj = obj;
		}
	}
	else
	{
		nwave = wave;
		if(looped)
		{
			IDirectSoundBuffer_Play(sound->DSB, 0, 0, DSBPLAY_LOOPING);
			sound->looped = TRUE;
		}
		else
		{
			IDirectSoundBuffer_Play(sound->DSB, 0, 0, 0);
			sound->looped = FALSE;
		}
		sound->obj = obj;
	}
	if(obj)
		sndUpdate3D(nwave, obj);
	
	return nwave;
}

void sndStop(int wave)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	
	if(wave < 0)
		return;
	IDirectSoundBuffer_Stop(sound->DSB);
}

BOOL sndIsPlaying(int wave)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	DWORD			status;
	
	if(wave < 0)
		return FALSE;
	IDirectSoundBuffer_GetStatus(sound->DSB, &status);
	return (status & DSBSTATUS_PLAYING);
}

int sndGetFrequency(int wave)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	
	if(wave < 0)
		return -1;
	return sound->freq;
}

int sndGetBalance(int wave)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	
	if(wave < 0)
		return 0;
	return sound->pan;
}

int sndGetVolume(int wave)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	
	if(wave < 0)
		return 0;
	return sound->vol;
}

BOOL sndGetLooping(int wave)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	
	if(wave < 0)
		return FALSE;
	return sound->looped;
}

void sndSetFrequency(int wave, int frequency)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	HRESULT			dsrval;
	
	if(wave < 0)
		return;
	dsrval = IDirectSoundBuffer_SetFrequency(sound->DSB, frequency);
	
	if(dsrval == DS_OK)
		sound->freq = frequency;
}

void sndSetBalance(int wave, int balance)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	HRESULT			dsrval;
	
	if(wave < 0)
		return;
	dsrval = IDirectSoundBuffer_SetPan(sound->DSB, balance);
	
	if(dsrval == DS_OK)
		sound->pan = balance;
}

void sndSetVolume(int wave, int volume)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	HRESULT			dsrval;
	
	if(wave < 0)
		return;
	dsrval = IDirectSoundBuffer_SetVolume(sound->DSB, volume);
	
	if(dsrval == DS_OK)
		sound->vol = volume;
}

void sndSetLooping(int wave, BOOL looping)
{
	SNDWAVEFILE		*sound = &sounds[wave];
	
	if(wave < 0)
		return;
	if(looping == sound->looped)
		return;
	if(looping)
	{
		IDirectSoundBuffer_Play(sound->DSB, 0, 0, DSBPLAY_LOOPING);
		sound->looped = TRUE;
	}
	else
	{
		IDirectSoundBuffer_Play(sound->DSB, 0, 0, 0);
		sound->looped = FALSE;
	}
}

void sndUpdate(void)
{
	/* delete temp sounds that are done playing */
	int				i;
	SNDWAVEFILE		*sound;
	
	for(i=MAX_STATIC_SOUNDS; i<MAX_SOUNDS; i++)
	{
		sound = &sounds[i];
		
		if(sound->DSB)
			if(!sndIsPlaying(i))
				sndUnload(i);
	}
	/* update 3D sounds */
	for(i=0; i<MAX_SOUNDS; i++)
	{
		sound = &sounds[i];
		
		if(sound->DSB && sndIsPlaying(i) && sound->obj)
			sndUpdate3D(i, sound->obj);
	}
}

/*
* Custom IO procedure for MMIO calls.
*
* Used to allow wave files to be accessed in PAK files.
*/

LRESULT (CALLBACK sndMMIOProc)(LPSTR lpmmioinfo, UINT uMsg,
							   LONG lParam1, LONG lParam2)
{
	char	*filename;
	int		f, count;
	MMIOINFO	*mmioinfo = (MMIOINFO *)lpmmioinfo;
	
	switch (uMsg)
	{
	case MMIOM_OPEN:
		filename = (char*)lParam1;
		stripExtension(filename);	/* remove the .wav extension */
		strcat(filename, ".wav");	/* add our extension */
		f = openFile(filename,O_RDONLY|O_BINARY);
		if(f >0)
		{
			mmioinfo->adwInfo[0] = f;
			seekFile(f, 0, SEEK_SET);
			return MMSYSERR_NOERROR;
		}
		else
		{
			return MMIOERR_CANNOTOPEN;
		}
		break;
	case MMIOM_CLOSE:
		f = mmioinfo->adwInfo[0];
		closeFile(f);
		return MMSYSERR_NOERROR;
		break;
	case MMIOM_READ:
		f = mmioinfo->adwInfo[0];
		count = readFile(f, (char *)lParam1, lParam2);
		if(count > 0)
			mmioinfo->lDiskOffset += count;
		return count;
		break;
	case MMIOM_SEEK:
		f = mmioinfo->adwInfo[0];
		count = seekFile(f, lParam1, lParam2);
		if(count > 0)
			mmioinfo->lDiskOffset += count;
		return count;
		break;
	default:
		return 0;
		break;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
丰满岳乱妇一区二区三区| www.视频一区| 亚洲欧美在线aaa| 欧美一区二区在线观看| 99精品在线免费| 国产主播一区二区| 视频一区视频二区在线观看| 欧美激情一区二区在线| 日韩精品一区二区三区在线 | 国产日韩综合av| 欧美日韩免费电影| 99视频一区二区三区| 国产在线麻豆精品观看| 五月婷婷欧美视频| 亚洲欧美日韩久久| 欧美激情在线一区二区| 欧美精品一区二区三区四区 | 色天使色偷偷av一区二区| 国产精品99久久久久久宅男| 免费在线成人网| 婷婷亚洲久悠悠色悠在线播放| 中文字幕亚洲在| 国产日韩欧美在线一区| 精品少妇一区二区| 制服丝袜av成人在线看| 欧美日韩一区不卡| 欧美丝袜丝交足nylons图片| 波多野结衣一区二区三区| 国产乱码精品一区二区三区av | 久草热8精品视频在线观看| 亚洲成人综合在线| 午夜欧美视频在线观看| 一区二区三区在线播放| 亚洲天天做日日做天天谢日日欢| 国产欧美日韩精品a在线观看| 久久女同精品一区二区| 337p日本欧洲亚洲大胆色噜噜| 欧美日韩免费不卡视频一区二区三区| 91久久精品一区二区二区| 91在线码无精品| 色久优优欧美色久优优| 欧美在线色视频| 欧美亚洲一区二区在线观看| 色哟哟亚洲精品| 在线视频国产一区| 欧美日韩色一区| 欧美一级黄色录像| 久久网站最新地址| 国产精品污www在线观看| 国产三级精品在线| 成人欧美一区二区三区| 亚洲男同性恋视频| 亚洲成av人影院| 日本女优在线视频一区二区| 久久99久久99| 成人丝袜视频网| 色妹子一区二区| 欧美视频你懂的| 欧美一区二区三区日韩视频| 日韩精品专区在线影院重磅| 久久蜜桃av一区精品变态类天堂| 中文字幕av一区 二区| 亚洲欧美成aⅴ人在线观看| 亚洲一区欧美一区| 捆绑调教美女网站视频一区| 国产美女av一区二区三区| 99久久精品国产毛片| 欧美日韩一级片网站| www国产亚洲精品久久麻豆| 国产精品入口麻豆九色| 一区二区三区四区精品在线视频| 日韩—二三区免费观看av| 国产毛片精品一区| 色网站国产精品| 日韩女优制服丝袜电影| 一区在线中文字幕| 日韩国产一区二| 成人激情视频网站| 欧美日韩国产高清一区二区三区| 精品久久免费看| 日韩一区在线播放| 日韩va欧美va亚洲va久久| 国产成人精品aa毛片| 在线成人小视频| 中文字幕乱码一区二区免费| 亚洲国产日韩在线一区模特| 国产麻豆精品theporn| 日本二三区不卡| 久久色中文字幕| 亚洲成人资源在线| 波多野结衣视频一区| 日韩亚洲欧美综合| 亚洲精选视频在线| 精品在线免费视频| 色屁屁一区二区| 国产免费久久精品| 青青草伊人久久| 色综合久久综合网欧美综合网| 2021国产精品久久精品| 亚洲一区二区三区中文字幕| 国产成人亚洲精品青草天美| 欧美人妇做爰xxxⅹ性高电影 | 亚洲综合一区二区| 国产91在线观看丝袜| 91精品国产日韩91久久久久久| 国产精品不卡在线| 国产剧情在线观看一区二区| 欧美绝品在线观看成人午夜影视| 中文字幕免费一区| 国内精品伊人久久久久影院对白| 欧美猛男男办公室激情| 亚洲欧美一区二区三区极速播放 | 欧美一区二区精品在线| 亚洲精品免费在线播放| 粉嫩蜜臀av国产精品网站| 精品成人a区在线观看| 蜜桃av一区二区| 欧美精品v国产精品v日韩精品| 亚洲免费观看高清在线观看| 粉嫩一区二区三区在线看| 国产三级欧美三级| 国产成人免费视频| 日本一区二区三区四区| 狠狠色综合色综合网络| 欧美videos大乳护士334| 男女视频一区二区| 91精品一区二区三区久久久久久| 亚洲一区二区三区四区在线| 色综合天天综合网天天看片| 国产精品福利影院| 99久久精品免费精品国产| 国产精品久久久久影院老司| 丁香六月综合激情| ...中文天堂在线一区| jlzzjlzz国产精品久久| 国产精品大尺度| 91啪亚洲精品| 一区二区三区欧美亚洲| 在线亚洲+欧美+日本专区| 亚洲一区国产视频| 91精品一区二区三区久久久久久| 午夜视黄欧洲亚洲| 日韩一区二区三区电影在线观看| 奇米四色…亚洲| 2024国产精品视频| 成人精品国产福利| 亚洲激情av在线| 欧美日韩国产首页在线观看| 亚洲福利一二三区| 日韩午夜在线播放| 国产精品自拍在线| 国产精品国产a级| 91在线视频免费观看| 一区二区三区精品在线| 在线播放中文字幕一区| 久久精品99国产精品日本| 亚洲精品一线二线三线| 成人h精品动漫一区二区三区| 最近中文字幕一区二区三区| 欧洲一区二区三区免费视频| 天天色 色综合| 国产三级久久久| 色呦呦日韩精品| 卡一卡二国产精品| 国产欧美一区二区在线观看| 91麻豆精品视频| 日本欧美在线看| 欧美激情一区二区三区蜜桃视频| 99国产精品久久久久久久久久| 亚洲成人手机在线| 久久久久久久久久久久久久久99| 成人三级在线视频| 五月综合激情婷婷六月色窝| 国产日韩精品久久久| 91福利国产精品| 久久国产精品99久久人人澡| 中文字幕一区在线观看视频| 欧美美女网站色| 成人深夜视频在线观看| 日本系列欧美系列| 国产精品乱人伦| 在线综合视频播放| 99国产精品国产精品毛片| 日韩国产在线一| 亚洲欧洲av在线| 精品国产一区二区三区av性色| av动漫一区二区| 久久黄色级2电影| 一区二区日韩av| 国产视频在线观看一区二区三区| 在线观看亚洲a| 成人h动漫精品| 久久草av在线| 亚洲妇熟xx妇色黄| 综合久久久久综合| 精品日本一线二线三线不卡| 欧美日韩国产免费| 色成年激情久久综合| 国产成人av电影| 免费观看一级特黄欧美大片|