#define SPLITMUX_PART_TYPE_LOCK(p) g_mutex_lock(&(p)->type_lock)
#define SPLITMUX_PART_TYPE_UNLOCK(p) g_mutex_unlock(&(p)->type_lock)
+#define SPLITMUX_PART_MSG_LOCK(p) g_mutex_lock(&(p)->msg_lock)
+#define SPLITMUX_PART_MSG_UNLOCK(p) g_mutex_unlock(&(p)->msg_lock)
+
typedef struct _GstSplitMuxPartPad
{
GstPad parent;
g_cond_init (&reader->inactive_cond);
g_mutex_init (&reader->lock);
g_mutex_init (&reader->type_lock);
+ g_mutex_init (&reader->msg_lock);
/* FIXME: Create elements on a state change */
reader->src = gst_element_factory_make ("filesrc", NULL);
g_cond_clear (&reader->inactive_cond);
g_mutex_clear (&reader->lock);
g_mutex_clear (&reader->type_lock);
+ g_mutex_clear (&reader->msg_lock);
g_free (reader->path);
{
GstMessage *message;
- GST_STATE_LOCK (reader);
+ SPLITMUX_PART_MSG_LOCK (reader);
reader->async_pending = TRUE;
message = gst_message_new_async_start (GST_OBJECT_CAST (reader));
GST_BIN_CLASS (parent_class)->handle_message (GST_BIN_CAST (reader), message);
- GST_STATE_UNLOCK (reader);
+ SPLITMUX_PART_MSG_UNLOCK (reader);
}
static void
{
GstMessage *message;
- GST_STATE_LOCK (reader);
+ SPLITMUX_PART_MSG_LOCK (reader);
if (reader->async_pending) {
message =
gst_message_new_async_done (GST_OBJECT_CAST (reader),
reader->async_pending = FALSE;
}
- GST_STATE_UNLOCK (reader);
+ SPLITMUX_PART_MSG_UNLOCK (reader);
}
static void
{
GstMessage *message;
- GST_STATE_LOCK (splitmux);
+ SPLITMUX_SRC_MSG_LOCK (splitmux);
splitmux->async_pending = TRUE;
message = gst_message_new_async_start (GST_OBJECT_CAST (splitmux));
GST_BIN_CLASS (parent_class)->handle_message (GST_BIN_CAST (splitmux),
message);
- GST_STATE_UNLOCK (splitmux);
+ SPLITMUX_SRC_MSG_UNLOCK (splitmux);
}
static void
{
GstMessage *message;
- GST_STATE_LOCK (splitmux);
+ SPLITMUX_SRC_MSG_LOCK (splitmux);
if (splitmux->async_pending) {
message =
gst_message_new_async_done (GST_OBJECT_CAST (splitmux),
splitmux->async_pending = FALSE;
}
- GST_STATE_UNLOCK (splitmux);
+ SPLITMUX_SRC_MSG_UNLOCK (splitmux);
}
static GstStateChangeReturn
static void
gst_splitmux_src_activate_first_part (GstSplitMuxSrc * splitmux)
{
- if (!gst_splitmux_src_activate_part (splitmux, 0, GST_SEEK_FLAG_NONE)) {
- GST_ELEMENT_ERROR (splitmux, RESOURCE, OPEN_READ, (NULL),
- ("Failed to activate first part for playback"));
+ SPLITMUX_SRC_LOCK (splitmux);
+ if (splitmux->running) {
+ if (!gst_splitmux_src_activate_part (splitmux, 0, GST_SEEK_FLAG_NONE)) {
+ GST_ELEMENT_ERROR (splitmux, RESOURCE, OPEN_READ, (NULL),
+ ("Failed to activate first part for playback"));
+ }
}
+ SPLITMUX_SRC_UNLOCK (splitmux);
}
static GstBusSyncReply
gchar **files;
guint i;
+ SPLITMUX_SRC_LOCK (splitmux);
+ if (splitmux->running) {
+ /* splitmux is still running / stopping. We can't start again yet */
+ SPLITMUX_SRC_UNLOCK (splitmux);
+ return FALSE;
+ }
+ SPLITMUX_SRC_UNLOCK (splitmux);
+
GST_DEBUG_OBJECT (splitmux, "Starting");
g_signal_emit (splitmux, signals[SIGNAL_FORMAT_LOCATION], 0, &files);
GST_DEBUG_OBJECT (splitmux, "Stopping");
- /* Stop and destroy all parts */
+ SPLITMUX_SRC_UNLOCK (splitmux);
+
+ /* Stop and destroy all parts. We don't need the lock here,
+ * because all parts were created in _start() */
for (i = 0; i < splitmux->num_created_parts; i++) {
if (splitmux->parts[i] == NULL)
continue;
g_object_unref (splitmux->parts[i]);
splitmux->parts[i] = NULL;
}
+ SPLITMUX_SRC_LOCK (splitmux);
SPLITMUX_SRC_PADS_WLOCK (splitmux);
pads_list = splitmux->pads;