Sayonara Player
EngineUtils.h
1 /* EngineUtils.h */
2 
3 /* Copyright (C) 2011-2019 Lucio Carreras
4  *
5  * This file is part of sayonara player
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11 
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16 
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #ifndef ENGINE_UTILS_H
22 #define ENGINE_UTILS_H
23 
24 #include "Utils/typedefs.h"
25 
26 #include <type_traits>
27 #include <utility>
28 #include <memory>
29 #include <iostream>
30 #include <gst/gst.h>
31 
32 template<typename T>
33 class QList;
34 
35 namespace Engine
36 {
41  namespace Utils
42  {
44 
45  template<typename T>
47  {
48  T* obj=nullptr;
49 
50  GObjectAutoFree(T* obj) : obj(obj) {}
52  {
53  if(obj) {
54  g_free(obj);
55  }
56 
57  obj = nullptr;
58  }
59  T* data() const { return obj; }
60  };
61 
67  void config_queue(GstElement* queue, gulong max_time_ms=100);
68 
73  void config_sink(GstElement* sink);
74 
79  void config_lame(GstElement* lame);
80 
88  bool tee_connect(GstElement* tee, GstElement* queue, const QString& queue_name);
89 
96  bool has_element(GstBin* bin, GstElement* element);
97 
104  bool test_and_error(void* element, const QString& errorstr);
105 
112  bool test_and_error_bool(bool b, const QString& errorstr);
113 
120  bool create_element(GstElement** elem, const QString& elem_name);
121 
129  bool create_element(GstElement** elem, const QString& elem_name, const QString& name);
130 
136  void set_passthrough(GstElement* e, bool b);
137 
143  GValue get_int64(gint64 value);
144 
150  GValue get_uint64(guint64 value);
151 
157  GValue get_uint(guint value);
158 
164  GValue get_int(gint value);
165 
170  MilliSeconds get_update_interval();
171 
172  template<typename T>
173 
178  {
180  {
181  std::string("There's a wrong value somewhere") + value;
182  }
183  };
184 
185 
186  template<typename GlibObject, typename T>
193  void set_value(GlibObject* object, const gchar* key, T value, std::true_type)
194  {
195  (void) object;
196  (void) key;
197  (void) value;
199  }
200 
201 
202  template<typename GlibObject, typename T>
209  void set_value(GlibObject* object, const gchar* key, T value, std::false_type)
210  {
211  g_object_set(G_OBJECT(object), key, value, nullptr);
212  }
213 
214 
215  template<typename GlibObject, typename T>
222  void set_value(GlibObject* object, const gchar* key, T value)
223  {
224  constexpr bool b = (std::is_integral<T>::value) && (sizeof(T) > sizeof(bool));
225  set_value(object, key, value, std::integral_constant<bool, b>());
226  }
227 
228 
229  template<typename GlibObject, typename First>
236  void set_values(GlibObject* object, const gchar* key, First value)
237  {
238  set_value(object, key, value);
239  }
240 
241 
242  template<typename GlibObject, typename First, typename... Args>
250  void set_values(GlibObject* object, const gchar* key, First value, Args... args)
251  {
252  set_value(object, key, value);
253  set_values(object, std::forward<Args>(args)...);
254  }
255 
256 
257  template<typename GlibObject>
264  void set_int64_value(GlibObject* object, const gchar* key, gint64 value)
265  {
266  GValue val = get_int64(value);
267  g_object_set_property(G_OBJECT(object), key, &val);
268  }
269 
270 
271  template<typename GlibObject>
278  void set_int_value(GlibObject* object,const gchar* key, gint value)
279  {
280  GValue val = get_int(value);
281  g_object_set_property(G_OBJECT(object), key, &val);
282  }
283 
284 
285 
286  template<typename GlibObject>
293  void set_uint64_value(GlibObject* object, const gchar* key, guint64 value)
294  {
295  GValue val = get_uint64(value);
296  g_object_set_property(G_OBJECT(object), key, &val);
297  }
298 
299 
300  template<typename GlibObject>
307  void set_uint_value(GlibObject* object, const gchar* key, guint value)
308  {
309  GValue val = get_uint(value);
310  g_object_set_property(G_OBJECT(object), key, &val);
311  }
312 
318  MilliSeconds get_duration_ms(GstElement* element);
319 
325  MilliSeconds get_position_ms(GstElement* element);
326 
332  MilliSeconds get_time_to_go(GstElement* element);
333 
339  GstState get_state(GstElement* element);
340 
347  bool set_state(GstElement* element, GstState state);
348 
354  bool check_plugin_available(const gchar* str);
355 
360  bool check_lame_available();
361 
366  bool check_pitch_available();
367 
375  bool create_bin(GstElement** bin, const Elements& elements, const QString& prefix);
376 
383  bool create_ghost_pad(GstBin* bin, GstElement* e);
384 
390  bool link_elements(const Elements& elements);
391 
392  void unlink_elements(const Elements& elements);
393 
399  bool add_elements(GstBin* bin, const Elements& elements);
400 
401  void remove_elements(GstBin* bin, const Elements& elements);
402 
407  void unref_elements(const Elements& elements);
408  }
409 }
410 
411 #endif // ENGINE_UTILS_H
bool has_element(GstBin *bin, GstElement *element)
has_element
void set_uint_value(GlibObject *object, const gchar *key, guint value)
set_uint_value
Definition: EngineUtils.h:307
bool create_ghost_pad(GstBin *bin, GstElement *e)
create_ghost_pad
MilliSeconds get_time_to_go(GstElement *element)
get_time_to_go
Definition: EngineUtils.h:46
void set_int64_value(GlibObject *object, const gchar *key, gint64 value)
set_int64_value
Definition: EngineUtils.h:264
void set_uint64_value(GlibObject *object, const gchar *key, guint64 value)
set_uint64_value
Definition: EngineUtils.h:293
void set_value(GlibObject *object, const gchar *key, T value, std::true_type)
set_value
Definition: EngineUtils.h:193
void unref_elements(const Elements &elements)
unref_elements
void config_lame(GstElement *lame)
config_lame
bool test_and_error_bool(bool b, const QString &errorstr)
test_and_error_bool
GstState get_state(GstElement *element)
get_state
bool test_and_error(void *element, const QString &errorstr)
test_and_error
bool check_plugin_available(const gchar *str)
check_plugin_available
bool tee_connect(GstElement *tee, GstElement *queue, const QString &queue_name)
tee_connect
bool set_state(GstElement *element, GstState state)
set_state
bool link_elements(const Elements &elements)
link_elements
bool create_bin(GstElement **bin, const Elements &elements, const QString &prefix)
create_bin
MilliSeconds get_position_ms(GstElement *element)
get_position_ms
bool add_elements(GstBin *bin, const Elements &elements)
add_elements
GValue get_int(gint value)
get_int
void set_int_value(GlibObject *object, const gchar *key, gint value)
set_int_value
Definition: EngineUtils.h:278
MilliSeconds get_duration_ms(GstElement *element)
get_duration_ms
void set_values(GlibObject *object, const gchar *key, First value)
set_values
Definition: EngineUtils.h:236
void set_passthrough(GstElement *e, bool b)
set_passthrough
Class for compiler warnings.
Definition: EngineUtils.h:177
GValue get_uint64(guint64 value)
get_uint64
GValue get_int64(gint64 value)
get_int64
bool create_element(GstElement **elem, const QString &elem_name)
create_element
void config_queue(GstElement *queue, gulong max_time_ms=100)
config_queue
MilliSeconds get_update_interval()
get_update_interval
void config_sink(GstElement *sink)
config_sink
bool check_pitch_available()
check_pitch_available
GValue get_uint(guint value)
get_uint
Definition: EngineUtils.h:33
bool check_lame_available()
check_lame_available