I modified something for the USB earphone issue.

hustxyj hustxyj at sina.com
Mon Jun 9 05:16:46 PDT 2014


Hi all:

 

I sent an email about the hot-plug issue about USB earphone before. These
days, I trace the log, and found that when I plugged out the device, it came
to an endless loop in gst_directsound_sink_write; calculate_freesize was
called everytime. So, if gst_element_set_state was called in another thread,
gst_directsound_sink_reset triggered, Which may blocked, due to
GST_DSOUND_LOCK (dsoundsink).

 

I added a variable "reset" in GstDirectSoundSink to indicate the reset of a
sink. It will be set true before GST_DSOUND_LOCK (dsoundsink) in
gst_directsound_sink_reset:

static void

gst_directsound_sink_reset (GstAudioSink * asink)

{

  GstDirectSoundSink *dsoundsink;

  LPVOID pLockedBuffer = NULL;

  DWORD dwSizeBuffer = 0;

 

  dsoundsink = GST_DIRECTSOUND_SINK (asink);

  

  dsoundsink->reset = TRUE;

 

  GST_DSOUND_LOCK (dsoundsink);

 

  ..

}

 

In the calculate_freesize loop, modified as below:

if (SUCCEEDED (hRes) && (dwStatus & DSBSTATUS_PLAYING) &&
!dsoundsink->reset)

 goto calculate_freesize;

else {

  dsoundsink->first_buffer_after_reset = FALSE;

  dsoundsink->reset = FALSE;

  GST_DSOUND_UNLOCK (dsoundsink);

  return 0; 

}

 

After modified, the stuck issue was gone. I want to ask you guys, if this is
a good idea or a bad one. If bad, do you have any other solutions?

PS: I haven't looked deep into the logic of calculate_freesize loop. So
maybe there is a better way to break the loop which I have not found.

 

Thanks!

 

--

Yongjian

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20140609/b7d4c0dd/attachment.html>


More information about the gstreamer-devel mailing list