gstaudioringbuffer.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /* GStreamer
  2. * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
  3. * 2005 Wim Taymans <wim@fluendo.com>
  4. *
  5. * gstaudioringbuffer.h:
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Library General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2 of the License, or (at your option) any later version.
  11. *
  12. * This library 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 GNU
  15. * Library General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Library General Public
  18. * License along with this library; if not, write to the
  19. * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
  20. * Boston, MA 02110-1301, USA.
  21. */
  22. #ifndef __GST_AUDIO_AUDIO_H__
  23. #include <gst/audio/audio.h>
  24. #endif
  25. #ifndef __GST_AUDIO_RING_BUFFER_H__
  26. #define __GST_AUDIO_RING_BUFFER_H__
  27. G_BEGIN_DECLS
  28. #define GST_TYPE_AUDIO_RING_BUFFER (gst_audio_ring_buffer_get_type())
  29. #define GST_AUDIO_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_RING_BUFFER,GstAudioRingBuffer))
  30. #define GST_AUDIO_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_RING_BUFFER,GstAudioRingBufferClass))
  31. #define GST_AUDIO_RING_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_AUDIO_RING_BUFFER, GstAudioRingBufferClass))
  32. #define GST_AUDIO_RING_BUFFER_CAST(obj) ((GstAudioRingBuffer *)obj)
  33. #define GST_IS_AUDIO_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_RING_BUFFER))
  34. #define GST_IS_AUDIO_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_RING_BUFFER))
  35. typedef struct _GstAudioRingBuffer GstAudioRingBuffer;
  36. typedef struct _GstAudioRingBufferClass GstAudioRingBufferClass;
  37. typedef struct _GstAudioRingBufferSpec GstAudioRingBufferSpec;
  38. /**
  39. * GstAudioRingBufferCallback:
  40. * @rbuf: a #GstAudioRingBuffer
  41. * @data: (array length=len): target to fill
  42. * @len: amount to fill
  43. * @user_data: user data
  44. *
  45. * This function is set with gst_audio_ring_buffer_set_callback() and is
  46. * called to fill the memory at @data with @len bytes of samples.
  47. */
  48. typedef void (*GstAudioRingBufferCallback) (GstAudioRingBuffer *rbuf, guint8* data, guint len, gpointer user_data);
  49. /**
  50. * GstAudioRingBufferState:
  51. * @GST_AUDIO_RING_BUFFER_STATE_STOPPED: The ringbuffer is stopped
  52. * @GST_AUDIO_RING_BUFFER_STATE_PAUSED: The ringbuffer is paused
  53. * @GST_AUDIO_RING_BUFFER_STATE_STARTED: The ringbuffer is started
  54. * @GST_AUDIO_RING_BUFFER_STATE_ERROR: The ringbuffer has encountered an
  55. * error after it has been started, e.g. because the device was
  56. * disconnected (Since 1.2)
  57. *
  58. * The state of the ringbuffer.
  59. */
  60. typedef enum {
  61. GST_AUDIO_RING_BUFFER_STATE_STOPPED,
  62. GST_AUDIO_RING_BUFFER_STATE_PAUSED,
  63. GST_AUDIO_RING_BUFFER_STATE_STARTED,
  64. GST_AUDIO_RING_BUFFER_STATE_ERROR
  65. } GstAudioRingBufferState;
  66. /**
  67. * GstAudioRingBufferFormatType:
  68. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW: samples in linear or float
  69. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_MU_LAW: samples in mulaw
  70. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_A_LAW: samples in alaw
  71. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_IMA_ADPCM: samples in ima adpcm
  72. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_MPEG: samples in mpeg audio (but not AAC) format
  73. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_GSM: samples in gsm format
  74. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_IEC958: samples in IEC958 frames (e.g. AC3)
  75. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_AC3: samples in AC3 format
  76. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_EAC3: samples in EAC3 format
  77. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_DTS: samples in DTS format
  78. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_MPEG2_AAC: samples in MPEG-2 AAC format
  79. * @GST_AUDIO_RING_BUFFER_FORMAT_TYPE_MPEG4_AAC: samples in MPEG-4 AAC format
  80. *
  81. * The format of the samples in the ringbuffer.
  82. */
  83. typedef enum
  84. {
  85. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW,
  86. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_MU_LAW,
  87. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_A_LAW,
  88. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_IMA_ADPCM,
  89. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_MPEG,
  90. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_GSM,
  91. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_IEC958,
  92. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_AC3,
  93. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_EAC3,
  94. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_DTS,
  95. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_MPEG2_AAC,
  96. GST_AUDIO_RING_BUFFER_FORMAT_TYPE_MPEG4_AAC
  97. } GstAudioRingBufferFormatType;
  98. /**
  99. * GstAudioRingBufferSpec:
  100. * @caps: The caps that generated the Spec.
  101. * @type: the sample type
  102. * @info: the #GstAudioInfo
  103. * @latency_time: the latency in microseconds
  104. * @buffer_time: the total buffer size in microseconds
  105. * @segsize: the size of one segment in bytes
  106. * @segtotal: the total number of segments
  107. * @seglatency: number of segments queued in the lower level device,
  108. * defaults to segtotal
  109. *
  110. * The structure containing the format specification of the ringbuffer.
  111. */
  112. struct _GstAudioRingBufferSpec
  113. {
  114. /*< public >*/
  115. /* in */
  116. GstCaps *caps; /* the caps of the buffer */
  117. /* in/out */
  118. GstAudioRingBufferFormatType type;
  119. GstAudioInfo info;
  120. guint64 latency_time; /* the required/actual latency time, this is the
  121. * actual the size of one segment and the
  122. * minimum possible latency we can achieve. */
  123. guint64 buffer_time; /* the required/actual time of the buffer, this is
  124. * the total size of the buffer and maximum
  125. * latency we can compensate for. */
  126. gint segsize; /* size of one buffer segment in bytes, this value
  127. * should be chosen to match latency_time as
  128. * well as possible. */
  129. gint segtotal; /* total number of segments, this value is the
  130. * number of segments of @segsize and should be
  131. * chosen so that it matches buffer_time as
  132. * close as possible. */
  133. /* ABI added 0.10.20 */
  134. gint seglatency; /* number of segments queued in the lower
  135. * level device, defaults to segtotal. */
  136. /*< private >*/
  137. gpointer _gst_reserved[GST_PADDING];
  138. };
  139. #define GST_AUDIO_RING_BUFFER_GET_COND(buf) (&(((GstAudioRingBuffer *)buf)->cond))
  140. #define GST_AUDIO_RING_BUFFER_WAIT(buf) (g_cond_wait (GST_AUDIO_RING_BUFFER_GET_COND (buf), GST_OBJECT_GET_LOCK (buf)))
  141. #define GST_AUDIO_RING_BUFFER_SIGNAL(buf) (g_cond_signal (GST_AUDIO_RING_BUFFER_GET_COND (buf)))
  142. #define GST_AUDIO_RING_BUFFER_BROADCAST(buf)(g_cond_broadcast (GST_AUDIO_RING_BUFFER_GET_COND (buf)))
  143. /**
  144. * GstAudioRingBuffer:
  145. * @cond: used to signal start/stop/pause/resume actions
  146. * @open: boolean indicating that the ringbuffer is open
  147. * @acquired: boolean indicating that the ringbuffer is acquired
  148. * @memory: data in the ringbuffer
  149. * @size: size of data in the ringbuffer
  150. * @spec: format and layout of the ringbuffer data
  151. * @samples_per_seg: number of samples in one segment
  152. * @empty_seg: pointer to memory holding one segment of silence samples
  153. * @state: state of the buffer
  154. * @segdone: readpointer in the ringbuffer
  155. * @segbase: segment corresponding to segment 0 (unused)
  156. * @waiting: is a reader or writer waiting for a free segment
  157. *
  158. * The ringbuffer base class structure.
  159. */
  160. struct _GstAudioRingBuffer {
  161. GstObject object;
  162. /*< public >*/ /* with LOCK */
  163. GCond cond;
  164. gboolean open;
  165. gboolean acquired;
  166. guint8 *memory;
  167. gsize size;
  168. GstClockTime *timestamps;
  169. GstAudioRingBufferSpec spec;
  170. gint samples_per_seg;
  171. guint8 *empty_seg;
  172. /*< public >*/ /* ATOMIC */
  173. gint state;
  174. gint segdone;
  175. gint segbase;
  176. gint waiting;
  177. /*< private >*/
  178. GstAudioRingBufferCallback callback;
  179. gpointer cb_data;
  180. gboolean need_reorder;
  181. /* gst[channel_reorder_map[i]] = device[i] */
  182. gint channel_reorder_map[64];
  183. gboolean flushing;
  184. /* ATOMIC */
  185. gint may_start;
  186. gboolean active;
  187. /*< private >*/
  188. gpointer _gst_reserved[GST_PADDING];
  189. };
  190. /**
  191. * GstAudioRingBufferClass:
  192. * @parent_class: parent class
  193. * @open_device: open the device, don't set any params or allocate anything
  194. * @acquire: allocate the resources for the ringbuffer using the given spec
  195. * @release: free resources of the ringbuffer
  196. * @close_device: close the device
  197. * @start: start processing of samples
  198. * @pause: pause processing of samples
  199. * @resume: resume processing of samples after pause
  200. * @stop: stop processing of samples
  201. * @delay: get number of frames queued in device
  202. * @activate: activate the thread that starts pulling and monitoring the
  203. * consumed segments in the device.
  204. * @commit: write samples into the ringbuffer
  205. * @clear_all: clear the entire ringbuffer.
  206. *
  207. * The vmethods that subclasses can override to implement the ringbuffer.
  208. */
  209. struct _GstAudioRingBufferClass {
  210. GstObjectClass parent_class;
  211. /*< public >*/
  212. gboolean (*open_device) (GstAudioRingBuffer *buf);
  213. gboolean (*acquire) (GstAudioRingBuffer *buf, GstAudioRingBufferSpec *spec);
  214. gboolean (*release) (GstAudioRingBuffer *buf);
  215. gboolean (*close_device) (GstAudioRingBuffer *buf);
  216. gboolean (*start) (GstAudioRingBuffer *buf);
  217. gboolean (*pause) (GstAudioRingBuffer *buf);
  218. gboolean (*resume) (GstAudioRingBuffer *buf);
  219. gboolean (*stop) (GstAudioRingBuffer *buf);
  220. guint (*delay) (GstAudioRingBuffer *buf);
  221. /* ABI added */
  222. gboolean (*activate) (GstAudioRingBuffer *buf, gboolean active);
  223. guint (*commit) (GstAudioRingBuffer * buf, guint64 *sample,
  224. guint8 * data, gint in_samples,
  225. gint out_samples, gint * accum);
  226. void (*clear_all) (GstAudioRingBuffer * buf);
  227. /*< private >*/
  228. gpointer _gst_reserved[GST_PADDING];
  229. };
  230. GType gst_audio_ring_buffer_get_type(void);
  231. /* callback stuff */
  232. void gst_audio_ring_buffer_set_callback (GstAudioRingBuffer *buf,
  233. GstAudioRingBufferCallback cb,
  234. gpointer user_data);
  235. gboolean gst_audio_ring_buffer_parse_caps (GstAudioRingBufferSpec *spec, GstCaps *caps);
  236. void gst_audio_ring_buffer_debug_spec_caps (GstAudioRingBufferSpec *spec);
  237. void gst_audio_ring_buffer_debug_spec_buff (GstAudioRingBufferSpec *spec);
  238. gboolean gst_audio_ring_buffer_convert (GstAudioRingBuffer * buf, GstFormat src_fmt,
  239. gint64 src_val, GstFormat dest_fmt,
  240. gint64 * dest_val);
  241. /* device state */
  242. gboolean gst_audio_ring_buffer_open_device (GstAudioRingBuffer *buf);
  243. gboolean gst_audio_ring_buffer_close_device (GstAudioRingBuffer *buf);
  244. gboolean gst_audio_ring_buffer_device_is_open (GstAudioRingBuffer *buf);
  245. /* allocate resources */
  246. gboolean gst_audio_ring_buffer_acquire (GstAudioRingBuffer *buf, GstAudioRingBufferSpec *spec);
  247. gboolean gst_audio_ring_buffer_release (GstAudioRingBuffer *buf);
  248. gboolean gst_audio_ring_buffer_is_acquired (GstAudioRingBuffer *buf);
  249. /* set the device channel positions */
  250. void gst_audio_ring_buffer_set_channel_positions (GstAudioRingBuffer *buf, const GstAudioChannelPosition *position);
  251. /* activating */
  252. gboolean gst_audio_ring_buffer_activate (GstAudioRingBuffer *buf, gboolean active);
  253. gboolean gst_audio_ring_buffer_is_active (GstAudioRingBuffer *buf);
  254. /* flushing */
  255. void gst_audio_ring_buffer_set_flushing (GstAudioRingBuffer *buf, gboolean flushing);
  256. gboolean gst_audio_ring_buffer_is_flushing (GstAudioRingBuffer *buf);
  257. /* playback/pause */
  258. gboolean gst_audio_ring_buffer_start (GstAudioRingBuffer *buf);
  259. gboolean gst_audio_ring_buffer_pause (GstAudioRingBuffer *buf);
  260. gboolean gst_audio_ring_buffer_stop (GstAudioRingBuffer *buf);
  261. /* get status */
  262. guint gst_audio_ring_buffer_delay (GstAudioRingBuffer *buf);
  263. guint64 gst_audio_ring_buffer_samples_done (GstAudioRingBuffer *buf);
  264. void gst_audio_ring_buffer_set_sample (GstAudioRingBuffer *buf, guint64 sample);
  265. /* clear all segments */
  266. void gst_audio_ring_buffer_clear_all (GstAudioRingBuffer *buf);
  267. /* commit samples */
  268. guint gst_audio_ring_buffer_commit (GstAudioRingBuffer * buf, guint64 *sample,
  269. guint8 * data, gint in_samples,
  270. gint out_samples, gint * accum);
  271. /* read samples */
  272. guint gst_audio_ring_buffer_read (GstAudioRingBuffer *buf, guint64 sample,
  273. guint8 *data, guint len, GstClockTime *timestamp);
  274. /* Set timestamp on buffer */
  275. void gst_audio_ring_buffer_set_timestamp (GstAudioRingBuffer * buf, gint readseg, GstClockTime
  276. timestamp);
  277. /* mostly protected */
  278. /* not yet implemented
  279. gboolean gst_audio_ring_buffer_prepare_write (GstAudioRingBuffer *buf, gint *segment, guint8 **writeptr, gint *len);
  280. */
  281. gboolean gst_audio_ring_buffer_prepare_read (GstAudioRingBuffer *buf, gint *segment,
  282. guint8 **readptr, gint *len);
  283. void gst_audio_ring_buffer_clear (GstAudioRingBuffer *buf, gint segment);
  284. void gst_audio_ring_buffer_advance (GstAudioRingBuffer *buf, guint advance);
  285. void gst_audio_ring_buffer_may_start (GstAudioRingBuffer *buf, gboolean allowed);
  286. #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
  287. G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAudioRingBuffer, gst_object_unref)
  288. #endif
  289. G_END_DECLS
  290. #endif /* __GST_AUDIO_RING_BUFFER_H__ */