21#ifndef SAYONARA_PLAYER_ENGINE_UTILS_H
22#define SAYONARA_PLAYER_ENGINE_UTILS_H
24#include "Utils/typedefs.h"
35namespace Engine::Utils
40 struct GObjectAutoFree
44 explicit GObjectAutoFree(T* obj) :
53 T* data()
const {
return obj; }
55 T* operator*()
const {
return data(); }
62 AutoUnref(T* element) :
63 m_element {element} {}
67 gst_object_unref(m_element);
70 T* operator*()
const {
return m_element; }
78 void configureQueue(GstElement* queue, guint64 maxTimeMs = 100);
80 void configureSink(GstElement* sink);
82 void configureLame(GstElement* lame);
84 bool connectTee(GstElement* tee, GstElement* queue,
const QString& queue_name);
86 bool hasElement(GstBin* bin, GstElement* element);
88 bool testAndError(
void* element,
const QString& errorstr);
90 bool testAndErrorBool(
bool b,
const QString& errorstr);
92 bool createElement(GstElement** elem,
const QString& elementType);
94 bool createElement(GstElement** elem,
const QString& elementType,
const QString& prefix);
96 GValue getInt64(gint64 value);
98 GValue getUint64(guint64 value);
100 GValue getUint(guint value);
102 GValue getInt(gint value);
104 constexpr inline MilliSeconds getUpdateInterval() {
return 50; };
107 struct Dont_Use_Integers_In_GObject_Set
109 Dont_Use_Integers_In_GObject_Set(T value)
111 std::string(
"There's a wrong value somewhere") + value;
115 template<
typename GlibObject,
typename T>
116 void setValue(GlibObject* ,
const gchar* , T , std::true_type)
121 template<
typename GlibObject,
typename T>
122 void setValue(GlibObject*
object,
const gchar* key, T value, std::false_type)
124 g_object_set(G_OBJECT(
object), key, value,
nullptr);
127 template<
typename GlibObject,
typename T>
128 void setValue(GlibObject*
object,
const gchar* key, T value)
130 constexpr bool b = (std::is_integral<T>::value) && (
sizeof(T) >
sizeof(
bool));
131 setValue(
object, key, value, std::integral_constant<bool, b>());
134 template<
typename GlibObject,
typename First>
135 void setValues(GlibObject*
object,
const gchar* key, First value)
137 setValue(
object, key, value);
140 template<
typename GlibObject,
typename First,
typename... Args>
141 void setValues(GlibObject*
object,
const gchar* key, First value, Args... args)
143 setValue(
object, key, value);
144 setValues(
object, std::forward<Args>(args)...);
147 template<
typename GlibObject>
148 void setInt64Value(GlibObject*
object,
const gchar* key, gint64 value)
150 const auto val = getInt64(value);
151 g_object_set_property(G_OBJECT(
object), key, &val);
154 template<
typename GlibObject>
155 void setIntValue(GlibObject*
object,
const gchar* key, gint value)
157 const auto val = getInt(value);
158 g_object_set_property(G_OBJECT(
object), key, &val);
161 template<
typename GlibObject>
162 void setUint64Value(GlibObject*
object,
const gchar* key, guint64 value)
164 const auto val = getUint64(value);
165 g_object_set_property(G_OBJECT(
object), key, &val);
168 template<
typename GlibObject>
169 void setUintValue(GlibObject*
object,
const gchar* key, guint value)
171 const auto val = getUint(value);
172 g_object_set_property(G_OBJECT(
object), key, &val);
175 MilliSeconds getDurationMs(GstElement* element);
177 MilliSeconds getPositionMs(GstElement* element);
179 MilliSeconds getTimeToGo(GstElement* element);
181 GstState getState(GstElement* element);
183 bool setState(GstElement* element, GstState state);
185 bool isPluginAvailable(
const gchar* str);
187 bool isLameAvailable();
189 bool isPitchAvailable();
191 bool createBin(GstElement** bin,
const Elements& elements,
const QString& prefix);
193 bool createGhostPad(GstBin* bin, GstElement* e);
195 bool linkElements(
const Elements& elements);
197 void unlinkElements(
const Elements& elements);
199 bool addElements(GstBin* bin,
const Elements& elements);
201 void removeElements(GstBin* bin,
const Elements& elements);
203 void unrefElements(
const Elements& elements);
210 [[nodiscard]]
AutoUnref<GstPad> getStaticPad(GstElement* element, PadType padType);
212 [[nodiscard]] QString getElementName(
const GstElement* element);
214 [[nodiscard]] QString getObjectName(GstObject* element);
216 [[nodiscard]]
bool isPadLinked(GstElement* element, PadType padType);
218 [[nodiscard]] GstElement* createSink(
const QString& sinkName);
Definition EngineUtils.h:60
Definition EngineUtils.h:33
Definition EngineUtils.h:108
Definition EngineUtils.h:41