audio-io.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. /******************************************************************************
  2. Copyright (C) 2013 by Hugh Bailey <[email protected]>
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. ******************************************************************************/
  14. #include <math.h>
  15. #include <inttypes.h>
  16. #include "../util/threading.h"
  17. #include "../util/darray.h"
  18. #include "../util/circlebuf.h"
  19. #include "../util/platform.h"
  20. #include "../util/profiler.h"
  21. #include "../util/util_uint64.h"
  22. #include "audio-io.h"
  23. #include "audio-resampler.h"
  24. extern profiler_name_store_t *obs_get_profiler_name_store(void);
  25. /* #define DEBUG_AUDIO */
  26. #define nop() \
  27. do { \
  28. int invalid = 0; \
  29. } while (0)
  30. struct audio_input {
  31. struct audio_convert_info conversion;
  32. audio_resampler_t *resampler;
  33. audio_output_callback_t callback;
  34. void *param;
  35. };
  36. static inline void audio_input_free(struct audio_input *input)
  37. {
  38. audio_resampler_destroy(input->resampler);
  39. }
  40. struct audio_mix {
  41. DARRAY(struct audio_input) inputs;
  42. float buffer[MAX_AUDIO_CHANNELS][AUDIO_OUTPUT_FRAMES];
  43. };
  44. struct audio_output {
  45. struct audio_output_info info;
  46. size_t block_size;
  47. size_t channels;
  48. size_t planes;
  49. pthread_t thread;
  50. os_event_t *stop_event;
  51. bool initialized;
  52. audio_input_callback_t input_cb;
  53. void *input_param;
  54. pthread_mutex_t input_mutex;
  55. struct audio_mix mixes[MAX_AUDIO_MIXES];
  56. };
  57. /* ------------------------------------------------------------------------- */
  58. /* the following functions are used to calculate frame offsets based upon
  59. * timestamps. this will actually work accurately as long as you handle the
  60. * values correctly */
  61. static inline double ts_to_frames(const audio_t *audio, uint64_t ts)
  62. {
  63. return util_mul_div64(ts, audio->info.samples_per_sec, 1000000000ULL);
  64. }
  65. static inline double positive_round(double val)
  66. {
  67. return floor(val + 0.5);
  68. }
  69. static int64_t ts_diff_frames(const audio_t *audio, uint64_t ts1, uint64_t ts2)
  70. {
  71. double diff = ts_to_frames(audio, ts1) - ts_to_frames(audio, ts2);
  72. return (int64_t)positive_round(diff);
  73. }
  74. static int64_t ts_diff_bytes(const audio_t *audio, uint64_t ts1, uint64_t ts2)
  75. {
  76. return ts_diff_frames(audio, ts1, ts2) * (int64_t)audio->block_size;
  77. }
  78. /* ------------------------------------------------------------------------- */
  79. static inline uint64_t min_uint64(uint64_t a, uint64_t b)
  80. {
  81. return a < b ? a : b;
  82. }
  83. static inline size_t min_size(size_t a, size_t b)
  84. {
  85. return a < b ? a : b;
  86. }
  87. #ifndef CLAMP
  88. #define CLAMP(val, minval, maxval) \
  89. ((val > maxval) ? maxval : ((val < minval) ? minval : val))
  90. #endif
  91. static bool resample_audio_output(struct audio_input *input,
  92. struct audio_data *data)
  93. {
  94. bool success = true;
  95. if (input->resampler) {
  96. uint8_t *output[MAX_AV_PLANES];
  97. uint32_t frames;
  98. uint64_t offset;
  99. memset(output, 0, sizeof(output));
  100. success = audio_resampler_resample(
  101. input->resampler, output, &frames, &offset,
  102. (const uint8_t *const *)data->data, data->frames);
  103. for (size_t i = 0; i < MAX_AV_PLANES; i++)
  104. data->data[i] = output[i];
  105. data->frames = frames;
  106. data->timestamp -= offset;
  107. }
  108. return success;
  109. }
  110. static inline void do_audio_output(struct audio_output *audio, size_t mix_idx,
  111. uint64_t timestamp, uint32_t frames)
  112. {
  113. struct audio_mix *mix = &audio->mixes[mix_idx];
  114. struct audio_data data;
  115. pthread_mutex_lock(&audio->input_mutex);
  116. for (size_t i = mix->inputs.num; i > 0; i--) {
  117. struct audio_input *input = mix->inputs.array + (i - 1);
  118. for (size_t i = 0; i < audio->planes; i++)
  119. data.data[i] = (uint8_t *)mix->buffer[i];
  120. data.frames = frames;
  121. data.timestamp = timestamp;
  122. if (resample_audio_output(input, &data))
  123. input->callback(input->param, mix_idx, &data);
  124. }
  125. pthread_mutex_unlock(&audio->input_mutex);
  126. }
  127. static inline void clamp_audio_output(struct audio_output *audio, size_t bytes)
  128. {
  129. size_t float_size = bytes / sizeof(float);
  130. for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
  131. struct audio_mix *mix = &audio->mixes[mix_idx];
  132. /* do not process mixing if a specific mix is inactive */
  133. if (!mix->inputs.num)
  134. continue;
  135. for (size_t plane = 0; plane < audio->planes; plane++) {
  136. float *mix_data = mix->buffer[plane];
  137. float *mix_end = &mix_data[float_size];
  138. while (mix_data < mix_end) {
  139. float val = *mix_data;
  140. val = (val > 1.0f) ? 1.0f : val;
  141. val = (val < -1.0f) ? -1.0f : val;
  142. *(mix_data++) = val;
  143. }
  144. }
  145. }
  146. }
  147. static void input_and_output(struct audio_output *audio, uint64_t audio_time,
  148. uint64_t prev_time)
  149. {
  150. size_t bytes = AUDIO_OUTPUT_FRAMES * audio->block_size;
  151. struct audio_output_data data[MAX_AUDIO_MIXES];
  152. uint32_t active_mixes = 0;
  153. uint64_t new_ts = 0;
  154. bool success;
  155. memset(data, 0, sizeof(data));
  156. #ifdef DEBUG_AUDIO
  157. blog(LOG_DEBUG, "audio_time: %llu, prev_time: %llu, bytes: %lu",
  158. audio_time, prev_time, bytes);
  159. #endif
  160. /* get mixers */
  161. pthread_mutex_lock(&audio->input_mutex);
  162. for (size_t i = 0; i < MAX_AUDIO_MIXES; i++) {
  163. if (audio->mixes[i].inputs.num)
  164. active_mixes |= (1 << i);
  165. }
  166. pthread_mutex_unlock(&audio->input_mutex);
  167. /* clear mix buffers */
  168. for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
  169. struct audio_mix *mix = &audio->mixes[mix_idx];
  170. memset(mix->buffer[0], 0,
  171. AUDIO_OUTPUT_FRAMES * MAX_AUDIO_CHANNELS *
  172. sizeof(float));
  173. for (size_t i = 0; i < audio->planes; i++)
  174. data[mix_idx].data[i] = mix->buffer[i];
  175. }
  176. /* get new audio data */
  177. success = audio->input_cb(audio->input_param, prev_time, audio_time,
  178. &new_ts, active_mixes, data);
  179. if (!success)
  180. return;
  181. /* clamps audio data to -1.0..1.0 */
  182. clamp_audio_output(audio, bytes);
  183. /* output */
  184. for (size_t i = 0; i < MAX_AUDIO_MIXES; i++)
  185. do_audio_output(audio, i, new_ts, AUDIO_OUTPUT_FRAMES);
  186. }
  187. static void *audio_thread(void *param)
  188. {
  189. struct audio_output *audio = param;
  190. size_t rate = audio->info.samples_per_sec;
  191. uint64_t samples = 0;
  192. uint64_t start_time = os_gettime_ns();
  193. uint64_t prev_time = start_time;
  194. uint64_t audio_time = prev_time;
  195. uint32_t audio_wait_time = (uint32_t)(
  196. audio_frames_to_ns(rate, AUDIO_OUTPUT_FRAMES) / 1000000);
  197. os_set_thread_name("audio-io: audio thread");
  198. const char *audio_thread_name =
  199. profile_store_name(obs_get_profiler_name_store(),
  200. "audio_thread(%s)", audio->info.name);
  201. while (os_event_try(audio->stop_event) == EAGAIN) {
  202. uint64_t cur_time;
  203. os_sleep_ms(audio_wait_time);
  204. profile_start(audio_thread_name);
  205. cur_time = os_gettime_ns();
  206. while (audio_time <= cur_time) {
  207. samples += AUDIO_OUTPUT_FRAMES;
  208. audio_time =
  209. start_time + audio_frames_to_ns(rate, samples);
  210. input_and_output(audio, audio_time, prev_time);
  211. prev_time = audio_time;
  212. }
  213. profile_end(audio_thread_name);
  214. profile_reenable_thread();
  215. }
  216. return NULL;
  217. }
  218. /* ------------------------------------------------------------------------- */
  219. static size_t audio_get_input_idx(const audio_t *audio, size_t mix_idx,
  220. audio_output_callback_t callback, void *param)
  221. {
  222. const struct audio_mix *mix = &audio->mixes[mix_idx];
  223. for (size_t i = 0; i < mix->inputs.num; i++) {
  224. struct audio_input *input = mix->inputs.array + i;
  225. if (input->callback == callback && input->param == param)
  226. return i;
  227. }
  228. return DARRAY_INVALID;
  229. }
  230. static inline bool audio_input_init(struct audio_input *input,
  231. struct audio_output *audio)
  232. {
  233. if (input->conversion.format != audio->info.format ||
  234. input->conversion.samples_per_sec != audio->info.samples_per_sec ||
  235. input->conversion.speakers != audio->info.speakers) {
  236. struct resample_info from = {
  237. .format = audio->info.format,
  238. .samples_per_sec = audio->info.samples_per_sec,
  239. .speakers = audio->info.speakers};
  240. struct resample_info to = {
  241. .format = input->conversion.format,
  242. .samples_per_sec = input->conversion.samples_per_sec,
  243. .speakers = input->conversion.speakers};
  244. input->resampler = audio_resampler_create(&to, &from);
  245. if (!input->resampler) {
  246. blog(LOG_ERROR, "audio_input_init: Failed to "
  247. "create resampler");
  248. return false;
  249. }
  250. } else {
  251. input->resampler = NULL;
  252. }
  253. return true;
  254. }
  255. bool audio_output_connect(audio_t *audio, size_t mi,
  256. const struct audio_convert_info *conversion,
  257. audio_output_callback_t callback, void *param)
  258. {
  259. bool success = false;
  260. if (!audio || mi >= MAX_AUDIO_MIXES)
  261. return false;
  262. pthread_mutex_lock(&audio->input_mutex);
  263. if (audio_get_input_idx(audio, mi, callback, param) == DARRAY_INVALID) {
  264. struct audio_mix *mix = &audio->mixes[mi];
  265. struct audio_input input;
  266. input.callback = callback;
  267. input.param = param;
  268. if (conversion) {
  269. input.conversion = *conversion;
  270. } else {
  271. input.conversion.format = audio->info.format;
  272. input.conversion.speakers = audio->info.speakers;
  273. input.conversion.samples_per_sec =
  274. audio->info.samples_per_sec;
  275. }
  276. if (input.conversion.format == AUDIO_FORMAT_UNKNOWN)
  277. input.conversion.format = audio->info.format;
  278. if (input.conversion.speakers == SPEAKERS_UNKNOWN)
  279. input.conversion.speakers = audio->info.speakers;
  280. if (input.conversion.samples_per_sec == 0)
  281. input.conversion.samples_per_sec =
  282. audio->info.samples_per_sec;
  283. success = audio_input_init(&input, audio);
  284. if (success)
  285. da_push_back(mix->inputs, &input);
  286. }
  287. pthread_mutex_unlock(&audio->input_mutex);
  288. return success;
  289. }
  290. void audio_output_disconnect(audio_t *audio, size_t mix_idx,
  291. audio_output_callback_t callback, void *param)
  292. {
  293. if (!audio || mix_idx >= MAX_AUDIO_MIXES)
  294. return;
  295. pthread_mutex_lock(&audio->input_mutex);
  296. size_t idx = audio_get_input_idx(audio, mix_idx, callback, param);
  297. if (idx != DARRAY_INVALID) {
  298. struct audio_mix *mix = &audio->mixes[mix_idx];
  299. audio_input_free(mix->inputs.array + idx);
  300. da_erase(mix->inputs, idx);
  301. }
  302. pthread_mutex_unlock(&audio->input_mutex);
  303. }
  304. static inline bool valid_audio_params(const struct audio_output_info *info)
  305. {
  306. return info->format && info->name && info->samples_per_sec > 0 &&
  307. info->speakers > 0;
  308. }
  309. int audio_output_open(audio_t **audio, struct audio_output_info *info)
  310. {
  311. struct audio_output *out;
  312. pthread_mutexattr_t attr;
  313. bool planar = is_audio_planar(info->format);
  314. if (!valid_audio_params(info))
  315. return AUDIO_OUTPUT_INVALIDPARAM;
  316. out = bzalloc(sizeof(struct audio_output));
  317. if (!out)
  318. goto fail;
  319. memcpy(&out->info, info, sizeof(struct audio_output_info));
  320. out->channels = get_audio_channels(info->speakers);
  321. out->planes = planar ? out->channels : 1;
  322. out->input_cb = info->input_callback;
  323. out->input_param = info->input_param;
  324. out->block_size = (planar ? 1 : out->channels) *
  325. get_audio_bytes_per_channel(info->format);
  326. if (pthread_mutexattr_init(&attr) != 0)
  327. goto fail;
  328. if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
  329. goto fail;
  330. if (pthread_mutex_init(&out->input_mutex, &attr) != 0)
  331. goto fail;
  332. if (os_event_init(&out->stop_event, OS_EVENT_TYPE_MANUAL) != 0)
  333. goto fail;
  334. if (pthread_create(&out->thread, NULL, audio_thread, out) != 0)
  335. goto fail;
  336. out->initialized = true;
  337. *audio = out;
  338. return AUDIO_OUTPUT_SUCCESS;
  339. fail:
  340. audio_output_close(out);
  341. return AUDIO_OUTPUT_FAIL;
  342. }
  343. void audio_output_close(audio_t *audio)
  344. {
  345. void *thread_ret;
  346. if (!audio)
  347. return;
  348. if (audio->initialized) {
  349. os_event_signal(audio->stop_event);
  350. pthread_join(audio->thread, &thread_ret);
  351. }
  352. for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
  353. struct audio_mix *mix = &audio->mixes[mix_idx];
  354. for (size_t i = 0; i < mix->inputs.num; i++)
  355. audio_input_free(mix->inputs.array + i);
  356. da_free(mix->inputs);
  357. }
  358. os_event_destroy(audio->stop_event);
  359. bfree(audio);
  360. }
  361. const struct audio_output_info *audio_output_get_info(const audio_t *audio)
  362. {
  363. return audio ? &audio->info : NULL;
  364. }
  365. bool audio_output_active(const audio_t *audio)
  366. {
  367. if (!audio)
  368. return false;
  369. for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
  370. const struct audio_mix *mix = &audio->mixes[mix_idx];
  371. if (mix->inputs.num != 0)
  372. return true;
  373. }
  374. return false;
  375. }
  376. size_t audio_output_get_block_size(const audio_t *audio)
  377. {
  378. return audio ? audio->block_size : 0;
  379. }
  380. size_t audio_output_get_planes(const audio_t *audio)
  381. {
  382. return audio ? audio->planes : 0;
  383. }
  384. size_t audio_output_get_channels(const audio_t *audio)
  385. {
  386. return audio ? audio->channels : 0;
  387. }
  388. uint32_t audio_output_get_sample_rate(const audio_t *audio)
  389. {
  390. return audio ? audio->info.samples_per_sec : 0;
  391. }