mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-18 22:36:33 +00:00
mlaudiosink: Fix crash when stopping pipeline
This is a bug in LuminOS 0.97.0.
This commit is contained in:
parent
380ab8123b
commit
da584995f6
1 changed files with 23 additions and 0 deletions
|
@ -86,6 +86,12 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
"channels = (int) [ 1, 2 ], "
|
"channels = (int) [ 1, 2 ], "
|
||||||
"rate = (int) [ 16000, 48000 ], " "layout = (string) interleaved"));
|
"rate = (int) [ 16000, 48000 ], " "layout = (string) interleaved"));
|
||||||
|
|
||||||
|
/* HACK: After calling MLAudioStopSound() there is no way to know when it will
|
||||||
|
* actually stop calling buffer_cb(). If the sink is disposed first, it would
|
||||||
|
* crash. Keep here a set of active sinks. */
|
||||||
|
static GHashTable *active_sinks;
|
||||||
|
static GMutex active_sinks_mutex;
|
||||||
|
|
||||||
struct _GstMLAudioSink
|
struct _GstMLAudioSink
|
||||||
{
|
{
|
||||||
GstAudioSink parent;
|
GstAudioSink parent;
|
||||||
|
@ -198,11 +204,18 @@ buffer_cb (MLHandle handle, gpointer user_data)
|
||||||
{
|
{
|
||||||
GstMLAudioSink *self = user_data;
|
GstMLAudioSink *self = user_data;
|
||||||
|
|
||||||
|
g_mutex_lock (&active_sinks_mutex);
|
||||||
|
if (!g_hash_table_contains (active_sinks, self))
|
||||||
|
goto out;
|
||||||
|
|
||||||
gst_ml_audio_wrapper_set_handle (self->wrapper, handle);
|
gst_ml_audio_wrapper_set_handle (self->wrapper, handle);
|
||||||
|
|
||||||
g_mutex_lock (&self->mutex);
|
g_mutex_lock (&self->mutex);
|
||||||
g_cond_signal (&self->cond);
|
g_cond_signal (&self->cond);
|
||||||
g_mutex_unlock (&self->mutex);
|
g_mutex_unlock (&self->mutex);
|
||||||
|
|
||||||
|
out:
|
||||||
|
g_mutex_unlock (&active_sinks_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Must be called with self->mutex locked */
|
/* Must be called with self->mutex locked */
|
||||||
|
@ -282,6 +295,10 @@ gst_ml_audio_sink_prepare (GstAudioSink * sink, GstAudioRingBufferSpec * spec)
|
||||||
self->stopped = FALSE;
|
self->stopped = FALSE;
|
||||||
self->paused = FALSE;
|
self->paused = FALSE;
|
||||||
|
|
||||||
|
g_mutex_lock (&active_sinks_mutex);
|
||||||
|
g_hash_table_add (active_sinks, self);
|
||||||
|
g_mutex_unlock (&active_sinks_mutex);
|
||||||
|
|
||||||
/* createAudioNode() and createSoundWithOutputStream() must both be called in
|
/* createAudioNode() and createSoundWithOutputStream() must both be called in
|
||||||
* application's main thread, and in a single main loop iteration. */
|
* application's main thread, and in a single main loop iteration. */
|
||||||
if (!gst_ml_audio_wrapper_invoke_sync (self->wrapper, create_sound_cb, self))
|
if (!gst_ml_audio_wrapper_invoke_sync (self->wrapper, create_sound_cb, self))
|
||||||
|
@ -306,8 +323,11 @@ gst_ml_audio_sink_unprepare (GstAudioSink * sink)
|
||||||
{
|
{
|
||||||
GstMLAudioSink *self = GST_ML_AUDIO_SINK (sink);
|
GstMLAudioSink *self = GST_ML_AUDIO_SINK (sink);
|
||||||
|
|
||||||
|
g_mutex_lock (&active_sinks_mutex);
|
||||||
|
g_hash_table_remove (active_sinks, self);
|
||||||
release_current_buffer (self);
|
release_current_buffer (self);
|
||||||
g_clear_pointer (&self->wrapper, gst_ml_audio_wrapper_free);
|
g_clear_pointer (&self->wrapper, gst_ml_audio_wrapper_free);
|
||||||
|
g_mutex_unlock (&active_sinks_mutex);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -432,6 +452,9 @@ gst_ml_audio_sink_class_init (GstMLAudioSinkClass * klass)
|
||||||
GstBaseSinkClass *basesink_class = GST_BASE_SINK_CLASS (klass);
|
GstBaseSinkClass *basesink_class = GST_BASE_SINK_CLASS (klass);
|
||||||
GstAudioSinkClass *audiosink_class = GST_AUDIO_SINK_CLASS (klass);
|
GstAudioSinkClass *audiosink_class = GST_AUDIO_SINK_CLASS (klass);
|
||||||
|
|
||||||
|
active_sinks = g_hash_table_new (NULL, NULL);
|
||||||
|
g_mutex_init (&active_sinks_mutex);
|
||||||
|
|
||||||
gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_ml_audio_sink_dispose);
|
gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_ml_audio_sink_dispose);
|
||||||
gobject_class->set_property =
|
gobject_class->set_property =
|
||||||
GST_DEBUG_FUNCPTR (gst_ml_audio_sink_set_property);
|
GST_DEBUG_FUNCPTR (gst_ml_audio_sink_set_property);
|
||||||
|
|
Loading…
Reference in a new issue