summaryrefslogtreecommitdiff
path: root/src/openal.c
diff options
context:
space:
mode:
authorSteven Fuller <relnev@icculus.org>2001-12-08 00:27:43 +0000
committerPatryk Obara <dreamer.tan@gmail.com>2019-08-20 02:22:37 +0200
commitaff53cc9ba16638575e0c7f49b705bda2d73c2df (patch)
tree14898292ea7e5349ed1b8df1044121dc38a71c3c /src/openal.c
parentaa61006034cea1c70250356ecb9ed240ff754b1f (diff)
Disable sound, not crash, when OpenAL init fails.
Diffstat (limited to 'src/openal.c')
-rw-r--r--src/openal.c63
1 files changed, 57 insertions, 6 deletions
diff --git a/src/openal.c b/src/openal.c
index dea3f83..5dfd931 100644
--- a/src/openal.c
+++ b/src/openal.c
@@ -31,6 +31,8 @@ ALCdevice *AvpSoundDevice;
ALvoid *AvpSoundContext;
int AvpFrequency = 44100;
+static int SoundActivated = 0;
+
/*
openal.c TODO:
1. AL_PITCH code does not work.
@@ -40,6 +42,7 @@ openal.c TODO:
4. Restarting sound system may or may not work.
5. Doppler (if it was originally used) isn't currently used.
Probably also broken in OpenAL (see 1).
+6. Better Error Handling (device not avail, etc).
*/
int PlatStartSoundSys()
{
@@ -61,12 +64,18 @@ int PlatStartSoundSys()
attrlist[3] = AL_FALSE;
attrlist[4] = 0;
+ SoundActivated = 0;
+
snprintf(buf, sizeof(buf), "'( (sampling-rate %d ))\n", AvpFrequency);
AvpSoundDevice = alcOpenDevice(buf);
+ if (AvpSoundDevice == NULL)
+ return 0;
+
AvpSoundContext = alcCreateContext(AvpSoundDevice, attrlist);
-// AvpSoundDevice = alcOpenDevice(NULL);
-// AvpSoundContext = alcCreateContext(AvpSoundDevice, NULL);
+ if (AvpSoundContext == NULL) /* TODO: destroy sound device */
+ return 0;
+
alcMakeContextCurrent(AvpSoundContext);
alListenerfv(AL_POSITION, pos);
@@ -111,6 +120,8 @@ int PlatStartSoundSys()
alSourcef(p, AL_REFERENCE_DISTANCE, 1.0f);
}
+ SoundActivated = 1;
+
return 1;
}
@@ -367,6 +378,9 @@ int PlatPlaySound(int activeIndex)
{
int si;
+ if (!SoundActivated)
+ return 0;
+
if ((activeIndex < 0) || (activeIndex >= SOUND_MAXACTIVE))
return 0;
si = ActiveSounds[activeIndex].soundIndex;
@@ -434,6 +448,9 @@ void PlatStopSound(int activeIndex)
{
/* printf("PlatStopSound(%d)\n", activeIndex); */
+ if (!SoundActivated)
+ return 0;
+
// if (ActiveSounds[activeIndex].paused)
// alSourcePause (ActiveSounds[activeIndex].ds3DBufferP);
// else
@@ -467,6 +484,9 @@ static float vol_to_gain_table[] = {
int PlatChangeGlobalVolume(int volume)
{
+ if (!SoundActivated)
+ return 0;
+
alListenerf(AL_GAIN, vol_to_gain_table[volume]);
return 1;
@@ -474,6 +494,9 @@ int PlatChangeGlobalVolume(int volume)
int PlatChangeSoundVolume(int activeIndex, int volume)
{
+ if (!SoundActivated)
+ return 0;
+
alSourcef(ActiveSounds[activeIndex].ds3DBufferP,
AL_GAIN, vol_to_gain_table[volume]);
@@ -483,7 +506,10 @@ int PlatChangeSoundVolume(int activeIndex, int volume)
int PlatChangeSoundPitch(int activeIndex, int pitch)
{
float frequency;
-
+
+ if (!SoundActivated)
+ return 0;
+
if ((pitch < PITCH_MIN) || (pitch >= PITCH_MAX))
return 0;
@@ -508,6 +534,10 @@ int PlatSoundHasStopped(int activeIndex)
/*
printf("PlatSoundHasStopped(%d)\n", activeIndex);
*/
+
+ if (!SoundActivated)
+ return 0;
+
alGetSourceiv (ActiveSounds[activeIndex].ds3DBufferP,
AL_SOURCE_STATE, &val);
@@ -526,6 +556,9 @@ int PlatDo3dSound(int activeIndex)
VECTORCH relativePosn;
int newVolume;
+ if (!SoundActivated)
+ return 0;
+
if (ActiveSounds[activeIndex].threedee == 0)
return 1;
@@ -622,6 +655,9 @@ void PlatUpdatePlayer()
{
ALfloat vel[3], or[6], pos[3];
+ if (!SoundActivated)
+ return 0;
+
if (Global_VDB_Ptr) {
extern int NormalFrameTime;
extern int DopplerShiftIsOn;
@@ -672,7 +708,10 @@ void PlatUpdatePlayer()
void PlatEndGameSound(SOUNDINDEX index)
{
int i;
-
+
+ if (!SoundActivated)
+ return 0;
+
if((index<0)||(index>=SID_MAXIMUM)) return; /* no such sound */
for (i = 0; i < SOUND_MAXACTIVE; i++) {
@@ -712,7 +751,7 @@ void InitialiseBaseFrequency(SOUNDINDEX soundNum)
int frequency;
printf("FREQ InitialiseBaseFrequency(%d) [%d]\n", soundNum, GameSounds[soundNum].pitch==PITCH_DEFAULTPLAT);
-
+
if(GameSounds[soundNum].pitch>PITCH_MAXPLAT) GameSounds[soundNum].pitch=PITCH_MAXPLAT;
if(GameSounds[soundNum].pitch<PITCH_MINPLAT) GameSounds[soundNum].pitch=PITCH_MINPLAT;
@@ -739,8 +778,11 @@ void UpdateSoundFrequencies()
int i;
/* printf("FREQ UpdateSoundFreqncies()\n"); */
+
+ if (!SoundActivated)
+ return 0;
- if (!SoundSwitchedOn)
+ if (!SoundSwitchedOn) /* TODO: maybe I should have used this var.. */
return;
for (i = 0; i < SOUND_MAXACTIVE; i++) {
@@ -771,6 +813,10 @@ int LoadWavFile(int soundNum, char * wavFileName)
/*
printf("LoadWavFile(%d, %s) - sound\n", soundNum, wavFileName);
*/
+
+ if (!SoundActivated)
+ return 0;
+
alutLoadWAV (wavFileName, &data, &format, &size, &bits, &freq);
alGenBuffers (1, &(GameSounds[soundNum].dsBufferP));
alBufferData (GameSounds[soundNum].dsBufferP, format, data, size, freq);
@@ -808,6 +854,8 @@ unsigned char *ExtractWavFile(int soundIndex, unsigned char *bufferPtr)
int slen;
/* printf("ExtractWavFile(%d, %p)\n", soundIndex, bufferPtr); */
+ if (!SoundActivated)
+ return 0;
slen = strlen (bufferPtr) + 1;
GameSounds[soundIndex].wavName = (char *)AllocateMem (slen);
@@ -878,6 +926,9 @@ int LoadWavFromFastFile(int soundNum, char * wavFileName)
/* printf("LoadWavFromFastFile(%d, %s)\n", soundNum, wavFileName); */
+ if (!SoundActivated)
+ return 0;
+
if ((fp = ffopen (wavFileName, "rb")) != NULL) {
ffseek (fp, 0, SEEK_END);
len = fftell (fp);