Initial patch for in-game VoIP support!
This commit is contained in:
parent
0ee3960225
commit
12326a9eac
19 changed files with 1185 additions and 127 deletions
|
@ -90,8 +90,8 @@ cvar_t *s_mixPreStep;
|
|||
static loopSound_t loopSounds[MAX_GENTITIES];
|
||||
static channel_t *freelist = NULL;
|
||||
|
||||
int s_rawend;
|
||||
portable_samplepair_t s_rawsamples[MAX_RAW_SAMPLES];
|
||||
int s_rawend[MAX_RAW_STREAMS];
|
||||
portable_samplepair_t s_rawsamples[MAX_RAW_STREAMS][MAX_RAW_SAMPLES];
|
||||
|
||||
|
||||
// ====================================================================
|
||||
|
@ -120,6 +120,42 @@ void S_Base_SoundInfo(void) {
|
|||
Com_Printf("----------------------\n" );
|
||||
}
|
||||
|
||||
|
||||
#if USE_VOIP
|
||||
static
|
||||
void S_Base_StartCapture( void )
|
||||
{
|
||||
// !!! FIXME: write me.
|
||||
}
|
||||
|
||||
static
|
||||
int S_Base_AvailableCaptureSamples( void )
|
||||
{
|
||||
// !!! FIXME: write me.
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
void S_Base_Capture( int samples, byte *data )
|
||||
{
|
||||
// !!! FIXME: write me.
|
||||
}
|
||||
|
||||
static
|
||||
void S_Base_StopCapture( void )
|
||||
{
|
||||
// !!! FIXME: write me.
|
||||
}
|
||||
|
||||
static
|
||||
void S_Base_MasterGain( float val )
|
||||
{
|
||||
// !!! FIXME: write me.
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
S_Base_SoundList
|
||||
|
@ -608,7 +644,7 @@ void S_Base_ClearSoundBuffer( void ) {
|
|||
|
||||
S_ChannelSetup();
|
||||
|
||||
s_rawend = 0;
|
||||
Com_Memset(s_rawend, '\0', sizeof (s_rawend));
|
||||
|
||||
if (dma.samplebits == 8)
|
||||
clear = 0x80;
|
||||
|
@ -879,10 +915,6 @@ void S_ByteSwapRawSamples( int samples, int width, int s_channels, const byte *d
|
|||
}
|
||||
}
|
||||
|
||||
portable_samplepair_t *S_GetRawSamplePointer( void ) {
|
||||
return s_rawsamples;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
S_RawSamples
|
||||
|
@ -890,36 +922,42 @@ S_RawSamples
|
|||
Music streaming
|
||||
============
|
||||
*/
|
||||
void S_Base_RawSamples( int samples, int rate, int width, int s_channels, const byte *data, float volume ) {
|
||||
void S_Base_RawSamples( int stream, int samples, int rate, int width, int s_channels, const byte *data, float volume ) {
|
||||
int i;
|
||||
int src, dst;
|
||||
float scale;
|
||||
int intVolume;
|
||||
portable_samplepair_t *rawsamples;
|
||||
|
||||
if ( !s_soundStarted || s_soundMuted ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (stream < 0) || (stream >= MAX_RAW_STREAMS) ) {
|
||||
return;
|
||||
}
|
||||
rawsamples = s_rawsamples[stream];
|
||||
|
||||
intVolume = 256 * volume;
|
||||
|
||||
if ( s_rawend < s_soundtime ) {
|
||||
Com_DPrintf( "S_RawSamples: resetting minimum: %i < %i\n", s_rawend, s_soundtime );
|
||||
s_rawend = s_soundtime;
|
||||
if ( s_rawend[stream] < s_soundtime ) {
|
||||
Com_DPrintf( "S_RawSamples: resetting minimum: %i < %i\n", s_rawend[stream], s_soundtime );
|
||||
s_rawend[stream] = s_soundtime;
|
||||
}
|
||||
|
||||
scale = (float)rate / dma.speed;
|
||||
|
||||
//Com_Printf ("%i < %i < %i\n", s_soundtime, s_paintedtime, s_rawend);
|
||||
//Com_Printf ("%i < %i < %i\n", s_soundtime, s_paintedtime, s_rawend[stream]);
|
||||
if (s_channels == 2 && width == 2)
|
||||
{
|
||||
if (scale == 1.0)
|
||||
{ // optimized case
|
||||
for (i=0 ; i<samples ; i++)
|
||||
{
|
||||
dst = s_rawend&(MAX_RAW_SAMPLES-1);
|
||||
s_rawend++;
|
||||
s_rawsamples[dst].left = ((short *)data)[i*2] * intVolume;
|
||||
s_rawsamples[dst].right = ((short *)data)[i*2+1] * intVolume;
|
||||
dst = s_rawend[stream]&(MAX_RAW_SAMPLES-1);
|
||||
s_rawend[stream]++;
|
||||
rawsamples[dst].left = ((short *)data)[i*2] * intVolume;
|
||||
rawsamples[dst].right = ((short *)data)[i*2+1] * intVolume;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -929,10 +967,10 @@ void S_Base_RawSamples( int samples, int rate, int width, int s_channels, const
|
|||
src = i*scale;
|
||||
if (src >= samples)
|
||||
break;
|
||||
dst = s_rawend&(MAX_RAW_SAMPLES-1);
|
||||
s_rawend++;
|
||||
s_rawsamples[dst].left = ((short *)data)[src*2] * intVolume;
|
||||
s_rawsamples[dst].right = ((short *)data)[src*2+1] * intVolume;
|
||||
dst = s_rawend[stream]&(MAX_RAW_SAMPLES-1);
|
||||
s_rawend[stream]++;
|
||||
rawsamples[dst].left = ((short *)data)[src*2] * intVolume;
|
||||
rawsamples[dst].right = ((short *)data)[src*2+1] * intVolume;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -943,10 +981,10 @@ void S_Base_RawSamples( int samples, int rate, int width, int s_channels, const
|
|||
src = i*scale;
|
||||
if (src >= samples)
|
||||
break;
|
||||
dst = s_rawend&(MAX_RAW_SAMPLES-1);
|
||||
s_rawend++;
|
||||
s_rawsamples[dst].left = ((short *)data)[src] * intVolume;
|
||||
s_rawsamples[dst].right = ((short *)data)[src] * intVolume;
|
||||
dst = s_rawend[stream]&(MAX_RAW_SAMPLES-1);
|
||||
s_rawend[stream]++;
|
||||
rawsamples[dst].left = ((short *)data)[src] * intVolume;
|
||||
rawsamples[dst].right = ((short *)data)[src] * intVolume;
|
||||
}
|
||||
}
|
||||
else if (s_channels == 2 && width == 1)
|
||||
|
@ -958,10 +996,10 @@ void S_Base_RawSamples( int samples, int rate, int width, int s_channels, const
|
|||
src = i*scale;
|
||||
if (src >= samples)
|
||||
break;
|
||||
dst = s_rawend&(MAX_RAW_SAMPLES-1);
|
||||
s_rawend++;
|
||||
s_rawsamples[dst].left = ((char *)data)[src*2] * intVolume;
|
||||
s_rawsamples[dst].right = ((char *)data)[src*2+1] * intVolume;
|
||||
dst = s_rawend[stream]&(MAX_RAW_SAMPLES-1);
|
||||
s_rawend[stream]++;
|
||||
rawsamples[dst].left = ((char *)data)[src*2] * intVolume;
|
||||
rawsamples[dst].right = ((char *)data)[src*2+1] * intVolume;
|
||||
}
|
||||
}
|
||||
else if (s_channels == 1 && width == 1)
|
||||
|
@ -973,15 +1011,15 @@ void S_Base_RawSamples( int samples, int rate, int width, int s_channels, const
|
|||
src = i*scale;
|
||||
if (src >= samples)
|
||||
break;
|
||||
dst = s_rawend&(MAX_RAW_SAMPLES-1);
|
||||
s_rawend++;
|
||||
s_rawsamples[dst].left = (((byte *)data)[src]-128) * intVolume;
|
||||
s_rawsamples[dst].right = (((byte *)data)[src]-128) * intVolume;
|
||||
dst = s_rawend[stream]&(MAX_RAW_SAMPLES-1);
|
||||
s_rawend[stream]++;
|
||||
rawsamples[dst].left = (((byte *)data)[src]-128) * intVolume;
|
||||
rawsamples[dst].right = (((byte *)data)[src]-128) * intVolume;
|
||||
}
|
||||
}
|
||||
|
||||
if ( s_rawend > s_soundtime + MAX_RAW_SAMPLES ) {
|
||||
Com_DPrintf( "S_RawSamples: overflowed %i > %i\n", s_rawend, s_soundtime );
|
||||
if ( s_rawend[stream] > s_soundtime + MAX_RAW_SAMPLES ) {
|
||||
Com_DPrintf( "S_RawSamples: overflowed %i > %i\n", s_rawend[stream], s_soundtime );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1258,7 +1296,7 @@ void S_Base_StopBackgroundTrack( void ) {
|
|||
return;
|
||||
S_CodecCloseStream(s_backgroundStream);
|
||||
s_backgroundStream = NULL;
|
||||
s_rawend = 0;
|
||||
s_rawend[0] = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1331,12 +1369,12 @@ void S_UpdateBackgroundTrack( void ) {
|
|||
}
|
||||
|
||||
// see how many samples should be copied into the raw buffer
|
||||
if ( s_rawend < s_soundtime ) {
|
||||
s_rawend = s_soundtime;
|
||||
if ( s_rawend[0] < s_soundtime ) {
|
||||
s_rawend[0] = s_soundtime;
|
||||
}
|
||||
|
||||
while ( s_rawend < s_soundtime + MAX_RAW_SAMPLES ) {
|
||||
bufferSamples = MAX_RAW_SAMPLES - (s_rawend - s_soundtime);
|
||||
while ( s_rawend[0] < s_soundtime + MAX_RAW_SAMPLES ) {
|
||||
bufferSamples = MAX_RAW_SAMPLES - (s_rawend[0] - s_soundtime);
|
||||
|
||||
// decide how much data needs to be read from the file
|
||||
fileSamples = bufferSamples * s_backgroundStream->info.rate / dma.speed;
|
||||
|
@ -1359,7 +1397,7 @@ void S_UpdateBackgroundTrack( void ) {
|
|||
if(r > 0)
|
||||
{
|
||||
// add to raw buffer
|
||||
S_Base_RawSamples( fileSamples, s_backgroundStream->info.rate,
|
||||
S_Base_RawSamples( 0, fileSamples, s_backgroundStream->info.rate,
|
||||
s_backgroundStream->info.width, s_backgroundStream->info.channels, raw, musicVolume );
|
||||
}
|
||||
else
|
||||
|
@ -1492,5 +1530,13 @@ qboolean S_Base_Init( soundInterface_t *si ) {
|
|||
si->SoundInfo = S_Base_SoundInfo;
|
||||
si->SoundList = S_Base_SoundList;
|
||||
|
||||
#if USE_VOIP
|
||||
si->StartCapture = S_Base_StartCapture;
|
||||
si->AvailableCaptureSamples = S_Base_AvailableCaptureSamples;
|
||||
si->Capture = S_Base_Capture;
|
||||
si->StopCapture = S_Base_StopCapture;
|
||||
si->MasterGain = S_Base_MasterGain;
|
||||
#endif
|
||||
|
||||
return qtrue;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue