diff options
author | Lennart Poettering <lennart@poettering.net> | 2008-05-26 18:50:28 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2008-05-26 18:50:28 +0000 |
commit | 64ff61369428cd88f7ede6fb32c72356d520edf2 (patch) | |
tree | 693d739a5814b6d4f1abc5a0387bae0eaf3e1220 /read-sound-file.c | |
parent | 9010c443230c167398e22ffa3fa7643dfc252f00 (diff) |
most complete pulse driver
git-svn-id: file:///home/lennart/svn/public/libcanberra/trunk@9 01b60673-d06a-42c0-afdd-89cb8e0f78ac
Diffstat (limited to 'read-sound-file.c')
-rw-r--r-- | read-sound-file.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/read-sound-file.c b/read-sound-file.c index 13066b1..8670445 100644 --- a/read-sound-file.c +++ b/read-sound-file.c @@ -135,3 +135,41 @@ int ca_sound_file_read_uint8(ca_sound_file *fn, uint8_t *d, unsigned *n) { if (f->wav) return ca_wav_read_u8(f->wav, d, n); } + +int ca_sound_file_read_arbitrary(ca_sound_file *f, void *d, size_t *n) { + int ret; + + ca_return_val_if_fail(f, CA_ERROR_INVALID); + ca_return_val_if_fail(d, CA_ERROR_INVALID); + ca_return_val_if_fail(n, CA_ERROR_INVALID); + ca_return_val_if_fail(*n > 0, CA_ERROR_INVALID); + ca_return_val_if_fail(f->wav && !f->vorbis, CA_ERROR_STATE); + + switch (f->type) { + case CA_SAMPLE_S16NE: + case CA_SAMPLE_S16RE: { + unsigned k; + + k = *n / sizeof(int16_t); + if ((ret = ca_sound_file_read_int16(f, d, &k)) == CA_SUCCESS) + *n = k * sizeof(int16_t); + + break; + } + + case CA_SAMPLE_S16RE: { + unsigned k; + + k = *n; + if ((ret = ca_sound_file_read_uint8(f, d, &k)) == CA_SUCCESS) + *n = k; + + break; + } + + default: + ca_assert_not_reached(); + } + + return ret; +} |