pulsesink: Add property to apply render delay automatically based on the latency... 89/225889/4
authorSangchul Lee <sc11.lee@samsung.com>
Tue, 25 Feb 2020 07:26:05 +0000 (16:26 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 4 Mar 2020 05:26:12 +0000 (14:26 +0900)
Change-Id: I496fca57bc627a3e09170ba32c9b50bccbc00cc9
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
ext/pulse/pulsesink.c
ext/pulse/pulsesink.h

index fca5601..b5eadb4 100644 (file)
@@ -75,7 +75,8 @@ GST_DEBUG_CATEGORY_EXTERN (pulse_debug);
 #define DEFAULT_MUTE            FALSE
 #define MAX_VOLUME              10.0
 #ifdef __TIZEN__
-#define DEFAULT_AUDIO_LATENCY   "mid"
+#define DEFAULT_AUDIO_LATENCY     "mid"
+#define DEFAULT_AUTO_RENDER_DELAY FALSE
 #endif /* __TIZEN__ */
 
 enum
@@ -91,6 +92,7 @@ enum
   PROP_STREAM_PROPERTIES,
 #ifdef __TIZEN__
   PROP_AUDIO_LATENCY,
+  PROP_AUTO_RENDER_DELAY,
 #endif /* __TIZEN__ */
   PROP_LAST
 };
@@ -782,6 +784,19 @@ gst_pulsering_stream_latency_cb (pa_stream * s, void *userdata)
       GST_TIMEVAL_TO_TIME (info->timestamp), info->write_index_corrupt,
       info->write_index, info->read_index_corrupt, info->read_index,
       info->sink_usec, sink_usec);
+#ifdef __TIZEN__
+  if (!psink->auto_render_delay)
+    return;
+
+  if (sink_usec < info->sink_usec)
+    gst_base_sink_set_render_delay (GST_BASE_SINK(psink),
+        (info->sink_usec - sink_usec) * G_GINT64_CONSTANT (1000));
+  else
+    gst_base_sink_set_render_delay (GST_BASE_SINK(psink), 0);
+
+  GST_DEBUG_OBJECT (psink,
+    "Current render delay is %llu", gst_base_sink_get_render_delay (GST_BASE_SINK(psink)));
+#endif
 }
 
 static void
@@ -2084,6 +2099,12 @@ gst_pulsesink_class_init (GstPulseSinkClass * klass)
           "Audio Backend Latency (\"low\": Low Latency, \"mid\": Mid Latency, \"high\": High Latency)",
           DEFAULT_AUDIO_LATENCY,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class,
+      PROP_AUTO_RENDER_DELAY,
+      g_param_spec_boolean ("auto-render-delay", "Auto Render Delay",
+          "Apply render delay automatically", DEFAULT_AUTO_RENDER_DELAY,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 #endif /* __TIZEN__ */
 
   gst_element_class_set_static_metadata (gstelement_class,
@@ -2493,6 +2514,7 @@ gst_pulsesink_init (GstPulseSink * pulsesink)
   pulsesink->proplist = NULL;
 #ifdef __TIZEN__
   pulsesink->latency = g_strdup (DEFAULT_AUDIO_LATENCY);
+  pulsesink->auto_render_delay = DEFAULT_AUTO_RENDER_DELAY;
   pulsesink->proplist = pa_proplist_new();
   pa_proplist_sets(pulsesink->proplist, PA_PROP_MEDIA_TIZEN_AUDIO_LATENCY, pulsesink->latency);
 #ifdef PCM_DUMP_ENABLE
@@ -3078,6 +3100,10 @@ gst_pulsesink_set_property (GObject * object,
       pa_proplist_sets(pulsesink->proplist, PA_PROP_MEDIA_TIZEN_AUDIO_LATENCY, pulsesink->latency);
       GST_DEBUG_OBJECT(pulsesink, "latency(%s)", pulsesink->latency);
       break;
+    case PROP_AUTO_RENDER_DELAY:
+      pulsesink->auto_render_delay = g_value_get_boolean (value);
+      GST_DEBUG_OBJECT (pulsesink, "setting auto-render-delay to %d", g_value_get_boolean (value));
+      break;
 #endif /* __TIZEN__ */
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -3145,6 +3171,9 @@ gst_pulsesink_get_property (GObject * object,
     case PROP_AUDIO_LATENCY:
       g_value_set_string (value, pulsesink->latency);
       break;
+    case PROP_AUTO_RENDER_DELAY:
+      g_value_set_boolean (value, pulsesink->auto_render_delay);
+      break;
 #endif /* __TIZEN__ */
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
index 8dca8fc..446bd27 100644 (file)
@@ -84,6 +84,7 @@ struct _GstPulseSink
 
 #ifdef __TIZEN__
   gchar *latency;
+  gboolean auto_render_delay:1;
 #ifdef PCM_DUMP_ENABLE
   gint need_dump_input;
   FILE *dump_fd_input;