[calls] media manager: Manage and hand out available pipelines



commit 7033c1cd754023576f3857af3b04063a04214775
Author: Evangelos Ribeiro Tzaras <devrtz fortysixandtwo eu>
Date:   Mon Feb 28 11:37:26 2022 +0100

    media manager: Manage and hand out available pipelines
    
    The media manager will always try to have a pipeline ready.

 plugins/sip/calls-sip-media-manager.c | 48 ++++++++++++++++++++++++++++++++---
 plugins/sip/calls-sip-media-manager.h | 34 +++++++++++++------------
 2 files changed, 63 insertions(+), 19 deletions(-)
---
diff --git a/plugins/sip/calls-sip-media-manager.c b/plugins/sip/calls-sip-media-manager.c
index f8e81546..1a00161b 100644
--- a/plugins/sip/calls-sip-media-manager.c
+++ b/plugins/sip/calls-sip-media-manager.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 Purism SPC
+ * Copyright (C) 2021-2022 Purism SPC
  *
  * This file is part of Calls.
  *
@@ -26,8 +26,11 @@
 
 #include "calls-settings.h"
 #include "calls-sip-media-manager.h"
+#include "calls-sip-media-pipeline.h"
 #include "gst-rfc3551.h"
+#include "util.h"
 
+#include <gio/gio.h>
 #include <gst/gst.h>
 
 #include <sys/types.h>
@@ -41,8 +44,8 @@
  * @Title: CallsSipMediaManager
  *
  * #CallsSipMediaManager is mainly responsible for generating appropriate
- * SDP messages for the set of supported codecs. In the future it
- * shall also manage the #CallsSipMediaPipeline objects that are in use.
+ * SDP messages for the set of supported codecs. It also holds a list of
+ * #CallsSipMediaPipeline objects that are ready to be used.
  */
 
 typedef struct _CallsSipMediaManager
@@ -54,6 +57,7 @@ typedef struct _CallsSipMediaManager
 
   CallsSettings *settings;
   GList         *preferred_codecs;
+  GListStore    *pipelines;
 } CallsSipMediaManager;
 
 G_DEFINE_TYPE (CallsSipMediaManager, calls_sip_media_manager, G_TYPE_OBJECT);
@@ -132,6 +136,18 @@ on_notify_preferred_audio_codecs (CallsSipMediaManager *self)
 }
 
 
+static void
+add_new_pipeline (CallsSipMediaManager *self)
+{
+  CallsSipMediaPipeline *pipeline;
+
+  g_assert (CALLS_IS_SIP_MEDIA_MANAGER (self));
+
+  pipeline = calls_sip_media_pipeline_new (NULL);
+  g_list_store_append (self->pipelines, pipeline);
+}
+
+
 static void
 calls_sip_media_manager_finalize (GObject *object)
 {
@@ -139,6 +155,7 @@ calls_sip_media_manager_finalize (GObject *object)
 
   g_list_free (self->preferred_codecs);
   g_object_unref (self->settings);
+  g_object_unref (self->pipelines);
 
   G_OBJECT_CLASS (calls_sip_media_manager_parent_class)->finalize (object);
 }
@@ -169,6 +186,10 @@ calls_sip_media_manager_init (CallsSipMediaManager *self)
   /* Hints are used with getaddrinfo() when setting the session IP */
   self->hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_NUMERICHOST;
   self->hints.ai_family = AF_UNSPEC;
+
+  self->pipelines = g_list_store_new (CALLS_TYPE_SIP_MEDIA_PIPELINE);
+
+  add_new_pipeline (self);
 }
 
 
@@ -342,4 +363,25 @@ calls_sip_media_manager_get_codecs_from_sdp (CallsSipMediaManager *self,
   return codecs;
 }
 
+/**
+ * calls_sip_media_manager_get_pipeline:
+ * @self: A #CallsSipMediaManager
+ *
+ * Returns: (transfer full): A #CallsSipMediaPipeline
+ */
+CallsSipMediaPipeline *
+calls_sip_media_manager_get_pipeline (CallsSipMediaManager *self)
+{
+  g_autoptr (CallsSipMediaPipeline) pipeline = NULL;
+
+  g_return_val_if_fail (CALLS_IS_SIP_MEDIA_MANAGER (self), NULL);
+
+  pipeline = g_list_model_get_item (G_LIST_MODEL (self->pipelines), 0);
+
+  g_list_store_remove (self->pipelines, 0);
 
+  /* add a pipeline for the one we just removed */
+  add_new_pipeline (self);
+
+  return pipeline;
+}
diff --git a/plugins/sip/calls-sip-media-manager.h b/plugins/sip/calls-sip-media-manager.h
index a8316d80..076235bc 100644
--- a/plugins/sip/calls-sip-media-manager.h
+++ b/plugins/sip/calls-sip-media-manager.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 Purism SPC
+ * Copyright (C) 2021-2022 Purism SPC
  *
  * This file is part of Calls.
  *
@@ -24,6 +24,7 @@
 
 #pragma once
 
+#include "calls-sip-media-pipeline.h"
 #include "gst-rfc3551.h"
 
 #include <sofia-sip/sdp.h>
@@ -36,20 +37,21 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (CallsSipMediaManager, calls_sip_media_manager, CALLS, SIP_MEDIA_MANAGER, GObject)
 
 
-CallsSipMediaManager* calls_sip_media_manager_default                       (void);
-gchar*                calls_sip_media_manager_get_capabilities              (CallsSipMediaManager *self,
-                                                                             const char           *own_ip,
-                                                                             guint                 port,
-                                                                             gboolean              use_srtp,
-                                                                             GList                
*supported_codecs);
-gchar*                calls_sip_media_manager_static_capabilities           (CallsSipMediaManager *self,
-                                                                             const char           *own_ip,
-                                                                             guint                 port,
-                                                                             gboolean              use_srtp);
-gboolean              calls_sip_media_manager_supports_media                (CallsSipMediaManager *self,
-                                                                             const char           
*media_type);
-GList *               calls_sip_media_manager_codec_candidates              (CallsSipMediaManager *self);
-GList *               calls_sip_media_manager_get_codecs_from_sdp           (CallsSipMediaManager *self,
-                                                                             sdp_media_t          
*sdp_media);
+CallsSipMediaManager*   calls_sip_media_manager_default                 (void);
+gchar*                  calls_sip_media_manager_get_capabilities        (CallsSipMediaManager *self,
+                                                                         const char           *own_ip,
+                                                                         guint                 port,
+                                                                         gboolean              use_srtp,
+                                                                         GList                
*supported_codecs);
+gchar*                  calls_sip_media_manager_static_capabilities     (CallsSipMediaManager *self,
+                                                                         const char           *own_ip,
+                                                                         guint                 port,
+                                                                         gboolean              use_srtp);
+gboolean                calls_sip_media_manager_supports_media          (CallsSipMediaManager *self,
+                                                                         const char           *media_type);
+GList *                 calls_sip_media_manager_codec_candidates        (CallsSipMediaManager *self);
+GList *                 calls_sip_media_manager_get_codecs_from_sdp     (CallsSipMediaManager *self,
+                                                                         sdp_media_t          *sdp_media);
+CallsSipMediaPipeline  *calls_sip_media_manager_get_pipeline            (CallsSipMediaManager *self);
 
 G_END_DECLS


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]