aboutsummaryrefslogtreecommitdiff
path: root/examples/pcm-writei.c
diff options
context:
space:
mode:
authorTaylor Holberton <taylorcholberton@gmail.com>2016-12-04 13:17:53 -0800
committerTaylor Holberton <taylorcholberton@gmail.com>2016-12-04 13:17:53 -0800
commit5317e1ce90f781458e3e75585a6f46ba2ea788f2 (patch)
tree296a8ba9e7f4bc62b04519f928137e041794544e /examples/pcm-writei.c
parent9d1b7f22f5d5c2a02fa450e73a24914b700f9bb9 (diff)
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'.
Diffstat (limited to 'examples/pcm-writei.c')
-rw-r--r--examples/pcm-writei.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/examples/pcm-writei.c b/examples/pcm-writei.c
new file mode 100644
index 0000000..66280eb
--- /dev/null
+++ b/examples/pcm-writei.c
@@ -0,0 +1,100 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <tinyalsa/pcm.h>
+
+static long int file_size(FILE * file)
+{
+ if (fseek(file, 0, SEEK_END) < 0) {
+ return -1;
+ }
+ long int file_size = ftell(file);
+ if (fseek(file, 0, SEEK_SET) < 0) {
+ return -1;
+ }
+ return file_size;
+}
+
+static size_t read_file(void ** frames){
+
+ FILE * input_file = fopen("audio.raw", "rb");
+ if (input_file == NULL) {
+ perror("failed to open 'audio.raw' for writing");
+ return -1;
+ }
+
+ long int size = file_size(input_file);
+ if (size < 0) {
+ perror("failed to get file size of 'audio.raw'");
+ fclose(input_file);
+ return -1;
+ }
+
+ *frames = malloc(size);
+ if (*frames == NULL) {
+ fprintf(stderr, "failed to allocate frames\n");
+ fclose(input_file);
+ return -1;
+ }
+
+ size = fread(*frames, 1, size, input_file);
+
+ fclose(input_file);
+
+ return size;
+}
+
+static int write_frames(const void * frames, size_t byte_count){
+
+ unsigned int card = 0;
+ unsigned int device = 0;
+ int flags = PCM_OUT;
+
+ 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 -1;
+ } else if (!pcm_is_ready(pcm)){
+ pcm_close(pcm);
+ fprintf(stderr, "failed to open PCM\n");
+ return -1;
+ }
+
+ unsigned int frame_count = pcm_bytes_to_frames(pcm, byte_count);
+
+ pcm_writei(pcm, frames, frame_count);
+
+ pcm_close(pcm);
+
+ return 0;
+}
+
+int main(void)
+{
+ void *frames;
+ size_t size;
+
+ size = read_file(&frames);
+ if (size == 0) {
+ return EXIT_FAILURE;
+ }
+
+ if (write_frames(frames, size) < 0) {
+ return EXIT_FAILURE;
+ }
+
+ free(frames);
+ return EXIT_SUCCESS;
+}
+