# Conflicts:
#	src/Makefile.mingw
#	src/SOUND/openal.c
This commit is contained in:
waltje
2017-06-19 01:08:47 -04:00
2 changed files with 163 additions and 130 deletions

View File

@@ -62,7 +62,7 @@ endif
#########################################################################
# Nothing should need changing from here on.. #
#########################################################################
VPATH = . cpu sound sound/resid-fp video lzf network network/slirp win
VPATH = . cpu sound sound/munt sound/munt/c_interface sound/munt/sha1 sound/munt/srchelper sound/resid-fp video lzf network network/slirp win
PLAT = win/
ifeq ($(X64), y)
CPP = g++.exe -m64
@@ -76,9 +76,17 @@ WINDRES = windres.exe
OPTS = -DWIN32 -I$(PLAT) $(EXTRAS) $(STUFF)
ifeq ($(X64), y)
DFLAGS =
ifeq ($(OPTIM), y)
DFLAGS = -march=native
else
DFLAGS =
endif
else
DFLAGS = -march=i686
ifeq ($(OPTIM), y)
DFLAGS = -march=native
else
DFLAGS = -march=i686
endif
endif
ifeq ($(DEBUG), y)
DFLAGS += -ggdb -DDEBUG
@@ -170,12 +178,19 @@ NETOBJ = network.o \
net_ne2000.o
SCSIOBJ = scsi.o scsi_disk.o scsi_buslogic.o scsi_aha154x.o
SNDOBJ = sound.o \
openal.o \
dbopl.o nukedopl.o \
convolve.o convolve-sse.o envelope.o extfilt.o \
filter.o pot.o sid.o voice.o wave6581__ST.o \
wave6581_P_T.o wave6581_PS_.o wave6581_PST.o \
wave8580__ST.o wave8580_P_T.o wave8580_PS_.o \
wave8580_PST.o wave.o \
dbopl.o nukedopl.o openal.o \
Analog.o BReverbModel.o File.o FileStream.o LA32Ramp.o \
LA32FloatWaveGenerator.o LA32WaveGenerator.o \
MidiStreamParser.o Part.o Partial.o PartialManager.o \
Poly.o ROMInfo.o Synth.o Tables.o TVA.o TVF.o TVP.o \
sha1.o c_interface.o \
midi.o midi_mt32.o midi_system.o \
snd_speaker.o snd_ps1.o snd_pssj.o \
snd_adlib.o snd_adlibgold.o snd_ad1848.o \
snd_sb.o snd_sb_dsp.o snd_cms.o snd_dbopl.o \
@@ -220,9 +235,11 @@ OBJ = $(MAINOBJ) $(CPUOBJ) $(SYSOBJ) $(DEVOBJ) $(USBOBJ) \
LZFOBJ = lzf_c.o lzf_d.o
LIBS = -lddraw -ldinput8 -ldxguid -ld3d9 -ld3dx9 -lopenal.dll \
-mwindows -lcomctl32 -lwinmm -lwsock32 -liphlpapi -lpsapi \
-static-libstdc++ -static -lstdc++ -static-libgcc -static -lgcc
LIBS = -mwindows \
-lopenal.dll \
-lddraw -ldinput8 -ldxguid -ld3d9 -ld3dx9 \
-lcomctl32 -lkernel32 -lwsock32 -lwinmm -liphlpapi -lpsapi \
-static -lstdc++ -lgcc
# Build rules.

View File

@@ -3,6 +3,10 @@
#include <string.h>
#include <stdlib.h>
#ifdef USE_OPENAL
# undef AL_API
# undef ALC_API
# define AL_LIBTYPE_STATIC
# define ALC_LIBTYPE_STATIC
# include <AL/al.h>
# include <AL/alc.h>
# include <AL/alext.h>
@@ -11,81 +15,117 @@
#include "sound.h"
FILE *allog;
#define FREQ 48000
#define BUFLEN SOUNDBUFLEN
#ifdef USE_OPENAL
ALuint buffers[4]; /* front and back buffers */
ALuint buffers_cd[4]; /* front and back buffers */
static ALuint source[2]; /* audio source */
ALuint buffers_midi[4]; /* front and back buffers */
static ALuint source[3]; /* audio source */
#endif
#define FREQ 48000
#define BUFLEN SOUNDBUFLEN
static int midi_freq = 44100;
static int midi_buf_size = 4410;
static int initialized = 0;
void al_set_midi(int freq, int buf_size)
{
midi_freq = freq;
midi_buf_size = buf_size;
}
void closeal(void);
ALvoid alutInit(ALint *argc,ALbyte **argv)
ALvoid alutInit(ALint *argc,ALbyte **argv)
{
ALCcontext *Context;
ALCdevice *Device;
ALCcontext *Context;
ALCdevice *Device;
/* Open device */
Device=alcOpenDevice((ALCchar *)"");
/* Open device */
Device = alcOpenDevice((ALCchar *)"");
if (Device != NULL) {
/* Create context(s) */
Context=alcCreateContext(Device,NULL);
/* Set active context */
alcMakeContextCurrent(Context);
/* Register extensions */
Context = alcCreateContext(Device, NULL);
if (Context != NULL) {
/* Set active context */
alcMakeContextCurrent(Context);
}
}
}
ALvoid alutExit(ALvoid)
ALvoid alutExit(ALvoid)
{
ALCcontext *Context;
ALCdevice *Device;
ALCcontext *Context;
ALCdevice *Device;
/* Unregister extensions */
/* Get active context */
Context=alcGetCurrentContext();
/* Get active context */
Context = alcGetCurrentContext();
if (Context != NULL) {
/* Get device for active context */
Device=alcGetContextsDevice(Context);
/* Disable context */
alcMakeContextCurrent(NULL);
Device = alcGetContextsDevice(Context);
if (Device != NULL) {
/* Disable context */
alcMakeContextCurrent(NULL);
/* Close device */
alcCloseDevice(Device);
}
/* Release context(s) */
alcDestroyContext(Context);
/* Close device */
alcCloseDevice(Device);
}
void initalmain(int argc, char *argv[])
{
#ifdef USE_OPENAL
alutInit(0,0);
atexit(closeal);
#endif
}
}
void closeal(void)
{
#ifdef USE_OPENAL
alutExit();
alutExit();
#endif
}
void initalmain(int argc, char *argv[])
{
if (!initialized) return;
#ifdef USE_OPENAL
alutInit(0,0);
atexit(closeal);
#endif
initialized = 0;
}
void inital(ALvoid)
{
if (initialized) return;
#ifdef USE_OPENAL
int c;
float buf[BUFLEN*2];
float *buf = NULL, *cd_buf = NULL, *midi_buf = NULL;
int16_t *buf_int16 = NULL, *cd_buf_int16 = NULL, *midi_buf_int16 = NULL;
float cd_buf[CD_BUFLEN*2];
int16_t buf_int16[BUFLEN*2];
int16_t cd_buf_int16[CD_BUFLEN*2];
if (sound_is_float)
{
buf = (float *) malloc((BUFLEN << 1) * sizeof(float));
cd_buf = (float *) malloc((CD_BUFLEN << 1) * sizeof(float));
midi_buf = (float *) malloc(midi_buf_size * sizeof(float));
}
else
{
buf_int16 = (int16_t *) malloc((BUFLEN << 1) * sizeof(int16_t));
cd_buf_int16 = (int16_t *) malloc((CD_BUFLEN << 1) * sizeof(int16_t));
midi_buf_int16 = (int16_t *) malloc(midi_buf_size * sizeof(int16_t));
}
alGenBuffers(4, buffers);
alGenBuffers(4, buffers_cd);
alGenBuffers(4, buffers_midi);
alGenSources(2, source);
alGenSources(3, source);
alSource3f(source[0], AL_POSITION, 0.0, 0.0, 0.0);
alSource3f(source[0], AL_VELOCITY, 0.0, 0.0, 0.0);
@@ -97,9 +137,24 @@ void inital(ALvoid)
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 );
alSource3f(source[2], AL_POSITION, 0.0, 0.0, 0.0);
alSource3f(source[2], AL_VELOCITY, 0.0, 0.0, 0.0);
alSource3f(source[2], AL_DIRECTION, 0.0, 0.0, 0.0);
alSourcef (source[2], AL_ROLLOFF_FACTOR, 0.0 );
alSourcei (source[2], AL_SOURCE_RELATIVE, AL_TRUE );
memset(buf,0,BUFLEN*2*sizeof(float));
memset(cd_buf,0,BUFLEN*2*sizeof(float));
if (sound_is_float)
{
memset(buf,0,BUFLEN*2*sizeof(float));
memset(cd_buf,0,BUFLEN*2*sizeof(float));
memset(midi_buf,0,midi_buf_size*sizeof(float));
}
else
{
memset(buf_int16,0,BUFLEN*2*sizeof(int16_t));
memset(cd_buf_int16,0,BUFLEN*2*sizeof(int16_t));
memset(midi_buf_int16,0,midi_buf_size*sizeof(int16_t));
}
for (c = 0; c < 4; c++)
{
@@ -107,123 +162,84 @@ void inital(ALvoid)
{
alBufferData(buffers[c], AL_FORMAT_STEREO_FLOAT32, buf, BUFLEN*2*sizeof(float), FREQ);
alBufferData(buffers_cd[c], AL_FORMAT_STEREO_FLOAT32, cd_buf, CD_BUFLEN*2*sizeof(float), CD_FREQ);
alBufferData(buffers_midi[c], AL_FORMAT_STEREO_FLOAT32, midi_buf, midi_buf_size*sizeof(float), midi_freq);
}
else
{
alBufferData(buffers[c], AL_FORMAT_STEREO16, buf_int16, BUFLEN*2*sizeof(int16_t), FREQ);
alBufferData(buffers_cd[c], AL_FORMAT_STEREO16, cd_buf_int16, CD_BUFLEN*2*sizeof(int16_t), CD_FREQ);
alBufferData(buffers_midi[c], AL_FORMAT_STEREO16, midi_buf_int16, midi_buf_size*sizeof(int16_t), midi_freq);
}
}
alSourceQueueBuffers(source[0], 4, buffers);
alSourceQueueBuffers(source[1], 4, buffers_cd);
alSourceQueueBuffers(source[2], 4, buffers_midi);
alSourcePlay(source[0]);
alSourcePlay(source[1]);
alSourcePlay(source[2]);
if (sound_is_float)
{
free(midi_buf);
free(cd_buf);
free(buf);
}
else
{
free(midi_buf_int16);
free(cd_buf_int16);
free(buf_int16);
}
initialized = 1;
#endif
}
void givealbuffer(float *buf)
void givealbuffer_common(void *buf, uint8_t src, int size, int freq)
{
#ifdef USE_OPENAL
int processed;
int state;
ALuint buffer;
int processed;
int state;
ALuint buffer;
alGetSourcei(source[0], AL_SOURCE_STATE, &state);
alGetSourcei(source[src], AL_SOURCE_STATE, &state);
if (state==0x1014)
{
alSourcePlay(source[0]);
alSourcePlay(source[src]);
}
alGetSourcei(source[0], AL_BUFFERS_PROCESSED, &processed);
alGetSourcei(source[src], AL_BUFFERS_PROCESSED, &processed);
if (processed>=1)
{
alSourceUnqueueBuffers(source[0], 1, &buffer);
alSourceUnqueueBuffers(source[src], 1, &buffer);
alBufferData(buffer, AL_FORMAT_STEREO_FLOAT32, buf, BUFLEN*2*sizeof(float), FREQ);
if (sound_is_float)
{
alBufferData(buffer, AL_FORMAT_STEREO_FLOAT32, buf, size * sizeof(float), freq);
}
else
{
alBufferData(buffer, AL_FORMAT_STEREO16, buf, size * sizeof(int16_t), freq);
}
alSourceQueueBuffers(source[0], 1, &buffer);
alSourceQueueBuffers(source[src], 1, &buffer);
}
#endif
}
void givealbuffer_int16(int16_t *buf)
void givealbuffer(void *buf)
{
#ifdef USE_OPENAL
int processed;
int state;
ALuint buffer;
alGetSourcei(source[0], AL_SOURCE_STATE, &state);
if (state==0x1014)
{
alSourcePlay(source[0]);
}
alGetSourcei(source[0], AL_BUFFERS_PROCESSED, &processed);
if (processed>=1)
{
alSourceUnqueueBuffers(source[0], 1, &buffer);
alBufferData(buffer, AL_FORMAT_STEREO16, buf, BUFLEN*2*sizeof(int16_t), FREQ);
alSourceQueueBuffers(source[0], 1, &buffer);
}
#endif
givealbuffer_common(buf, 0, BUFLEN << 1, FREQ);
}
void givealbuffer_cd(float *buf)
void givealbuffer_cd(void *buf)
{
#ifdef USE_OPENAL
int processed;
int state;
alGetSourcei(source[1], AL_SOURCE_STATE, &state);
if (state==0x1014)
{
alSourcePlay(source[1]);
}
alGetSourcei(source[1], AL_BUFFERS_PROCESSED, &processed);
if (processed>=1)
{
ALuint buffer;
alSourceUnqueueBuffers(source[1], 1, &buffer);
alBufferData(buffer, AL_FORMAT_STEREO_FLOAT32, buf, CD_BUFLEN*2*sizeof(float), CD_FREQ);
alSourceQueueBuffers(source[1], 1, &buffer);
}
#endif
givealbuffer_common(buf, 1, CD_BUFLEN << 1, CD_FREQ);
}
void givealbuffer_cd_int16(int16_t *buf)
void givealbuffer_midi(void *buf, uint32_t size)
{
#ifdef USE_OPENAL
int processed;
int state;
alGetSourcei(source[1], AL_SOURCE_STATE, &state);
if (state==0x1014)
{
alSourcePlay(source[1]);
}
alGetSourcei(source[1], AL_BUFFERS_PROCESSED, &processed);
if (processed>=1)
{
ALuint buffer;
alSourceUnqueueBuffers(source[1], 1, &buffer);
alBufferData(buffer, AL_FORMAT_STEREO16, buf, CD_BUFLEN*2*sizeof(int16_t), CD_FREQ);
alSourceQueueBuffers(source[1], 1, &buffer);
}
#endif
givealbuffer_common(buf, 2, size, midi_freq);
}