Guard the sequencer API

This commit is contained in:
derselbst 2019-12-14 18:38:27 +01:00
parent cd199cfdc8
commit 13c6e98936
2 changed files with 49 additions and 22 deletions

View file

@ -176,6 +176,8 @@ delete_fluid_sequencer(fluid_sequencer_t *seq)
int
fluid_sequencer_get_use_system_timer(fluid_sequencer_t *seq)
{
fluid_return_val_if_fail(seq != NULL, FALSE);
return seq->useSystemTimer;
}
@ -203,6 +205,8 @@ fluid_sequencer_register_client(fluid_sequencer_t *seq, const char *name,
fluid_sequencer_client_t *client;
char *nameCopy;
fluid_return_val_if_fail(seq != NULL, FLUID_FAILED);
client = FLUID_NEW(fluid_sequencer_client_t);
if(client == NULL)
@ -242,10 +246,7 @@ fluid_sequencer_unregister_client(fluid_sequencer_t *seq, fluid_seq_id_t id)
{
fluid_list_t *tmp;
if(seq->clients == NULL)
{
return;
}
fluid_return_if_fail(seq != NULL);
tmp = seq->clients;
@ -280,7 +281,7 @@ fluid_sequencer_unregister_client(fluid_sequencer_t *seq, fluid_seq_id_t id)
int
fluid_sequencer_count_clients(fluid_sequencer_t *seq)
{
if(seq->clients == NULL)
if(seq == NULL || seq->clients == NULL)
{
return 0;
}
@ -296,7 +297,12 @@ fluid_sequencer_count_clients(fluid_sequencer_t *seq)
*/
fluid_seq_id_t fluid_sequencer_get_client_id(fluid_sequencer_t *seq, int index)
{
fluid_list_t *tmp = fluid_list_nth(seq->clients, index);
fluid_list_t *tmp;
fluid_return_val_if_fail(seq != NULL, FLUID_FAILED);
fluid_return_val_if_fail(index >= 0, FLUID_FAILED);
tmp = fluid_list_nth(seq->clients, index);
if(tmp == NULL)
{
@ -321,10 +327,7 @@ fluid_sequencer_get_client_name(fluid_sequencer_t *seq, fluid_seq_id_t id)
{
fluid_list_t *tmp;
if(seq->clients == NULL)
{
return NULL;
}
fluid_return_val_if_fail(seq != NULL, NULL);
tmp = seq->clients;
@ -354,10 +357,7 @@ fluid_sequencer_client_is_dest(fluid_sequencer_t *seq, fluid_seq_id_t id)
{
fluid_list_t *tmp;
if(seq->clients == NULL)
{
return FALSE;
}
fluid_return_val_if_fail(seq != NULL, FALSE);
tmp = seq->clients;
@ -384,10 +384,16 @@ fluid_sequencer_client_is_dest(fluid_sequencer_t *seq, fluid_seq_id_t id)
void
fluid_sequencer_send_now(fluid_sequencer_t *seq, fluid_event_t *evt)
{
fluid_seq_id_t destID = fluid_event_get_dest(evt);
fluid_seq_id_t destID;
fluid_list_t *tmp;
fluid_return_if_fail(seq != NULL);
fluid_return_if_fail(evt != NULL);
destID = fluid_event_get_dest(evt);
/* find callback */
fluid_list_t *tmp = seq->clients;
tmp = seq->clients;
while(tmp)
{
@ -422,6 +428,9 @@ fluid_sequencer_send_at(fluid_sequencer_t *seq, fluid_event_t *evt,
{
unsigned int now = fluid_sequencer_get_tick(seq);
fluid_return_val_if_fail(seq != NULL, FLUID_FAILED);
fluid_return_val_if_fail(evt != NULL, FLUID_FAILED);
/* set absolute */
if(!absolute)
{
@ -446,6 +455,8 @@ void
fluid_sequencer_remove_events(fluid_sequencer_t *seq, fluid_seq_id_t source,
fluid_seq_id_t dest, int type)
{
fluid_return_if_fail(seq != NULL);
_fluid_seq_queue_pre_remove(seq, source, dest, type);
}
@ -462,9 +473,13 @@ fluid_sequencer_remove_events(fluid_sequencer_t *seq, fluid_seq_id_t source,
unsigned int
fluid_sequencer_get_tick(fluid_sequencer_t *seq)
{
unsigned int absMs = seq->useSystemTimer ? (int) fluid_curtime() : fluid_atomic_int_get(&seq->currentMs);
unsigned int absMs;
double nowFloat;
unsigned int now;
fluid_return_val_if_fail(seq != NULL, 0u);
absMs = seq->useSystemTimer ? (int) fluid_curtime() : fluid_atomic_int_get(&seq->currentMs);
nowFloat = ((double)(absMs - seq->startMs)) * seq->scale / 1000.0f;
now = nowFloat;
return now;
@ -482,6 +497,8 @@ fluid_sequencer_get_tick(fluid_sequencer_t *seq)
void
fluid_sequencer_set_time_scale(fluid_sequencer_t *seq, double scale)
{
fluid_return_if_fail(seq != NULL);
if(scale <= 0)
{
FLUID_LOG(FLUID_WARN, "sequencer: scale <= 0 : %f\n", scale);
@ -542,6 +559,7 @@ fluid_sequencer_set_time_scale(fluid_sequencer_t *seq, double scale)
double
fluid_sequencer_get_time_scale(fluid_sequencer_t *seq)
{
fluid_return_val_if_fail(seq != NULL, 0);
return seq->scale;
}

View file

@ -104,6 +104,9 @@ fluid_sequencer_register_fluidsynth(fluid_sequencer_t *seq, fluid_synth_t *synth
{
fluid_seqbind_t *seqbind;
fluid_return_val_if_fail(seq != NULL, FLUID_FAILED);
fluid_return_val_if_fail(synth != NULL, FLUID_FAILED);
seqbind = FLUID_NEW(fluid_seqbind_t);
if(seqbind == NULL)
@ -112,10 +115,10 @@ fluid_sequencer_register_fluidsynth(fluid_sequencer_t *seq, fluid_synth_t *synth
return FLUID_FAILED;
}
FLUID_MEMSET(seqbind, 0, sizeof(*seqbind));
seqbind->synth = synth;
seqbind->seq = seq;
seqbind->sample_timer = NULL;
seqbind->client_id = -1;
/* set up the sample timer */
if(!fluid_sequencer_get_use_system_timer(seq))
@ -135,7 +138,7 @@ fluid_sequencer_register_fluidsynth(fluid_sequencer_t *seq, fluid_synth_t *synth
seqbind->client_id =
fluid_sequencer_register_client(seq, "fluidsynth", fluid_seq_fluidsynth_callback, (void *)seqbind);
if(seqbind->client_id == -1)
if(seqbind->client_id == FLUID_FAILED)
{
delete_fluid_seqbind(seqbind);
return FLUID_FAILED;
@ -307,8 +310,14 @@ int
fluid_sequencer_add_midi_event_to_buffer(void *data, fluid_midi_event_t *event)
{
fluid_event_t evt;
fluid_sequencer_t *seq = (fluid_sequencer_t *) data;
int chan = fluid_midi_event_get_channel(event);
fluid_sequencer_t *seq;
int chan;
fluid_return_val_if_fail(data != NULL, FLUID_FAILED);
fluid_return_val_if_fail(event != NULL, FLUID_FAILED);
seq = (fluid_sequencer_t *) data;
chan = fluid_midi_event_get_channel(event);
fluid_event_clear(&evt);
fluid_event_set_time(&evt, fluid_sequencer_get_tick(seq));