From a2ff24afd73a552e2d5102ee898125c649b67853 Mon Sep 17 00:00:00 2001 From: Paul Dino Jones Date: Wed, 4 Dec 2024 11:20:21 -0500 Subject: [PATCH] add code to smooth out frequencies between audio frames --- .../devices/sound/usb_generic_shaker_pulse.c | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/monocoque/devices/sound/usb_generic_shaker_pulse.c b/src/monocoque/devices/sound/usb_generic_shaker_pulse.c index 2a9fd4d..28ca62a 100644 --- a/src/monocoque/devices/sound/usb_generic_shaker_pulse.c +++ b/src/monocoque/devices/sound/usb_generic_shaker_pulse.c @@ -12,7 +12,7 @@ #define FORMAT PA_SAMPLE_S16LE #define SAMPLE_RATE (44100) -#define AMPLITUDE 1 +#define AMPLITUDE .5 #define DURATION 1.0 #ifndef M_PI @@ -46,31 +46,46 @@ void gear_sound_stream(pa_stream *s, size_t length, void *userdata) { pa_stream_write(s, buffer, length, NULL, 0LL, PA_SEEK_RELATIVE); } +double get_closest_frequency(size_t num_samples, double input_frequency) { + + double samples_per_cycle = SAMPLE_RATE / input_frequency; + + double adjusted_frequency = SAMPLE_RATE / (num_samples / floor(num_samples/samples_per_cycle) ); + + return adjusted_frequency; +} + void engine_sound_stream(pa_stream *s, size_t length, void *userdata) { SoundData* data = (SoundData*)userdata; double freq = data->curr_frequency; + size_t num_samples = length / sizeof(int16_t); - num_samples = (size_t) (DURATION * SAMPLE_RATE); + freq = get_closest_frequency( num_samples, freq ); + //size_t num_samples = (size_t) (DURATION * SAMPLE_RATE); int16_t buffer[num_samples]; - + //double t = 0; for (size_t i = 0; i < num_samples; i++) { double t = data->phase; - double sample = AMPLITUDE * 32767.0 * sin(2.0 * M_PI * freq * t); + double sample = AMPLITUDE * 32767.0 * sin( 2.0 * M_PI * freq * t ); buffer[i] = (int16_t)sample; t += 1.0 / SAMPLE_RATE; - if (t >= DURATION) { - t = -DURATION; + if (t >= SAMPLE_RATE) { + t = 0; } data->phase = t; } + data->phase = round(data->phase); + pa_stream_write(s, buffer, length, NULL, 0LL, PA_SEEK_RELATIVE); } + + void stream_success_cb(pa_stream *stream, int success, void *userdata) { return; }