2 * Copyright (C) 2013 nu774
3 * For conditions of distribution and use, see copyright notice in COPYING
11 typedef struct pcm_reader_t pcm_reader_t
;
13 typedef struct pcm_reader_vtbl_t
{
14 const pcm_sample_description_t
*(*get_format
)(pcm_reader_t
*);
15 int64_t (*get_length
)(pcm_reader_t
*);
16 int64_t (*get_position
)(pcm_reader_t
*);
17 int (*read_frames
)(pcm_reader_t
*, void *, unsigned);
18 void (*teardown
)(pcm_reader_t
**);
22 pcm_reader_vtbl_t
*vtbl
;
25 typedef int (*pcm_read_callback
)(void *cookie
, void *data
, uint32_t count
);
26 typedef int (*pcm_seek_callback
)(void *cookie
, int64_t off
, int whence
);
27 typedef int64_t (*pcm_tell_callback
)(void *cookie
);
29 typedef struct pcm_io_vtbl_t
{
30 pcm_read_callback read
;
31 pcm_seek_callback seek
;
32 pcm_tell_callback tell
;
35 typedef struct pcm_io_context_t
{
41 const pcm_sample_description_t
*pcm_get_format(pcm_reader_t
*r
)
43 return r
->vtbl
->get_format(r
);
47 int64_t pcm_get_length(pcm_reader_t
*r
)
49 return r
->vtbl
->get_length(r
);
53 int64_t pcm_get_position(pcm_reader_t
*r
)
55 return r
->vtbl
->get_position(r
);
58 int pcm_read_frames(pcm_reader_t
*r
, void *data
, unsigned nframes
);
61 void pcm_teardown(pcm_reader_t
**r
)
63 (*r
)->vtbl
->teardown(r
);
67 uint32_t bitcount(uint32_t bits
)
69 bits
= (bits
& 0x55555555) + (bits
>> 1 & 0x55555555);
70 bits
= (bits
& 0x33333333) + (bits
>> 2 & 0x33333333);
71 bits
= (bits
& 0x0f0f0f0f) + (bits
>> 4 & 0x0f0f0f0f);
72 bits
= (bits
& 0x00ff00ff) + (bits
>> 8 & 0x00ff00ff);
73 return (bits
& 0x0000ffff) + (bits
>>16 & 0x0000ffff);
76 #define TRY_IO(expr) \
78 if ((expr)) goto FAIL; \
81 #define ENSURE(expr) \
83 if (!(expr)) goto FAIL;\
86 int pcm_read(pcm_io_context_t
*io
, void *buffer
, uint32_t size
);
87 int pcm_skip(pcm_io_context_t
*io
, int64_t count
);
89 static inline int pcm_seek(pcm_io_context_t
*io
, int64_t off
, int whence
)
91 return io
->vtbl
->seek
? io
->vtbl
->seek(io
->cookie
, off
, whence
) : -1;
94 static inline int64_t pcm_tell(pcm_io_context_t
*io
)
96 return io
->vtbl
->tell
? io
->vtbl
->tell(io
->cookie
) : -1;
99 int pcm_read16le(pcm_io_context_t
*io
, uint16_t *value
);
100 int pcm_read16be(pcm_io_context_t
*io
, uint16_t *value
);
101 int pcm_read32le(pcm_io_context_t
*io
, uint32_t *value
);
102 int pcm_read32be(pcm_io_context_t
*io
, uint32_t *value
);
103 int pcm_read64le(pcm_io_context_t
*io
, uint64_t *value
);
104 int pcm_read64be(pcm_io_context_t
*io
, uint64_t *value
);
105 int pcm_scanl(pcm_io_context_t
*io
, const char *fmt
, ...);
106 int pcm_scanb(pcm_io_context_t
*io
, const char *fmt
, ...);
108 int apple_chan_chunk(pcm_io_context_t
*io
, uint32_t chunk_size
,
109 pcm_sample_description_t
*fmt
, uint8_t *mapping
);
111 pcm_reader_t
*wav_open(pcm_io_context_t
*io
, int ignore_length
);
112 pcm_reader_t
*raw_open(pcm_io_context_t
*io
,
113 const pcm_sample_description_t
*desc
);
114 pcm_reader_t
*caf_open(pcm_io_context_t
*io
,
115 aacenc_tag_callback_t tag_callback
, void *tag_ctx
);
117 pcm_reader_t
*pcm_open_native_converter(pcm_reader_t
*reader
);
118 pcm_reader_t
*pcm_open_float_converter(pcm_reader_t
*reader
);
119 pcm_reader_t
*pcm_open_sint16_converter(pcm_reader_t
*reader
);
121 pcm_reader_t
*extrapolater_open(pcm_reader_t
*reader
);
122 pcm_reader_t
*limiter_open(pcm_reader_t
*reader
);