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 "audio-io.h"
  22. #include "audio-resampler.h"
  23. extern profiler_name_store_t *obs_get_profiler_name_store(void);
  24. /* #define DEBUG_AUDIO */
  25. #define nop() do {int invalid = 0;} while(0)
  26. struct audio_input {
  27. struct audio_convert_info conversion;
  28. audio_resampler_t *resampler;
  29. audio_output_callback_t callback;
  30. void *param;
  31. };
  32. static inline void audio_input_free(struct audio_input *input)
  33. {
  34. audio_resampler_destroy(input->resampler);
  35. }
  36. struct audio_mix {
  37. DARRAY(struct audio_input) inputs;
  38. float buffer[MAX_AUDIO_CHANNELS][AUDIO_OUTPUT_FRAMES];
  39. };
  40. struct audio_output {
  41. struct audio_output_info info;
  42. size_t block_size;
  43. size_t channels;
  44. size_t planes;
  45. pthread_t thread;
  46. os_event_t *stop_event;
  47. bool initialized;
  48. audio_input_callback_t input_cb;
  49. void *input_param;
  50. pthread_mutex_t input_mutex;
  51. struct audio_mix mixes[MAX_AUDIO_MIXES];
  52. };
  53. /* ------------------------------------------------------------------------- */
  54. /* the following functions are used to calculate frame offsets based upon
  55. * timestamps. this will actually work accurately as long as you handle the
  56. * values correctly */
  57. static inline double ts_to_frames(const audio_t *audio, uint64_t ts)
  58. {
  59. double audio_offset_d = (double)ts;
  60. audio_offset_d /= 1000000000.0;
  61. audio_offset_d *= (double)audio->info.samples_per_sec;
  62. return audio_offset_d;
  63. }
  64. static inline double positive_round(double val)
  65. {
  66. return floor(val+0.5);
  67. }
  68. static int64_t ts_diff_frames(const audio_t *audio, uint64_t ts1, uint64_t ts2)
  69. {
  70. double diff = ts_to_frames(audio, ts1) - ts_to_frames(audio, ts2);
  71. return (int64_t)positive_round(diff);
  72. }
  73. static int64_t ts_diff_bytes(const audio_t *audio, uint64_t ts1, uint64_t ts2)
  74. {
  75. return ts_diff_frames(audio, ts1, ts2) * (int64_t)audio->block_size;
  76. }
  77. /* ------------------------------------------------------------------------- */
  78. static inline uint64_t min_uint64(uint64_t a, uint64_t b)
  79. {
  80. return a < b ? a : b;
  81. }
  82. static inline size_t min_size(size_t a, size_t b)
  83. {
  84. return a < b ? a : b;
  85. }
  86. #ifndef CLAMP
  87. #define CLAMP(val, minval, maxval) \
  88. ((val > maxval) ? maxval : ((val < minval) ? minval : val))
  89. #endif
  90. static bool resample_audio_output(struct audio_input *input,
  91. struct audio_data *data)
  92. {
  93. bool success = true;
  94. if (input->resampler) {
  95. uint8_t *output[MAX_AV_PLANES];
  96. uint32_t frames;
  97. uint64_t offset;
  98. memset(output, 0, sizeof(output));
  99. success = audio_resampler_resample(input->resampler,
  100. output, &frames, &offset,
  101. (const uint8_t *const *)data->data,
  102. 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,
  111. size_t mix_idx, 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,
  148. uint64_t audio_time, 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, AUDIO_OUTPUT_FRAMES *
  171. MAX_AUDIO_CHANNELS * sizeof(float));
  172. for (size_t i = 0; i < audio->planes; i++)
  173. data[mix_idx].data[i] = mix->buffer[i];
  174. }
  175. /* get new audio data */
  176. success = audio->input_cb(audio->input_param, prev_time, audio_time,
  177. &new_ts, active_mixes, data);
  178. if (!success)
  179. return;
  180. /* clamps audio data to -1.0..1.0 */
  181. clamp_audio_output(audio, bytes);
  182. /* output */
  183. for (size_t i = 0; i < MAX_AUDIO_MIXES; i++)
  184. do_audio_output(audio, i, new_ts, AUDIO_OUTPUT_FRAMES);
  185. }
  186. static void *audio_thread(void *param)
  187. {
  188. struct audio_output *audio = param;
  189. size_t rate = audio->info.samples_per_sec;
  190. uint64_t samples = 0;
  191. uint64_t start_time = os_gettime_ns();
  192. uint64_t prev_time = start_time;
  193. uint64_t audio_time = prev_time;
  194. uint32_t audio_wait_time =
  195. (uint32_t)(audio_frames_to_ns(rate, AUDIO_OUTPUT_FRAMES) /
  196. 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 = start_time +
  209. 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. };
  241. struct resample_info to = {
  242. .format = input->conversion.format,
  243. .samples_per_sec = input->conversion.samples_per_sec,
  244. .speakers = input->conversion.speakers
  245. };
  246. input->resampler = audio_resampler_create(&to, &from);
  247. if (!input->resampler) {
  248. blog(LOG_ERROR, "audio_input_init: Failed to "
  249. "create resampler");
  250. return false;
  251. }
  252. } else {
  253. input->resampler = NULL;
  254. }
  255. return true;
  256. }
  257. bool audio_output_connect(audio_t *audio, size_t mi,
  258. const struct audio_convert_info *conversion,
  259. audio_output_callback_t callback, void *param)
  260. {
  261. bool success = false;
  262. if (!audio || mi >= MAX_AUDIO_MIXES) return false;
  263. pthread_mutex_lock(&audio->input_mutex);
  264. if (audio_get_input_idx(audio, mi, callback, param) == DARRAY_INVALID) {
  265. struct audio_mix *mix = &audio->mixes[mi];
  266. struct audio_input input;
  267. input.callback = callback;
  268. input.param = param;
  269. if (conversion) {
  270. input.conversion = *conversion;
  271. } else {
  272. input.conversion.format = audio->info.format;
  273. input.conversion.speakers = audio->info.speakers;
  274. input.conversion.samples_per_sec =
  275. audio->info.samples_per_sec;
  276. }
  277. if (input.conversion.format == AUDIO_FORMAT_UNKNOWN)
  278. input.conversion.format = audio->info.format;
  279. if (input.conversion.speakers == SPEAKERS_UNKNOWN)
  280. input.conversion.speakers = audio->info.speakers;
  281. if (input.conversion.samples_per_sec == 0)
  282. input.conversion.samples_per_sec =
  283. audio->info.samples_per_sec;
  284. success = audio_input_init(&input, audio);
  285. if (success)
  286. da_push_back(mix->inputs, &input);
  287. }
  288. pthread_mutex_unlock(&audio->input_mutex);
  289. return success;
  290. }
  291. void audio_output_disconnect(audio_t *audio, size_t mix_idx,
  292. audio_output_callback_t callback, void *param)
  293. {
  294. if (!audio || mix_idx >= MAX_AUDIO_MIXES) 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) return false;
  368. for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
  369. const struct audio_mix *mix = &audio->mixes[mix_idx];
  370. if (mix->inputs.num != 0)
  371. return true;
  372. }
  373. return false;
  374. }
  375. size_t audio_output_get_block_size(const audio_t *audio)
  376. {
  377. return audio ? audio->block_size : 0;
  378. }
  379. size_t audio_output_get_planes(const audio_t *audio)
  380. {
  381. return audio ? audio->planes : 0;
  382. }
  383. size_t audio_output_get_channels(const audio_t *audio)
  384. {
  385. return audio ? audio->channels : 0;
  386. }
  387. uint32_t audio_output_get_sample_rate(const audio_t *audio)
  388. {
  389. return audio ? audio->info.samples_per_sec : 0;
  390. }