first commit

This commit is contained in:
bjoernf 2023-08-16 22:38:32 +02:00
commit c81e05c841
6 changed files with 171 additions and 0 deletions

24
README.md Normal file
View File

@ -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

BIN
a.out Executable file

Binary file not shown.

65
main.c Normal file
View File

@ -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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
// 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;
}

22
makefile Normal file
View File

@ -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

54
play_raw_audio.c Normal file
View File

@ -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 <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <pulse/simple.h>
#include <pulse/error.h>
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;
}

6
play_raw_audio.h Normal file
View File

@ -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[]);