mirror of
https://github.com/id-Software/DOOM-3-BFG.git
synced 2025-03-01 23:20:44 +00:00
OpenAL plays first scratchy sounds
This commit is contained in:
parent
038037e524
commit
00a459c61b
6 changed files with 156 additions and 11 deletions
|
@ -222,6 +222,7 @@ void idSoundHardware_OpenAL::Init()
|
||||||
common->Printf( "OpenAL vendor: %s\n", alGetString( AL_VENDOR ) );
|
common->Printf( "OpenAL vendor: %s\n", alGetString( AL_VENDOR ) );
|
||||||
common->Printf( "OpenAL renderer: %s\n", alGetString( AL_RENDERER ) );
|
common->Printf( "OpenAL renderer: %s\n", alGetString( AL_RENDERER ) );
|
||||||
common->Printf( "OpenAL version: %s\n", alGetString( AL_VERSION ) );
|
common->Printf( "OpenAL version: %s\n", alGetString( AL_VERSION ) );
|
||||||
|
common->Printf( "OpenAL extensions: %s\n", alGetString( AL_EXTENSIONS ) );
|
||||||
|
|
||||||
//pMasterVoice->SetVolume( DBtoLinear( s_volume_dB.GetFloat() ) );
|
//pMasterVoice->SetVolume( DBtoLinear( s_volume_dB.GetFloat() ) );
|
||||||
|
|
||||||
|
|
|
@ -73,14 +73,16 @@ idSoundVoice_OpenAL::idSoundVoice_OpenAL
|
||||||
========================
|
========================
|
||||||
*/
|
*/
|
||||||
idSoundVoice_OpenAL::idSoundVoice_OpenAL()
|
idSoundVoice_OpenAL::idSoundVoice_OpenAL()
|
||||||
: openalSource( 0 ),
|
:
|
||||||
leadinSample( NULL ),
|
triggered( false ),
|
||||||
loopingSample( NULL ),
|
openalSource( 0 ),
|
||||||
formatTag( 0 ),
|
leadinSample( NULL ),
|
||||||
numChannels( 0 ),
|
loopingSample( NULL ),
|
||||||
sampleRate( 0 ),
|
formatTag( 0 ),
|
||||||
paused( true ),
|
numChannels( 0 ),
|
||||||
hasVUMeter( false )
|
sampleRate( 0 ),
|
||||||
|
paused( true ),
|
||||||
|
hasVUMeter( false )
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -125,6 +127,8 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
triggered = true;
|
||||||
|
|
||||||
leadinSample = ( idSoundSample_OpenAL* )leadinSample_;
|
leadinSample = ( idSoundSample_OpenAL* )leadinSample_;
|
||||||
loopingSample = ( idSoundSample_OpenAL* )loopingSample_;
|
loopingSample = ( idSoundSample_OpenAL* )loopingSample_;
|
||||||
|
|
||||||
|
@ -152,6 +156,27 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo
|
||||||
|
|
||||||
alSourcef( openalSource, AL_ROLLOFF_FACTOR, 0.0f );
|
alSourcef( openalSource, AL_ROLLOFF_FACTOR, 0.0f );
|
||||||
|
|
||||||
|
// handle streaming sounds (decode on the fly) both single shot AND looping
|
||||||
|
//if( triggered )
|
||||||
|
{
|
||||||
|
alSourcei( openalSource, AL_BUFFER, 0 );
|
||||||
|
alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] );
|
||||||
|
lastopenalStreamingBuffer[0] = openalStreamingBuffer[0];
|
||||||
|
lastopenalStreamingBuffer[1] = openalStreamingBuffer[1];
|
||||||
|
lastopenalStreamingBuffer[2] = openalStreamingBuffer[2];
|
||||||
|
|
||||||
|
alGenBuffers( 3, &openalStreamingBuffer[0] );
|
||||||
|
/*
|
||||||
|
if( soundSystemLocal.alEAXSetBufferMode )
|
||||||
|
{
|
||||||
|
soundSystemLocal.alEAXSetBufferMode( 3, &chan->openalStreamingBuffer[0], alGetEnumValue( ID_ALCHAR "AL_STORAGE_ACCESSIBLE" ) );
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
openalStreamingBuffer[0];
|
||||||
|
openalStreamingBuffer[1];
|
||||||
|
openalStreamingBuffer[2];
|
||||||
|
}
|
||||||
|
|
||||||
if( s_debugHardware.GetBool() )
|
if( s_debugHardware.GetBool() )
|
||||||
{
|
{
|
||||||
if( loopingSample == NULL || loopingSample == leadinSample )
|
if( loopingSample == NULL || loopingSample == leadinSample )
|
||||||
|
@ -173,7 +198,9 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo
|
||||||
alSource3f( openalSource, AL_POSITION, 0.0f, 0.0f, 0.0f );
|
alSource3f( openalSource, AL_POSITION, 0.0f, 0.0f, 0.0f );
|
||||||
|
|
||||||
// RB: FIXME 0.0f ?
|
// RB: FIXME 0.0f ?
|
||||||
alSourcef( openalSource, AL_GAIN, 1.0f );
|
alSourcef( openalSource, AL_GAIN, 0.0f );
|
||||||
|
|
||||||
|
//OnBufferStart( leadinSample, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -331,6 +358,73 @@ int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferN
|
||||||
bufferContext->bufferNumber = bufferNumber;
|
bufferContext->bufferNumber = bufferNumber;
|
||||||
|
|
||||||
// TODO openal stream
|
// TODO openal stream
|
||||||
|
|
||||||
|
ALint finishedbuffers;
|
||||||
|
|
||||||
|
if( !triggered )
|
||||||
|
{
|
||||||
|
alGetSourcei( openalSource, AL_BUFFERS_PROCESSED, &finishedbuffers );
|
||||||
|
alSourceUnqueueBuffers( openalSource, finishedbuffers, &openalStreamingBuffer[0] );
|
||||||
|
if( finishedbuffers == 3 )
|
||||||
|
{
|
||||||
|
triggered = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
finishedbuffers = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALenum format;
|
||||||
|
|
||||||
|
if( sample->format.basic.formatTag == idWaveFile::FORMAT_PCM )
|
||||||
|
{
|
||||||
|
format = sample->NumChannels() == 1 ? AL_FORMAT_MONO_IMA4 : AL_FORMAT_STEREO_IMA4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int j = 0; j < finishedbuffers && j < 1; j++ )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
chan->GatherChannelSamples( chan->openalStreamingOffset * sample->objectInfo.nChannels, MIXBUFFER_SAMPLES * sample->objectInfo.nChannels, alignedInputSamples );
|
||||||
|
for( int i = 0; i < ( MIXBUFFER_SAMPLES * sample->objectInfo.nChannels ); i++ )
|
||||||
|
{
|
||||||
|
if( alignedInputSamples[i] < -32768.0f )
|
||||||
|
( ( short* )alignedInputSamples )[i] = -32768;
|
||||||
|
else if( alignedInputSamples[i] > 32767.0f )
|
||||||
|
( ( short* )alignedInputSamples )[i] = 32767;
|
||||||
|
else
|
||||||
|
( ( short* )alignedInputSamples )[i] = idMath::FtoiFast( alignedInputSamples[i] );
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
//alBufferData( buffers[0], sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, sample->buffers[bufferNumber].buffer, sample->buffers[bufferNumber].bufferSize, sample->SampleRate() /*44100*/ );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
alBufferData( openalStreamingBuffer[j], format, sample->buffers[bufferNumber].buffer, sample->buffers[bufferNumber].bufferSize, sample->SampleRate() /*44100*/ );
|
||||||
|
//openalStreamingOffset += MIXBUFFER_SAMPLES;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( finishedbuffers > 0 )
|
||||||
|
{
|
||||||
|
//alSourceQueueBuffers( openalSource, finishedbuffers, &buffers[0] );
|
||||||
|
alSourceQueueBuffers( openalSource, 1, &openalStreamingBuffer[0] );
|
||||||
|
|
||||||
|
if( bufferNumber == 0 )
|
||||||
|
{
|
||||||
|
alSourcePlay( openalSource );
|
||||||
|
triggered = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sample->buffers[bufferNumber].bufferSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
// should never happen
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -502,6 +596,30 @@ void idSoundVoice_OpenAL::Stop()
|
||||||
alSourceStop( openalSource );
|
alSourceStop( openalSource );
|
||||||
alSourcei( openalSource, AL_BUFFER, 0 );
|
alSourcei( openalSource, AL_BUFFER, 0 );
|
||||||
|
|
||||||
|
if( openalStreamingBuffer[0] && openalStreamingBuffer[1] && openalStreamingBuffer[2] )
|
||||||
|
{
|
||||||
|
alGetError();
|
||||||
|
alDeleteBuffers( 3, &openalStreamingBuffer[0] );
|
||||||
|
if( alGetError() == AL_NO_ERROR )
|
||||||
|
{
|
||||||
|
openalStreamingBuffer[0] = openalStreamingBuffer[1] = openalStreamingBuffer[2] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( lastopenalStreamingBuffer[0] && lastopenalStreamingBuffer[1] && lastopenalStreamingBuffer[2] )
|
||||||
|
{
|
||||||
|
alGetError();
|
||||||
|
alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] );
|
||||||
|
if( alGetError() == AL_NO_ERROR )
|
||||||
|
{
|
||||||
|
lastopenalStreamingBuffer[0] = lastopenalStreamingBuffer[1] = lastopenalStreamingBuffer[2] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
openalStreamingOffset = 0;
|
||||||
|
//openalStreamingBuffer[0] = openalStreamingBuffer[1] = openalStreamingBuffer[2] = 0;
|
||||||
|
//lastopenalStreamingBuffer[0] = lastopenalStreamingBuffer[1] = lastopenalStreamingBuffer[2] = 0;
|
||||||
|
|
||||||
//pSourceVoice->Stop( 0, OPERATION_SET );
|
//pSourceVoice->Stop( 0, OPERATION_SET );
|
||||||
paused = true;
|
paused = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,20 @@ public:
|
||||||
idSoundVoice_OpenAL();
|
idSoundVoice_OpenAL();
|
||||||
~idSoundVoice_OpenAL();
|
~idSoundVoice_OpenAL();
|
||||||
|
|
||||||
|
void SetPosition( const idVec3& p )
|
||||||
|
{
|
||||||
|
idSoundVoice_Base::SetPosition( p );
|
||||||
|
|
||||||
|
alSource3f( openalSource, AL_POSITION, -p.y, p.z, -p.x );
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetGain( float gain )
|
||||||
|
{
|
||||||
|
idSoundVoice_Base::SetGain( gain );
|
||||||
|
|
||||||
|
alSourcef( openalSource, AL_GAIN, ( gain ) < ( 1.0f ) ? ( gain ) : ( 1.0f ) );
|
||||||
|
}
|
||||||
|
|
||||||
void Create( const idSoundSample* leadinSample, const idSoundSample* loopingSample );
|
void Create( const idSoundSample* leadinSample, const idSoundSample* loopingSample );
|
||||||
|
|
||||||
// Start playing at a particular point in the buffer. Does an Update() too
|
// Start playing at a particular point in the buffer. Does an Update() too
|
||||||
|
@ -95,7 +109,11 @@ private:
|
||||||
void SetSampleRate( uint32 newSampleRate, uint32 operationSet );
|
void SetSampleRate( uint32 newSampleRate, uint32 operationSet );
|
||||||
|
|
||||||
//IXAudio2SourceVoice* pSourceVoice;
|
//IXAudio2SourceVoice* pSourceVoice;
|
||||||
|
bool triggered;
|
||||||
ALuint openalSource;
|
ALuint openalSource;
|
||||||
|
ALuint openalStreamingOffset;
|
||||||
|
ALuint openalStreamingBuffer[3];
|
||||||
|
ALuint lastopenalStreamingBuffer[3];
|
||||||
|
|
||||||
idSoundSample_OpenAL* leadinSample;
|
idSoundSample_OpenAL* leadinSample;
|
||||||
idSoundSample_OpenAL* loopingSample;
|
idSoundSample_OpenAL* loopingSample;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
Doom 3 BFG Edition GPL Source Code
|
Doom 3 BFG Edition GPL Source Code
|
||||||
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
|
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
|
||||||
|
Copyright (C) 2013 Robert Beckebans
|
||||||
|
|
||||||
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
|
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
|
||||||
|
|
||||||
|
@ -43,14 +44,18 @@ public:
|
||||||
|
|
||||||
void CalculateSurround( int srcChannels, float pLevelMatrix[ MAX_CHANNELS_PER_VOICE* MAX_CHANNELS_PER_VOICE ], float scale );
|
void CalculateSurround( int srcChannels, float pLevelMatrix[ MAX_CHANNELS_PER_VOICE* MAX_CHANNELS_PER_VOICE ], float scale );
|
||||||
|
|
||||||
void SetPosition( const idVec3& p )
|
// RB begin
|
||||||
|
virtual void SetPosition( const idVec3& p )
|
||||||
{
|
{
|
||||||
position = p;
|
position = p;
|
||||||
}
|
}
|
||||||
void SetGain( float g )
|
|
||||||
|
virtual void SetGain( float g )
|
||||||
{
|
{
|
||||||
gain = g;
|
gain = g;
|
||||||
}
|
}
|
||||||
|
// RB end
|
||||||
|
|
||||||
void SetCenterChannel( float c )
|
void SetCenterChannel( float c )
|
||||||
{
|
{
|
||||||
centerChannel = c;
|
centerChannel = c;
|
||||||
|
|
|
@ -101,6 +101,7 @@ typedef enum
|
||||||
|
|
||||||
#include <AL/al.h>
|
#include <AL/al.h>
|
||||||
#include <AL/alc.h>
|
#include <AL/alc.h>
|
||||||
|
#include <AL/alext.h>
|
||||||
|
|
||||||
#include "OpenAL/AL_SoundSample.h"
|
#include "OpenAL/AL_SoundSample.h"
|
||||||
#include "OpenAL/AL_SoundVoice.h"
|
#include "OpenAL/AL_SoundVoice.h"
|
||||||
|
|
|
@ -372,8 +372,10 @@ void idSoundWorldLocal::Update()
|
||||||
const bool canMute = channel->CanMute();
|
const bool canMute = channel->CanMute();
|
||||||
if( canMute && channel->volumeDB <= DB_SILENCE )
|
if( canMute && channel->volumeDB <= DB_SILENCE )
|
||||||
{
|
{
|
||||||
|
#if !defined(USE_OPENAL)
|
||||||
channel->Mute();
|
channel->Mute();
|
||||||
continue;
|
continue;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the sort key.
|
// Calculate the sort key.
|
||||||
|
|
Loading…
Reference in a new issue