Group :: Games/Other
RPM: nogravity
Main Changelog Spec Patches Sources Download Gear Bugs and FR Repocop
Patch: nogravity--openal.patch
Download
Download
--- nogravity-2.00/rlx32/src/linux/snd_openal.c 2005-05-07 11:46:24.000000000 +0200
+++ nogravity-2.00.new/rlx32/src/linux/snd_openal.c 2007-12-30 20:39:36.000000000 +0100
@@ -184,7 +184,8 @@
}
if (lpDistanceF != NULL)
{
- for (channel = 0; channel < g_nchannels; channel ++)
+ // g_nchannels - 1, highest channel is reserver for music / streams
+ for (channel = 0; channel < (g_nchannels - 1); channel ++)
{
alSourcef(g_pchannels[channel].src, AL_REFERENCE_DISTANCE, (ALfloat)*lpDistanceF);
}
@@ -194,7 +195,8 @@
}
if (lpRolloffF != NULL)
{
- for (channel = 0; channel < g_nchannels; channel ++)
+ // g_nchannels - 1, highest channel is reserver for music / streams
+ for (channel = 0; channel < (g_nchannels - 1); channel ++)
{
alSourcef(g_pchannels[channel].src, AL_ROLLOFF_FACTOR, (ALfloat)*lpRolloffF);
}
@@ -233,7 +235,9 @@
static void ChannelSetSamplingRate(int channel, int sampleRate)
{
- alSourcef(g_pchannels[channel].src, AL_PITCH, 44100.0 / sampleRate);
+ float bufferSampleRate = g_pchannels[channel].sam?
+ g_pchannels[channel].sam->samplingRate : 44100.0;
+ alSourcef(g_pchannels[channel].src, AL_PITCH, bufferSampleRate / sampleRate);
}
static void ChannelSetParms(int channel, V3XVECTOR *pos, V3XVECTOR *velocity, V3XRANGE *fRange)
@@ -277,6 +281,8 @@
static void ChannelStop(int channel)
{
alSourceStop(g_pchannels[channel].src);
+ g_pchannels[channel].sam = NULL;
+ g_pchannels[channel].play = FALSE;
}
static int ChannelGetStatus(int channel)
@@ -293,7 +299,8 @@
static int ChannelGetFree(V3XA_HANDLE *sam)
{
int channel;
- for (channel = 0; channel < g_nchannels; channel ++)
+ // g_nchannels - 1, highest channel is reserver for music / streams
+ for (channel = 0; channel < (g_nchannels - 1); channel ++)
{
if ((!g_pchannels[channel].play) &&
(!g_pchannels[channel].stream))
@@ -301,7 +308,7 @@
break;
}
}
- if (channel >= g_nchannels)
+ if (channel >= (g_nchannels - 1))
{
channel = -1;
}
@@ -311,7 +318,8 @@
static void ChannelFlushAll(int mode)
{
int channel;
- for (channel = 0; channel < g_nchannels; channel ++)
+ // g_nchannels - 1, highest channel is reserver for music / streams
+ for (channel = 0; channel < (g_nchannels - 1); channel ++)
{
if (ChannelGetStatus(channel))
{
@@ -323,7 +331,8 @@
static void ChannelInvalidate(V3XA_HANDLE *sam)
{
int channel;
- for (channel = 0; channel < g_nchannels; channel ++)
+ // g_nchannels - 1, highest channel is reserver for music / streams
+ for (channel = 0; channel < (g_nchannels - 1); channel ++)
{
if ((g_pchannels[channel].sam == sam) &&
(ChannelGetStatus(channel)))
@@ -347,7 +356,7 @@
alSourceUnqueueBuffers(g_pchannels[g_pstreams[handle].chan].src, 1, &g_pstreams[handle].bufs[g_pstreams[handle].first]);
alDeleteBuffers(1, &g_pstreams[handle].bufs[g_pstreams[handle].first]);
g_pstreams[handle].first ++;
- if (g_pstreams[handle].first > g_nbufsperstream)
+ if (g_pstreams[handle].first >= g_nbufsperstream)
{
g_pstreams[handle].first = 0;
}
@@ -368,12 +377,11 @@
g_pstreams[stream].first = 0;
g_pstreams[stream].last = 0;
g_pchannels[g_pstreams[stream].chan].stream = TRUE;
- ChannelSetSamplingRate(g_pstreams[stream].chan, g_pstreams[stream].rate);
ChannelSetVolume(g_pstreams[stream].chan, 1.0);
ChannelSetPanning(g_pstreams[stream].chan, 0.0);
ChannelSetParms(g_pstreams[stream].chan, (V3XVECTOR *)&vector, (V3XVECTOR *)&vector, (V3XRANGE *)&range);
alSourcei(g_pchannels[g_pstreams[stream].chan].src, AL_LOOPING, AL_FALSE);
-
+ alSourcef(g_pchannels[g_pstreams[stream].chan].src, AL_PITCH, 1.0);
}
static V3XA_STREAM StreamInitialize(int sampleFormat, int sampleRate, size_t size)
@@ -389,19 +397,12 @@
}
if (stream < g_nstreams)
{
- channel = 31;
- if (channel != -1)
- {
+ channel = g_nchannels - 1;
g_pstreams[stream].chan = channel;
g_pstreams[stream].fmt = (sampleFormat & V3XA_FMTSTEREO) ? ((sampleFormat & V3XA_FMT16BIT) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16) : ((sampleFormat & V3XA_FMT16BIT) ? AL_FORMAT_STEREO8 : AL_FORMAT_MONO8);
g_pstreams[stream].rate = sampleRate;
StreamReset(stream);
- }
- else
- {
- stream = -1;
- }
}
else
{
@@ -442,16 +443,16 @@
g_pstreams[handle].pos += size;
alDeleteBuffers(1, &g_pstreams[handle].bufs[g_pstreams[handle].first]);
g_pstreams[handle].first ++;
- if (g_pstreams[handle].first > g_nbufsperstream)
+ if (g_pstreams[handle].first >= g_nbufsperstream)
{
g_pstreams[handle].first = 0;
}
processed --;
}
if (((g_pstreams[handle].last >= g_pstreams[handle].first) &&
- (g_pstreams[handle].last - g_pstreams[handle].first <= 20)) ||
+ (g_pstreams[handle].last - g_pstreams[handle].first <= 25)) ||
((g_pstreams[handle].last < g_pstreams[handle].first) &&
- (g_pstreams[handle].last + g_nbufsperstream - g_pstreams[handle].first <= 20)))
+ (g_pstreams[handle].last + g_nbufsperstream - g_pstreams[handle].first <= 25)))
{
ret_code = 0;
}
@@ -475,7 +477,7 @@
alBufferData(g_pstreams[handle].bufs[g_pstreams[handle].last], g_pstreams[handle].fmt, data, size, g_pstreams[handle].rate);
alSourceQueueBuffers(g_pchannels[g_pstreams[handle].chan].src, 1, &g_pstreams[handle].bufs[g_pstreams[handle].last]);
g_pstreams[handle].last ++;
- if (g_pstreams[handle].last > g_nbufsperstream)
+ if (g_pstreams[handle].last >= g_nbufsperstream)
{
g_pstreams[handle].last = 0;
}
--- nogravity-2.00/src/lt_sound.c 2005-06-17 21:59:34.000000000 +0200
+++ nogravity-2.00.new/src/lt_sound.c 2007-12-30 14:55:28.000000000 +0100
@@ -414,6 +414,7 @@
if (RLX.Audio.Config&RLXAUDIO_Use3D)
{
V3XA.Client->ChannelSetParms(playChannel, pos, speed, NULL);
+ V3XA.Client->ChannelSetVolume(playChannel, (float)g_SGSettings.VolFX / 100);
return 1;
}
else
@@ -444,7 +445,7 @@
{
V3XRANGE range = {1000.f, 100000.f};
info.smpHandle->sampleFormat|=V3XA_FMT3D;
- V3XA.Client->ChannelPlay(info.playChannel, 44100, 1, 0, info.smpHandle);
+ V3XA.Client->ChannelPlay(info.playChannel, 44100, (float)g_SGSettings.VolFX / 100, 0, info.smpHandle);
V3XA.Client->ChannelSetParms(info.playChannel, pos, speed, &range);
}
else