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 653a5a1b3Sopenharmony_ci published by the Free Software Foundation; either version 2.1 of the 753a5a1b3Sopenharmony_ci License, 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 Lesser General Public License for more details. 1353a5a1b3Sopenharmony_ci 1453a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public 1553a5a1b3Sopenharmony_ci License 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 <unistd.h> 2353a5a1b3Sopenharmony_ci#include <sys/types.h> 2453a5a1b3Sopenharmony_ci#include <errno.h> 2553a5a1b3Sopenharmony_ci#include <string.h> 2653a5a1b3Sopenharmony_ci#include <stdlib.h> 2753a5a1b3Sopenharmony_ci#include <time.h> 2853a5a1b3Sopenharmony_ci 2953a5a1b3Sopenharmony_ci#include <pulsecore/core-util.h> 3053a5a1b3Sopenharmony_ci#include <pulsecore/mcalign.h> 3153a5a1b3Sopenharmony_ci 3253a5a1b3Sopenharmony_ci/* A simple program for testing pa_mcalign */ 3353a5a1b3Sopenharmony_ci 3453a5a1b3Sopenharmony_ciint main(int argc, char *argv[]) { 3553a5a1b3Sopenharmony_ci pa_mempool *p; 3653a5a1b3Sopenharmony_ci pa_mcalign *a; 3753a5a1b3Sopenharmony_ci pa_memchunk c; 3853a5a1b3Sopenharmony_ci 3953a5a1b3Sopenharmony_ci p = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true); 4053a5a1b3Sopenharmony_ci 4153a5a1b3Sopenharmony_ci a = pa_mcalign_new(11); 4253a5a1b3Sopenharmony_ci 4353a5a1b3Sopenharmony_ci pa_memchunk_reset(&c); 4453a5a1b3Sopenharmony_ci 4553a5a1b3Sopenharmony_ci srand((unsigned) time(NULL)); 4653a5a1b3Sopenharmony_ci 4753a5a1b3Sopenharmony_ci for (;;) { 4853a5a1b3Sopenharmony_ci ssize_t r; 4953a5a1b3Sopenharmony_ci size_t l; 5053a5a1b3Sopenharmony_ci 5153a5a1b3Sopenharmony_ci if (!c.memblock) { 5253a5a1b3Sopenharmony_ci c.memblock = pa_memblock_new(p, 2048); 5353a5a1b3Sopenharmony_ci c.index = c.length = 0; 5453a5a1b3Sopenharmony_ci } 5553a5a1b3Sopenharmony_ci 5653a5a1b3Sopenharmony_ci pa_assert(c.index < pa_memblock_get_length(c.memblock)); 5753a5a1b3Sopenharmony_ci 5853a5a1b3Sopenharmony_ci l = pa_memblock_get_length(c.memblock) - c.index; 5953a5a1b3Sopenharmony_ci 6053a5a1b3Sopenharmony_ci l = l <= 1 ? l : (size_t) rand() % (l-1) +1; 6153a5a1b3Sopenharmony_ci 6253a5a1b3Sopenharmony_ci p = pa_memblock_acquire(c.memblock); 6353a5a1b3Sopenharmony_ci 6453a5a1b3Sopenharmony_ci if ((r = read(STDIN_FILENO, (uint8_t*) p + c.index, l)) <= 0) { 6553a5a1b3Sopenharmony_ci pa_memblock_release(c.memblock); 6653a5a1b3Sopenharmony_ci fprintf(stderr, "read() failed: %s\n", r < 0 ? strerror(errno) : "EOF"); 6753a5a1b3Sopenharmony_ci break; 6853a5a1b3Sopenharmony_ci } 6953a5a1b3Sopenharmony_ci 7053a5a1b3Sopenharmony_ci pa_memblock_release(c.memblock); 7153a5a1b3Sopenharmony_ci 7253a5a1b3Sopenharmony_ci c.length = (size_t) r; 7353a5a1b3Sopenharmony_ci pa_mcalign_push(a, &c); 7453a5a1b3Sopenharmony_ci fprintf(stderr, "Read %zd bytes\n", r); 7553a5a1b3Sopenharmony_ci 7653a5a1b3Sopenharmony_ci c.index += (size_t) r; 7753a5a1b3Sopenharmony_ci 7853a5a1b3Sopenharmony_ci if (c.index >= pa_memblock_get_length(c.memblock)) { 7953a5a1b3Sopenharmony_ci pa_memblock_unref(c.memblock); 8053a5a1b3Sopenharmony_ci pa_memchunk_reset(&c); 8153a5a1b3Sopenharmony_ci } 8253a5a1b3Sopenharmony_ci 8353a5a1b3Sopenharmony_ci for (;;) { 8453a5a1b3Sopenharmony_ci pa_memchunk t; 8553a5a1b3Sopenharmony_ci 8653a5a1b3Sopenharmony_ci if (pa_mcalign_pop(a, &t) < 0) 8753a5a1b3Sopenharmony_ci break; 8853a5a1b3Sopenharmony_ci 8953a5a1b3Sopenharmony_ci p = pa_memblock_acquire(t.memblock); 9053a5a1b3Sopenharmony_ci pa_loop_write(STDOUT_FILENO, (uint8_t*) p + t.index, t.length, NULL); 9153a5a1b3Sopenharmony_ci pa_memblock_release(t.memblock); 9253a5a1b3Sopenharmony_ci fprintf(stderr, "Wrote %lu bytes.\n", (unsigned long) t.length); 9353a5a1b3Sopenharmony_ci 9453a5a1b3Sopenharmony_ci pa_memblock_unref(t.memblock); 9553a5a1b3Sopenharmony_ci } 9653a5a1b3Sopenharmony_ci } 9753a5a1b3Sopenharmony_ci 9853a5a1b3Sopenharmony_ci pa_mcalign_free(a); 9953a5a1b3Sopenharmony_ci 10053a5a1b3Sopenharmony_ci if (c.memblock) 10153a5a1b3Sopenharmony_ci pa_memblock_unref(c.memblock); 10253a5a1b3Sopenharmony_ci 10353a5a1b3Sopenharmony_ci pa_mempool_unref(p); 10453a5a1b3Sopenharmony_ci 10553a5a1b3Sopenharmony_ci return 0; 10653a5a1b3Sopenharmony_ci} 107