From a714b8c4811627d874934b0a0387b8cb27fc5921 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Tue, 20 Sep 2016 00:48:21 +0300 Subject: [PATCH] music playback works on GNU/Linux --- GNUmakefile | 10 ++-- libs/mikmod/GNUmakefile | 2 +- libs/mikmod/drivers/drv_nos.c | 107 ++++++++++++++++++++++++++++++++++++++++ libs/mikmod/playercode/mlreg.c | 18 ------- src/demo.c | 10 ++++ src/music.c | 62 +++++++++++++++++++++++ src/music.h | 9 ++++ 7 files changed, 196 insertions(+), 22 deletions(-) create mode 100644 libs/mikmod/drivers/drv_nos.c create mode 100644 src/music.c create mode 100644 src/music.h diff --git a/GNUmakefile b/GNUmakefile index 972046b..e81d771 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -2,18 +2,22 @@ src = $(wildcard src/*.c) $(wildcard src/sdl/*.c) obj = $(src:.c=.o) bin = demo -inc = -Isrc -Isrc/sdl -Ilibs/imago/src +inc = -Isrc -Isrc/sdl -Ilibs/imago/src -Ilibs/mikmod/include CFLAGS = -pedantic -Wall -g $(inc) `sdl-config --cflags` -LDFLAGS = -Llibs/imago -limago `sdl-config --libs` -lm +LDFLAGS = -Llibs/imago -Llibs/mikmod -limago -lmikmod `sdl-config --libs` -lm -$(bin): $(obj) imago +$(bin): $(obj) imago mikmod $(CC) -o $@ $(obj) $(LDFLAGS) .PHONY: imago imago: $(MAKE) -C libs/imago +.PHONY: mikmod +mikmod: + $(MAKE) -C libs/mikmod + .PHONY: clean clean: rm -f $(obj) $(bin) diff --git a/libs/mikmod/GNUmakefile b/libs/mikmod/GNUmakefile index 54ad1c3..9a31d25 100644 --- a/libs/mikmod/GNUmakefile +++ b/libs/mikmod/GNUmakefile @@ -1,7 +1,7 @@ src = $(wildcard drivers/*.c) \ $(wildcard loaders/*.c) \ $(wildcard mmio/*.c) \ - $(wildcard deackers/*.c) \ + $(wildcard depackers/*.c) \ $(wildcard posix/*.c) \ $(wildcard playercode/*.c) obj = $(src:.c=.o) diff --git a/libs/mikmod/drivers/drv_nos.c b/libs/mikmod/drivers/drv_nos.c new file mode 100644 index 0000000..b870985 --- /dev/null +++ b/libs/mikmod/drivers/drv_nos.c @@ -0,0 +1,107 @@ +/* MikMod sound library + (c) 1998, 1999, 2000 Miodrag Vallat and others - see file AUTHORS for + complete list. + + This library is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +/*============================================================================== + + $Id$ + + Driver for no output + +==============================================================================*/ + +/* + + Written by Jean-Paul Mikkers + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "mikmod_internals.h" + +#define ZEROLEN 32768 + +static SBYTE *zerobuf=NULL; + +static BOOL NS_IsThere(void) +{ + return 1; +} + +static int NS_Init(void) +{ + zerobuf=(SBYTE*)MikMod_malloc(ZEROLEN); + return VC_Init(); +} + +static void NS_Exit(void) +{ + VC_Exit(); + MikMod_free(zerobuf); + zerobuf=NULL; +} + +static void NS_Update(void) +{ + if (zerobuf) + VC_WriteBytes(zerobuf,ZEROLEN); +} + +MIKMODAPI MDRIVER drv_nos={ + NULL, + "No Sound", + "Nosound Driver v3.0", + 255,255, + "nosound", + NULL, + NULL, + NS_IsThere, + VC_SampleLoad, + VC_SampleUnload, + VC_SampleSpace, + VC_SampleLength, + NS_Init, + NS_Exit, + NULL, + VC_SetNumVoices, + VC_PlayStart, + VC_PlayStop, + NS_Update, + NULL, + VC_VoiceSetVolume, + VC_VoiceGetVolume, + VC_VoiceSetFrequency, + VC_VoiceGetFrequency, + VC_VoiceSetPanning, + VC_VoiceGetPanning, + VC_VoicePlay, + VC_VoiceStop, + VC_VoiceStopped, + VC_VoiceGetPosition, + VC_VoiceRealVolume +}; + +/* ex:set ts=4: */ diff --git a/libs/mikmod/playercode/mlreg.c b/libs/mikmod/playercode/mlreg.c index fd41e86..4b0bed2 100644 --- a/libs/mikmod/playercode/mlreg.c +++ b/libs/mikmod/playercode/mlreg.c @@ -34,28 +34,10 @@ static void MikMod_RegisterAllLoaders_internal(void) { - _mm_registerloader(&load_669); - _mm_registerloader(&load_amf); - _mm_registerloader(&load_asy); - _mm_registerloader(&load_dsm); - _mm_registerloader(&load_far); - _mm_registerloader(&load_gdm); -/* _mm_registerloader(&load_gt2);*/ /* load_gt2 isn't complete */ _mm_registerloader(&load_it); - _mm_registerloader(&load_imf); _mm_registerloader(&load_mod); - _mm_registerloader(&load_med); - _mm_registerloader(&load_mtm); - _mm_registerloader(&load_okt); _mm_registerloader(&load_s3m); - _mm_registerloader(&load_stm); - _mm_registerloader(&load_stx); - _mm_registerloader(&load_ult); - _mm_registerloader(&load_umx); - _mm_registerloader(&load_uni); _mm_registerloader(&load_xm); - - _mm_registerloader(&load_m15); } MIKMODAPI void MikMod_RegisterAllLoaders(void) diff --git a/src/demo.c b/src/demo.c index ce06a44..9133a26 100644 --- a/src/demo.c +++ b/src/demo.c @@ -7,6 +7,7 @@ #include "demo.h" #include "screen.h" #include "3dgfx.h" +#include "music.h" int fb_width = 320; int fb_height = 240; @@ -33,6 +34,11 @@ int demo_init(int argc, char **argv) } g3d_framebuffer(fb_width, fb_height, fb_pixels); + if(music_open("data/test.mod") == -1) { + fprintf(stderr, "failed to open music: data/test.mod\n"); + return -1; + } + if(scr_init() == -1) { return -1; } @@ -49,11 +55,14 @@ int demo_init(int argc, char **argv) /* clear the framebuffer at least once */ memset(fb_pixels, 0, fb_width * fb_height * fb_bpp / CHAR_BIT); + + music_play(); return 0; } void demo_cleanup(void) { + music_close(); scr_shutdown(); g3d_destroy(); @@ -65,6 +74,7 @@ void demo_cleanup(void) void demo_draw(void) { + music_update(); scr_update(); scr_draw(); diff --git a/src/music.c b/src/music.c new file mode 100644 index 0000000..365ad01 --- /dev/null +++ b/src/music.c @@ -0,0 +1,62 @@ +#include "music.h" +#include "mikmod.h" + +static MODULE *mod; +static int initialized; + + +static int init(void) +{ + MikMod_RegisterAllDrivers(); + MikMod_RegisterAllLoaders(); + + md_mode |= DMODE_SOFT_MUSIC; + if(MikMod_Init("") != 0) { + fprintf(stderr, "mikmod init failed: %s\n", + MikMod_strerror(MikMod_errno)); + return -1; + } + return 0; +} + +int music_open(const char *fname) +{ + if(!initialized) { + if(init() == -1) { + return -1; + } + initialized = 1; + } + + if(!(mod = Player_Load(fname, 64, 0))) { + fprintf(stderr, "failed to load music: %s: %s\n", fname, + MikMod_strerror(MikMod_errno)); + return -1; + } + return 0; +} + +void music_close(void) +{ + if(mod) { + music_stop(); + Player_Free(mod); + } +} + +void music_play(void) +{ + Player_Start(mod); +} + +void music_stop(void) +{ + Player_Stop(); +} + +void music_update(void) +{ + if(Player_Active()) { + MikMod_Update(); + } +} diff --git a/src/music.h b/src/music.h new file mode 100644 index 0000000..9d9cb01 --- /dev/null +++ b/src/music.h @@ -0,0 +1,9 @@ +#ifndef MUSIC_H_ +#define MUSIC_H_ + +int music_open(const char *fname); +void music_close(void); +void music_play(void); +void music_update(void); + +#endif /* MUSIC_H_ */ -- 1.7.10.4