ref: f9891e3bde2979defcd5e28c395a7b54337b1b82
parent: 630957d00b70534bf728fa9016e057f487da26bd
author: tide pods <ltchips>
date: Thu Dec 20 08:40:20 EST 2018
implemented more functions
--- /dev/null
+++ b/src/fluidsynth.c
@@ -1,0 +1,285 @@
+/*
+* Copyright (C) 1994-1995 Apogee Software, Ltd.
+* Copyright (C) 2002-2015 icculus.org, GNU/Linux port
+* Copyright (C) 2017-2018 Steven LeVesque
+*/
+
+#include "music.h"
+#include "fluidsynth.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <assert.h>
+
+/*
+#include "rt_def.h" // ROTT music hack
+#include "rt_cfg.h" // ROTT music hack
+#include "rt_util.h" // ROTT music hack
+*/
+
+static char warningMessage[80];
+static char errorMessage[80];
+static FILE *debug_file = NULL;
+static int initialized_debugging = 0;
+
+
+static int isFluidInit = 0;
+
+static fluid_settings_t * fsettings = NULL;
+static fluid_synth_t * fsynth = NULL;
+static fluid_audio_driver_t * faudiodriver = NULL;
+static fluid_player_t * fplayer = NULL;
+
+
+char *MUSIC_ErrorString(int ErrorNumber)
+{
+ switch (ErrorNumber)
+ {
+ case MUSIC_Warning:
+ return(warningMessage);
+
+ case MUSIC_Error:
+ return(errorMessage);
+
+ case MUSIC_Ok:
+ return("OK; no error.");
+
+ case MUSIC_ASSVersion:
+ return("Incorrect sound library version.");
+
+ case MUSIC_SoundCardError:
+ return("General sound card error.");
+
+ case MUSIC_InvalidCard:
+ return("Invalid sound card.");
+
+ case MUSIC_MidiError:
+ return("MIDI error.");
+
+ case MUSIC_MPU401Error:
+ return("MPU401 error.");
+
+ case MUSIC_TaskManError:
+ return("Task Manager error.");
+
+ case MUSIC_FMNotDetected:
+ return("FM not detected error.");
+
+ case MUSIC_DPMI_Error:
+ return("DPMI error.");
+
+ default:
+ return("Unknown error.");
+ } // switch
+
+ assert(0); // shouldn't hit this point.
+ return(NULL);
+} // MUSIC_ErrorString
+
+
+int MUSIC_Init( int SoundCard, int Address )
+{
+ if (isFluidInit)
+ {
+ Error("Fluidsynth is already initialized! \n");
+ return(MUSIC_Error);
+
+ }
+ fsettings = new_fluid_settings();
+ fluid_settings_setstr(fsettings, "audio.driver", "pulseaudio");
+
+ //fluid_settings_setint(fsettings, "synth.cpu-cores", 2);
+
+ //fluid_settings_setstr(fsettings, "synth.verbose", 1);
+
+ fsynth = new_fluid_synth(fsettings);
+
+ faudiodriver = new_fluid_audio_driver(fsettings, fsynth);
+ fplayer = new_fluid_player(fsynth);
+
+ fluid_synth_sfload(fsynth, "Scc1t2.sf2", 1);
+ fluid_settings_setint(fsettings, "player.reset-synth", 0);
+
+ isFluidInit = 1;
+
+ return MUSIC_Ok;
+
+}
+
+
+
+
+int MUSIC_Shutdown( void )
+{
+ if (isFluidInit)
+ {
+ delete_fluid_player(fplayer);
+ delete_fluid_audio_driver(faudiodriver);
+ delete_fluid_synth(fsynth);
+ delete_fluid_settings(fsettings);
+ isFluidInit = 0;
+ }
+
+
+ return MUSIC_Ok;
+}
+
+int songsize;
+
+
+int MUSIC_PlaySong( unsigned char *song, int loopflag )
+{
+ MUSIC_StopSong();
+
+/*
+ GetPathFromEnvironment(filename, ApogeePath, "tmpsong.mid");
+ handle = SafeOpenWrite(filename);
+
+ SafeWrite(handle, song, size);
+ close(handle);
+*/
+ int memloadSuccess = fluid_player_add_mem(fplayer, song, songsize);
+ //printf("%d \n",fluid_player_add(fplayer, "tmpsong.mid"));
+
+ if(memloadSuccess == FLUID_FAILED)
+ {
+ Error("FLUID_FAILED: Attempt to load MIDI track from memory into fluidsynth player failed! \n");
+ return MUSIC_Error;
+ }
+
+ //fluid_player_add(fplayer, "tmpsong.mid");
+
+ if (loopflag == MUSIC_LoopSong)
+ {
+ loopflag = -1;//-1 means loop indefinetly in fluidsynth
+ }
+ else
+ {
+ loopflag = 1;
+ }
+
+ fluid_player_set_loop(fplayer, loopflag);
+
+ int playSuccess = fluid_player_play(fplayer);
+
+ if (playSuccess == 0)
+ return MUSIC_Ok;
+ else
+ return MUSIC_Error;
+ //fluid_player_join(fplayer);
+
+ //return MUSIC_Ok;
+
+
+
+}
+
+int MUSIC_PlaySongROTT(unsigned char *song, int size, int loopflag)
+{
+ MUSIC_StopSong();
+
+
+ fluid_settings_setint(fsettings, "player.reset-synth", 0);
+
+ int memloadSuccess = fluid_player_add_mem(fplayer, song, size);
+ //printf("%d \n",fluid_player_add(fplayer, "tmpsong.mid"));
+
+ songsize = size;
+
+ if(memloadSuccess == FLUID_FAILED)
+ {
+ Error("FLUID_FAILED: Attempt to load MIDI track from memory into fluidsynth player failed! \n");
+ return MUSIC_Error;
+ }
+
+ //fluid_player_add(fplayer, "tmpsong.mid");
+
+ fluid_player_set_loop(fplayer, loopflag == MUSIC_LoopSong ? -1 : 1);
+
+ int playSuccess = fluid_player_play(fplayer);
+
+ if (playSuccess == 0)
+ return MUSIC_Ok;
+ else
+ return MUSIC_Error;
+ //fluid_player_join(fplayer);
+
+ //return MUSIC_Ok;
+
+
+}
+
+
+void MUSIC_SetMaxFMMidiChannel( int channel ) {Error("Not implmented yet");}
+
+void MUSIC_SetVolume( int volume )
+{
+ double val = ((double)volume) * 0.00390625; //(1/256)
+ fluid_settings_setnum(fsettings, "synth.gain", val);
+}
+
+
+void MUSIC_SetMidiChannelVolume( int channel, int volume ) {Error("Not implmented yet");}
+void MUSIC_ResetMidiChannelVolumes( void ) {Error("Not implmented yet");}
+
+int MUSIC_GetVolume( void )
+{
+ double val;
+ fluid_settings_getnum(fsettings, "synth.gain", &val);
+ return (int) (val / 0.00390625);
+}
+
+void MUSIC_SetLoopFlag( int loopflag )
+{
+ fluid_player_set_loop(fplayer, loopflag == MUSIC_LoopSong ? -1 : 1);
+}
+
+int MUSIC_SongPlaying( void )
+{
+ return (fluid_player_get_status(fplayer) == FLUID_PLAYER_PLAYING ? 1 : 0 );
+}
+void MUSIC_Continue( void ) {Error("Not implmented yet");}
+void MUSIC_Pause( void ) {Error("Not implmented yet");}
+
+int MUSIC_StopSong( void )
+{
+ //fluid_player_stop(fplayer);
+ MUSIC_Shutdown();
+ MUSIC_Init(0, 0);
+ return MUSIC_Ok;
+}
+
+// ROTT Special - SBF
+//int MUSIC_PlaySongROTT(unsigned char *song, int size, int loopflag);
+
+void MUSIC_SetContext( int context )
+{
+/*
+ Error("%s Not implmented yet", __func__);
+*/
+}
+
+int MUSIC_GetContext( void )
+{
+/*
+ Error("%s Not implmented yet", __func__);
+ return 0;
+*/
+}
+void MUSIC_SetSongTick( unsigned long PositionInTicks ) {}
+void MUSIC_SetSongTime( unsigned long milliseconds ) {}
+void MUSIC_SetSongPosition( int measure, int beat, int tick ) {}
+void MUSIC_GetSongPosition( songposition *pos ) {}
+void MUSIC_GetSongLength( songposition *pos ) {}
+int MUSIC_FadeVolume( int tovolume, int milliseconds )
+{
+ //Error("%s Not implmented yet", __func__);
+ return 0;
+}
+int MUSIC_FadeActive( void ) {return 0;}
+void MUSIC_StopFade( void ) {}
+/*
+void MUSIC_RerouteMidiChannel( int channel, int cdecl ( *function )( int event, int c1, int c2 ) ){}
+*/
+void MUSIC_RegisterTimbreBank( unsigned char *timbres ) {}