mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-05 06:58:49 +00:00
pulsesink: use relative seeks
Use relative seeks because I was told that absolute seeks don't work.
This commit is contained in:
parent
bb03d8ff18
commit
e914f5254a
1 changed files with 14 additions and 4 deletions
|
@ -106,6 +106,7 @@ struct _GstPulseRingBuffer
|
||||||
|
|
||||||
pa_sample_spec sample_spec;
|
pa_sample_spec sample_spec;
|
||||||
gint64 offset;
|
gint64 offset;
|
||||||
|
gint64 write_offset;
|
||||||
|
|
||||||
gboolean corked;
|
gboolean corked;
|
||||||
gboolean in_commit;
|
gboolean in_commit;
|
||||||
|
@ -542,7 +543,7 @@ gst_pulsering_stream_latency_cb (pa_stream * s, void *userdata)
|
||||||
|
|
||||||
GST_LOG_OBJECT (psink,
|
GST_LOG_OBJECT (psink,
|
||||||
"latency_update, %" G_GUINT64_FORMAT ", %d:%" G_GINT64_FORMAT ", %d:%"
|
"latency_update, %" G_GUINT64_FORMAT ", %d:%" G_GINT64_FORMAT ", %d:%"
|
||||||
G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT "\n",
|
G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT ", %" G_GUINT64_FORMAT,
|
||||||
GST_TIMEVAL_TO_TIME (info->timestamp), info->write_index_corrupt,
|
GST_TIMEVAL_TO_TIME (info->timestamp), info->write_index_corrupt,
|
||||||
info->write_index, info->read_index_corrupt, info->read_index,
|
info->write_index, info->read_index_corrupt, info->read_index,
|
||||||
info->sink_usec, info->configured_sink_usec);
|
info->sink_usec, info->configured_sink_usec);
|
||||||
|
@ -669,6 +670,7 @@ gst_pulseringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
|
||||||
else
|
else
|
||||||
pbuf->offset = -gst_util_uint64_scale_int (-time_offset,
|
pbuf->offset = -gst_util_uint64_scale_int (-time_offset,
|
||||||
pbuf->sample_spec.rate, GST_SECOND);
|
pbuf->sample_spec.rate, GST_SECOND);
|
||||||
|
pbuf->write_offset = 0;
|
||||||
GST_LOG_OBJECT (psink, "sample offset %" G_GINT64_FORMAT, pbuf->offset);
|
GST_LOG_OBJECT (psink, "sample offset %" G_GINT64_FORMAT, pbuf->offset);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
@ -1085,7 +1087,7 @@ gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
|
||||||
gboolean reverse;
|
gboolean reverse;
|
||||||
gint *toprocess;
|
gint *toprocess;
|
||||||
gint inr, outr, bps;
|
gint inr, outr, bps;
|
||||||
gint64 offset;
|
gint64 offset, diff;
|
||||||
guint bufsize;
|
guint bufsize;
|
||||||
|
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
||||||
|
@ -1151,6 +1153,9 @@ gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
|
||||||
/* offset is in bytes */
|
/* offset is in bytes */
|
||||||
offset *= bps;
|
offset *= bps;
|
||||||
|
|
||||||
|
diff = offset - pbuf->write_offset;
|
||||||
|
pbuf->write_offset = offset;
|
||||||
|
|
||||||
while (*toprocess > 0) {
|
while (*toprocess > 0) {
|
||||||
size_t avail;
|
size_t avail;
|
||||||
guint towrite;
|
guint towrite;
|
||||||
|
@ -1198,11 +1203,13 @@ gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
|
||||||
|
|
||||||
if (G_LIKELY (inr == outr && !reverse)) {
|
if (G_LIKELY (inr == outr && !reverse)) {
|
||||||
/* no rate conversion, simply write out the samples */
|
/* no rate conversion, simply write out the samples */
|
||||||
if (pa_stream_write (pbuf->stream, data, towrite, NULL, offset,
|
if (pa_stream_write (pbuf->stream, data, towrite, NULL, diff,
|
||||||
PA_SEEK_ABSOLUTE) < 0)
|
PA_SEEK_RELATIVE) < 0)
|
||||||
goto write_failed;
|
goto write_failed;
|
||||||
|
|
||||||
data += towrite;
|
data += towrite;
|
||||||
|
diff = 0;
|
||||||
|
pbuf->write_offset += towrite;
|
||||||
in_samples -= avail;
|
in_samples -= avail;
|
||||||
out_samples -= avail;
|
out_samples -= avail;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1556,6 +1563,9 @@ gst_pulsesink_init (GstPulseSink * pulsesink, GstPulseSinkClass * klass)
|
||||||
/* needed for conditional execution */
|
/* needed for conditional execution */
|
||||||
pulsesink->pa_version = pa_get_library_version ();
|
pulsesink->pa_version = pa_get_library_version ();
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (pulsesink, "using pulseaudio version %s",
|
||||||
|
pulsesink->pa_version);
|
||||||
|
|
||||||
g_assert ((pulsesink->mainloop = pa_threaded_mainloop_new ()));
|
g_assert ((pulsesink->mainloop = pa_threaded_mainloop_new ()));
|
||||||
g_assert (pa_threaded_mainloop_start (pulsesink->mainloop) == 0);
|
g_assert (pa_threaded_mainloop_start (pulsesink->mainloop) == 0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue