1 // Generated by gmmproc 2.50.1 -- DO NOT MODIFY! 2 #ifndef _GSTREAMERMM_AUDIOCLOCK_H 3 #define _GSTREAMERMM_AUDIOCLOCK_H 4 5 6 #include <glibmm/ustring.h> 7 #include <sigc++/sigc++.h> 8 9 /* gstreamermm - a C++ wrapper for gstreamer 10 * 11 * Copyright 2008-2016 The gstreamermm Development Team 12 * 13 * This library is free software; you can redistribute it and/or 14 * modify it under the terms of the GNU Lesser General Public 15 * License as published by the Free Software Foundation; either 16 * version 2.1 of the License, or (at your option) any later version. 17 * 18 * This library is distributed in the hope that it will be useful, 19 * but WITHOUT ANY WARRANTY; without even the implied warranty of 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21 * Lesser General Public License for more details. 22 * 23 * You should have received a copy of the GNU Lesser General Public 24 * License along with this library; if not, write to the Free 25 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 26 */ 27 28 #include <gstreamermm/systemclock.h> 29 #include <memory> 30 31 32 #ifndef DOXYGEN_SHOULD_SKIP_THIS 33 using GstAudioClock = struct _GstAudioClock; 34 using GstAudioClockClass = struct _GstAudioClockClass; 35 #endif /* DOXYGEN_SHOULD_SKIP_THIS */ 36 37 38 #ifndef DOXYGEN_SHOULD_SKIP_THIS 39 namespace Gst 40 { class AudioClock_Class; } // namespace Gst 41 #endif //DOXYGEN_SHOULD_SKIP_THIS 42 43 namespace Gst 44 { 45 46 /** A Helper object for implementing audio clocks. 47 * Gst::AudioClock makes it easy for elements to implement a Gst::Clock, 48 * they simply need to provide a slot that returns the current clock time. 49 * 50 * This object is internally used to implement the clock in 51 * Gst::AudioBaseSink. 52 * 53 * Last reviewed on 2016-04-23 (1.8.0). 54 */ 55 56 class AudioClock : public Gst::SystemClock 57 { 58 59 #ifndef DOXYGEN_SHOULD_SKIP_THIS 60 61 public: 62 using CppObjectType = AudioClock; 63 using CppClassType = AudioClock_Class; 64 using BaseObjectType = GstAudioClock; 65 using BaseClassType = GstAudioClockClass; 66 67 // noncopyable 68 AudioClock(const AudioClock&) = delete; 69 AudioClock& operator=(const AudioClock&) = delete; 70 71 private: friend class AudioClock_Class; 72 static CppClassType audioclock_class_; 73 74 protected: 75 explicit AudioClock(const Glib::ConstructParams& construct_params); 76 explicit AudioClock(GstAudioClock* castitem); 77 78 #endif /* DOXYGEN_SHOULD_SKIP_THIS */ 79 80 public: 81 82 AudioClock(AudioClock&& src) noexcept; 83 AudioClock& operator=(AudioClock&& src) noexcept; 84 85 ~AudioClock() noexcept override; 86 87 /** Get the GType for this class, for use with the underlying GObject type system. 88 */ 89 static GType get_type() G_GNUC_CONST; 90 91 #ifndef DOXYGEN_SHOULD_SKIP_THIS 92 93 94 static GType get_base_type() G_GNUC_CONST; 95 #endif 96 97 ///Provides access to the underlying C GObject. gobj()98 GstAudioClock* gobj() { return reinterpret_cast<GstAudioClock*>(gobject_); } 99 100 ///Provides access to the underlying C GObject. gobj()101 const GstAudioClock* gobj() const { return reinterpret_cast<GstAudioClock*>(gobject_); } 102 103 ///Provides access to the underlying C instance. The caller is responsible for unrefing it. Use when directly setting fields in structs. 104 GstAudioClock* gobj_copy(); 105 106 private: 107 108 109 public: 110 /** For example, 111 * Gst::ClockTime on_get_time(const Glib::RefPtr<Gst::Clock>& clock);. 112 * This function will be called whenever the current clock time needs to be 113 * calculated. If this function returns Gst::CLOCK_TIME_NONE, the last 114 * reported time will be returned by the clock. 115 * 116 * @param clock The Gst::AudioClock. 117 */ 118 typedef sigc::slot< Gst::ClockTime, const Glib::RefPtr<Gst::Clock>& > SlotGetTime; 119 120 protected: 121 AudioClock(const Glib::ustring& name, const SlotGetTime& time_slot); 122 123 public: 124 /** Create a new Gst::AudioClock instance. Whenever the clock time should 125 * be calculated it will call @a time_slot. When @a time_slot returns 126 * Gst::CLOCK_TIME_NONE, the clock will return the last reported time. 127 * 128 * @param name The name of the clock. 129 * @param time_slot A slot that returns the time. 130 * 131 * @return a new Gst::AudioClock. 132 */ 133 134 static Glib::RefPtr<AudioClock> create(const Glib::ustring& name, const SlotGetTime& time_slot); 135 136 137 /** Inform @a clock that future calls to Gst::AudioClockGetTimeFunc will return values 138 * starting from @a time. The clock will update an internal offset to make sure that 139 * future calls to internal_time will return an increasing result as required by 140 * the Gst::Clock object. 141 * 142 * @param time A Gst::ClockTime. 143 */ 144 void reset(Gst::ClockTime time); 145 146 // TODO methods below get GstClock as a first argument, 147 // so have to be wrapped manually. It has been fixed in 148 // GStreamer (https://bugzilla.gnome.org/show_bug.cgi?id=756628) 149 // but patch is not available in 1.8.0 version. 150 151 /** Adjust @a time with the internal offset of the audio clock. 152 * 153 * @param clock A Gst::AudioClock. 154 * @param time A Gst::ClockTime. 155 * @return @a time adjusted with the internal offset. 156 */ 157 158 Gst::ClockTime adjust(Gst::ClockTime time); 159 160 161 /** Report the time as returned by the Gst::AudioClockGetTimeFunc without applying 162 * any offsets. 163 * 164 * @param clock A Gst::AudioClock. 165 * @return The time as reported by the time function of the audio clock. 166 */ 167 168 Gst::ClockTime get_time() const; 169 170 171 /** Invalidate the clock function. Call this function when the provided 172 * Gst::AudioClockGetTimeFunc cannot be called anymore, for example, when the 173 * user_data becomes invalid. 174 * 175 * After calling this function, @a clock will return the last returned time for 176 * the rest of its lifetime. 177 * 178 * @param clock A Gst::AudioClock. 179 */ 180 181 void invalidate(); 182 183 #ifndef DOXYGEN_SHOULD_SKIP_THIS 184 private: 185 // TODO this slot should be moved in move constructor, but for now it's 186 // impossible to provide custom move constructor 187 // (see https://bugzilla.gnome.org/show_bug.cgi?id=756593). 188 // However, task should be managed by RefPtr class, so move constructor 189 // and move assignment operator will never be called. 190 std::unique_ptr<SlotGetTime> m_slot; 191 #endif 192 193 194 public: 195 196 public: 197 //C++ methods used to invoke GTK+ virtual functions: 198 199 protected: 200 //GTK+ Virtual Functions (override these to change behaviour): 201 202 //Default Signal Handlers:: 203 204 205 }; 206 207 } // namespace Gst 208 209 210 namespace Glib 211 { 212 /** A Glib::wrap() method for this object. 213 * 214 * @param object The C instance. 215 * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref. 216 * @result A C++ instance that wraps this C instance. 217 * 218 * @relates Gst::AudioClock 219 */ 220 Glib::RefPtr<Gst::AudioClock> wrap(GstAudioClock* object, bool take_copy = false); 221 } 222 223 224 #endif /* _GSTREAMERMM_AUDIOCLOCK_H */ 225 226