From 5317e1ce90f781458e3e75585a6f46ba2ea788f2 Mon Sep 17 00:00:00 2001 From: Taylor Holberton Date: Sun, 4 Dec 2016 13:17:53 -0800 Subject: Added examples for basic IO Added an example of pcm_writei usage and an example of pcm_readi usage. Both examples use a common file called 'audio.raw'. --- examples/pcm-readi.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 examples/pcm-readi.c (limited to 'examples/pcm-readi.c') diff --git a/examples/pcm-readi.c b/examples/pcm-readi.c new file mode 100644 index 0000000..5b85ca6 --- /dev/null +++ b/examples/pcm-readi.c @@ -0,0 +1,83 @@ +#include +#include + +#include + +static size_t read_frames(void **frames) +{ + unsigned int card = 0; + unsigned int device = 0; + int flags = PCM_IN; + + const struct pcm_config config = { + .channels = 2, + .rate = 48000, + .format = PCM_FORMAT_S32_LE, + .period_size = 1024, + .period_count = 2, + .start_threshold = 1024, + .silence_threshold = 1024 * 2, + .stop_threshold = 1024 * 2 + }; + + struct pcm *pcm = pcm_open(card, device, flags, &config); + if (pcm == NULL) { + fprintf(stderr, "failed to allocate memory for PCM\n"); + return EXIT_FAILURE; + } else if (!pcm_is_ready(pcm)){ + pcm_close(pcm); + fprintf(stderr, "failed to open PCM\n"); + return EXIT_FAILURE; + } + + unsigned int frame_size = pcm_frames_to_bytes(pcm, 1); + unsigned int frames_per_sec = pcm_get_rate(pcm); + + *frames = malloc(frame_size * frames_per_sec); + if (*frames == NULL) { + fprintf(stderr, "failed to allocate frames\n"); + pcm_close(pcm); + return EXIT_FAILURE; + } + + int read_count = pcm_readi(pcm, *frames, frames_per_sec); + + size_t byte_count = pcm_frames_to_bytes(pcm, read_count); + + pcm_close(pcm); + + return byte_count; +} + +static int write_file(const void *frames, size_t size) +{ + FILE *output_file = fopen("audio.raw", "wb"); + if (output_file == NULL) { + perror("failed to open 'audio.raw' for writing"); + return EXIT_FAILURE; + } + fwrite(frames, 1, size, output_file); + fclose(output_file); + return 0; +} + +int main(void) +{ + void *frames; + size_t size; + + size = read_frames(&frames); + if (size == 0) { + return EXIT_FAILURE; + } + + if (write_file(frames, size) < 0) { + free(frames); + return EXIT_FAILURE; + } + + free(frames); + + return EXIT_SUCCESS; +} + -- cgit v1.2.3