test-sinewave.c 1.9 KB

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