static void _fluid_seq_queue_end(fluid_sequencer_t* seq) { int i; /* free all remaining events */ _fluid_free_evt_queue(&seq->preQueue, &seq->preQueueLast); for (i = 0; i < 256; i++) _fluid_free_evt_queue(&(seq->queue0[i][0]), &(seq->queue0[i][1])); for (i = 0; i < 255; i++) _fluid_free_evt_queue(&(seq->queue1[i][0]), &(seq->queue1[i][1])); _fluid_free_evt_queue(&seq->queueLater, NULL); if (seq->timer) { delete_fluid_timer(seq->timer); seq->timer = NULL; } if (seq->heap) { _fluid_evt_heap_free(seq->heap); seq->heap = NULL; } fluid_mutex_destroy(seq->mutex); }
/** * Stops a MIDI player. * @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; return FLUID_OK; }
/** * Set the time scale of a sequencer. * @param seq Sequencer object * @param scale Sequencer scale value in ticks per second * (default is 1000 for 1 tick per millisecond, max is 1000.0) * * If there are already scheduled events in the sequencer and the scale is changed * the events are adjusted accordingly. */ void fluid_sequencer_set_time_scale (fluid_sequencer_t* seq, double scale) { if (scale <= 0) { fluid_log(FLUID_WARN, "sequencer: scale <= 0 : %f\n", scale); return; } if (scale > 1000.0) // Otherwise : problems with the timer = 0ms... scale = 1000.0; if (seq->scale != scale) { double oldScale = seq->scale; // stop timer if (seq->timer) { delete_fluid_timer(seq->timer); seq->timer = NULL; } seq->scale = scale; // change start0 so that cellNb is preserved seq->queue0StartTime = (seq->queue0StartTime + seq->prevCellNb)*(seq->scale/oldScale) - seq->prevCellNb; // change all preQueue events for new scale { fluid_evt_entry* tmp; tmp = seq->preQueue; while (tmp) { if (tmp->entryType == FLUID_EVT_ENTRY_INSERT) tmp->evt.time = tmp->evt.time*seq->scale/oldScale; tmp = tmp->next; } } /* re-start timer */ if (seq->useSystemTimer) { seq->timer = new_fluid_timer((int)(1000/seq->scale), _fluid_seq_queue_process, (void *)seq, TRUE, FALSE, TRUE); } } }
int delete_fluid_file_audio_driver(fluid_audio_driver_t* p) { fluid_file_audio_driver_t* dev = (fluid_file_audio_driver_t*) p; if (dev == NULL) { return FLUID_OK; } if (dev->timer != NULL) { delete_fluid_timer(dev->timer); } if (dev->renderer != NULL) { delete_fluid_file_renderer(dev->renderer); } FLUID_FREE(dev); return FLUID_OK; }