📄 sounds.c
字号:
//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2003 - 3D Realms Entertainment
This file is part of Duke Nukem 3D version 1.5 - Atomic EditionDuke Nukem 3D is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Original Source: 1996 - Todd Replogle
Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include "types.h"
#include "sndcards.h"
#include "fx_man.h"
#include "music.h"
#include "util_lib.h"
#include "duke3d.h"
#define LOUDESTVOLUME 150
long backflag,numenvsnds;
/*
===================
=
= SoundStartup
=
===================
*/
void SoundStartup( void )
{
int32 status;
// if they chose None lets return
if (FXDevice == NumSoundCards) return;
// Do special Sound Blaster, AWE32 stuff
if (
( FXDevice == SoundBlaster ) ||
( FXDevice == Awe32 )
)
{
int MaxVoices;
int MaxBits;
int MaxChannels;
status = FX_SetupSoundBlaster
(
BlasterConfig, (int *)&MaxVoices, (int *)&MaxBits, (int *)&MaxChannels
);
}
else
{
status = FX_Ok;
}
if ( status == FX_Ok )
{
if ( eightytwofifty && numplayers > 1)
{
status = FX_Init( FXDevice, min( NumVoices,4 ), 1, 8, 8000 );
}
else
{
status = FX_Init( FXDevice, NumVoices, NumChannels, NumBits, MixRate );
}
if ( status == FX_Ok )
{
FX_SetVolume( FXVolume );
if (ReverseStereo == 1)
{
FX_SetReverseStereo(!FX_GetReverseStereo());
}
}
}
if ( status != FX_Ok )
{
Error( FX_ErrorString( FX_Error ));
}
status = FX_SetCallBack( TestCallBack );
if ( status != FX_Ok )
{
Error( FX_ErrorString( FX_Error ));
}
}
/*
===================
=
= SoundShutdown
=
===================
*/
void SoundShutdown( void )
{
int32 status;
// if they chose None lets return
if (FXDevice == NumSoundCards)
return;
status = FX_Shutdown();
if ( status != FX_Ok )
{
Error( FX_ErrorString( FX_Error ));
}
}
/*
===================
=
= MusicStartup
=
===================
*/
void MusicStartup( void )
{
int32 status;
// if they chose None lets return
if ((MusicDevice == NumSoundCards) || (eightytwofifty && numplayers > 1) )
return;
// satisfy AWE32 and WAVEBLASTER stuff
BlasterConfig.Midi = MidiPort;
// Do special Sound Blaster, AWE32 stuff
if (
( FXDevice == SoundBlaster ) ||
( FXDevice == Awe32 )
)
{
int MaxVoices;
int MaxBits;
int MaxChannels;
FX_SetupSoundBlaster
(
BlasterConfig, (int *)&MaxVoices, (int *)&MaxBits, (int *)&MaxChannels
);
}
status = MUSIC_Init( MusicDevice, MidiPort );
if ( status == MUSIC_Ok )
{
MUSIC_SetVolume( MusicVolume );
}
else
{
puts("Couldn't find selected sound card, or, error w/ sound card itself.");
SoundShutdown();
uninittimer();
uninitengine();
CONTROL_Shutdown();
CONFIG_WriteSetup();
KB_Shutdown();
uninitgroupfile();
unlink("duke3d.tmp");
exit(-1);
}
}
/*
===================
=
= MusicShutdown
=
===================
*/
void MusicShutdown( void )
{
int32 status;
// if they chose None lets return
if ((MusicDevice == NumSoundCards) || (eightytwofifty && numplayers > 1) )
return;
status = MUSIC_Shutdown();
if ( status != MUSIC_Ok )
{
Error( MUSIC_ErrorString( MUSIC_ErrorCode ));
}
}
int USRHOOKS_GetMem(char **ptr, unsigned long size )
{
*ptr = malloc(size);
if (*ptr == NULL)
return(USRHOOKS_Error);
return( USRHOOKS_Ok);
}
int USRHOOKS_FreeMem(char *ptr)
{
free(ptr);
return( USRHOOKS_Ok);
}
char menunum=0;
void intomenusounds(void)
{
short i;
short menusnds[] =
{
LASERTRIP_EXPLODE,
DUKE_GRUNT,
DUKE_LAND_HURT,
CHAINGUN_FIRE,
SQUISHED,
KICK_HIT,
PISTOL_RICOCHET,
PISTOL_BODYHIT,
PISTOL_FIRE,
SHOTGUN_FIRE,
BOS1_WALK,
RPG_EXPLODE,
PIPEBOMB_BOUNCE,
PIPEBOMB_EXPLODE,
NITEVISION_ONOFF,
RPG_SHOOT,
SELECT_WEAPON
};
sound(menusnds[menunum++]);
menunum %= 17;
}
void playmusic(char *fn)
{
short fp;
long l;
if(MusicToggle == 0) return;
if(MusicDevice == NumSoundCards) return;
if(eightytwofifty && numplayers > 1) return;
fp = kopen4load(fn,0);
if(fp == -1) return;
l = kfilelength( fp );
if(l >= 72000)
{
kclose(fp);
return;
}
kread( fp, MusicPtr, l);
kclose( fp );
MUSIC_PlaySong( MusicPtr, MUSIC_LoopSong );
}
char loadsound(unsigned short num)
{
long fp, l;
if(num >= NUM_SOUNDS || SoundToggle == 0) return 0;
if (FXDevice == NumSoundCards) return 0;
fp = kopen4load(sounds[num],loadfromgrouponly);
if(fp == -1)
{
sprintf(&fta_quotes[113][0],"Sound %s(#%ld) not found.",sounds[num],num);
FTA(113,&ps[myconnectindex]);
return 0;
}
l = kfilelength( fp );
soundsiz[num] = l;
Sound[num].lock = 200;
allocache((long *)&Sound[num].ptr,l,&Sound[num].lock);
kread( fp, Sound[num].ptr , l);
kclose( fp );
return 1;
}
int xyzsound(short num,short i,long x,long y,long z)
{
long sndist, cx, cy, cz, j,k;
short pitche,pitchs,cs;
int voice, sndang, ca, pitch;
// if(num != 358) return 0;
if( num >= NUM_SOUNDS ||
FXDevice == NumSoundCards ||
( (soundm[num]&8) && ud.lockout ) ||
SoundToggle == 0 ||
Sound[num].num > 3 ||
FX_VoiceAvailable(soundpr[num]) == 0 ||
(ps[myconnectindex].timebeforeexit > 0 && ps[myconnectindex].timebeforeexit <= 26*3) ||
ps[myconnectindex].gm&MODE_MENU) return -1;
if( soundm[num]&128 )
{
sound(num);
return 0;
}
if( soundm[num]&4 )
{
if(VoiceToggle==0 || (ud.multimode > 1 && PN == APLAYER && sprite[i].yvel != screenpeek && ud.coop != 1) ) return -1;
for(j=0;j<NUM_SOUNDS;j++)
for(k=0;k<Sound[j].num;k++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -