[Bug 755050] New: pulsesink: no sound heard very shortly at starting of resuming playback.

GStreamer (GNOME Bugzilla) bugzilla at gnome.org
Tue Sep 15 03:15:43 PDT 2015


https://bugzilla.gnome.org/show_bug.cgi?id=755050

            Bug ID: 755050
           Summary: pulsesink: no sound heard very shortly at starting of
                    resuming playback.
    Classification: Platform
           Product: GStreamer
           Version: 1.4.1
                OS: Linux
            Status: NEW
          Severity: major
          Priority: Normal
         Component: gst-plugins-good
          Assignee: gstreamer-bugs at lists.freedesktop.org
          Reporter: see2002 at gmail.com
        QA Contact: gstreamer-bugs at lists.freedesktop.org
     GNOME version: ---

Dear all,

When I use pulsesink based playback, I found no sound heard very shortly(around
100ms) when resume paused playback.
The reproduce step is:
 - play 1 second (44100Hz, mono, 16bit signed short) of wav file via pulsesink,
 - pause playback around EOS (1sec),
 - seek to 0, resume.
 - pcm was dropped(no sound) around 100ms at starting of resume.


// pa_stream_write() at the end of playback

0:00:47.458404541    pulse
pulsesink.c:783:gst_pulsering_stream_request_cb:<pulsesink3> got request for
length 6856
0:00:47.459289550    pulse
pulsesink.c:1824:gst_pulseringbuffer_commit:<pulsesink3> requesting 2276 bytes
of shared memory
0:00:47.459381103    pulse
pulsesink.c:1833:gst_pulseringbuffer_commit:<pulsesink3> got 2276 bytes of
shared memory
0:00:47.459411621    pulse
pulsesink.c:1842:gst_pulseringbuffer_commit:<pulsesink3> writing 1138 samples
at offset 342180
0:00:47.459472656    pulse
pulsesink.c:1895:gst_pulseringbuffer_commit:<pulsesink3> flushing 1138 samples
at offset 342180
0:00:47.459564209    pulse
pulsesink.c:1939:gst_pulseringbuffer_commit:<pulsesink3> wrote 1138 samples

// end of buffer, pulsesink got eos event.

0:00:47.459777832 basesink gstbasesink.c:3191:gst_base_sink_event:<pulsesink3>
received event 0xaf8be130 eos event: 0xaf8be130, time 99:99:99.999999999,
seq-num 1241, (NULL)
0:00:47.459869384 pulse pulsesink.c:1998:gst_pulsering_flush:<pulsesink3>
entering flush
0:00:47.459991455 basesink
gstbasesink.c:1854:gst_base_sink_get_sync_times:<pulsesink3> sync times for EOS
99:99:99.999999999
0:00:47.460052490 basesink gstbasesink.c:2308:gst_base_sink_wait:<pulsesink3>
checking preroll 0

// try to wait until 3.905 sec

0:00:47.460083007 basesink gstbasesink.c:2319:gst_base_sink_wait:<pulsesink3>
possibly waiting for clock to reach 0:00:01.001043084
0:00:47.460113525 basesink
gstbasesink.c:2073:gst_base_sink_wait_clock:<pulsesink3> time
0:00:01.001043084, base_time 0:00:02.903992000
0:00:47.460205078    pulse pulsesink.c:2414:gst_pulsesink_get_time:<pulsesink3>
current time is 0:00:03.739977000
0:00:47.519287109    pulse pulsesink.c:2414:gst_pulsesink_get_time:<pulsesink3>
current time is 0:00:03.802569000
0:00:47.519683838    pulse pulsesink.c:2414:gst_pulsesink_get_time:<pulsesink3>
current time is 0:00:03.802989000
0:00:47.519927978    pulse pulsesink.c:2414:gst_pulsesink_get_time:<pulsesink3>
current time is 0:00:03.803247000
0:00:47.520233154    pulse pulsesink.c:2414:gst_pulsesink_get_time:<pulsesink3>
current time is 0:00:03.803602000

// waiting was broken due to application tried to pause.

0:00:47.520477295 pulse pulsesink.c:1490:gst_pulseringbuffer_pause:<pulsesink3>
pausing and corking
0:00:47.520507812 pulse pulsesink.c:1355:gst_pulsering_set_corked:<pulsesink3>
setting corked state to 1
0:00:47.525177002    pulse
pulsesink.c:856:gst_pulsering_stream_latency_cb:<pulsesink3> latency_update,
1441797905315028000, 0:344456, 0:345094, 90252, 90000
0:00:47.525390625    pulse
pulsesink.c:783:gst_pulsering_stream_request_cb:<pulsesink3> got request for
length 10340
0:00:47.525543213    pulse
pulsesink.c:801:gst_pulsering_stream_underflow_cb:<pulsesink3> Got underflow
0:00:47.526428222    pulse
pulsesink.c:550:gst_pulsering_context_subscribe_cb:<pulsesink6> type 0012, idx
347
0:00:47.526489257    pulse
pulsesink.c:550:gst_pulsering_context_subscribe_cb:<pulsesink5> type 0012, idx
347
0:00:47.526550293    pulse
pulsesink.c:550:gst_pulsering_context_subscribe_cb:<pulsesink4> type 0012, idx
347
0:00:47.526580810    pulse
pulsesink.c:550:gst_pulsering_context_subscribe_cb:<pulsesink3> type 0012, idx
347
0:00:47.526611328    pulse
pulsesink.c:550:gst_pulsering_context_subscribe_cb:<pulsesink2> type 0012, idx
347
0:00:47.526672363    pulse
pulsesink.c:550:gst_pulsering_context_subscribe_cb:<pulsesink1> type 0012, idx
347
0:00:47.526702881    pulse
pulsesink.c:550:gst_pulsering_context_subscribe_cb:<pulsesink0> type 0012, idx
347

// read_index & write_index became 344456 (3.905 sec) after pause, it seems ok.

0:00:47.526824951    pulse
pulsesink.c:856:gst_pulsering_stream_latency_cb:<pulsesink3> latency_update,
1441797905317561000, 0:344456, 0:344456, 80791, 90000
0:00:47.526977539    pulse
pulsesink.c:856:gst_pulsering_stream_latency_cb:<pulsesink3> latency_update,
1441797905318721000, 0:344456, 0:344456, 79297, 90000
0:00:47.527343750 basesink gstbasesink.c:2328:gst_base_sink_wait:<pulsesink3>
clock returned 2
0:00:47.527404785 basesink gstbasesink.c:2308:gst_base_sink_wait:<pulsesink3>
checking preroll 1
0:00:47.528472900    pulse pulsesink.c:2414:gst_pulsesink_get_time:<pulsesink3>
current time is 0:00:03.805343000
0:00:47.537872314    pulse
pulsesink.c:856:gst_pulsering_stream_latency_cb:<pulsesink3> latency_update,
1441797905330501000, 0:344456, 0:344456, 67521, 90000
0:00:47.559356689    pulse
pulsesink.c:856:gst_pulsering_stream_latency_cb:<pulsesink3> latency_update,
1441797905351955000, 0:344456, 0:344456, 89655, 90000

// application try to seek & flush using pa_stream_flush()

0:00:47.592529297 basesink
gstbasesink.c:4366:gst_base_sink_send_event:<pulsesink3> handling event
0xaf8be010 seek event: 0xaf8be010, time 99:99:99.999999999, seq-num 1287,
GstEventSeek, rate=(double)1, format=(GstFormat)GST_FORMAT_TIME,
flags=(GstSeekFlags)GST_SEEK_FLAG_FLUSH+GST_SEEK_FLAG_ACCURATE,
cur-type=(GstSeekType)GST_SEEK_TYPE_SET, cur=(gint64)0,
stop-type=(GstSeekType)GST_SEEK_TYPE_NONE, stop=(gint64)-1;
0:00:47.593109131 basesink gstbasesink.c:3191:gst_base_sink_event:<pulsesink3>
received event 0xb85b3170 flush-start event: 0xb85b3170, time
99:99:99.999999999, seq-num 1288, (NULL)
0:00:47.593475341 basesink
gstbasesink.c:3000:gst_base_sink_default_event:<pulsesink3> flush-start
0xb85b3170
0:00:47.593719482 basesink gstbasesink.c:2349:gst_base_sink_wait:<pulsesink3>
we are flushing
0:00:47.594177246    pulse pulsesink.c:2414:gst_pulsesink_get_time:<pulsesink3>
current time is 0:00:03.805343000
0:00:47.594818115 basesink gstbasesink.c:3191:gst_base_sink_event:<pulsesink3>
received event 0xb85b30e0 flush-stop event: 0xb85b30e0, time
99:99:99.999999999, seq-num 1296, GstEventFlushStop, reset-time=(boolean)true;
0:00:47.595062256 pulse pulsesink.c:1404:gst_pulseringbuffer_clear:<pulsesink3>
clearing
0:00:47.597290039    pulse
pulsesink.c:856:gst_pulsering_stream_latency_cb:<pulsesink3> latency_update,
1441797905389064000, 1:344456, 0:344456, 88854, 90000
0:00:47.597503662    pulse
pulsesink.c:856:gst_pulsering_stream_latency_cb:<pulsesink3> latency_update,
1441797905389735000, 0:344456, 0:344456, 88153, 90000
0:00:47.597747802 basesink
gstbasesink.c:3010:gst_base_sink_default_event:<pulsesink3> flush-stop
0xb85b30e0, reset_time: 1
0:00:47.600616455 basesink gstbasesink.c:3191:gst_base_sink_event:<pulsesink3>
received event 0xaf8be178 segment event: 0xaf8be178, time 99:99:99.999999999,
seq-num 1298, GstEventSegment, segment=(GstSegment)"GstSegment,
flags=(GstSegmentFlags)GST_SEGMENT_FLAG_RESET, rate=(double)1,
applied-rate=(double)1, format=(GstFormat)GST_FORMAT_TIME, base=(guint64)0,
offset=(guint64)0, start=(guint64)0, stop=(guint64)18446744073709551615,
time=(guint64)0, position=(guint64)0, duration=(guint64)1001043084;";
0:00:47.601135254 basesink
gstbasesink.c:1902:gst_base_sink_get_sync_times:<pulsesink3> got times start:
0:00:00.000000000, stop: 0:00:00.046439910, do_sync 0
0:00:47.601226806 basesink
gstbasesink.c:1455:gst_base_sink_commit_state:<pulsesink3> commiting state to
PAUSED
0:00:47.601257324 basesink
gstbasesink.c:1480:gst_base_sink_commit_state:<pulsesink3> posting PAUSED state
change message
0:00:47.601318359 basesink
gstbasesink.c:1486:gst_base_sink_commit_state:<pulsesink3> posting async-done
message
0:00:47.602111816 basesink
gstbasesink.c:4413:gst_base_sink_send_event:<pulsesink3> handled event
0xaf8be010 seek event: 0xaf8be010, time 99:99:99.999999999, seq-num 1287,
GstEventSeek, rate=(double)1, format=(GstFormat)GST_FORMAT_TIME,
flags=(GstSeekFlags)GST_SEEK_FLAG_FLUSH+GST_SEEK_FLAG_ACCURATE,
cur-type=(GstSeekType)GST_SEEK_TYPE_SET, cur=(gint64)0,
stop-type=(GstSeekType)GST_SEEK_TYPE_NONE, stop=(gint64)-1;: 1
0:00:47.606475830    pulse
pulsesink.c:856:gst_pulsering_stream_latency_cb:<pulsesink3> latency_update,
1441797905399135000, 0:344456, 0:344456, 78731, 90000
0:00:47.609008789    pulse pulsesink.c:2414:gst_pulsesink_get_time:<pulsesink3>
current time is 0:00:03.805343000
0:00:47.609649658 basesink
gstbasesink.c:4366:gst_base_sink_send_event:<pulsesink3> handling event
0xb85b3050 latency event: 0xb85b3050, time 99:99:99.999999999, seq-num 1310,
GstEventLatency, latency=(guint64)0;
0:00:47.609985351 basesink
gstbasesink.c:4413:gst_base_sink_send_event:<pulsesink3> handled event
0xb85b3050 latency event: 0xb85b3050, time 99:99:99.999999999, seq-num 1310,
GstEventLatency, latency=(guint64)0;: 1

// application try to resume,
// pa_stream_write()

0:00:47.610321045 basesink
gstbasesink.c:4975:gst_base_sink_change_state:<pulsesink3> PAUSED to PLAYING,
don't need preroll
0:00:47.610534668 pulse
pulsesink.c:1707:gst_pulseringbuffer_commit:<pulseringbuffer3> start!
0:00:47.610565185 pulse pulsesink.c:1450:gst_pulseringbuffer_start:<pulsesink3>
starting
0:00:47.610595703 pulse
pulsesink.c:1714:gst_pulseringbuffer_commit:<pulsesink3> entering commit
0:00:47.610626220 pulse
pulsesink.c:1732:gst_pulseringbuffer_commit:<pulsesink3> in 2047, out 2047

// I expect that offset should be around "344456", but pa_stream_get_time()
returns "335630".
// around 100ms of pcm couldn't heard due to discontinuity.

0:00:47.610748291    pulse
pulsesink.c:1755:gst_pulseringbuffer_commit:<pulsesink3> need to write 2048
samples at offset 335630
0:00:47.610778808    pulse
pulsesink.c:1759:gst_pulseringbuffer_commit:<pulsesink3> discontinuity, offset
is 335630, last offset was 344456
0:00:47.610809326    pulse
pulsesink.c:1824:gst_pulseringbuffer_commit:<pulsesink3> requesting 4096 bytes
of shared memory
0:00:47.610870361    pulse
pulsesink.c:1833:gst_pulseringbuffer_commit:<pulsesink3> got 4096 bytes of
shared memory
0:00:47.610900879    pulse
pulsesink.c:1842:gst_pulseringbuffer_commit:<pulsesink3> writing 2048 samples
at offset 335630
0:00:47.610931396    pulse
pulsesink.c:1895:gst_pulseringbuffer_commit:<pulsesink3> flushing 2048 samples
at offset 335630
0:00:47.611022949    pulse
pulsesink.c:1916:gst_pulseringbuffer_commit:<pulsesink3> read_index at 344456,
offset 339726
0:00:47.611053466    pulse
pulsesink.c:1939:gst_pulseringbuffer_commit:<pulsesink3> wrote 2048 samples
0:00:47.611206054 basesink
gstbasesink.c:1902:gst_base_sink_get_sync_times:<pulsesink3> got times start:
0:00:00.046439910, stop: 0:00:00.092879819, do_sync 0



When I tried to disable interpolation timing(PA_STREAM_INTERPOLATE_TIMING) flag
in pulsesink.c, the
offset move expectedly and sound heard well without this kind of drop. Please
refer below test patch.

-------------------------------------------------------------------------------
diff --git a/ext/pulse/pulsesink.c b/ext/pulse/pulsesink.c
index e580afc..a10da7e 100755
--- a/ext/pulse/pulsesink.c
+++ b/ext/pulse/pulsesink.c
@@ -961,8 +961,8 @@ gst_pulseringbuffer_acquire (GstAudioRingBuffer * buf,
   }

   /* construct the flags */
-  flags = PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE |
-      PA_STREAM_ADJUST_LATENCY | PA_STREAM_START_CORKED;
+  flags = PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_ADJUST_LATENCY |
+      PA_STREAM_START_CORKED;

   if (psink->mute_set) {
     if (psink->mute)
-------------------------------------------------------------------------------

I guess interpolation timing isn't correct in some special cases than index
based timing, but I have no idea why.
Can you give us any feedback about this issue?  Is it proper disabling
"PA_STREAM_INTERPOLATE_TIMING" flag than use it?

Regards,
KimJeongYeon

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.


More information about the gstreamer-bugs mailing list