mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-12-24 08:56:42 -05:00
merge 'lennart' branch back into trunk.
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1971 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
6687dd0131
commit
a67c21f093
294 changed files with 79057 additions and 11614 deletions
110
src/tests/asyncmsgq-test.c
Normal file
110
src/tests/asyncmsgq-test.c
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
/* $Id$ */
|
||||
|
||||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
PulseAudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
PulseAudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with PulseAudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <pulse/util.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
#include <pulsecore/asyncmsgq.h>
|
||||
#include <pulsecore/thread.h>
|
||||
#include <pulsecore/log.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/macro.h>
|
||||
|
||||
enum {
|
||||
OPERATION_A,
|
||||
OPERATION_B,
|
||||
OPERATION_C,
|
||||
QUIT
|
||||
};
|
||||
|
||||
static void the_thread(void *_q) {
|
||||
pa_asyncmsgq *q = _q;
|
||||
int quit = 0;
|
||||
|
||||
do {
|
||||
int code = 0;
|
||||
|
||||
pa_assert_se(pa_asyncmsgq_get(q, NULL, &code, NULL, NULL, NULL, 1) == 0);
|
||||
|
||||
switch (code) {
|
||||
|
||||
case OPERATION_A:
|
||||
printf("Operation A\n");
|
||||
break;
|
||||
|
||||
case OPERATION_B:
|
||||
printf("Operation B\n");
|
||||
break;
|
||||
|
||||
case OPERATION_C:
|
||||
printf("Operation C\n");
|
||||
break;
|
||||
|
||||
case QUIT:
|
||||
printf("quit\n");
|
||||
quit = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
pa_asyncmsgq_done(q, 0);
|
||||
|
||||
} while (!quit);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
pa_asyncmsgq *q;
|
||||
pa_thread *t;
|
||||
|
||||
pa_assert_se(q = pa_asyncmsgq_new(0));
|
||||
|
||||
pa_assert_se(t = pa_thread_new(the_thread, q));
|
||||
|
||||
printf("Operation A post\n");
|
||||
pa_asyncmsgq_post(q, NULL, OPERATION_A, NULL, 0, NULL, NULL);
|
||||
|
||||
pa_thread_yield();
|
||||
|
||||
printf("Operation B post\n");
|
||||
pa_asyncmsgq_post(q, NULL, OPERATION_B, NULL, 0, NULL, NULL);
|
||||
|
||||
pa_thread_yield();
|
||||
|
||||
printf("Operation C send\n");
|
||||
pa_asyncmsgq_send(q, NULL, OPERATION_C, NULL, 0, NULL);
|
||||
|
||||
pa_thread_yield();
|
||||
|
||||
printf("Quit post\n");
|
||||
pa_asyncmsgq_post(q, NULL, QUIT, NULL, 0, NULL, NULL);
|
||||
|
||||
pa_thread_free(t);
|
||||
|
||||
pa_asyncmsgq_unref(q);
|
||||
|
||||
return 0;
|
||||
}
|
||||
87
src/tests/asyncq-test.c
Normal file
87
src/tests/asyncq-test.c
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
/* $Id$ */
|
||||
|
||||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
PulseAudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
PulseAudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with PulseAudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <pulse/util.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
#include <pulsecore/asyncq.h>
|
||||
#include <pulsecore/thread.h>
|
||||
#include <pulsecore/log.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/macro.h>
|
||||
|
||||
static void producer(void *_q) {
|
||||
pa_asyncq *q = _q;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 1000; i++) {
|
||||
printf("pushing %i\n", i);
|
||||
pa_asyncq_push(q, PA_UINT_TO_PTR(i+1), 1);
|
||||
}
|
||||
|
||||
pa_asyncq_push(q, PA_UINT_TO_PTR(-1), 1);
|
||||
printf("pushed end\n");
|
||||
}
|
||||
|
||||
static void consumer(void *_q) {
|
||||
pa_asyncq *q = _q;
|
||||
void *p;
|
||||
int i;
|
||||
|
||||
sleep(1);
|
||||
|
||||
for (i = 0;; i++) {
|
||||
p = pa_asyncq_pop(q, 1);
|
||||
|
||||
if (p == PA_UINT_TO_PTR(-1))
|
||||
break;
|
||||
|
||||
pa_assert(p == PA_UINT_TO_PTR(i+1));
|
||||
|
||||
printf("popped %i\n", i);
|
||||
}
|
||||
|
||||
printf("popped end\n");
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
pa_asyncq *q;
|
||||
pa_thread *t1, *t2;
|
||||
|
||||
pa_assert_se(q = pa_asyncq_new(0));
|
||||
|
||||
pa_assert_se(t1 = pa_thread_new(producer, q));
|
||||
pa_assert_se(t2 = pa_thread_new(consumer, q));
|
||||
|
||||
pa_thread_free(t1);
|
||||
pa_thread_free(t2);
|
||||
|
||||
pa_asyncq_free(q, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,5 +1,9 @@
|
|||
/* $Id$ */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <pulsecore/hook-list.h>
|
||||
#include <pulsecore/log.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ int main(int argc, char *argv[]) {
|
|||
pa_gettimeofday(&now);
|
||||
|
||||
rtc = pa_timeval_diff(&now, &start);
|
||||
printf("%i\t%llu\t%llu\t%llu\t%llu\t%u\n", k, rtc, t, rtc-old_rtc, t-old_t, changed);
|
||||
printf("%i\t%llu\t%llu\t%llu\t%llu\t%u\n", k, (unsigned long long) rtc, (unsigned long long) t, (unsigned long long) (rtc-old_rtc), (unsigned long long) (t-old_t), changed);
|
||||
old_t = t;
|
||||
old_rtc = rtc;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,24 +59,29 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char *argv[]) {
|
|||
c.index = c.length = 0;
|
||||
}
|
||||
|
||||
assert(c.index < c.memblock->length);
|
||||
assert(c.index < pa_memblock_get_length(c.memblock));
|
||||
|
||||
l = c.memblock->length - c.index;
|
||||
l = pa_memblock_get_length(c.memblock) - c.index;
|
||||
|
||||
l = l <= 1 ? l : rand() % (l-1) +1 ;
|
||||
|
||||
if ((r = read(STDIN_FILENO, (uint8_t*) c.memblock->data + c.index, l)) <= 0) {
|
||||
p = pa_memblock_acquire(c.memblock);
|
||||
|
||||
if ((r = read(STDIN_FILENO, (uint8_t*) p + c.index, l)) <= 0) {
|
||||
pa_memblock_release(c.memblock);
|
||||
fprintf(stderr, "read() failed: %s\n", r < 0 ? strerror(errno) : "EOF");
|
||||
break;
|
||||
}
|
||||
|
||||
pa_memblock_release(c.memblock);
|
||||
|
||||
c.length = r;
|
||||
pa_mcalign_push(a, &c);
|
||||
fprintf(stderr, "Read %ld bytes\n", (long)r);
|
||||
|
||||
c.index += r;
|
||||
|
||||
if (c.index >= c.memblock->length) {
|
||||
if (c.index >= pa_memblock_get_length(c.memblock)) {
|
||||
pa_memblock_unref(c.memblock);
|
||||
pa_memchunk_reset(&c);
|
||||
}
|
||||
|
|
@ -87,7 +92,9 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char *argv[]) {
|
|||
if (pa_mcalign_pop(a, &t) < 0)
|
||||
break;
|
||||
|
||||
pa_loop_write(STDOUT_FILENO, (uint8_t*) t.memblock->data + t.index, t.length, NULL);
|
||||
p = pa_memblock_acquire(t.memblock);
|
||||
pa_loop_write(STDOUT_FILENO, (uint8_t*) p + t.index, t.length, NULL);
|
||||
pa_memblock_release(t.memblock);
|
||||
fprintf(stderr, "Wrote %lu bytes.\n", (unsigned long) t.length);
|
||||
|
||||
pa_memblock_unref(t.memblock);
|
||||
|
|
|
|||
|
|
@ -23,11 +23,11 @@
|
|||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <pulsecore/memblock.h>
|
||||
#include <pulsecore/macro.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
|
||||
static void release_cb(pa_memimport *i, uint32_t block_id, void *userdata) {
|
||||
|
|
@ -76,6 +76,7 @@ int main(int argc, char *argv[]) {
|
|||
pa_memblock* blocks[5];
|
||||
uint32_t id, shm_id;
|
||||
size_t offset, size;
|
||||
char *x;
|
||||
|
||||
const char txt[] = "This is a test!";
|
||||
|
||||
|
|
@ -87,13 +88,20 @@ int main(int argc, char *argv[]) {
|
|||
pa_mempool_get_shm_id(pool_b, &id_b);
|
||||
pa_mempool_get_shm_id(pool_c, &id_c);
|
||||
|
||||
assert(pool_a && pool_b && pool_c);
|
||||
pa_assert(pool_a && pool_b && pool_c);
|
||||
|
||||
blocks[0] = pa_memblock_new_fixed(pool_a, (void*) txt, sizeof(txt), 1);
|
||||
|
||||
blocks[1] = pa_memblock_new(pool_a, sizeof(txt));
|
||||
snprintf(blocks[1]->data, blocks[1]->length, "%s", txt);
|
||||
x = pa_memblock_acquire(blocks[1]);
|
||||
snprintf(x, pa_memblock_get_length(blocks[1]), "%s", txt);
|
||||
pa_memblock_release(blocks[1]);
|
||||
|
||||
blocks[2] = pa_memblock_new_pool(pool_a, sizeof(txt));
|
||||
snprintf(blocks[2]->data, blocks[2]->length, "%s", txt);
|
||||
x = pa_memblock_acquire(blocks[2]);
|
||||
snprintf(x, pa_memblock_get_length(blocks[2]), "%s", txt);
|
||||
pa_memblock_release(blocks[2]);
|
||||
|
||||
blocks[3] = pa_memblock_new_malloced(pool_a, pa_xstrdup(txt), sizeof(txt));
|
||||
blocks[4] = NULL;
|
||||
|
||||
|
|
@ -101,43 +109,47 @@ int main(int argc, char *argv[]) {
|
|||
printf("Memory block %u\n", i);
|
||||
|
||||
mb_a = blocks[i];
|
||||
assert(mb_a);
|
||||
pa_assert(mb_a);
|
||||
|
||||
export_a = pa_memexport_new(pool_a, revoke_cb, (void*) "A");
|
||||
export_b = pa_memexport_new(pool_b, revoke_cb, (void*) "B");
|
||||
|
||||
assert(export_a && export_b);
|
||||
pa_assert(export_a && export_b);
|
||||
|
||||
import_b = pa_memimport_new(pool_b, release_cb, (void*) "B");
|
||||
import_c = pa_memimport_new(pool_c, release_cb, (void*) "C");
|
||||
|
||||
assert(import_b && import_c);
|
||||
pa_assert(import_b && import_c);
|
||||
|
||||
r = pa_memexport_put(export_a, mb_a, &id, &shm_id, &offset, &size);
|
||||
assert(r >= 0);
|
||||
assert(shm_id == id_a);
|
||||
pa_assert(r >= 0);
|
||||
pa_assert(shm_id == id_a);
|
||||
|
||||
printf("A: Memory block exported as %u\n", id);
|
||||
|
||||
mb_b = pa_memimport_get(import_b, id, shm_id, offset, size);
|
||||
assert(mb_b);
|
||||
pa_assert(mb_b);
|
||||
r = pa_memexport_put(export_b, mb_b, &id, &shm_id, &offset, &size);
|
||||
assert(r >= 0);
|
||||
assert(shm_id == id_a || shm_id == id_b);
|
||||
pa_assert(r >= 0);
|
||||
pa_assert(shm_id == id_a || shm_id == id_b);
|
||||
pa_memblock_unref(mb_b);
|
||||
|
||||
printf("B: Memory block exported as %u\n", id);
|
||||
|
||||
mb_c = pa_memimport_get(import_c, id, shm_id, offset, size);
|
||||
assert(mb_c);
|
||||
printf("1 data=%s\n", (char*) mb_c->data);
|
||||
pa_assert(mb_c);
|
||||
x = pa_memblock_acquire(mb_c);
|
||||
printf("1 data=%s\n", x);
|
||||
pa_memblock_release(mb_c);
|
||||
|
||||
print_stats(pool_a, "A");
|
||||
print_stats(pool_b, "B");
|
||||
print_stats(pool_c, "C");
|
||||
|
||||
pa_memexport_free(export_b);
|
||||
printf("2 data=%s\n", (char*) mb_c->data);
|
||||
x = pa_memblock_acquire(mb_c);
|
||||
printf("2 data=%s\n", x);
|
||||
pa_memblock_release(mb_c);
|
||||
pa_memblock_unref(mb_c);
|
||||
|
||||
pa_memimport_free(import_b);
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include <pulsecore/memblockq.h>
|
||||
#include <pulsecore/log.h>
|
||||
|
|
@ -48,22 +49,22 @@ int main(int argc, char *argv[]) {
|
|||
bq = pa_memblockq_new(0, 40, 10, 2, 4, 4, silence);
|
||||
assert(bq);
|
||||
|
||||
chunk1.memblock = pa_memblock_new_fixed(p, (char*) "AA", 2, 1);
|
||||
chunk1.memblock = pa_memblock_new_fixed(p, (char*) "11", 2, 1);
|
||||
chunk1.index = 0;
|
||||
chunk1.length = 2;
|
||||
assert(chunk1.memblock);
|
||||
|
||||
chunk2.memblock = pa_memblock_new_fixed(p, (char*) "TTBB", 4, 1);
|
||||
chunk2.memblock = pa_memblock_new_fixed(p, (char*) "XX22", 4, 1);
|
||||
chunk2.index = 2;
|
||||
chunk2.length = 2;
|
||||
assert(chunk2.memblock);
|
||||
|
||||
chunk3.memblock = pa_memblock_new_fixed(p, (char*) "ZZZZ", 4, 1);
|
||||
chunk3.memblock = pa_memblock_new_fixed(p, (char*) "3333", 4, 1);
|
||||
chunk3.index = 0;
|
||||
chunk3.length = 4;
|
||||
assert(chunk3.memblock);
|
||||
|
||||
chunk4.memblock = pa_memblock_new_fixed(p, (char*) "KKKKKKKK", 8, 1);
|
||||
chunk4.memblock = pa_memblock_new_fixed(p, (char*) "44444444", 8, 1);
|
||||
chunk4.index = 0;
|
||||
chunk4.length = 8;
|
||||
assert(chunk4.memblock);
|
||||
|
|
@ -115,13 +116,12 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
chunk3.index += 2;
|
||||
chunk3.length -= 2;
|
||||
|
||||
ret = pa_memblockq_push(bq, &chunk3);
|
||||
assert(ret == 0);
|
||||
|
||||
printf(">");
|
||||
pa_memblockq_shorten(bq, pa_memblockq_get_length(bq)-2);
|
||||
|
||||
pa_memblockq_shorten(bq, 6);
|
||||
printf(">");
|
||||
|
||||
for (;;) {
|
||||
pa_memchunk out;
|
||||
|
|
@ -131,11 +131,13 @@ int main(int argc, char *argv[]) {
|
|||
if (pa_memblockq_peek(bq, &out) < 0)
|
||||
break;
|
||||
|
||||
for (e = (char*) out.memblock->data + out.index, n = 0; n < out.length; n++)
|
||||
p = pa_memblock_acquire(out.memblock);
|
||||
for (e = (char*) p + out.index, n = 0; n < out.length; n++)
|
||||
printf("%c", *e);
|
||||
pa_memblock_release(out.memblock);
|
||||
|
||||
pa_memblock_unref(out.memblock);
|
||||
pa_memblockq_drop(bq, &out, out.length);
|
||||
pa_memblockq_drop(bq, out.length);
|
||||
}
|
||||
|
||||
printf("<\n");
|
||||
|
|
|
|||
69
src/tests/queue-test.c
Normal file
69
src/tests/queue-test.c
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
/* $Id$ */
|
||||
|
||||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
PulseAudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
PulseAudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with PulseAudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <pulse/util.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
#include <pulsecore/queue.h>
|
||||
#include <pulsecore/log.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/macro.h>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
pa_queue *q;
|
||||
|
||||
pa_assert_se(q = pa_queue_new());
|
||||
|
||||
pa_assert(pa_queue_is_empty(q));
|
||||
|
||||
pa_queue_push(q, (void*) "eins");
|
||||
pa_log("%s\n", (char*) pa_queue_pop(q));
|
||||
|
||||
pa_assert(pa_queue_is_empty(q));
|
||||
|
||||
pa_queue_push(q, (void*) "zwei");
|
||||
pa_queue_push(q, (void*) "drei");
|
||||
pa_queue_push(q, (void*) "vier");
|
||||
|
||||
pa_log("%s\n", (char*) pa_queue_pop(q));
|
||||
pa_log("%s\n", (char*) pa_queue_pop(q));
|
||||
|
||||
pa_queue_push(q, (void*) "fuenf");
|
||||
|
||||
pa_log("%s\n", (char*) pa_queue_pop(q));
|
||||
pa_log("%s\n", (char*) pa_queue_pop(q));
|
||||
|
||||
pa_assert(pa_queue_is_empty(q));
|
||||
|
||||
pa_queue_push(q, (void*) "sechs");
|
||||
pa_queue_push(q, (void*) "sieben");
|
||||
|
||||
pa_queue_free(q, NULL, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
227
src/tests/resampler-test.c
Normal file
227
src/tests/resampler-test.c
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
/* $Id$ */
|
||||
|
||||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
PulseAudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
PulseAudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with PulseAudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <pulse/sample.h>
|
||||
#include <pulse/volume.h>
|
||||
|
||||
#include <pulsecore/resampler.h>
|
||||
#include <pulsecore/macro.h>
|
||||
#include <pulsecore/endianmacros.h>
|
||||
#include <pulsecore/memblock.h>
|
||||
#include <pulsecore/sample-util.h>
|
||||
|
||||
#include <liboil/liboil.h>
|
||||
|
||||
static float swap_float(float a) {
|
||||
uint32_t *b = (uint32_t*) &a;
|
||||
*b = PA_UINT32_SWAP(*b);
|
||||
return a;
|
||||
}
|
||||
|
||||
static void dump_block(const pa_sample_spec *ss, const pa_memchunk *chunk) {
|
||||
void *d;
|
||||
unsigned i;
|
||||
|
||||
d = pa_memblock_acquire(chunk->memblock);
|
||||
|
||||
switch (ss->format) {
|
||||
|
||||
case PA_SAMPLE_U8:
|
||||
case PA_SAMPLE_ULAW:
|
||||
case PA_SAMPLE_ALAW: {
|
||||
uint8_t *u = d;
|
||||
|
||||
for (i = 0; i < chunk->length / pa_frame_size(ss); i++)
|
||||
printf("0x%02x ", *(u++));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case PA_SAMPLE_S16NE:
|
||||
case PA_SAMPLE_S16RE: {
|
||||
uint16_t *u = d;
|
||||
|
||||
for (i = 0; i < chunk->length / pa_frame_size(ss); i++)
|
||||
printf("0x%04x ", *(u++));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case PA_SAMPLE_FLOAT32NE:
|
||||
case PA_SAMPLE_FLOAT32RE: {
|
||||
float *u = d;
|
||||
|
||||
for (i = 0; i < chunk->length / pa_frame_size(ss); i++) {
|
||||
printf("%1.3g ", ss->format == PA_SAMPLE_FLOAT32NE ? *u : swap_float(*u));
|
||||
u++;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
pa_assert_not_reached();
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
||||
pa_memblock_release(chunk->memblock);
|
||||
}
|
||||
|
||||
static pa_memblock* generate_block(pa_mempool *pool, const pa_sample_spec *ss) {
|
||||
pa_memblock *r;
|
||||
void *d;
|
||||
unsigned i;
|
||||
|
||||
pa_assert_se(r = pa_memblock_new(pool, pa_frame_size(ss) * 10));
|
||||
d = pa_memblock_acquire(r);
|
||||
|
||||
switch (ss->format) {
|
||||
|
||||
case PA_SAMPLE_U8:
|
||||
case PA_SAMPLE_ULAW:
|
||||
case PA_SAMPLE_ALAW: {
|
||||
uint8_t *u = d;
|
||||
|
||||
u[0] = 0x00;
|
||||
u[1] = 0xFF;
|
||||
u[2] = 0x7F;
|
||||
u[3] = 0x80;
|
||||
u[4] = 0x9f;
|
||||
u[5] = 0x3f;
|
||||
u[6] = 0x1;
|
||||
u[7] = 0xF0;
|
||||
u[8] = 0x20;
|
||||
u[9] = 0x21;
|
||||
break;
|
||||
}
|
||||
|
||||
case PA_SAMPLE_S16NE:
|
||||
case PA_SAMPLE_S16RE: {
|
||||
uint16_t *u = d;
|
||||
|
||||
u[0] = 0x0000;
|
||||
u[1] = 0xFFFF;
|
||||
u[2] = 0x7FFF;
|
||||
u[3] = 0x8000;
|
||||
u[4] = 0x9fff;
|
||||
u[5] = 0x3fff;
|
||||
u[6] = 0x1;
|
||||
u[7] = 0xF000;
|
||||
u[8] = 0x20;
|
||||
u[9] = 0x21;
|
||||
break;
|
||||
}
|
||||
|
||||
case PA_SAMPLE_FLOAT32NE:
|
||||
case PA_SAMPLE_FLOAT32RE: {
|
||||
float *u = d;
|
||||
|
||||
u[0] = 0.0;
|
||||
u[1] = -1.0;
|
||||
u[2] = 1.0;
|
||||
u[3] = 4711;
|
||||
u[4] = 0.222;
|
||||
u[5] = 0.33;
|
||||
u[6] = -.3;
|
||||
u[7] = 99;
|
||||
u[8] = -0.555;
|
||||
u[9] = -.123;
|
||||
|
||||
if (ss->format == PA_SAMPLE_FLOAT32RE)
|
||||
for (i = 0; i < 10; i++)
|
||||
u[i] = swap_float(u[i]);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
pa_assert_not_reached();
|
||||
}
|
||||
|
||||
pa_memblock_release(r);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
pa_mempool *pool;
|
||||
pa_sample_spec a, b;
|
||||
pa_cvolume v;
|
||||
|
||||
oil_init();
|
||||
pa_log_set_maximal_level(PA_LOG_DEBUG);
|
||||
|
||||
pa_assert_se(pool = pa_mempool_new(FALSE));
|
||||
|
||||
a.channels = b.channels = 1;
|
||||
a.rate = b.rate = 44100;
|
||||
|
||||
v.channels = a.channels;
|
||||
v.values[0] = pa_sw_volume_from_linear(0.5);
|
||||
|
||||
for (a.format = 0; a.format < PA_SAMPLE_MAX; a.format ++) {
|
||||
for (b.format = 0; b.format < PA_SAMPLE_MAX; b.format ++) {
|
||||
|
||||
pa_resampler *forth, *back;
|
||||
pa_memchunk i, j, k;
|
||||
|
||||
printf("=== %s -> %s -> %s -> /2\n",
|
||||
pa_sample_format_to_string(a.format),
|
||||
pa_sample_format_to_string(b.format),
|
||||
pa_sample_format_to_string(a.format));
|
||||
|
||||
pa_assert_se(forth = pa_resampler_new(pool, &a, NULL, &b, NULL, PA_RESAMPLER_AUTO, FALSE));
|
||||
pa_assert_se(back = pa_resampler_new(pool, &b, NULL, &a, NULL, PA_RESAMPLER_AUTO, FALSE));
|
||||
|
||||
i.memblock = generate_block(pool, &a);
|
||||
i.length = pa_memblock_get_length(i.memblock);
|
||||
i.index = 0;
|
||||
pa_resampler_run(forth, &i, &j);
|
||||
pa_resampler_run(back, &j, &k);
|
||||
|
||||
dump_block(&a, &i);
|
||||
dump_block(&b, &j);
|
||||
dump_block(&a, &k);
|
||||
|
||||
pa_memblock_unref(j.memblock);
|
||||
pa_memblock_unref(k.memblock);
|
||||
|
||||
pa_volume_memchunk(&i, &a, &v);
|
||||
dump_block(&a, &i);
|
||||
|
||||
pa_memblock_unref(i.memblock);
|
||||
|
||||
pa_resampler_free(forth);
|
||||
pa_resampler_free(back);
|
||||
}
|
||||
}
|
||||
|
||||
pa_mempool_free(pool);
|
||||
|
||||
return 0;
|
||||
}
|
||||
91
src/tests/rtpoll-test.c
Normal file
91
src/tests/rtpoll-test.c
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
/* $Id: thread-test.c 1621 2007-08-10 22:00:22Z lennart $ */
|
||||
|
||||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
PulseAudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
PulseAudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with PulseAudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <signal.h>
|
||||
#include <poll.h>
|
||||
|
||||
#include <pulsecore/log.h>
|
||||
#include <pulsecore/rtpoll.h>
|
||||
#include <pulsecore/rtsig.h>
|
||||
|
||||
static int before(pa_rtpoll_item *i) {
|
||||
pa_log("before");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void after(pa_rtpoll_item *i) {
|
||||
pa_log("after");
|
||||
}
|
||||
|
||||
static int worker(pa_rtpoll_item *w) {
|
||||
pa_log("worker");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
pa_rtpoll *p;
|
||||
pa_rtpoll_item *i, *w;
|
||||
struct pollfd *pollfd;
|
||||
|
||||
pa_rtsig_configure(SIGRTMIN+10, SIGRTMAX);
|
||||
|
||||
p = pa_rtpoll_new();
|
||||
|
||||
i = pa_rtpoll_item_new(p, PA_RTPOLL_EARLY, 1);
|
||||
pa_rtpoll_item_set_before_callback(i, before);
|
||||
pa_rtpoll_item_set_after_callback(i, after);
|
||||
|
||||
pollfd = pa_rtpoll_item_get_pollfd(i, NULL);
|
||||
pollfd->fd = 0;
|
||||
pollfd->events = POLLIN;
|
||||
|
||||
w = pa_rtpoll_item_new(p, PA_RTPOLL_NORMAL, 0);
|
||||
pa_rtpoll_item_set_before_callback(w, worker);
|
||||
|
||||
pa_rtpoll_install(p);
|
||||
pa_rtpoll_set_timer_periodic(p, 10000000); /* 10 s */
|
||||
|
||||
pa_rtpoll_run(p, 1);
|
||||
|
||||
pa_rtpoll_item_free(i);
|
||||
|
||||
i = pa_rtpoll_item_new(p, PA_RTPOLL_EARLY, 1);
|
||||
pa_rtpoll_item_set_before_callback(i, before);
|
||||
pa_rtpoll_item_set_after_callback(i, after);
|
||||
|
||||
pollfd = pa_rtpoll_item_get_pollfd(i, NULL);
|
||||
pollfd->fd = 0;
|
||||
pollfd->events = POLLIN;
|
||||
|
||||
pa_rtpoll_run(p, 1);
|
||||
|
||||
pa_rtpoll_item_free(i);
|
||||
|
||||
pa_rtpoll_item_free(w);
|
||||
|
||||
pa_rtpoll_free(p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
39
src/tests/sig2str-test.c
Normal file
39
src/tests/sig2str-test.c
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/* $Id$ */
|
||||
|
||||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
PulseAudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
PulseAudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with PulseAudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <pulsecore/macro.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
int sig;
|
||||
|
||||
for (sig = -1; sig <= NSIG; sig++)
|
||||
printf("%i = %s\n", sig, pa_sig2str(sig));
|
||||
|
||||
return 0;
|
||||
}
|
||||
80
src/tests/smoother-test.c
Normal file
80
src/tests/smoother-test.c
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
/* $Id$ */
|
||||
|
||||
/***
|
||||
This file is part of PulseAudio.
|
||||
|
||||
PulseAudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
PulseAudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with PulseAudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <pulsecore/time-smoother.h>
|
||||
#include <pulse/timeval.h>
|
||||
|
||||
int main(int argc, char*argv[]) {
|
||||
pa_usec_t x;
|
||||
unsigned u = 0;
|
||||
pa_smoother *s;
|
||||
int m;
|
||||
|
||||
/* unsigned msec[] = { */
|
||||
/* 200, 200, */
|
||||
/* 300, 320, */
|
||||
/* 400, 400, */
|
||||
/* 500, 480, */
|
||||
/* 0, 0 */
|
||||
/* }; */
|
||||
|
||||
int msec[200];
|
||||
|
||||
srand(0);
|
||||
|
||||
for (m = 0, u = 0; u < PA_ELEMENTSOF(msec)-2; u+= 2) {
|
||||
|
||||
msec[u] = m+1;
|
||||
msec[u+1] = m + rand() % 2000 - 1000;
|
||||
|
||||
m += rand() % 100;
|
||||
|
||||
if (msec[u+1] < 0)
|
||||
msec[u+1] = 0;
|
||||
}
|
||||
|
||||
msec[PA_ELEMENTSOF(msec)-2] = 0;
|
||||
msec[PA_ELEMENTSOF(msec)-1] = 0;
|
||||
|
||||
s = pa_smoother_new(1000*PA_USEC_PER_MSEC, 2000*PA_USEC_PER_MSEC, TRUE);
|
||||
|
||||
for (x = 0, u = 0; x < PA_USEC_PER_SEC * 10; x += PA_USEC_PER_MSEC) {
|
||||
|
||||
while (msec[u] > 0 && (pa_usec_t) msec[u]*PA_USEC_PER_MSEC < x) {
|
||||
pa_smoother_put(s, msec[u]*PA_USEC_PER_MSEC, msec[u+1]*PA_USEC_PER_MSEC);
|
||||
printf("%i\t\t%i\n", msec[u], msec[u+1]);
|
||||
u += 2;
|
||||
}
|
||||
|
||||
printf("%llu\t%llu\n", x/PA_USEC_PER_MSEC, pa_smoother_get(s, x)/PA_USEC_PER_MSEC);
|
||||
}
|
||||
|
||||
pa_smoother_free(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -23,18 +23,19 @@
|
|||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/util.h>
|
||||
|
||||
#include <pulsecore/gccmacro.h>
|
||||
#include <pulse/thread-mainloop.h>
|
||||
|
||||
#include <pulsecore/gccmacro.h>
|
||||
#include <pulsecore/macro.h>
|
||||
|
||||
static void tcb(pa_mainloop_api*a, pa_time_event *e, const struct timeval *tv, void *userdata) {
|
||||
pa_assert_se(pa_threaded_mainloop_in_thread(userdata));
|
||||
fprintf(stderr, "TIME EVENT START\n");
|
||||
pa_threaded_mainloop_signal(userdata, 1);
|
||||
fprintf(stderr, "TIME EVENT END\n");
|
||||
|
|
@ -45,15 +46,15 @@ int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char *argv[]) {
|
|||
pa_threaded_mainloop *m;
|
||||
struct timeval tv;
|
||||
|
||||
m = pa_threaded_mainloop_new();
|
||||
assert(m);
|
||||
a = pa_threaded_mainloop_get_api(m);
|
||||
assert(a);
|
||||
pa_assert_se(m = pa_threaded_mainloop_new());
|
||||
pa_assert_se(a = pa_threaded_mainloop_get_api(m));
|
||||
|
||||
pa_threaded_mainloop_start(m);
|
||||
|
||||
pa_threaded_mainloop_lock(m);
|
||||
|
||||
pa_assert_se(!pa_threaded_mainloop_in_thread(m));
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec += 5;
|
||||
a->time_new(a, &tv, tcb, m);
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ static void once_func(void) {
|
|||
pa_log("once!");
|
||||
}
|
||||
|
||||
static pa_once_t once = PA_ONCE_INIT;
|
||||
static pa_once once = PA_ONCE_INIT;
|
||||
|
||||
static void thread_func(void *data) {
|
||||
pa_tls_set(tls, data);
|
||||
|
|
@ -72,7 +72,7 @@ static void thread_func(void *data) {
|
|||
|
||||
pa_mutex_unlock(mutex);
|
||||
|
||||
pa_once(&once, once_func);
|
||||
pa_run_once(&once, once_func);
|
||||
|
||||
pa_cond_signal(cond2, 0);
|
||||
|
||||
|
|
@ -98,7 +98,7 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
assert(pa_thread_is_running(pa_thread_self()));
|
||||
|
||||
mutex = pa_mutex_new(0);
|
||||
mutex = pa_mutex_new(FALSE, FALSE);
|
||||
cond1 = pa_cond_new();
|
||||
cond2 = pa_cond_new();
|
||||
tls = pa_tls_new(pa_xfree);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue