summaryrefslogtreecommitdiffstats
path: root/src/read-vorbis.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/read-vorbis.c')
-rw-r--r--src/read-vorbis.c234
1 files changed, 118 insertions, 116 deletions
diff --git a/src/read-vorbis.c b/src/read-vorbis.c
index fb2150a..45beb81 100644
--- a/src/read-vorbis.c
+++ b/src/read-vorbis.c
@@ -1,3 +1,5 @@
+/*-*- Mode: C; c-basic-offset: 8 -*-*/
+
/***
This file is part of libcanberra.
@@ -33,212 +35,212 @@
#define FILE_SIZE_MAX ((off_t) (64U*1024U*1024U))
struct ca_vorbis {
- OggVorbis_File ovf;
- off_t size;
- ca_channel_position_t channel_map[8];
+ OggVorbis_File ovf;
+ off_t size;
+ ca_channel_position_t channel_map[8];
};
static int convert_error(int or) {
- switch (or) {
+ switch (or) {
case OV_ENOSEEK:
case OV_EBADPACKET:
case OV_EBADLINK:
case OV_EFAULT:
case OV_EREAD:
case OV_HOLE:
- return CA_ERROR_IO;
+ return CA_ERROR_IO;
case OV_EIMPL:
case OV_EVERSION:
case OV_ENOTAUDIO:
- return CA_ERROR_NOTSUPPORTED;
+ return CA_ERROR_NOTSUPPORTED;
case OV_ENOTVORBIS:
case OV_EBADHEADER:
case OV_EOF:
- return CA_ERROR_CORRUPT;
+ return CA_ERROR_CORRUPT;
case OV_EINVAL:
- return CA_ERROR_INVALID;
+ return CA_ERROR_INVALID;
default:
- return CA_ERROR_IO;
- }
+ return CA_ERROR_IO;
+ }
}
int ca_vorbis_open(ca_vorbis **_v, FILE *f) {
- int ret, or;
- ca_vorbis *v;
- int64_t n;
+ int ret, or;
+ ca_vorbis *v;
+ int64_t n;
- ca_return_val_if_fail(_v, CA_ERROR_INVALID);
- ca_return_val_if_fail(f, CA_ERROR_INVALID);
+ ca_return_val_if_fail(_v, CA_ERROR_INVALID);
+ ca_return_val_if_fail(f, CA_ERROR_INVALID);
- if (!(v = ca_new0(ca_vorbis, 1)))
- return CA_ERROR_OOM;
+ if (!(v = ca_new0(ca_vorbis, 1)))
+ return CA_ERROR_OOM;
- if ((or = ov_open(f, &v->ovf, NULL, 0)) < 0) {
- ret = convert_error(or);
- goto fail;
- }
+ if ((or = ov_open(f, &v->ovf, NULL, 0)) < 0) {
+ ret = convert_error(or);
+ goto fail;
+ }
- if ((n = ov_pcm_total(&v->ovf, -1)) < 0) {
- ret = convert_error(or);
- ov_clear(&v->ovf);
- goto fail;
- }
+ if ((n = ov_pcm_total(&v->ovf, -1)) < 0) {
+ ret = convert_error(or);
+ ov_clear(&v->ovf);
+ goto fail;
+ }
- if (((off_t) n * (off_t) sizeof(int16_t)) > FILE_SIZE_MAX) {
- ret = CA_ERROR_TOOBIG;
- ov_clear(&v->ovf);
- goto fail;
- }
+ if (((off_t) n * (off_t) sizeof(int16_t)) > FILE_SIZE_MAX) {
+ ret = CA_ERROR_TOOBIG;
+ ov_clear(&v->ovf);
+ goto fail;
+ }
- v->size = (off_t) n * (off_t) sizeof(int16_t) * ca_vorbis_get_nchannels(v);
+ v->size = (off_t) n * (off_t) sizeof(int16_t) * ca_vorbis_get_nchannels(v);
- *_v = v;
+ *_v = v;
- return CA_SUCCESS;
+ return CA_SUCCESS;
fail:
- ca_free(v);
- return ret;
+ ca_free(v);
+ return ret;
}
void ca_vorbis_close(ca_vorbis *v) {
- ca_assert(v);
+ ca_assert(v);
- ov_clear(&v->ovf);
- ca_free(v);
+ ov_clear(&v->ovf);
+ ca_free(v);
}
unsigned ca_vorbis_get_nchannels(ca_vorbis *v) {
- const vorbis_info *vi;
- ca_assert(v);
+ const vorbis_info *vi;
+ ca_assert(v);
- ca_assert_se(vi = ov_info(&v->ovf, -1));
+ ca_assert_se(vi = ov_info(&v->ovf, -1));
- return (unsigned) vi->channels;
+ return (unsigned) vi->channels;
}
unsigned ca_vorbis_get_rate(ca_vorbis *v) {
- const vorbis_info *vi;
- ca_assert(v);
+ const vorbis_info *vi;
+ ca_assert(v);
- ca_assert_se(vi = ov_info(&v->ovf, -1));
+ ca_assert_se(vi = ov_info(&v->ovf, -1));
- return (unsigned) vi->rate;
+ return (unsigned) vi->rate;
}
const ca_channel_position_t* ca_vorbis_get_channel_map(ca_vorbis *v) {
- /* See http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-800004.3.9 */
+ /* See http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-800004.3.9 */
- switch (ca_vorbis_get_nchannels(v)) {
+ switch (ca_vorbis_get_nchannels(v)) {
case 8:
- v->channel_map[0] = CA_CHANNEL_FRONT_LEFT;
- v->channel_map[1] = CA_CHANNEL_FRONT_CENTER;
- v->channel_map[2] = CA_CHANNEL_FRONT_RIGHT;
- v->channel_map[3] = CA_CHANNEL_SIDE_LEFT;
- v->channel_map[4] = CA_CHANNEL_SIDE_RIGHT;
- v->channel_map[5] = CA_CHANNEL_REAR_LEFT;
- v->channel_map[6] = CA_CHANNEL_REAR_RIGHT;
- v->channel_map[7] = CA_CHANNEL_LFE;
- return v->channel_map;
+ v->channel_map[0] = CA_CHANNEL_FRONT_LEFT;
+ v->channel_map[1] = CA_CHANNEL_FRONT_CENTER;
+ v->channel_map[2] = CA_CHANNEL_FRONT_RIGHT;
+ v->channel_map[3] = CA_CHANNEL_SIDE_LEFT;
+ v->channel_map[4] = CA_CHANNEL_SIDE_RIGHT;
+ v->channel_map[5] = CA_CHANNEL_REAR_LEFT;
+ v->channel_map[6] = CA_CHANNEL_REAR_RIGHT;
+ v->channel_map[7] = CA_CHANNEL_LFE;
+ return v->channel_map;
case 7:
- v->channel_map[0] = CA_CHANNEL_FRONT_LEFT;
- v->channel_map[1] = CA_CHANNEL_FRONT_CENTER;
- v->channel_map[2] = CA_CHANNEL_FRONT_RIGHT;
- v->channel_map[3] = CA_CHANNEL_SIDE_LEFT;
- v->channel_map[4] = CA_CHANNEL_SIDE_RIGHT;
- v->channel_map[5] = CA_CHANNEL_REAR_CENTER;
- v->channel_map[6] = CA_CHANNEL_LFE;
- return v->channel_map;
+ v->channel_map[0] = CA_CHANNEL_FRONT_LEFT;
+ v->channel_map[1] = CA_CHANNEL_FRONT_CENTER;
+ v->channel_map[2] = CA_CHANNEL_FRONT_RIGHT;
+ v->channel_map[3] = CA_CHANNEL_SIDE_LEFT;
+ v->channel_map[4] = CA_CHANNEL_SIDE_RIGHT;
+ v->channel_map[5] = CA_CHANNEL_REAR_CENTER;
+ v->channel_map[6] = CA_CHANNEL_LFE;
+ return v->channel_map;
case 6:
- v->channel_map[5] = CA_CHANNEL_LFE;
- /* fall through */
+ v->channel_map[5] = CA_CHANNEL_LFE;
+ /* fall through */
case 5:
- v->channel_map[3] = CA_CHANNEL_REAR_LEFT;
- v->channel_map[4] = CA_CHANNEL_REAR_RIGHT;
- /* fall through */
+ v->channel_map[3] = CA_CHANNEL_REAR_LEFT;
+ v->channel_map[4] = CA_CHANNEL_REAR_RIGHT;
+ /* fall through */
case 3:
- v->channel_map[0] = CA_CHANNEL_FRONT_LEFT;
- v->channel_map[1] = CA_CHANNEL_FRONT_CENTER;
- v->channel_map[2] = CA_CHANNEL_FRONT_RIGHT;
- return v->channel_map;
+ v->channel_map[0] = CA_CHANNEL_FRONT_LEFT;
+ v->channel_map[1] = CA_CHANNEL_FRONT_CENTER;
+ v->channel_map[2] = CA_CHANNEL_FRONT_RIGHT;
+ return v->channel_map;
case 4:
- v->channel_map[2] = CA_CHANNEL_REAR_LEFT;
- v->channel_map[3] = CA_CHANNEL_REAR_RIGHT;
- /* fall through */
+ v->channel_map[2] = CA_CHANNEL_REAR_LEFT;
+ v->channel_map[3] = CA_CHANNEL_REAR_RIGHT;
+ /* fall through */
case 2:
- v->channel_map[0] = CA_CHANNEL_FRONT_LEFT;
- v->channel_map[1] = CA_CHANNEL_FRONT_RIGHT;
- return v->channel_map;
+ v->channel_map[0] = CA_CHANNEL_FRONT_LEFT;
+ v->channel_map[1] = CA_CHANNEL_FRONT_RIGHT;
+ return v->channel_map;
case 1:
- v->channel_map[0] = CA_CHANNEL_MONO;
- return v->channel_map;
- }
+ v->channel_map[0] = CA_CHANNEL_MONO;
+ return v->channel_map;
+ }
- return NULL;
+ return NULL;
}
int ca_vorbis_read_s16ne(ca_vorbis *v, int16_t *d, size_t *n){
- long r;
- int section;
- int length;
- size_t n_read = 0;
+ long r;
+ int section;
+ int length;
+ size_t n_read = 0;
- ca_return_val_if_fail(v, 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(v, 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);
- length = (int) (*n * sizeof(int16_t));
+ length = (int) (*n * sizeof(int16_t));
- do {
+ do {
- r = ov_read(&v->ovf, (char*) d, length,
+ r = ov_read(&v->ovf, (char*) d, length,
#ifdef WORDS_BIGENDIAN
- 1,
+ 1,
#else
- 0,
+ 0,
#endif
- 2, 1, &section);
+ 2, 1, &section);
- if (r < 0)
- return convert_error((int) r);
+ if (r < 0)
+ return convert_error((int) r);
- if (r == 0)
- break;
+ if (r == 0)
+ break;
- /* We only read the first section */
- if (section != 0)
- break;
+ /* We only read the first section */
+ if (section != 0)
+ break;
- length -= (int) r;
- d += r/sizeof(int16_t);
- n_read += (size_t) r;
+ length -= (int) r;
+ d += r/sizeof(int16_t);
+ n_read += (size_t) r;
- } while (length >= 4096);
+ } while (length >= 4096);
- ca_assert(v->size >= (off_t) n_read);
- v->size -= (off_t) n_read;
+ ca_assert(v->size >= (off_t) n_read);
+ v->size -= (off_t) n_read;
- *n = n_read/sizeof(int16_t);
+ *n = n_read/sizeof(int16_t);
- return CA_SUCCESS;
+ return CA_SUCCESS;
}
off_t ca_vorbis_get_size(ca_vorbis *v) {
- ca_return_val_if_fail(v, (off_t) -1);
+ ca_return_val_if_fail(v, (off_t) -1);
- return v->size;
+ return v->size;
}