diff options
| author | Mattias Andrée <m@maandree.se> | 2026-02-19 17:57:05 +0100 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-02-19 17:57:05 +0100 |
| commit | 2824c6265a39e4f49ef27ab6c26539492581c96e (patch) | |
| tree | 9af5b0549b4d803a44f8cc83a8cde05ace238b52 /dogwhistle.c | |
| parent | Add dogwhistle (diff) | |
| download | pdatools-2824c6265a39e4f49ef27ab6c26539492581c96e.tar.gz pdatools-2824c6265a39e4f49ef27ab6c26539492581c96e.tar.bz2 pdatools-2824c6265a39e4f49ef27ab6c26539492581c96e.tar.xz | |
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'dogwhistle.c')
| -rw-r--r-- | dogwhistle.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/dogwhistle.c b/dogwhistle.c index 2d48b82..894d7e3 100644 --- a/dogwhistle.c +++ b/dogwhistle.c @@ -7,9 +7,10 @@ /* TODO add support for selecting output device and backend */ /* TODO add support for selecting volume */ /* TODO add support for pausing and exiting */ +/* TODO prefer loudspeakers over headphones */ +/* TODO use bus to listen for incoming phone calls and pause when arriving */ #define UTYPE uint32_t -#define SMIN INT32_MIN #define SMAX INT32_MAX #define FORMAT SND_PCM_FORMAT_U32 @@ -23,10 +24,10 @@ int main(int argc, char *argv[]) { UTYPE *buffer; - snd_pcm_uframes_t i, buflen = SAMPLE_RATE; + snd_pcm_uframes_t i, buflen, wavelen; snd_pcm_sframes_t n; snd_pcm_t *sound_handle = NULL; - unsigned long int freq = 16000; + double freq = 16000; double volume = (double)0.1f, imul, omul; int r; @@ -46,19 +47,23 @@ main(int argc, char *argv[]) eprintf("snd_pcm_set_params: %s\n", snd_strerror(r)); /* Generate tone */ + buflen = wavelen = (snd_pcm_uframes_t)((double)SAMPLE_RATE / freq); + if ((snd_pcm_uframes_t)freq > 1) + buflen *= (snd_pcm_uframes_t)freq; buffer = emallocn((size_t)buflen, sizeof(*buffer), 0); omul = volume * SMAX * 2; - imul = 2 * (double)freq / (double)SAMPLE_RATE; #ifdef __GNUC__ # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wunsuffixed-float-constants" #endif - imul *= M_PI; + imul = 2 * M_PI * freq / (double)SAMPLE_RATE; #ifdef __GNUC__ # pragma GCC diagnostic pop #endif - for (i = 0; i < buflen; i++) - buffer[i] = (UTYPE)(sin(imul * (double)i) * omul - SMIN); + for (i = 0; i < wavelen; i++) + buffer[i] = (UTYPE)(sin(imul * (double)i) * omul + SMAX); + for (i = wavelen; i < buflen; i += wavelen) + memcpy(&buffer[i], &buffer[0], wavelen * sizeof(UTYPE)); /* Play tone */ for (;;) { |
