From be79856caa0015d399347677e19d3b176958dba9 Mon Sep 17 00:00:00 2001 From: Bill Peterson Date: Tue, 6 Jul 2021 04:04:59 -0500 Subject: [PATCH] Only send all_notes_off when stopping player (#934) --- src/midi/fluid_midi.c | 26 ++++++++++++++++---------- src/midi/fluid_midi.h | 1 + 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/midi/fluid_midi.c b/src/midi/fluid_midi.c index 630e1323..e63f12e0 100644 --- a/src/midi/fluid_midi.c +++ b/src/midi/fluid_midi.c @@ -1577,12 +1577,12 @@ fluid_track_send_events(fluid_track_t *track, return; } - /* printf("track=%02d\tticks=%05u\ttrack=%05u\tdtime=%05u\tnext=%05u\n", */ - /* track->num, */ - /* ticks, */ - /* track->ticks, */ - /* event->dtime, */ - /* track->ticks + event->dtime); */ + /* printf("track=%02d\tticks=%05u\ttrack=%05u\tdtime=%05u\tnext=%05u\n", */ + /* track->num, */ + /* ticks, */ + /* track->ticks, */ + /* event->dtime, */ + /* track->ticks + event->dtime); */ if(track->ticks + event->dtime > ticks) { @@ -1651,6 +1651,7 @@ new_fluid_player(fluid_synth_t *synth) } fluid_atomic_int_set(&player->status, FLUID_PLAYER_READY); + fluid_atomic_int_set(&player->stopping, 0); player->loop = 1; player->ntracks = 0; @@ -1786,9 +1787,9 @@ fluid_player_reset(fluid_player_t *player) } } - /* player->current_file = NULL; */ - /* player->status = FLUID_PLAYER_READY; */ - /* player->loop = 1; */ + /* player->current_file = NULL; */ + /* player->status = FLUID_PLAYER_READY; */ + /* player->loop = 1; */ player->ntracks = 0; player->division = 0; player->miditempo = 500000; @@ -2088,7 +2089,11 @@ fluid_player_callback(void *data, unsigned int msec) if(fluid_player_get_status(player) != FLUID_PLAYER_PLAYING) { - fluid_synth_all_notes_off(synth, -1); + if(fluid_atomic_int_get(&player->stopping)) + { + fluid_synth_all_notes_off(synth, -1); + fluid_atomic_int_set(&player->stopping, 0); + } return 1; } do @@ -2198,6 +2203,7 @@ int fluid_player_stop(fluid_player_t *player) { fluid_atomic_int_set(&player->status, FLUID_PLAYER_DONE); + fluid_atomic_int_set(&player->stopping, 1); fluid_player_seek(player, fluid_player_get_current_tick(player)); return FLUID_OK; } diff --git a/src/midi/fluid_midi.h b/src/midi/fluid_midi.h index 4b33383c..fededcd1 100644 --- a/src/midi/fluid_midi.h +++ b/src/midi/fluid_midi.h @@ -285,6 +285,7 @@ typedef struct struct _fluid_player_t { fluid_atomic_int_t status; + fluid_atomic_int_t stopping; /* Flag for sending all_notes_off when player is stopped */ int ntracks; fluid_track_t *track[MAX_NUMBER_OF_TRACKS]; fluid_synth_t *synth;