void MusicDriver_LibTimidity::StopSong() { _midi.status = MIDI_STOPPED; /* mid_song_free cannot handle NULL! */ if (_midi.song != NULL) mid_song_free(_midi.song); _midi.song = NULL; }
MidiDecoder::~MidiDecoder() { if (d->song != 0) mid_song_free(d->song); delete d; }
static void timidity_close (void *void_data) { struct timidity_data *data = (struct timidity_data *)void_data; if (data->midisong) { mid_song_free(data->midisong); } }
static void timidity_close (void *void_data) { struct timidity_data *data = (struct timidity_data *)void_data; if (data->midisong) { mid_song_free(data->midisong); } decoder_error_clear (&data->error); free (data); }
static GstStateChangeReturn gst_timidity_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstTimidity *timidity = GST_TIMIDITY (element); if (!timidity->initialized) { GST_WARNING ("Timidity renderer is not initialized"); return GST_STATE_CHANGE_FAILURE; } switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: timidity->out_caps = gst_caps_copy (gst_pad_get_pad_template_caps (timidity->srcpad)); timidity->mididata = NULL; break; case GST_STATE_CHANGE_READY_TO_PAUSED: timidity->mididata_size = 0; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: if (timidity->song) mid_song_free (timidity->song); timidity->song = NULL; timidity->mididata_size = 0; if (timidity->mididata) { g_free (timidity->mididata); timidity->mididata = NULL; } break; case GST_STATE_CHANGE_READY_TO_NULL: gst_caps_unref (timidity->out_caps); break; default: break; } return ret; }
static void do_song_load(MidIStream *stream, MidSongOptions *options, MidSong **out) { MidSong *song; int i; *out = NULL; if (!stream) return; if (options->rate < MIN_OUTPUT_RATE || options->rate > MAX_OUTPUT_RATE) { DEBUG_MSG("Bad sample rate %d\n",options->rate); return; } if (options->channels != 1 && options->channels != 2) { DEBUG_MSG("Bad channels %u\n",options->channels); return; } switch (options->format) { case MID_AUDIO_S8: case MID_AUDIO_U8: case MID_AUDIO_S16LSB: case MID_AUDIO_S16MSB: case MID_AUDIO_U16LSB: case MID_AUDIO_U16MSB: break; /* supported */ default: DEBUG_MSG("Bad audio format 0x%x\n",options->format); return; } /* Allocate memory for the song */ song = (MidSong *)timi_calloc(sizeof(MidSong)); if (!song) return; for (i = 0; i < 128; i++) { if (master_tonebank[i]) { song->tonebank[i] = (MidToneBank *) timi_calloc(sizeof(MidToneBank)); if (!song->tonebank[i]) goto fail; song->tonebank[i]->tone = master_tonebank[i]->tone; } if (master_drumset[i]) { song->drumset[i] = (MidToneBank *) timi_calloc(sizeof(MidToneBank)); if (!song->drumset[i]) goto fail; song->drumset[i]->tone = master_drumset[i]->tone; } } song->amplification = DEFAULT_AMPLIFICATION; song->voices = DEFAULT_VOICES; song->drumchannels = DEFAULT_DRUMCHANNELS; song->rate = options->rate; song->encoding = 0; if (options->format & 0x0010) song->encoding |= PE_16BIT; if (options->format & 0x8000) song->encoding |= PE_SIGNED; if (options->channels == 1) song->encoding |= PE_MONO; switch (options->format) { case MID_AUDIO_S8: song->write = timi_s32tos8; break; case MID_AUDIO_U8: song->write = timi_s32tou8; break; case MID_AUDIO_S16LSB: song->write = timi_s32tos16l; break; case MID_AUDIO_S16MSB: song->write = timi_s32tos16b; break; case MID_AUDIO_U16LSB: song->write = timi_s32tou16l; break; case MID_AUDIO_U16MSB: song->write = timi_s32tou16b; break; } song->buffer_size = options->buffer_size; song->resample_buffer = (sample_t *) timi_calloc(options->buffer_size * sizeof(sample_t)); if (!song->resample_buffer) goto fail; song->common_buffer = (sint32 *) timi_calloc(options->buffer_size * 2 * sizeof(sint32)); if (!song->common_buffer) goto fail; song->bytes_per_sample = 2; if (song->encoding & PE_16BIT) song->bytes_per_sample *= 2; if (song->encoding & PE_MONO) song->bytes_per_sample /= 2; song->control_ratio = options->rate / CONTROLS_PER_SECOND; if (song->control_ratio < 1) song->control_ratio = 1; else if (song->control_ratio > MAX_CONTROL_RATIO) song->control_ratio = MAX_CONTROL_RATIO; song->lost_notes = 0; song->cut_notes = 0; song->events = read_midi_file(stream, song, &(song->groomed_event_count), &song->samples); /* Make sure everything is okay */ if (!song->events) goto fail; song->default_instrument = NULL; song->default_program = DEFAULT_PROGRAM; if (*def_instr_name) set_default_instrument(song, def_instr_name); load_missing_instruments(song); if (! song->oom) *out = song; else { fail: mid_song_free (song); } }