static void AudioOutCallback(void *buf, unsigned int _reqn, void *userdata) { memset(buf, 0, _reqn * PSP_NUM_AUDIO_CHANNELS); if (_midi.status == MIDI_PLAYING) { mid_song_read_wave(_midi.song, buf, _reqn * PSP_NUM_AUDIO_CHANNELS); } }
static int timidity_decode (void *void_data, char *buf, int buf_len, struct sound_params *sound_params) { struct timidity_data *data = (struct timidity_data *)void_data; sound_params->channels = midioptions.channels; sound_params->rate = midioptions.rate; sound_params->fmt = (midioptions.format==MID_AUDIO_S16LSB)?(SFMT_S16 | SFMT_LE):SFMT_S8; return mid_song_read_wave(data->midisong, buf, buf_len); }
/* generate audio data and advance internal timers */ static GstBuffer * gst_timidity_fill_buffer (GstTimidity * timidity, GstBuffer * buffer) { size_t bytes_read; gint64 samples; bytes_read = mid_song_read_wave (timidity->song, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); if (bytes_read == 0) { gst_buffer_unref (buffer); return NULL; } GST_BUFFER_OFFSET (buffer) = timidity->o_segment->last_stop * timidity->bytes_per_frame; GST_BUFFER_TIMESTAMP (buffer) = timidity->o_segment->last_stop * timidity->time_per_frame; if (bytes_read < GST_BUFFER_SIZE (buffer)) { GstBuffer *old = buffer; buffer = gst_buffer_create_sub (buffer, 0, bytes_read); gst_buffer_unref (old); } samples = GST_BUFFER_SIZE (buffer) / timidity->bytes_per_frame; timidity->o_segment->last_stop += samples; GST_BUFFER_OFFSET_END (buffer) = timidity->o_segment->last_stop * timidity->bytes_per_frame; GST_BUFFER_DURATION (buffer) = samples * timidity->time_per_frame; GST_DEBUG_OBJECT (timidity, "generated buffer %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT " (%" G_GINT64_FORMAT " samples)", GST_TIME_ARGS ((guint64) GST_BUFFER_TIMESTAMP (buffer)), GST_TIME_ARGS (((guint64) (GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer)))), samples); return buffer; }
//private: qint64 MidiDecoder::readData(char *data, qint64 maxlen) { if (d->state != QtopiaMedia::Playing) return 0; qint64 rc = 0; if (maxlen > 0) { quint32 position = (mid_song_get_time(d->song) / 1000) * 1000; if (d->position != position) { d->position = position; emit positionChanged(d->position); } if ((rc = (qint64) mid_song_read_wave(d->song, data, maxlen)) == 0) { seek(0); mid_song_start(d->song); emit playerStateChanged(d->state = QtopiaMedia::Stopped); } } return rc; }