Open Broadcaster Software
Free, open source software for live streaming and recording
audio-io.h
Go to the documentation of this file.
1 /******************************************************************************
2  Copyright (C) 2013 by Hugh Bailey <obs.jim@gmail.com>
3 
4  This program is free software: you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation, either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program. If not, see <http://www.gnu.org/licenses/>.
16 ******************************************************************************/
17 
18 #pragma once
19 
20 #include "media-io-defs.h"
21 #include "../util/c99defs.h"
22 #include "../util/util_uint128.h"
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 #define MAX_AUDIO_MIXES 6
29 #define MAX_AUDIO_CHANNELS 8
30 #define AUDIO_OUTPUT_FRAMES 1024
31 
32 #define TOTAL_AUDIO_SIZE \
33  (MAX_AUDIO_MIXES * MAX_AUDIO_CHANNELS * AUDIO_OUTPUT_FRAMES * \
34  sizeof(float))
35 
36 /*
37  * Base audio output component. Use this to create an audio output track
38  * for the media.
39  */
40 
41 struct audio_output;
42 typedef struct audio_output audio_t;
43 
46 
51 
56 };
57 
76 };
77 
78 struct audio_data {
82 };
83 
86 };
87 
88 typedef bool (*audio_input_callback_t)(void *param, uint64_t start_ts,
89  uint64_t end_ts, uint64_t *new_ts,
90  uint32_t active_mixers,
91  struct audio_output_data *mixes);
92 
94  const char *name;
95 
99 
101  void *input_param;
102 };
103 
108 };
109 
110 static inline uint32_t get_audio_channels(enum speaker_layout speakers)
111 {
112  switch (speakers) {
113  case SPEAKERS_MONO:
114  return 1;
115  case SPEAKERS_STEREO:
116  return 2;
117  case SPEAKERS_2POINT1:
118  return 3;
119  case SPEAKERS_4POINT0:
120  return 4;
121  case SPEAKERS_4POINT1:
122  return 5;
123  case SPEAKERS_5POINT1:
124  return 6;
125  case SPEAKERS_7POINT1:
126  return 8;
127  case SPEAKERS_UNKNOWN:
128  return 0;
129  }
130 
131  return 0;
132 }
133 
134 static inline size_t get_audio_bytes_per_channel(enum audio_format format)
135 {
136  switch (format) {
137  case AUDIO_FORMAT_U8BIT:
139  return 1;
140 
141  case AUDIO_FORMAT_16BIT:
143  return 2;
144 
145  case AUDIO_FORMAT_FLOAT:
147  case AUDIO_FORMAT_32BIT:
149  return 4;
150 
152  return 0;
153  }
154 
155  return 0;
156 }
157 
158 static inline bool is_audio_planar(enum audio_format format)
159 {
160  switch (format) {
161  case AUDIO_FORMAT_U8BIT:
162  case AUDIO_FORMAT_16BIT:
163  case AUDIO_FORMAT_32BIT:
164  case AUDIO_FORMAT_FLOAT:
165  return false;
166 
171  return true;
172 
174  return false;
175  }
176 
177  return false;
178 }
179 
180 static inline size_t get_audio_planes(enum audio_format format,
181  enum speaker_layout speakers)
182 {
183  return (is_audio_planar(format) ? get_audio_channels(speakers) : 1);
184 }
185 
186 static inline size_t get_audio_size(enum audio_format format,
187  enum speaker_layout speakers,
188  uint32_t frames)
189 {
190  bool planar = is_audio_planar(format);
191 
192  return (planar ? 1 : get_audio_channels(speakers)) *
193  get_audio_bytes_per_channel(format) * frames;
194 }
195 
196 static inline uint64_t audio_frames_to_ns(size_t sample_rate, uint64_t frames)
197 {
198  util_uint128_t val;
199  val = util_mul64_64(frames, 1000000000ULL);
200  val = util_div128_32(val, (uint32_t)sample_rate);
201  return val.low;
202 }
203 
204 static inline uint64_t ns_to_audio_frames(size_t sample_rate, uint64_t frames)
205 {
206  util_uint128_t val;
207  val = util_mul64_64(frames, sample_rate);
208  val = util_div128_32(val, 1000000000);
209  return val.low;
210 }
211 
212 #define AUDIO_OUTPUT_SUCCESS 0
213 #define AUDIO_OUTPUT_INVALIDPARAM -1
214 #define AUDIO_OUTPUT_FAIL -2
215 
216 EXPORT int audio_output_open(audio_t **audio, struct audio_output_info *info);
217 EXPORT void audio_output_close(audio_t *audio);
218 
219 typedef void (*audio_output_callback_t)(void *param, size_t mix_idx,
220  struct audio_data *data);
221 
222 EXPORT bool audio_output_connect(audio_t *video, size_t mix_idx,
223  const struct audio_convert_info *conversion,
224  audio_output_callback_t callback, void *param);
225 EXPORT void audio_output_disconnect(audio_t *video, size_t mix_idx,
226  audio_output_callback_t callback,
227  void *param);
228 
229 EXPORT bool audio_output_active(const audio_t *audio);
230 
231 EXPORT size_t audio_output_get_block_size(const audio_t *audio);
232 EXPORT size_t audio_output_get_planes(const audio_t *audio);
233 EXPORT size_t audio_output_get_channels(const audio_t *audio);
235 EXPORT const struct audio_output_info *
236 audio_output_get_info(const audio_t *audio);
237 
238 #ifdef __cplusplus
239 }
240 #endif
Definition: util_uint128.h:19
speaker_layout
Definition: audio-io.h:67
EXPORT bool audio_output_active(const audio_t *audio)
float * data[MAX_AUDIO_CHANNELS]
Definition: audio-io.h:85
Definition: audio-io.h:93
unsigned uint32_t
Definition: vc_stdint.h:31
#define MAX_AUDIO_CHANNELS
Definition: audio-io.h:29
audio_format
Definition: audio-io.h:44
Definition: audio-io.h:49
audio_input_callback_t input_callback
Definition: audio-io.h:100
enum speaker_layout speakers
Definition: audio-io.h:98
Definition: audio-io.h:54
Definition: audio-io.h:70
Definition: audio-io.h:84
unsigned __int64 uint64_t
Definition: vc_stdint.h:33
EXPORT size_t audio_output_get_planes(const audio_t *audio)
Definition: audio-io.h:104
unsigned char uint8_t
Definition: vc_stdint.h:27
EXPORT void audio_output_close(audio_t *audio)
EXPORT bool audio_output_connect(audio_t *video, size_t mix_idx, const struct audio_convert_info *conversion, audio_output_callback_t callback, void *param)
Definition: audio-io.h:55
bool(* audio_input_callback_t)(void *param, uint64_t start_ts, uint64_t end_ts, uint64_t *new_ts, uint32_t active_mixers, struct audio_output_data *mixes)
Definition: audio-io.h:88
Definition: audio-io.h:53
Definition: audio-io.h:75
#define EXPORT
Definition: c99defs.h:49
EXPORT const struct audio_output_info * audio_output_get_info(const audio_t *audio)
uint32_t frames
Definition: audio-io.h:80
EXPORT uint32_t audio_output_get_sample_rate(const audio_t *audio)
uint32_t samples_per_sec
Definition: audio-io.h:96
Definition: audio-io.h:74
enum speaker_layout speakers
Definition: audio-io.h:107
uint32_t samples_per_sec
Definition: audio-io.h:105
Definition: audio-io.h:72
Definition: audio-io.h:73
Definition: audio-io.h:48
Definition: audio-io.h:78
Definition: audio-io.h:68
Definition: audio-io.h:47
Definition: audio-io.h:50
EXPORT size_t audio_output_get_block_size(const audio_t *audio)
EXPORT void audio_output_disconnect(audio_t *video, size_t mix_idx, audio_output_callback_t callback, void *param)
Definition: audio-io.h:52
uint64_t timestamp
Definition: audio-io.h:81
void(* audio_output_callback_t)(void *param, size_t mix_idx, struct audio_data *data)
Definition: audio-io.h:219
void * input_param
Definition: audio-io.h:101
#define MAX_AV_PLANES
Definition: media-io-defs.h:20
EXPORT size_t audio_output_get_channels(const audio_t *audio)
uint64_t low
Definition: util_uint128.h:23
enum audio_format format
Definition: audio-io.h:97
Definition: audio-io.h:69
Definition: audio-io.h:45
EXPORT int audio_output_open(audio_t **audio, struct audio_output_info *info)
#define bool
Definition: vc_stdbool.h:5
enum audio_format format
Definition: audio-io.h:106
const char * name
Definition: audio-io.h:94
struct audio_output audio_t
Definition: audio-io.h:42
Definition: audio-io.h:71
uint8_t * data[MAX_AV_PLANES]
Definition: audio-io.h:79