Example #1
0
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);
}
Example #2
0
/**
 * 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;
}
Example #3
0
/**
 * 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);
		}
	}
}
Example #4
0
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;
}