serial_audio_catcher/wavemonitor.c

58 lines
1.3 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#define BLOCK_FRAMES 256 // ~16 ms at 16 kHz
#define CHANNELS 1 // adjust to 2 if stereo
#define SAMPLE_RATE 16000
#define BYTES_PER_SAMPLE 2 // s16le
int main(void) {
int fd = open("/tmp/esp32_audio", O_RDONLY);
if (fd < 0) {
perror("open");
return 1;
}
size_t block_bytes = BLOCK_FRAMES * CHANNELS * BYTES_PER_SAMPLE;
int16_t *buffer = malloc(block_bytes);
if (!buffer) {
perror("malloc");
close(fd);
return 1;
}
while (1) {
ssize_t n = read(fd, buffer, block_bytes);
if (n <= 0) {
usleep(1000);
continue;
}
// compute peak
int16_t peak = 0;
for (ssize_t i = 0; i < n / 2; i++) {
int16_t sample = buffer[i];
if (sample < 0) sample = -sample;
if (sample > peak) peak = sample;
}
// scale to 50 chars
int bar_len = (peak * 50) / 32767;
char bar[51];
memset(bar, '#', bar_len);
bar[bar_len] = '\0';
printf("[%s]\r", bar);
fflush(stdout);
}
free(buffer);
close(fd);
return 0;
}