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 4
29 #define MAX_AUDIO_CHANNELS 2
30 #define AUDIO_OUTPUT_FRAMES 1024
31 
32 /*
33  * Base audio output component. Use this to create an audio output track
34  * for the media.
35  */
36 
37 struct audio_output;
38 typedef struct audio_output audio_t;
39 
42 
47 
52 };
53 
66 };
67 
68 struct audio_data {
72 };
73 
76 };
77 
78 typedef bool (*audio_input_callback_t)(void *param,
79  uint64_t start_ts, uint64_t end_ts, uint64_t *new_ts,
80  uint32_t active_mixers, struct audio_output_data *mixes);
81 
83  const char *name;
84 
86  enum audio_format format;
87  enum speaker_layout speakers;
88 
90  void *input_param;
91 };
92 
95  enum audio_format format;
96  enum speaker_layout speakers;
97 };
98 
99 static inline uint32_t get_audio_channels(enum speaker_layout speakers)
100 {
101  switch (speakers) {
102  case SPEAKERS_MONO: return 1;
103  case SPEAKERS_STEREO: return 2;
104  case SPEAKERS_2POINT1: return 3;
105  case SPEAKERS_SURROUND:
106  case SPEAKERS_QUAD: return 4;
107  case SPEAKERS_4POINT1: return 5;
108  case SPEAKERS_5POINT1:
109  case SPEAKERS_5POINT1_SURROUND: return 6;
110  case SPEAKERS_7POINT1: return 8;
111  case SPEAKERS_7POINT1_SURROUND: return 8;
112  case SPEAKERS_UNKNOWN: return 0;
113  }
114 
115  return 0;
116 }
117 
118 static inline size_t get_audio_bytes_per_channel(enum audio_format format)
119 {
120  switch (format) {
121  case AUDIO_FORMAT_U8BIT:
123  return 1;
124 
125  case AUDIO_FORMAT_16BIT:
127  return 2;
128 
129  case AUDIO_FORMAT_FLOAT:
131  case AUDIO_FORMAT_32BIT:
133  return 4;
134 
136  return 0;
137  }
138 
139  return 0;
140 }
141 
142 static inline bool is_audio_planar(enum audio_format format)
143 {
144  switch (format) {
145  case AUDIO_FORMAT_U8BIT:
146  case AUDIO_FORMAT_16BIT:
147  case AUDIO_FORMAT_32BIT:
148  case AUDIO_FORMAT_FLOAT:
149  return false;
150 
155  return true;
156 
158  return false;
159  }
160 
161  return false;
162 }
163 
164 static inline size_t get_audio_planes(enum audio_format format,
165  enum speaker_layout speakers)
166 {
167  return (is_audio_planar(format) ? get_audio_channels(speakers) : 1);
168 }
169 
170 static inline size_t get_audio_size(enum audio_format format,
171  enum speaker_layout speakers, uint32_t frames)
172 {
173  bool planar = is_audio_planar(format);
174 
175  return (planar ? 1 : get_audio_channels(speakers)) *
176  get_audio_bytes_per_channel(format) *
177  frames;
178 }
179 
180 static inline uint64_t audio_frames_to_ns(size_t sample_rate,
181  uint64_t frames)
182 {
183  util_uint128_t val;
184  val = util_mul64_64(frames, 1000000000ULL);
185  val = util_div128_32(val, (uint32_t)sample_rate);
186  return val.low;
187 }
188 
189 static inline uint64_t ns_to_audio_frames(size_t sample_rate,
190  uint64_t frames)
191 {
192  util_uint128_t val;
193  val = util_mul64_64(frames, sample_rate);
194  val = util_div128_32(val, 1000000000);
195  return val.low;
196 }
197 
198 #define AUDIO_OUTPUT_SUCCESS 0
199 #define AUDIO_OUTPUT_INVALIDPARAM -1
200 #define AUDIO_OUTPUT_FAIL -2
201 
202 EXPORT int audio_output_open(audio_t **audio, struct audio_output_info *info);
203 EXPORT void audio_output_close(audio_t *audio);
204 
205 typedef void (*audio_output_callback_t)(void *param, size_t mix_idx,
206  struct audio_data *data);
207 
208 EXPORT bool audio_output_connect(audio_t *video, size_t mix_idx,
209  const struct audio_convert_info *conversion,
210  audio_output_callback_t callback, void *param);
211 EXPORT void audio_output_disconnect(audio_t *video, size_t mix_idx,
212  audio_output_callback_t callback, void *param);
213 
214 EXPORT bool audio_output_active(const audio_t *audio);
215 
216 EXPORT size_t audio_output_get_block_size(const audio_t *audio);
217 EXPORT size_t audio_output_get_planes(const audio_t *audio);
218 EXPORT size_t audio_output_get_channels(const audio_t *audio);
221  const audio_t *audio);
222 
223 
224 #ifdef __cplusplus
225 }
226 #endif
Definition: util_uint128.h:19
speaker_layout
Definition: audio-io.h:54
EXPORT bool audio_output_active(const audio_t *audio)
Definition: audio-io.h:82
unsigned uint32_t
Definition: vc_stdint.h:31
#define MAX_AUDIO_CHANNELS
Definition: audio-io.h:29
audio_format
Definition: audio-io.h:40
Definition: audio-io.h:65
Definition: audio-io.h:45
audio_input_callback_t input_callback
Definition: audio-io.h:89
Definition: audio-io.h:50
Definition: audio-io.h:57
Definition: audio-io.h:74
unsigned __int64 uint64_t
Definition: vc_stdint.h:33
EXPORT size_t audio_output_get_planes(const audio_t *audio)
Definition: audio-io.h:93
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:51
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:78
Definition: audio-io.h:49
Definition: audio-io.h:63
#define EXPORT
Definition: c99defs.h:53
EXPORT const struct audio_output_info * audio_output_get_info(const audio_t *audio)
uint32_t frames
Definition: audio-io.h:70
EXPORT uint32_t audio_output_get_sample_rate(const audio_t *audio)
uint32_t samples_per_sec
Definition: audio-io.h:85
Definition: audio-io.h:61
Definition: audio-io.h:64
uint32_t samples_per_sec
Definition: audio-io.h:94
Definition: audio-io.h:60
Definition: audio-io.h:44
Definition: audio-io.h:68
Definition: audio-io.h:55
Definition: audio-io.h:43
Definition: audio-io.h:46
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:48
uint64_t timestamp
Definition: audio-io.h:71
void(* audio_output_callback_t)(void *param, size_t mix_idx, struct audio_data *data)
Definition: audio-io.h:205
Definition: audio-io.h:59
void * input_param
Definition: audio-io.h:90
#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
Definition: audio-io.h:56
Definition: audio-io.h:41
Definition: audio-io.h:62
EXPORT int audio_output_open(audio_t **audio, struct audio_output_info *info)
#define bool
Definition: vc_stdbool.h:5
const char * name
Definition: audio-io.h:83
struct audio_output audio_t
Definition: audio-io.h:38
Definition: audio-io.h:58
uint8_t * data[MAX_AV_PLANES]
Definition: audio-io.h:69