From 42d2130b1ce6d05ba2532333db8e64252a58654f Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 19 Jun 2017 07:00:41 +0200 Subject: [PATCH] Fixed the previous commit mess. --- src/Makefile.mingw | 544 +++++++++++++++++++++++++++++++++++++++++++++ src/SOUND/openal.c | 245 ++++++++++++++++++++ 2 files changed, 789 insertions(+) create mode 100644 src/Makefile.mingw create mode 100644 src/SOUND/openal.c diff --git a/src/Makefile.mingw b/src/Makefile.mingw new file mode 100644 index 000000000..51c6981a2 --- /dev/null +++ b/src/Makefile.mingw @@ -0,0 +1,544 @@ +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box distribution. +# +# Modified Makefile for Win32 (MinGW32) environment. +# +# Version: @(#)Makefile.mingw 1.0.30 2017/06/17 +# +# Authors: Miran Grca, +# Fred N. van Kempen, +# + +# Name of the executable. +ifndef PROG +PROG = 86Box +endif + +# Various compile-time options. +# -DROM_TRACE=0xcd800 traces ROM access from segment C800 +# -DIO_TACE=0x66 traces I/O on port 0x66 +ifndef STUFF +STUFF = +endif + +# Add feature selections here. +# -DANSI_CFG forces the config file to ANSI encoding. +# -DENABLE_VRAM_DUMP enables Video Ram dumping. +# -DENABLE_LOG_BREAKPOINT enables extra logging. +# -DENABLE_BUSLOGIC_LOG enables extra logging. +# -DENABLE_CDROM_LOG enables extra logging. +# -DENABLE_D86F_LOG enables extra logging. +# -DENABLE_FDC_LOG enables extra logging. +# -DENABLE_IDE_LOG enables extra logging. +# -DENABLE_SERIAL_LOG enables extra logging. +# -DENABLE_NIC_LOG enables extra logging. +ifndef EXTRAS +EXTRAS = +endif + +# Defaults for several build options (possibly defined in a chained file.) +ifndef DEBUG +DEBUG = n +endif +ifndef OPTIM +OPTIM = n +endif +ifndef RELEASE +RELEASE = n +endif +ifndef USB +USB = n +endif +ifndef X64 +X64 = n +endif + + +######################################################################### +# Nothing should need changing from here on.. # +######################################################################### +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 +CC = gcc.exe -m64 +else +CPP = g++.exe -m32 +CC = gcc.exe -m32 +endif +WINDRES = windres.exe + +OPTS = -DWIN32 -I$(PLAT) $(EXTRAS) $(STUFF) + +ifeq ($(X64), y) + ifeq ($(OPTIM), y) + DFLAGS = -march=native + else + DFLAGS = + endif +else + ifeq ($(OPTIM), y) + DFLAGS = -march=native + else + DFLAGS = -march=i686 + endif +endif +ifeq ($(DEBUG), y) + DFLAGS += -ggdb -DDEBUG + AOPTIM = + ifndef COPTIM + COPTIM = -Og + endif +else + ifeq ($(OPTIM), y) + AOPTIM = -mtune=native + ifndef COPTIM + COPTIM = -O6 + endif + else + ifndef COPTIM + COPTIM = -O3 + endif + endif +endif +AFLAGS = -msse -msse2 -mfpmath=sse +CFLAGS = $(OPTS) $(DFLAGS) $(COPTIM) $(AOPTIM) $(AFLAGS) \ + -fomit-frame-pointer -mstackrealign -Wall +RFLAGS = --input-format=rc -O coff +ifeq ($(RELEASE), y) +CFLAGS += -DRELEASE_BUILD +RFLAGS += -DRELEASE_BUILD +endif +ifeq ($(VRAMDUMP), y) +CFLAGS += -DENABLE_VRAM_DUMP +RFLAGS += -DENABLE_VRAM_DUMP +endif + +ifeq ($(X64), y) +PLATCG = codegen_x86-64.o +else +PLATCG = codegen_x86.o +endif + + +MAINOBJ = pc.o config.o device.o timer.o dma.o io.o nmi.o pic.o \ + mca.o mcr.o pit.o ppi.o pci.o sio.o intel.o rom.o mem.o \ + memregs.o intel_flash.o rtc.o nvr.o ps2_nvr.o +CPUOBJ = cpu.o 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o \ + codegen.o \ + codegen_ops.o codegen_timing_486.o \ + codegen_timing_686.o codegen_timing_pentium.o \ + codegen_timing_winchip.o $(PLATCG) \ + x86seg.o x87.o +SYSOBJ = model.o \ + headland.o \ + i430hx.o i430lx.o i430fx.o i430nx.o i430vx.o i440fx.o \ + neat.o \ + ali1429.o \ + opti495.o \ + scat.o \ + sis496.o \ + wd76c10.o \ + acer386sx.o acerm3a.o amstrad.o \ + compaq.o laserxt.o jim.o \ + olivetti_m24.o ps1.o ps2.o ps2_mca.o \ + tandy_eeprom.o tandy_rom.o +DEVOBJ = bugger.o lpt.o serial.o \ + fdc37c665.o fdc37c669.o fdc37c932fr.o \ + pc87306.o sis85c471.o w83877f.o \ + keyboard.o \ + keyboard_xt.o keyboard_at.o keyboard_pcjr.o \ + keyboard_amstrad.o keyboard_olim24.o \ + gameport.o \ + joystick_standard.o joystick_ch_flightstick_pro.o \ + joystick_sw_pad.o joystick_tm_fcs.o \ + mouse.o mouse_serial.o mouse_ps2.o mouse_bus.o \ + fdd.o fdc.o fdi2raw.o \ + hdd.o hdd_image.o \ + mfm_at.o mfm_xebec.o hdd_esdi.o ide.o xtide.o piix.o \ + disc.o \ + disc_86f.o disc_fdi.o disc_imd.o disc_img.o \ + disc_random.o disc_td0.o \ + cdrom.o \ + cdrom_dosbox.o cdrom_image.o cdrom_ioctl.o cdrom_null.o +ifdef USB +USBOBJ = usb.o +endif +NETOBJ = network.o \ + net_pcap.o \ + net_slirp.o \ + bootp.o ip_icmp.o misc.o socket.o tcp_timer.o cksum.o \ + ip_input.o queue.o tcp_input.o debug.o ip_output.o \ + sbuf.o tcp_output.o udp.o if.o mbuf.o slirp.o tcp_subr.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 \ + 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 \ + snd_emu8k.o snd_gus.o snd_opl.o \ + snd_mpu401.o snd_pas16.o snd_resid.o \ + snd_sn76489.o snd_ssi2001.o snd_wss.o \ + snd_ym7128.o +VIDOBJ = video.o \ + vid_cga.o vid_cga_comp.o vid_mda.o \ + vid_ega.o vid_ega_render.o \ + vid_vga.o vid_svga.o vid_svga_render.o \ + vid_hercules.o vid_herculesplus.o vid_incolor.o \ + vid_colorplus.o \ + vid_genius.o \ + vid_s3.o vid_s3_virge.o \ + vid_et4000.o vid_et4000w32.o vid_icd2061.o \ + vid_oti067.o \ + vid_paradise.o \ + vid_tvga.o vid_tgui9440.o vid_tkd8001_ramdac.o \ + vid_ati_eeprom.o vid_ati18800.o vid_ati28800.o \ + vid_ati68860_ramdac.o vid_ati_mach64.o \ + vid_ics2595.o \ + vid_sdac_ramdac.o \ + vid_stg_ramdac.o \ + vid_unk_ramdac.o \ + vid_wy700.o \ + vid_voodoo.o \ + vid_pcjr.o vid_ps1_svga.o \ + vid_olivetti_m24.o \ + vid_pc1512.o vid_pc1640.o vid_pc200.o \ + vid_tandy.o vid_tandysl.o +WINOBJ = win.o \ + win_ddraw.o win_ddraw_fs.o win_ddraw_screenshot.o \ + win_d3d.o win_d3d_fs.o \ + win_language.o win_status.o win_opendir.o win_dynld.o \ + win_video.o win_serial.o win_keyboard.o win_mouse.o \ + win_iodev.o win_joystick.o win_midi.o \ + win_settings.o win_deviceconfig.o win_joystickconfig.o \ + 86Box.res +OBJ = $(MAINOBJ) $(CPUOBJ) $(SYSOBJ) $(DEVOBJ) $(USBOBJ) \ + $(NETOBJ) $(SCSIOBJ) $(SNDOBJ) $(VIDOBJ) $(WINOBJ) + +LZFOBJ = lzf_c.o lzf_d.o + +LIBS = -mwindows \ + -lopenal.dll \ + -lddraw -ldinput8 -ldxguid -ld3d9 -ld3dx9 \ + -lcomctl32 -lkernel32 -lwsock32 -lwinmm -liphlpapi -lpsapi \ + -static -lstdc++ -lgcc + + +# Build rules. +%.o: %.c + @echo $< + @$(CC) $(CFLAGS) -c $< + +%.o: %.cc + @echo $< + @$(CPP) $(CFLAGS) -c $< + +%.o: %.cpp + @echo $< + @$(CPP) $(CFLAGS) -c $< + +all: $(PROG).exe pcap_if.exe + + +$(PROG).exe: $(OBJ) $(LZFOBJ) + @echo Linking $(PROG).exe .. + @$(CC) -o $(PROG).exe $(OBJ) $(LZFOBJ) $(LIBS) +ifneq ($(DEBUG), y) + @strip $(PROG).exe +endif + +pcap_if.exe: pcap_if.o win_dynld.o pcap_if.res + @echo Linking pcap_if.exe .. + @$(CC) -o pcap_if.exe pcap_if.o win_dynld.o pcap_if.res +ifneq ($(DEBUG), y) + @strip pcap_if.exe +endif + + + +clean: + -rm *.o + -rm *.exe + -rm *.res + +86Box.res: 86Box.rc + @echo Processing $< + @$(WINDRES) $(RFLAGS) $(EXTRAS) -i win/86Box.rc -o 86Box.res + +pcap_if.res: pcap_if.rc + @echo Processing $< + @$(WINDRES) $(RFLAGS) -i win/pcap_if.rc -o pcap_if.res + + +# Module dependencies. +acer386sx.o: ibm.h cpu/cpu.h io.h device.h model.h + +acerm3a.o: ibm.h cpu/cpu.h io.h device.h model.h + +ali1429.o: ibm.h cpu/cpu.h io.h mem.h device.h model.h + +amstrad.o: ibm.h cpu/cpu.h io.h device.h model.h keyboard.h lpt.h mouse.h + +bugger.o: ibm.h io.h bugger.h + +cdrom.o: 86box.h cdrom.h ibm.h ide.h piix.h scsi.h timer.h \ + win/plat_iodev.h + +cdrom_ioctl.o: ibm.h cdrom.h cdrom_ioctl.h scsi.h + +cdrom_null.o: ibm.h cdrom.h cdrom_ioctl.h + +compaq.o: ibm.h cpu/cpu.h mem.h device.h model.h + +config.o: cdrom.h config.h device.h disc.h fdc.h fdd.h ibm.h \ + cpu/cpu.h gameport.h ide.h hdd.h model.h mouse.h \ + network/network.h nvr.h scsi.h win/plat_joystick.h \ + win/plat_midi.h sound/snd_dbopl.h sound/snd_mpu401.h \ + sound/snd_opl.h sound/sound.h video/video.h win/win.h \ + win/win_language.h + +device.o: ibm.h cpu/cpu.h config.h device.h model.h sound/sound.h + +disc.o: ibm.h config.h disc.h disc_fdi.h disc_img.h disc_86f.h \ + disc_td0.h disc_imd.h fdc.h fdd.h timer.h + +disc_86f.o: lzf/lzf.h config.h dma.h disc.h disc_86f.h disc_random.h \ + fdc.h fdd.h ibm.h + +disc_fdi.o: ibm.h disc.h disc_img.h disc_fdi.h fdc.h fdd.h fdi2raw.h \ + ibm.h disc.h disc_imd.h fdc.h fdd.h ibm.h config.h disc.h \ + disc_img.h fdc.h fdd.h + +disc_random.o: disc_random.h + +disc_td0.o: ibm.h disc.h disc_td0.h fdc.h fdd.h + +dma.o: ibm.h cpu/x86.h mem.h io.h dma.h + +fdc.o: ibm.h disc.h dma.h fdc.h fdd.h io.h pic.h timer.h + +fdc37c665.o: ibm.h disc.h fdc.h fdd.h ide.h io.h lpt.h serial.h \ + fdc37c665.h ibm.h disc.h fdc.h fdd.h io.h ide.h \ + lpt.h serial.h fdc37c669.h + +fdc37c932fr.o: ibm.h disc.h fdc.h fdd.h ide.h io.h lpt.h serial.h \ + fdc37c932fr.h + +fdd.o: ibm.h disc.h fdc.h fdd.h + +fdi2raw.o: fdi2raw.h ibm.h + +gameport.o: ibm.h cpu/cpu.h device.h io.h timer.h gameport.h \ + joystick_ch_flightstick_pro.h joystick_standard.h \ + joystick_sw_pad.h joystick_tm_fcs.h plat_joystick.h + +hdd.o: ibm.h cpu/cpu.h device.h hdd.h model.h hdd_esdi.h \ + mfm_at.h mfm_xebec.h xtide.h + +hdd_image.o: ibm.h ide.h hdd_image.h + +hdd_esdi.o: ibm.h device.h dma.h hdd_image.h io.h mca.h mem.h \ + pic.h rom.h timer.h hdd_esdi.h + +headland.o: ibm.h cpu/cpu.h io.h mem.h device.h model.h + +i430fx.o: ibm.h cpu/cpu.h mem.h pci.h device.h model.h + +i430hx.o: ibm.h cpu/cpu.h io.h mem.h pci.h device.h model.h + +i430lx.o: ibm.h cpu/cpu.h mem.h pci.h device.h model.h + +i430nx.o: ibm.h cpu/cpu.h mem.h pci.h device.h model.h + +i430vx.o: ibm.h cpu/cpu.h io.h mem.h pci.h device.h model.h + +i440fx.o: ibm.h cpu/cpu.h io.h mem.h pci.h device.h model.h + +i82335.o: ibm.h io.h mem.h + +ide.o: 86box.h cdrom.h hdd_image.h ibm.h io.h pic.h timer.h cdrom.h scsi.h ide.h + +intel.o: ibm.h cpu/cpu.h io.h mem.h pit.h timer.h intel.h + +intel_flash.o: ibm.h cpu/cpu.h device.h mem.h model.h rom.h + +io.o: ibm.h io.h + +jim.o: ibm.h cpu/cpu.h io.h device.h model.h + +joystick_ch_flightstick_pro.o: ibm.h device.h timer.h gameport.h \ + joystick_standard.h plat_joystick.h + +joystick_standard.o: ibm.h device.h timer.h gameport.h \ + joystick_standard.h plat_joystick.h + +joystick_sw_pad.o: ibm.h device.h timer.h gameport.h \ + joystick_sw_pad.h plat_joystick.h + +joystick_tm_fcs.o: ibm.h device.h timer.h gameport.h \ + joystick_standard.h plat_joystick.h + +keyboard.o: ibm.h plat_keyboard.h keyboard.h + +keyboard_amstrad.o: ibm.h io.h mem.h pic.h pit.h timer.h sound/sound.h \ + sound/snd_speaker.h keyboard.h keyboard_amstrad.h + +keyboard_at.o: ibm.h io.h mem.h pic.h pit.h timer.h disc.h fdc.h \ + sound/sound.h sound/snd_speaker.h keyboard.h keyboard_at.h + +keyboard_olim24.o: ibm.h io.h mem.h pic.h pit.h timer.h mouse.h \ + sound/sound.h sound/snd_speaker.h keyboard.h keyboard_olim24.h + +keyboard_pcjr.o: ibm.h io.h mem.h nmi.h pic.h pit.h timer.h \ + device.h sound/sound.h sound/snd_speaker.h \ + sound/snd_sn76489.h keyboard.h keyboard_pcjr.h + +keyboard_xt.o: ibm.h io.h mem.h pic.h pit.h timer.h device.h tandy_eeprom.h \ + sound/sound.h sound/snd_speaker.h keyboard.h keyboard_xt.h + +laserxt.o: ibm.h cpu/cpu.h io.h mem.h device.h model.h + +lpt.o: ibm.h io.h lpt.h + +mca.o: ibm.h io.h mem.h mca.h + +mcr.o: ibm.h + +mem.o: ibm.h cpu/cpu.h cpu/x86_ops.h cpu/x86.h config.h \ + io.h mem.h rom.h cpu/codegen.h video/video.h + +memregs.o: ibm.h io.h memregs.h + +mfm_at.o: ibm.h device.h hdd_image.h io.h pic.h timer.h mfm_at.h + +mfm_xebec.o: ibm.h device.h dma.h hdd_image.h io.h mem.h pic.h rom.h timer.h mfm_xebec.h + +model.o: ibm.h io.h mem.h rom.h device.h model.h cpu/cpu.h \ + mouse.h mouse_ps2.h cdrom.h disc.h dma.h fdc.h \ + fdc37c665.h fdc37c669.h fdc37c932fr.h \ + gameport.h i82335.h ide.h intel.h intel_flash.h \ + keyboard_amstrad.h keyboard_at.h keyboard_olim24.h \ + keyboard_pcjr.h keyboard_xt.h lpt.h mem.h memregs.h \ + nmi.h nvr.h pc87306.h pci.h pic.h piix.h pit.h ps2_mca.h \ + serial.h sis85c471.h sio.h sound/snd_ps1.h sound/snd_pssj.h \ + sound/snd_sn76489.h tandy_eeprom.h tandy_rom.h \ + video/vid_pcjr.h video/vid_tandy.h w83877f.h wd76c10.h \ + xtide.h bugger.h + +mouse.o: ibm.h cpu/cpu.h device.h model.h \ + mouse.h mouse_serial.h mouse_ps2.h mouse_bus.h keyboard_olim24.h + +mouse_bus.o: ibm.h io.h pic.h mouse.h mouse_bus.h plat_mouse.h + +mouse_ps2.o: ibm.h keyboard_at.h mouse.h mouse_ps2.h plat_mouse.h + +mouse_serial.o: ibm.h timer.h serial.h mouse.h mouse_serial.h + +neat.o: ibm.h cpu/cpu.h io.h device.h model.h + +nmi.o: ibm.h io.h nmi.h + +nvr.o: ibm.h cpu/cpu.h device.h io.h mem.h model.h nvr.h \ + pic.h rom.h timer.h rtc.h + +olivetti_m24.o: ibm.h cpu/cpu.h io.h device.h model.h + +opti495.o: ibm.h cpu/cpu.h io.h mem.h device.h model.h + +pc.o: 86box.h ibm.h mem.h cpu/cpu.h cpu/x86_ops.h cpu/codegen.h \ + dma.h nvr.h pic.h pit.h timer.h device.h model.h disc.h \ + disc_86f.h disc_fdi.h disc_imd.h disc_img.h disc_td0.h \ + disc_random.h config.h fdc.h fdd.h gameport.h plat_joystick.h \ + plat_midi.h hdd.h ide.h cdrom.h cdrom_ioctl.h cdrom_image.h \ + cdrom_null.h scsi.h keyboard.h plat_keyboard.h keyboard_at.h \ + mouse.h plat_mouse.h network/network.h serial.h \ + sound/sound.h sound/snd_cms.h sound/snd_dbopl.h \ + sound/snd_mpu401.h sound/snd_opl.h sound/snd_gus.h \ + sound/snd_sb.h sound/snd_speaker.h sound/snd_ssi2001.h \ + video/video.h video/vid_voodoo.h win/plat_ui.h + +pc87306.o: ibm.h disc.h fdc.h fdd.h ide.h io.h lpt.h serial.h pc87306.h + +pci.o: ibm.h io.h mem.h pic.h pci.h + +pic.o: ibm.h io.h pic.h pit.h + +piix.o: ibm.h dma.h ide.h io.h mem.h pci.h piix.h + +pit.o: ibm.h cpu/cpu.h dma.h io.h pic.h pit.h device.h timer.h \ + model.h sound/snd_speaker.h video/video.h + +ppi.o: ibm.h pit.h plat_keyboard.h plat_mouse.h + +ps1.o: ibm.h cpu/cpu.h io.h mem.h rom.h device.h model.h lpt.h serial.h + +ps2.o: ibm.h cpu/cpu.h io.h mem.h rom.h device.h model.h lpt.h serial.h + +ps2_mca.o: ibm.h cpu/cpu.h cpu/x86.h io.h mca.h mem.h rom.h device.h \ + lpt.h ps2_mca.h ps2_nvr.h serial.h + +ps2_nvr.o: ibm.h device.h io.h mem.h rom.h ps2_nvr.h + +rom.o: config.h ibm.h mem.h rom.h + +rtc.o: nvr.h rtc.h + +scat.o: ibm.h cpu/cpu.h io.h mem.h device.h model.h + +scsi.o: 86box.h ibm.h timer.h device.h cdrom.h scsi.h \ + scsi_aha154x.h scsi_buslogic.h + +scsi_aha154x.o: ibm.h io.h mca.h mem.h mca.h rom.h dma.h pic.h timer.h \ + device.h cdrom.h scsi.h scsi_disk.h scsi_aha154x.h \ + +scsi_buslogic.o: ibm.h io.h mem.h rom.h dma.h pic.h pci.h timer.h \ + device.h scsi.h scsi_disk.h cdrom.h scsi_buslogic.h + +scsi_disk.o: 86box.h cdrom.h hdd_image.h ibm.h ide.h piix.h scsi.h \ + scsi_disk.h timer.h win/plat_iodev.h + +serial.o: ibm.h io.h pic.h timer.h serial.h plat_serial.h + +sio.o: ibm.h cdrom.h disc.h dma.h fdc.h keyboard_at.h ide.h \ + io.h mem.h pci.h sio.h + +sis496.o: ibm.h cpu/cpu.h io.h mem.h pci.h device.h model.h + +sis50x.o: ibm.h device.h io.h mem.h pci.h sis50x.h + +sis85c471.o: ibm.h ide.h disc.h fdc.h fdd.h io.h lpt.h serial.h sis85c471.h + +tandy_eeprom.o: ibm.h device.h mem.h io.h rom.h tandy_eeprom.h + +tandy_rom.o: ibm.h device.h io.h mem.h rom.h tandy_rom.h + +timer.o: ibm.h timer.h + +usb.o: ibm.h io.h mem.h usb.h + +w83877f.o: ibm.h disc.h fdc.h fdd.h io.h lpt.h serial.h w83877f.h + +wd76c10.o: ibm.h disc.h fdc.h io.h mem.h serial.h wd76c10.h + +xtide.o: ibm.h io.h mem.h rom.h device.h ide.h xtide.h + + +# End of Makefile.mingw. diff --git a/src/SOUND/openal.c b/src/SOUND/openal.c new file mode 100644 index 000000000..c2d8d87fa --- /dev/null +++ b/src/SOUND/openal.c @@ -0,0 +1,245 @@ +#define USE_OPENAL +#include +#include +#include +#ifdef USE_OPENAL +# undef AL_API +# undef ALC_API +# define AL_LIBTYPE_STATIC +# define ALC_LIBTYPE_STATIC +# include +# include +# include +#endif +#include "../ibm.h" +#include "sound.h" + + +#define FREQ 48000 +#define BUFLEN SOUNDBUFLEN + + +#ifdef USE_OPENAL +ALuint buffers[4]; /* front and back buffers */ +ALuint buffers_cd[4]; /* front and back buffers */ +ALuint buffers_midi[4]; /* front and back buffers */ +static ALuint source[3]; /* audio source */ +#endif + +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) +{ + ALCcontext *Context; + ALCdevice *Device; + + /* Open device */ + Device = alcOpenDevice((ALCchar *)""); + if (Device != NULL) { + /* Create context(s) */ + Context = alcCreateContext(Device, NULL); + if (Context != NULL) { + /* Set active context */ + alcMakeContextCurrent(Context); + } + } +} + + +ALvoid alutExit(ALvoid) +{ + ALCcontext *Context; + ALCdevice *Device; + + /* Get active context */ + Context = alcGetCurrentContext(); + if (Context != NULL) { + /* Get device for active context */ + Device = alcGetContextsDevice(Context); + if (Device != NULL) { + /* Disable context */ + alcMakeContextCurrent(NULL); + + /* Close device */ + alcCloseDevice(Device); + } + + /* Release context(s) */ + alcDestroyContext(Context); + } +} + + +void closeal(void) +{ +#ifdef USE_OPENAL + 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 = NULL, *cd_buf = NULL, *midi_buf = NULL; + int16_t *buf_int16 = NULL, *cd_buf_int16 = NULL, *midi_buf_int16 = NULL; + + 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(3, source); + + 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 ); + 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 ); + 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 ); + + 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++) + { + if (sound_is_float) + { + 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_common(void *buf, uint8_t src, int size, int freq) +{ +#ifdef USE_OPENAL + int processed; + int state; + ALuint buffer; + + alGetSourcei(source[src], AL_SOURCE_STATE, &state); + + if (state==0x1014) + { + alSourcePlay(source[src]); + } + alGetSourcei(source[src], AL_BUFFERS_PROCESSED, &processed); + + if (processed>=1) + { + alSourceUnqueueBuffers(source[src], 1, &buffer); + + 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[src], 1, &buffer); + } +#endif +} + +void givealbuffer(void *buf) +{ + givealbuffer_common(buf, 0, BUFLEN << 1, FREQ); +} + +void givealbuffer_cd(void *buf) +{ + givealbuffer_common(buf, 1, CD_BUFLEN << 1, CD_FREQ); +} + +void givealbuffer_midi(void *buf, uint32_t size) +{ + givealbuffer_common(buf, 2, size, midi_freq); +}