ref: f9891e3bde2979defcd5e28c395a7b54337b1b82
dir: /src/fluidsynth.c/
/*
* 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 ) {}