From c81e05c84190e0040a8bf5892d4f22c8b4ee51de Mon Sep 17 00:00:00 2001 From: bjoernf Date: Wed, 16 Aug 2023 22:38:32 +0200 Subject: [PATCH] first commit --- README.md | 24 +++++++++++++++++ a.out | Bin 0 -> 16552 bytes main.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++ makefile | 22 ++++++++++++++++ play_raw_audio.c | 54 +++++++++++++++++++++++++++++++++++++++ play_raw_audio.h | 6 +++++ 6 files changed, 171 insertions(+) create mode 100644 README.md create mode 100755 a.out create mode 100644 main.c create mode 100644 makefile create mode 100644 play_raw_audio.c create mode 100644 play_raw_audio.h diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc3ee74 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +#### installation + +``` +make +``` +``` +sudo make install +``` + +#### usage + +``` +countdown 20 +``` + +#### uninstalling + +``` +sudo make uninstall +``` + +#### TODO + +- allow countdowns to be longer than 60 minutes diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..022f7660347276fbdd4f5a5b8291281d7df5c928 GIT binary patch literal 16552 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 literal 0 HcmV?d00001 diff --git a/main.c b/main.c new file mode 100644 index 0000000..757d1a0 --- /dev/null +++ b/main.c @@ -0,0 +1,65 @@ +// to make it work for times bigger than 60 minutes this has to be extended + +#include "play_raw_audio.h" +#include +#include +#include +#include +#include + +// debug pulse audio problems +#define PA_DEBUG 0 + +int main(int argc, char **argv) { + int countdown_min_total; + char *HOME = getenv("HOME"); + char *audio_file = ""; + if (HOME != NULL) { + audio_file = strcat(HOME, "/music/alarm-clock-elapsed.wav"); + } else { + printf ("Can't find environment variable HOME!\n"); + return 1; + } + + if (argc > 1) { + countdown_min_total = atoi(argv[1]); + } else { + if (PA_DEBUG) { + countdown_min_total = 0; + } else { + puts ("Define your countdown length in minutes!"); + scanf ("%d", &countdown_min_total); + } + } + + int countdown_sec_total = countdown_min_total * 60; + + int countdown_sec; + int countdown_min; + + write(1, "\033c", 3); + + while (countdown_sec_total > 0) { + if (countdown_sec_total >= 60) { + countdown_sec = countdown_sec_total % 60; + countdown_min = (countdown_sec_total - countdown_sec) / 60; + } else { + countdown_sec = countdown_sec_total; + countdown_min = 0; + } + + write(1, "\033c", 3); + + printf ("%02d:%02d", countdown_min, countdown_sec); + fflush(stdout); + printf ("\r"); + + sleep(1); + countdown_sec_total--; + } + + printf ("THE TIME IS UP!\n"); + play_raw_audio(audio_file); + + return 0; +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..7bd4fb4 --- /dev/null +++ b/makefile @@ -0,0 +1,22 @@ +.PHONY:all +all: + gcc -Wall *.c -lpulse-simple + +.PHONY:run +run: + clear + gcc -Wall *.c -lpulse-simple + ./a.out + +.PHONY:debug +debug: + gcc -Wall -g *.c -lpulse-simple + gdb a.out + +.PHONY:install +install: + cp a.out /usr/local/bin/countdown + +.PHONY:uninstall +uninstall: + rm /usr/local/bin/countdown diff --git a/play_raw_audio.c b/play_raw_audio.c new file mode 100644 index 0000000..22ecf65 --- /dev/null +++ b/play_raw_audio.c @@ -0,0 +1,54 @@ +// install libpulse-dev or libpulse package depending on your distro +// compile: gcc -Wall play_raw_audio_file.c -lpulse-simple + +#include "play_raw_audio.h" +#include +#include +#include +#include +#include + +int play_raw_audio(char file_name[]) { + int pa_error = 0; + char content[1024] = ""; + + int myfd = open(file_name, O_RDONLY); + if (myfd == -1) { + perror("Failed to open audio file"); + return 1; + } + + pa_simple* simple = NULL; + pa_sample_spec ss; + ss.format = PA_SAMPLE_S16LE; + ss.rate = 48000; + ss.channels = 2; + + // Temporarily redirect stderr to /dev/null + // because pulseaudio prints to stderr even though it does not set any error codes + FILE *original_stderr = stderr; + stderr = fopen("/dev/null", "w"); + + simple = pa_simple_new(NULL, "Audio Playback", PA_STREAM_PLAYBACK, NULL, "playback", &ss, NULL, NULL, &pa_error); + + // Restore stderr + stderr = original_stderr; + + int i = 0; + while (read(myfd, content, sizeof(content))) { + // skip the first 1024 bytes to not play the file header + if (i != 0) { + pa_simple_write(simple, content, sizeof(content), &pa_error); + } + i++; + } + + pa_simple_drain(simple, NULL); + + pa_simple_free(simple); + + close(myfd); + + return 0; +} + diff --git a/play_raw_audio.h b/play_raw_audio.h new file mode 100644 index 0000000..6e7ad00 --- /dev/null +++ b/play_raw_audio.h @@ -0,0 +1,6 @@ +// install libpulse-dev or libpulse package depending on your distro +// compile: gcc -Wall play_raw_audio_file.c -lpulse-simple + +#pragma once + +int play_raw_audio(char file_name[]);