mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-17 04:06:26 +01:00
Update Fluidsynth to v2.0.6-git
This commit is contained in:
parent
69a3b0b46e
commit
fdcddc736b
19 changed files with 329 additions and 239 deletions
|
|
@ -48,7 +48,7 @@ static fluid_midi_event_t *fluid_track_next_event(fluid_track_t *track);
|
|||
static int fluid_track_get_duration(fluid_track_t *track);
|
||||
static int fluid_track_reset(fluid_track_t *track);
|
||||
|
||||
static int fluid_track_send_events(fluid_track_t *track,
|
||||
static void fluid_track_send_events(fluid_track_t *track,
|
||||
fluid_synth_t *synth,
|
||||
fluid_player_t *player,
|
||||
unsigned int ticks);
|
||||
|
|
@ -1553,13 +1553,12 @@ fluid_track_reset(fluid_track_t *track)
|
|||
/*
|
||||
* fluid_track_send_events
|
||||
*/
|
||||
int
|
||||
void
|
||||
fluid_track_send_events(fluid_track_t *track,
|
||||
fluid_synth_t *synth,
|
||||
fluid_player_t *player,
|
||||
unsigned int ticks)
|
||||
{
|
||||
int status = FLUID_OK;
|
||||
fluid_midi_event_t *event;
|
||||
int seeking = player->seek_ticks >= 0;
|
||||
|
||||
|
|
@ -1580,7 +1579,7 @@ fluid_track_send_events(fluid_track_t *track,
|
|||
|
||||
if(event == NULL)
|
||||
{
|
||||
return status;
|
||||
return;
|
||||
}
|
||||
|
||||
/* printf("track=%02d\tticks=%05u\ttrack=%05u\tdtime=%05u\tnext=%05u\n", */
|
||||
|
|
@ -1592,7 +1591,7 @@ fluid_track_send_events(fluid_track_t *track,
|
|||
|
||||
if(track->ticks + event->dtime > ticks)
|
||||
{
|
||||
return status;
|
||||
return;
|
||||
}
|
||||
|
||||
track->ticks += event->dtime;
|
||||
|
|
@ -1620,8 +1619,6 @@ fluid_track_send_events(fluid_track_t *track,
|
|||
fluid_track_next_event(track);
|
||||
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/******************************************************
|
||||
|
|
@ -1679,6 +1676,26 @@ new_fluid_player(fluid_synth_t *synth)
|
|||
fluid_player_set_playback_callback(player, fluid_synth_handle_midi_event, synth);
|
||||
player->use_system_timer = fluid_settings_str_equal(synth->settings,
|
||||
"player.timing-source", "system");
|
||||
if(player->use_system_timer)
|
||||
{
|
||||
player->system_timer = new_fluid_timer((int) player->deltatime,
|
||||
fluid_player_callback, player, TRUE, FALSE, TRUE);
|
||||
|
||||
if(player->system_timer == NULL)
|
||||
{
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
player->sample_timer = new_fluid_sample_timer(player->synth,
|
||||
fluid_player_callback, player);
|
||||
|
||||
if(player->sample_timer == NULL)
|
||||
{
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
fluid_settings_getint(synth->settings, "player.reset-synth", &i);
|
||||
fluid_player_handle_reset_synth(player, NULL, i);
|
||||
|
|
@ -1687,11 +1704,16 @@ new_fluid_player(fluid_synth_t *synth)
|
|||
fluid_player_handle_reset_synth, player);
|
||||
|
||||
return player;
|
||||
|
||||
err:
|
||||
delete_fluid_player(player);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a MIDI player instance.
|
||||
* @param player MIDI player instance
|
||||
* @warning Do not call while the \p synth renders audio, i.e. an audio driver is running or any other synthesizer thread calls fluid_synth_process() or fluid_synth_nwrite_float() or fluid_synth_write_*() !
|
||||
*/
|
||||
void
|
||||
delete_fluid_player(fluid_player_t *player)
|
||||
|
|
@ -1704,6 +1726,9 @@ delete_fluid_player(fluid_player_t *player)
|
|||
fluid_player_stop(player);
|
||||
fluid_player_reset(player);
|
||||
|
||||
delete_fluid_timer(player->system_timer);
|
||||
delete_fluid_sample_timer(player->synth, player->sample_timer);
|
||||
|
||||
while(player->playlist != NULL)
|
||||
{
|
||||
q = player->playlist->next;
|
||||
|
|
@ -2031,6 +2056,11 @@ fluid_player_callback(void *data, unsigned int msec)
|
|||
|
||||
loadnextfile = player->currentfile == NULL ? 1 : 0;
|
||||
|
||||
if(player->status == FLUID_PLAYER_DONE)
|
||||
{
|
||||
fluid_synth_all_notes_off(synth, -1);
|
||||
return 1;
|
||||
}
|
||||
do
|
||||
{
|
||||
if(loadnextfile)
|
||||
|
|
@ -2059,12 +2089,7 @@ fluid_player_callback(void *data, unsigned int msec)
|
|||
if(!fluid_track_eot(player->track[i]))
|
||||
{
|
||||
status = FLUID_PLAYER_PLAYING;
|
||||
|
||||
if(fluid_track_send_events(player->track[i], synth, player,
|
||||
player->cur_ticks) != FLUID_OK)
|
||||
{
|
||||
/* */
|
||||
}
|
||||
fluid_track_send_events(player->track[i], synth, player, player->cur_ticks);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2099,63 +2124,33 @@ fluid_player_callback(void *data, unsigned int msec)
|
|||
int
|
||||
fluid_player_play(fluid_player_t *player)
|
||||
{
|
||||
if(player->status == FLUID_PLAYER_PLAYING)
|
||||
if(player->status == FLUID_PLAYER_PLAYING ||
|
||||
player->playlist == NULL)
|
||||
{
|
||||
return FLUID_OK;
|
||||
}
|
||||
|
||||
if(player->playlist == NULL)
|
||||
if(!player->use_system_timer)
|
||||
{
|
||||
return FLUID_OK;
|
||||
fluid_sample_timer_reset(player->synth, player->sample_timer);
|
||||
}
|
||||
|
||||
player->status = FLUID_PLAYER_PLAYING;
|
||||
|
||||
if(player->use_system_timer)
|
||||
{
|
||||
player->system_timer = new_fluid_timer((int) player->deltatime,
|
||||
fluid_player_callback, (void *) player, TRUE, FALSE, TRUE);
|
||||
|
||||
if(player->system_timer == NULL)
|
||||
{
|
||||
return FLUID_FAILED;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
player->sample_timer = new_fluid_sample_timer(player->synth,
|
||||
fluid_player_callback, (void *) player);
|
||||
|
||||
if(player->sample_timer == NULL)
|
||||
{
|
||||
return FLUID_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
return FLUID_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stops a MIDI player.
|
||||
* Pauses the MIDI playback.
|
||||
*
|
||||
* It will not rewind to the beginning of the file, use fluid_player_seek() for this purpose.
|
||||
* @param player MIDI player instance
|
||||
* @return Always returns #FLUID_OK
|
||||
*/
|
||||
int
|
||||
fluid_player_stop(fluid_player_t *player)
|
||||
{
|
||||
if(player->system_timer != NULL)
|
||||
{
|
||||
delete_fluid_timer(player->system_timer);
|
||||
}
|
||||
|
||||
if(player->sample_timer != NULL)
|
||||
{
|
||||
delete_fluid_sample_timer(player->synth, player->sample_timer);
|
||||
}
|
||||
|
||||
player->status = FLUID_PLAYER_DONE;
|
||||
player->sample_timer = NULL;
|
||||
player->system_timer = NULL;
|
||||
fluid_player_seek(player, fluid_player_get_current_tick(player));
|
||||
return FLUID_OK;
|
||||
}
|
||||
|
||||
|
|
@ -2241,26 +2236,17 @@ int fluid_player_set_bpm(fluid_player_t *player, int bpm)
|
|||
}
|
||||
|
||||
/**
|
||||
* Wait for a MIDI player to terminate (when done playing).
|
||||
* Wait for a MIDI player until the playback has been stopped.
|
||||
* @param player MIDI player instance
|
||||
* @return #FLUID_OK on success, #FLUID_FAILED otherwise
|
||||
* @return Always #FLUID_OK
|
||||
*/
|
||||
int
|
||||
fluid_player_join(fluid_player_t *player)
|
||||
{
|
||||
if(player->system_timer)
|
||||
while(player->status != FLUID_PLAYER_DONE)
|
||||
{
|
||||
return fluid_timer_join(player->system_timer);
|
||||
fluid_msleep(10);
|
||||
}
|
||||
else if(player->sample_timer)
|
||||
{
|
||||
/* Busy-wait loop, since there's no thread to wait for... */
|
||||
while(player->status != FLUID_PLAYER_DONE)
|
||||
{
|
||||
fluid_msleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
return FLUID_OK;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue