CD audio processing now performed on a dedicated thread.

Sound Blaster mixer now affect CD volume.
This commit is contained in:
TomW 2015-08-23 15:35:37 +01:00
commit 8b572111da
4 changed files with 143 additions and 38 deletions

View file

@ -11,12 +11,13 @@
#endif
#endif
#include "ibm.h"
#include "sound.h"
FILE *allog;
#ifdef USE_OPENAL
ALuint buffers[4]; // front and back buffers
ALuint source; // audio source
ALenum format; // internal format
ALuint buffers_cd[4]; // front and back buffers
static ALuint source[2]; // audio source
#endif
#define FREQ 48000
#define BUFLEN SOUNDBUFLEN
@ -90,35 +91,51 @@ void inital()
#ifdef USE_OPENAL
int c;
int16_t buf[BUFLEN*2];
format = AL_FORMAT_STEREO16;
// printf("1\n");
check();
// printf("2\n");
alGenBuffers(4, buffers);
check();
alGenBuffers(4, buffers_cd);
check();
// printf("3\n");
alGenSources(1, &source);
alGenSources(2, source);
check();
// printf("4\n");
alSource3f(source, AL_POSITION, 0.0, 0.0, 0.0);
alSource3f(source, AL_VELOCITY, 0.0, 0.0, 0.0);
alSource3f(source, AL_DIRECTION, 0.0, 0.0, 0.0);
alSourcef (source, AL_ROLLOFF_FACTOR, 0.0 );
alSourcei (source, AL_SOURCE_RELATIVE, AL_TRUE );
alSource3f(source[0], AL_POSITION, 0.0, 0.0, 0.0);
alSource3f(source[0], AL_VELOCITY, 0.0, 0.0, 0.0);
alSource3f(source[0], AL_DIRECTION, 0.0, 0.0, 0.0);
alSourcef (source[0], AL_ROLLOFF_FACTOR, 0.0 );
alSourcei (source[0], AL_SOURCE_RELATIVE, AL_TRUE );
check();
alSource3f(source[1], AL_POSITION, 0.0, 0.0, 0.0);
alSource3f(source[1], AL_VELOCITY, 0.0, 0.0, 0.0);
alSource3f(source[1], AL_DIRECTION, 0.0, 0.0, 0.0);
alSourcef (source[1], AL_ROLLOFF_FACTOR, 0.0 );
alSourcei (source[1], AL_SOURCE_RELATIVE, AL_TRUE );
check();
memset(buf,0,BUFLEN*4);
// printf("5\n");
for (c=0;c<4;c++)
alBufferData(buffers[c], AL_FORMAT_STEREO16, buf, BUFLEN*2*2, FREQ);
alSourceQueueBuffers(source, 4, buffers);
for (c = 0; c < 4; c++)
{
alBufferData(buffers[c], AL_FORMAT_STEREO16, buf, BUFLEN*2*2, FREQ);
alBufferData(buffers_cd[c], AL_FORMAT_STEREO16, buf, CD_BUFLEN*2*2, CD_FREQ);
}
alSourceQueueBuffers(source[0], 4, buffers);
check();
alSourceQueueBuffers(source[1], 4, buffers_cd);
check();
// printf("6 %08X\n",source);
alSourcePlay(source);
alSourcePlay(source[0]);
check();
alSourcePlay(source[1]);
check();
// printf("InitAL!!! %08X\n",source);
#endif
@ -137,17 +154,17 @@ void givealbuffer(int16_t *buf)
// printf("GiveALBuffer %08X\n",source);
alGetSourcei(source, AL_SOURCE_STATE, &state);
alGetSourcei(source[0], AL_SOURCE_STATE, &state);
check();
if (state==0x1014)
{
alSourcePlay(source);
alSourcePlay(source[0]);
// printf("Resetting sound\n");
}
// printf("State - %i %08X\n",state,state);
alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);
alGetSourcei(source[0], AL_BUFFERS_PROCESSED, &processed);
// printf("P ");
check();
@ -157,7 +174,7 @@ void givealbuffer(int16_t *buf)
{
ALuint buffer;
alSourceUnqueueBuffers(source, 1, &buffer);
alSourceUnqueueBuffers(source[0], 1, &buffer);
// printf("U ");
check();
@ -166,7 +183,62 @@ void givealbuffer(int16_t *buf)
// printf("B ");
check();
alSourceQueueBuffers(source, 1, &buffer);
alSourceQueueBuffers(source[0], 1, &buffer);
// printf("Q ");
check();
// printf("\n");
// if (!allog) allog=fopen("al.pcm","wb");
// fwrite(buf,BUFLEN*2,1,allog);
}
// printf("\n");
#endif
}
void givealbuffer_cd(int16_t *buf)
{
#ifdef USE_OPENAL
int processed;
int state;
//return;
// printf("Start\n");
check();
// printf("GiveALBuffer %08X\n",source);
alGetSourcei(source[1], AL_SOURCE_STATE, &state);
check();
if (state==0x1014)
{
alSourcePlay(source[1]);
// printf("Resetting sound\n");
}
// printf("State - %i %08X\n",state,state);
alGetSourcei(source[1], AL_BUFFERS_PROCESSED, &processed);
// printf("P ");
check();
// printf("Processed - %i\n",processed);
if (processed>=1)
{
ALuint buffer;
alSourceUnqueueBuffers(source[1], 1, &buffer);
// printf("U ");
check();
// for (c=0;c<BUFLEN*2;c++) buf[c]^=0x8000;
alBufferData(buffer, AL_FORMAT_STEREO16, buf, CD_BUFLEN*2*2, CD_FREQ);
// printf("B ");
check();
alSourceQueueBuffers(source[1], 1, &buffer);
// printf("Q ");
check();