test-sinewave.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <math.h>
  2. #include "test-sinewave.h"
  3. const double rate = 261.63/48000.0;
  4. #define M_PI 3.1415926535897932384626433832795
  5. static void *sinewave_thread(void *pdata)
  6. {
  7. struct sinewave_data *swd = pdata;
  8. uint64_t last_time = os_gettime_ns();
  9. uint64_t ts = 0;
  10. double sin_val = 0.0;
  11. uint8_t bytes[480];
  12. while (event_try(&swd->event) == EAGAIN) {
  13. os_sleepto_ns(last_time += 10000000);
  14. for (size_t i = 0; i < 480; i++) {
  15. sin_val += rate * M_PI;
  16. if (sin_val > M_PI)
  17. sin_val -= M_PI;
  18. double wave = sin(sin_val);
  19. bytes[i] = (uint8_t)(wave * 255.0);
  20. }
  21. struct source_audio data;
  22. data.data = bytes;
  23. data.frames = 480;
  24. data.speakers = SPEAKERS_MONO;
  25. data.samples_per_sec = 48000;
  26. data.timestamp = ts;
  27. data.format = AUDIO_FORMAT_U8BIT;
  28. obs_source_output_audio(swd->source, &data);
  29. ts += 10000000;
  30. }
  31. return NULL;
  32. }
  33. /* ------------------------------------------------------------------------- */
  34. const char *sinewave_getname(const char *locale)
  35. {
  36. return "Sinewave Sound Source (Test)";
  37. }
  38. struct sinewave_data *sinewave_create(const char *settings, obs_source_t source)
  39. {
  40. struct sinewave_data *swd = bmalloc(sizeof(struct sinewave_data));
  41. memset(swd, 0, sizeof(struct sinewave_data));
  42. swd->source = source;
  43. if (event_init(&swd->event, EVENT_TYPE_MANUAL) != 0)
  44. goto fail;
  45. if (pthread_create(&swd->thread, NULL, sinewave_thread, swd) != 0)
  46. goto fail;
  47. swd->initialized_thread = true;
  48. return swd;
  49. fail:
  50. sinewave_destroy(swd);
  51. return NULL;
  52. }
  53. void sinewave_destroy(struct sinewave_data *swd)
  54. {
  55. if (swd) {
  56. if (swd->initialized_thread) {
  57. void *ret;
  58. event_signal(&swd->event);
  59. pthread_join(swd->thread, &ret);
  60. }
  61. event_destroy(&swd->event);
  62. bfree(swd);
  63. }
  64. }
  65. uint32_t sinewave_get_output_flags(struct sinewave_data *swd)
  66. {
  67. return SOURCE_AUDIO;
  68. }