Lost microphone, some news

Joakim Tjernlund Joakim.Tjernlund at infinera.com
Tue Jun 26 11:39:48 EDT 2018


I loose my microphone(USB headset) on and off. Fairly easy to trigger doing SIPE Test Calls
I have debugged it with GST_DEBUG=3 to:
0:01:44.674183639  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:686:validate_buffer:<srtpdec_1> No SSRC found in buffer
0:01:44.674222435  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:1254:gst_srtp_dec_chain:<srtpdec_1> Invalid buffer, dropping
0:01:44.723644690  9191 0x7f7750005370 WARN                 srtpdec gstsrtpdec.c:686:validate_buffer:<srtpdec_1> No SSRC found in buffer
0:01:44.723684456  9191 0x7f7750005370 WARN                 srtpdec gstsrtpdec.c:1254:gst_srtp_dec_chain:<srtpdec_1> Invalid buffer, dropping
0:01:44.773257417  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:686:validate_buffer:<srtpdec_1> No SSRC found in buffer
0:01:44.773299667  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:1254:gst_srtp_dec_chain:<srtpdec_1> Invalid buffer, dropping
0:01:44.773345513  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:686:validate_buffer:<srtpdec_1> No SSRC found in buffer
0:01:44.773362553  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:1254:gst_srtp_dec_chain:<srtpdec_1> Invalid buffer, dropping
0:01:44.773552549  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:686:validate_buffer:<srtpdec_1> No SSRC found in buffer
0:01:44.773577829  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:1254:gst_srtp_dec_chain:<srtpdec_1> Invalid buffer, dropping
0:01:44.824544605  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:686:validate_buffer:<srtpdec_1> No SSRC found in buffer
0:01:44.824593763  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:1254:gst_srtp_dec_chain:<srtpdec_1> Invalid buffer, dropping
0:01:44.984509825  9191 0x7f7750005370 WARN                 srtpdec gstsrtpdec.c:686:validate_buffer:<srtpdec_1> No SSRC found in buffer
0:01:44.984555736  9191 0x7f7750005370 WARN                 srtpdec gstsrtpdec.c:1254:gst_srtp_dec_chain:<srtpdec_1> Invalid buffer, dropping
0:01:45.038746276  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:686:validate_buffer:<srtpdec_1> No SSRC found in buffer
0:01:45.038816916  9191 0x55f2eff3f0f0 WARN                 srtpdec gstsrtpdec.c:1254:gst_srtp_dec_chain:<srtpdec_1> Invalid buffer, dropping
0:01:45.214407207  9191 0x55f2f0c30400 FIXME               basesink gstbasesink.c:3144:gst_base_sink_default_event:<autoaudiosink2-actual-sink-pulse> stream-start event without group-id. Consider implementing group-id handling in the upstream elements
0:01:45.297601562  9191 0x7f7784025a40 WARN                   pulse pulsesink.c:702:gst_pulsering_stream_underflow_cb:<autoaudiosink2-actual-sink-pulse> Got underflow
0:01:53.676467518  9191 0x7f7784025a40 WARN                   pulse pulsesink.c:702:gst_pulsering_stream_underflow_cb:<autoaudiosink2-actual-sink-pulse> Got underflow
0:02:10.626495331  9191 0x7f7784025a40 WARN                   pulse pulsesink.c:702:gst_pulsering_stream_underflow_cb:<autoaudiosink2-actual-sink-pulse> Got underflow
0:02:11.988072210  9191 0x7f7784025a40 WARN                   pulse pulsesink.c:702:gst_pulsering_stream_underflow_cb:<autoaudiosink2-actual-sink-pulse> Got underflow
0:02:15.532355085  9191 0x7f7750004b70 WARN                   pulse pulsesrc.c:1141:gst_pulsesrc_read:<autoaudiosrc3-actual-src-puls> error: pa_pause2: OK
0:02:15.532500956  9191 0x7f7750004b70 WARN                   pulse pulsesrc.c:1204:gst_pulsesrc_read:<autoaudiosrc3-actual-src-puls> error: pa_unlock_and_fail: OK
0:02:15.532584089  9191 0x7f7750004b70 WARN                audiosrc gstaudiosrc.c:221:audioringbuffer_thread_func:<autoaudiosrc3-actual-src-puls> error reading data -1 (reason: Resource temporarily unavailable), skipping segment

Here I loose my microphone and further(with some extra debug in gstreamer, pulsesrc.c:
gst_pulsesrc_read()
....
while (length > 0) {
    size_t l;

    GST_LOG_OBJECT (pulsesrc, "reading %u bytes", length);

    /*check if we have a leftover buffer */
    if (!pulsesrc->read_buffer) {
      for (;;) {
          if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) {
              GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED,
                                 ("pa_dead: %s",
                                  pa_strerror (pa_context_errno (pulsesrc->context))), (NULL));
              goto unlock_and_fail;
          }

        /* read all available data, we keep a pointer to the data and the length
         * and take from it what we need. */
        if (pa_stream_peek (pulsesrc->stream, &pulsesrc->read_buffer,
                &pulsesrc->read_buffer_length) < 0)
          goto peek_failed;

        GST_LOG_OBJECT (pulsesrc, "have data of %" G_GSIZE_FORMAT " bytes",
            pulsesrc->read_buffer_length);

        /* if we have data, process if */
        if (pulsesrc->read_buffer && pulsesrc->read_buffer_length)
          break;

        /* now wait for more data to become available */
        GST_LOG_OBJECT (pulsesrc, "waiting for data");
        pa_threaded_mainloop_wait (pulsesrc->mainloop);

        if (pulsesrc->paused) {
            GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED,
                               ("pa_pause2: %s",
                                pa_strerror (pa_context_errno (pulsesrc->context))), (NULL));
            goto was_paused;
        }
      }
    }

.....
unlock_and_fail:
  {
    GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED,
        ("pa_unlock_and_fail: %s",
            pa_strerror (pa_context_errno (pulsesrc->context))), (NULL));
    pulsesrc->in_read = FALSE;
    pa_threaded_mainloop_unlock (pulsesrc->mainloop);

    return (guint) - 1;
  }
}

Here one can se that whenever pause happens, I loose audio.
I don't know where to go next, this is audioringbuffer_thread_func()
in gstaudiosrc.c:
....
do {
        read = readfunc (src, readptr, left, &timestamp);
        GST_LOG_OBJECT (src, "transfered %d bytes of %d to segment %d", read,
            left, readseg);
        if (read < 0 || read > left) {
          GST_WARNING_OBJECT (src,
              "error reading data %d (reason: %s), skipping segment", read,
              g_strerror (errno));
          break;
        }
        left -= read;
        readptr += read;
} while (left > 0);

      /* Update timestamp on buffer if required */
      gst_audio_ring_buffer_set_timestamp (buf, readseg, timestamp);

      /* we read one segment */
      gst_audio_ring_buffer_advance (buf, 1);
....
No idea if pause should be handle here or maybe somewhere in pidgin,pidgin-sipe ?

 Jocke


More information about the Support mailing list