/* generate audio data and advance internal timers */ static GstBuffer * gst_wildmidi_get_buffer (GstWildmidi * wildmidi) { size_t size; gint64 samples; GstBuffer *buffer; GstSegment *segment; GstMapInfo info; guint bpf; bpf = wildmidi->bytes_per_frame; buffer = gst_buffer_new_and_alloc (256 * bpf); gst_buffer_map (buffer, &info, GST_MAP_READWRITE); GST_OBJECT_LOCK (wildmidi); size = WildMidi_GetOutput (wildmidi->song, (gpointer) info.data, (unsigned long int) info.size); GST_OBJECT_UNLOCK (wildmidi); gst_buffer_unmap (buffer, &info); if (size == 0) { gst_buffer_unref (buffer); return NULL; } /* adjust buffer size */ gst_buffer_resize (buffer, 0, size); segment = wildmidi->o_segment; GST_BUFFER_OFFSET (buffer) = segment->position; GST_BUFFER_TIMESTAMP (buffer) = gst_util_uint64_scale_int (segment->position, GST_SECOND, WILDMIDI_RATE); samples = size / bpf; segment->position += samples; GST_BUFFER_OFFSET_END (buffer) = segment->position; GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (segment->position, GST_SECOND, WILDMIDI_RATE) - GST_BUFFER_TIMESTAMP (buffer); GST_DEBUG_OBJECT (wildmidi, "buffer ts: %" GST_TIME_FORMAT ", " "duration: %" GST_TIME_FORMAT " (%" G_GINT64_FORMAT " samples)", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)), samples); return gst_wildmidi_clip_buffer (wildmidi, buffer); }
/* generate audio data and advance internal timers */ static GstBuffer * gst_wildmidi_get_buffer (GstWildmidi * wildmidi) { size_t bytes_read; gint64 samples; GstBuffer *buffer; GstSegment *segment; guint8 *data; guint size; guint bpf; bpf = wildmidi->bytes_per_frame; buffer = gst_buffer_new_and_alloc (256 * bpf); data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); GST_OBJECT_LOCK (wildmidi); bytes_read = WildMidi_GetOutput (wildmidi->song, (char *) data, (unsigned long int) size); GST_OBJECT_UNLOCK (wildmidi); if (bytes_read == 0) { gst_buffer_unref (buffer); return NULL; } /* adjust buffer size */ size = GST_BUFFER_SIZE (buffer) = bytes_read; segment = wildmidi->o_segment; GST_BUFFER_OFFSET (buffer) = segment->last_stop; GST_BUFFER_TIMESTAMP (buffer) = gst_util_uint64_scale_int (segment->last_stop, GST_SECOND, WILDMIDI_RATE); samples = size / bpf; segment->last_stop += samples; GST_BUFFER_OFFSET_END (buffer) = segment->last_stop; GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (segment->last_stop, GST_SECOND, WILDMIDI_RATE) - GST_BUFFER_TIMESTAMP (buffer); GST_DEBUG_OBJECT (wildmidi, "buffer ts: %" GST_TIME_FORMAT ", " "duration: %" GST_TIME_FORMAT " (%" G_GINT64_FORMAT " samples)", GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)), samples); return gst_wildmidi_clip_buffer (wildmidi, buffer); }