153a5a1b3Sopenharmony_ci/***
253a5a1b3Sopenharmony_ci  This file is part of PulseAudio.
353a5a1b3Sopenharmony_ci
453a5a1b3Sopenharmony_ci  PulseAudio is free software; you can redistribute it and/or modify
553a5a1b3Sopenharmony_ci  it under the terms of the GNU Lesser General Public License as published
653a5a1b3Sopenharmony_ci  by the Free Software Foundation; either version 2.1 of the License,
753a5a1b3Sopenharmony_ci  or (at your option) any later version.
853a5a1b3Sopenharmony_ci
953a5a1b3Sopenharmony_ci  PulseAudio is distributed in the hope that it will be useful, but
1053a5a1b3Sopenharmony_ci  WITHOUT ANY WARRANTY; without even the implied warranty of
1153a5a1b3Sopenharmony_ci  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1253a5a1b3Sopenharmony_ci  General Public License for more details.
1353a5a1b3Sopenharmony_ci
1453a5a1b3Sopenharmony_ci  You should have received a copy of the GNU Lesser General Public License
1553a5a1b3Sopenharmony_ci  along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
1653a5a1b3Sopenharmony_ci***/
1753a5a1b3Sopenharmony_ci
1853a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H
1953a5a1b3Sopenharmony_ci#include <config.h>
2053a5a1b3Sopenharmony_ci#endif
2153a5a1b3Sopenharmony_ci
2253a5a1b3Sopenharmony_ci#include <stdio.h>
2353a5a1b3Sopenharmony_ci#include <unistd.h>
2453a5a1b3Sopenharmony_ci#include <string.h>
2553a5a1b3Sopenharmony_ci#include <errno.h>
2653a5a1b3Sopenharmony_ci#include <fcntl.h>
2753a5a1b3Sopenharmony_ci
2853a5a1b3Sopenharmony_ci#include <pulse/simple.h>
2953a5a1b3Sopenharmony_ci#include <pulse/error.h>
3053a5a1b3Sopenharmony_ci
3153a5a1b3Sopenharmony_ci#define BUFSIZE 1024
3253a5a1b3Sopenharmony_ci
3353a5a1b3Sopenharmony_ciint main(int argc, char*argv[]) {
3453a5a1b3Sopenharmony_ci
3553a5a1b3Sopenharmony_ci    /* The Sample format to use */
3653a5a1b3Sopenharmony_ci    static const pa_sample_spec ss = {
3753a5a1b3Sopenharmony_ci        .format = PA_SAMPLE_S16LE,
3853a5a1b3Sopenharmony_ci        .rate = 44100,
3953a5a1b3Sopenharmony_ci        .channels = 2
4053a5a1b3Sopenharmony_ci    };
4153a5a1b3Sopenharmony_ci
4253a5a1b3Sopenharmony_ci    pa_simple *s = NULL;
4353a5a1b3Sopenharmony_ci    int ret = 1;
4453a5a1b3Sopenharmony_ci    int error;
4553a5a1b3Sopenharmony_ci
4653a5a1b3Sopenharmony_ci    /* replace STDIN with the specified file if needed */
4753a5a1b3Sopenharmony_ci    if (argc > 1) {
4853a5a1b3Sopenharmony_ci        int fd;
4953a5a1b3Sopenharmony_ci
5053a5a1b3Sopenharmony_ci        if ((fd = open(argv[1], O_RDONLY)) < 0) {
5153a5a1b3Sopenharmony_ci            fprintf(stderr, __FILE__": open() failed: %s\n", strerror(errno));
5253a5a1b3Sopenharmony_ci            goto finish;
5353a5a1b3Sopenharmony_ci        }
5453a5a1b3Sopenharmony_ci
5553a5a1b3Sopenharmony_ci        if (dup2(fd, STDIN_FILENO) < 0) {
5653a5a1b3Sopenharmony_ci            fprintf(stderr, __FILE__": dup2() failed: %s\n", strerror(errno));
5753a5a1b3Sopenharmony_ci            goto finish;
5853a5a1b3Sopenharmony_ci        }
5953a5a1b3Sopenharmony_ci
6053a5a1b3Sopenharmony_ci        close(fd);
6153a5a1b3Sopenharmony_ci    }
6253a5a1b3Sopenharmony_ci
6353a5a1b3Sopenharmony_ci    /* Create a new playback stream */
6453a5a1b3Sopenharmony_ci    if (!(s = pa_simple_new(NULL, argv[0], PA_STREAM_PLAYBACK, NULL, "playback", &ss, NULL, NULL, &error))) {
6553a5a1b3Sopenharmony_ci        fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error));
6653a5a1b3Sopenharmony_ci        goto finish;
6753a5a1b3Sopenharmony_ci    }
6853a5a1b3Sopenharmony_ci
6953a5a1b3Sopenharmony_ci    for (;;) {
7053a5a1b3Sopenharmony_ci        uint8_t buf[BUFSIZE];
7153a5a1b3Sopenharmony_ci        ssize_t r;
7253a5a1b3Sopenharmony_ci
7353a5a1b3Sopenharmony_ci#if 0
7453a5a1b3Sopenharmony_ci        pa_usec_t latency;
7553a5a1b3Sopenharmony_ci
7653a5a1b3Sopenharmony_ci        if ((latency = pa_simple_get_latency(s, &error)) == (pa_usec_t) -1) {
7753a5a1b3Sopenharmony_ci            fprintf(stderr, __FILE__": pa_simple_get_latency() failed: %s\n", pa_strerror(error));
7853a5a1b3Sopenharmony_ci            goto finish;
7953a5a1b3Sopenharmony_ci        }
8053a5a1b3Sopenharmony_ci
8153a5a1b3Sopenharmony_ci        fprintf(stderr, "%0.0f usec    \r", (float)latency);
8253a5a1b3Sopenharmony_ci#endif
8353a5a1b3Sopenharmony_ci
8453a5a1b3Sopenharmony_ci        /* Read some data ... */
8553a5a1b3Sopenharmony_ci        if ((r = read(STDIN_FILENO, buf, sizeof(buf))) <= 0) {
8653a5a1b3Sopenharmony_ci            if (r == 0) /* EOF */
8753a5a1b3Sopenharmony_ci                break;
8853a5a1b3Sopenharmony_ci
8953a5a1b3Sopenharmony_ci            fprintf(stderr, __FILE__": read() failed: %s\n", strerror(errno));
9053a5a1b3Sopenharmony_ci            goto finish;
9153a5a1b3Sopenharmony_ci        }
9253a5a1b3Sopenharmony_ci
9353a5a1b3Sopenharmony_ci        /* ... and play it */
9453a5a1b3Sopenharmony_ci        if (pa_simple_write(s, buf, (size_t) r, &error) < 0) {
9553a5a1b3Sopenharmony_ci            fprintf(stderr, __FILE__": pa_simple_write() failed: %s\n", pa_strerror(error));
9653a5a1b3Sopenharmony_ci            goto finish;
9753a5a1b3Sopenharmony_ci        }
9853a5a1b3Sopenharmony_ci    }
9953a5a1b3Sopenharmony_ci
10053a5a1b3Sopenharmony_ci    /* Make sure that every single sample was played */
10153a5a1b3Sopenharmony_ci    if (pa_simple_drain(s, &error) < 0) {
10253a5a1b3Sopenharmony_ci        fprintf(stderr, __FILE__": pa_simple_drain() failed: %s\n", pa_strerror(error));
10353a5a1b3Sopenharmony_ci        goto finish;
10453a5a1b3Sopenharmony_ci    }
10553a5a1b3Sopenharmony_ci
10653a5a1b3Sopenharmony_ci    ret = 0;
10753a5a1b3Sopenharmony_ci
10853a5a1b3Sopenharmony_cifinish:
10953a5a1b3Sopenharmony_ci
11053a5a1b3Sopenharmony_ci    if (s)
11153a5a1b3Sopenharmony_ci        pa_simple_free(s);
11253a5a1b3Sopenharmony_ci
11353a5a1b3Sopenharmony_ci    return ret;
11453a5a1b3Sopenharmony_ci}
115