| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #include <math.h>
- #include "test-sinewave.h"
- const double rate = 261.63/48000.0;
- #define M_PI 3.1415926535897932384626433832795
- static void *sinewave_thread(void *pdata)
- {
- struct sinewave_data *swd = pdata;
- uint64_t last_time = os_gettime_ns();
- uint64_t ts = 0;
- double sin_val = 0.0;
- uint8_t bytes[480];
- while (event_try(&swd->event) == EAGAIN) {
- os_sleepto_ns(last_time += 10000000);
- for (size_t i = 0; i < 480; i++) {
- sin_val += rate * M_PI;
- if (sin_val > M_PI)
- sin_val -= M_PI;
- double wave = sin(sin_val);
- bytes[i] = (uint8_t)(wave * 255.0);
- }
- struct source_audio data;
- data.data = bytes;
- data.frames = 480;
- data.speakers = SPEAKERS_MONO;
- data.samples_per_sec = 48000;
- data.timestamp = ts;
- data.format = AUDIO_FORMAT_U8BIT;
- obs_source_output_audio(swd->source, &data);
- ts += 10000000;
- }
- return NULL;
- }
- /* ------------------------------------------------------------------------- */
- const char *sinewave_getname(const char *locale)
- {
- return "Sinewave Sound Source (Test)";
- }
- struct sinewave_data *sinewave_create(const char *settings, obs_source_t source)
- {
- struct sinewave_data *swd = bmalloc(sizeof(struct sinewave_data));
- memset(swd, 0, sizeof(struct sinewave_data));
- swd->source = source;
- if (event_init(&swd->event, EVENT_TYPE_MANUAL) != 0)
- goto fail;
- if (pthread_create(&swd->thread, NULL, sinewave_thread, swd) != 0)
- goto fail;
- swd->initialized_thread = true;
- return swd;
- fail:
- sinewave_destroy(swd);
- return NULL;
- }
- void sinewave_destroy(struct sinewave_data *swd)
- {
- if (swd) {
- if (swd->initialized_thread) {
- void *ret;
- event_signal(&swd->event);
- pthread_join(swd->thread, &ret);
- }
- event_destroy(&swd->event);
- bfree(swd);
- }
- }
- uint32_t sinewave_get_output_flags(struct sinewave_data *swd)
- {
- return SOURCE_AUDIO;
- }
|