summaryrefslogtreecommitdiffstats
path: root/dogwhistle.c
diff options
context:
space:
mode:
Diffstat (limited to 'dogwhistle.c')
-rw-r--r--dogwhistle.c19
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 (;;) {