Lines Matching +full:0 +full:xa
1 /* libSoX xa.c Support for Maxis .XA file format
21 * "Maxis XA Audio File Format Description", dated 5-01-2002. */
29 #define HNIBBLE(byte) (((byte) >> 4) & 0xf)
30 #define LNIBBLE(byte) ((byte) & 0xf)
32 /* .xa file header */
34 char magic[4]; /* "XA\0\0", "XAI\0" (sound/speech), or "XAJ\0" (music) */
38 uint16_t tag; /* 0x0001 - PCM data */
54 /* Private data for .xa file */
66 0, 240, 460, 392,
67 0, 0, -208, -220,
68 0, 1, 3, 4,
70 0, -1, -3, -4
87 priv_t * xa = (priv_t *) ft->priv; in startread() local
88 char *magic = xa->header.magic; in startread()
91 if (lsx_readbuf(ft, xa->header.magic, (size_t)4) != 4 || in startread()
92 (memcmp("XA\0\0", xa->header.magic, (size_t)4) != 0 && in startread()
93 memcmp("XAI\0", xa->header.magic, (size_t)4) != 0 && in startread()
94 memcmp("XAJ\0", xa->header.magic, (size_t)4) != 0)) in startread()
96 lsx_fail_errno(ft, SOX_EHDR, "XA: Header not found"); in startread()
101 if (lsx_readdw(ft, &xa->header.outSize) != SOX_SUCCESS) return SOX_EOF; in startread()
102 if (lsx_readw(ft, &xa->header.tag) != SOX_SUCCESS) return SOX_EOF; in startread()
103 if (lsx_readw(ft, &xa->header.channels) != SOX_SUCCESS) return SOX_EOF; in startread()
104 if (lsx_readdw(ft, &xa->header.sampleRate) != SOX_SUCCESS) return SOX_EOF; in startread()
105 if (lsx_readdw(ft, &xa->header.avgByteRate) != SOX_SUCCESS) return SOX_EOF; in startread()
106 if (lsx_readw(ft, &xa->header.align) != SOX_SUCCESS) return SOX_EOF; in startread()
107 if (lsx_readw(ft, &xa->header.bits) != SOX_SUCCESS) return SOX_EOF; in startread()
110 lsx_debug("XA Header:"); in startread()
112 magic[0], magic[1], magic[2], magic[3], in startread()
113 (magic[0] >= 0x20 && magic[0] <= 0x7e) ? magic[0] : '.', in startread()
114 (magic[1] >= 0x20 && magic[1] <= 0x7e) ? magic[1] : '.', in startread()
115 (magic[2] >= 0x20 && magic[2] <= 0x7e) ? magic[2] : '.', in startread()
116 (magic[3] >= 0x20 && magic[3] <= 0x7e) ? magic[3] : '.'); in startread()
117 lsx_debug(" dwOutSize: %u", xa->header.outSize); in startread()
118 lsx_debug(" wTag: 0x%04x", xa->header.tag); in startread()
119 lsx_debug(" wChannels: %u", xa->header.channels); in startread()
120 lsx_debug(" dwSampleRate: %u", xa->header.sampleRate); in startread()
121 lsx_debug(" dwAvgByteRate: %u", xa->header.avgByteRate); in startread()
122 lsx_debug(" wAlign: %u", xa->header.align); in startread()
123 lsx_debug(" wBits: %u", xa->header.bits); in startread()
128 if (!ft->encoding.bits_per_sample || ft->encoding.bits_per_sample == xa->header.bits) { in startread()
129 ft->encoding.bits_per_sample = xa->header.bits; in startread()
131 lsx_report("User options overriding size read in .xa header"); in startread()
134 if (ft->signal.channels == 0 || ft->signal.channels == xa->header.channels) { in startread()
135 ft->signal.channels = xa->header.channels; in startread()
137 lsx_report("User options overriding channels read in .xa header"); in startread()
140 if (ft->signal.rate == 0 || ft->signal.rate == xa->header.sampleRate) { in startread()
141 ft->signal.rate = xa->header.sampleRate; in startread()
143 lsx_report("User options overriding rate read in .xa header"); in startread()
146 if (ft->signal.channels == 0 || ft->signal.channels > UINT16_MAX) { in startread()
160 if (xa->header.bits != ft->encoding.bits_per_sample) { in startread()
162 xa->header.bits, ft->encoding.bits_per_sample); in startread()
163 xa->header.bits = ft->encoding.bits_per_sample; in startread()
165 if (xa->header.align != (ft->encoding.bits_per_sample >> 3) * xa->header.channels) { in startread()
167 xa->header.align, (ft->encoding.bits_per_sample >> 3) * xa->header.channels); in startread()
168 xa->header.align = (ft->encoding.bits_per_sample >> 3) * xa->header.channels; in startread()
170 if (xa->header.avgByteRate != (xa->header.align * xa->header.sampleRate)) { in startread()
172 xa->header.avgByteRate, xa->header.align * xa->header.sampleRate); in startread()
173 xa->header.avgByteRate = xa->header.align * xa->header.sampleRate; in startread()
177 xa->blockSize = ft->signal.channels * 0xf; in startread()
178 xa->bufPos = xa->blockSize; in startread()
181 xa->buf = lsx_calloc(1, (size_t)xa->blockSize); in startread()
184 xa->state = lsx_calloc(sizeof(xa_state_t), ft->signal.channels); in startread()
187 xa->bytesDecoded = 0; in startread()
198 priv_t * xa = (priv_t *) ft->priv; in read_samples() local
204 done = 0; in read_samples()
206 if (xa->bufPos >= xa->blockSize) { in read_samples()
208 bytes = lsx_readbuf(ft, xa->buf, (size_t) xa->blockSize); in read_samples()
209 if (bytes < xa->blockSize) { in read_samples()
211 if (done > 0) { in read_samples()
214 lsx_fail_errno(ft,SOX_EOF,"Premature EOF on .xa input file"); in read_samples()
215 return 0; in read_samples()
219 return 0; in read_samples()
222 xa->bufPos = 0; in read_samples()
224 for (i = 0; i < ft->signal.channels; i++) { in read_samples()
225 inByte = xa->buf[i]; in read_samples()
226 xa->state[i].c1 = EA_ADPCM_Table[HNIBBLE(inByte)]; in read_samples()
227 xa->state[i].c2 = EA_ADPCM_Table[HNIBBLE(inByte) + 4]; in read_samples()
228 xa->state[i].shift = LNIBBLE(inByte) + 8; in read_samples()
230 xa->bufPos += ft->signal.channels; in read_samples()
233 for (i = 0; i < ft->signal.channels && done < len; i++) { in read_samples()
235 sample = HNIBBLE(xa->buf[xa->bufPos+i]); in read_samples()
236 sample = (sample << 28) >> xa->state[i].shift; in read_samples()
238 xa->state[i].curSample * xa->state[i].c1 + in read_samples()
239 xa->state[i].prevSample * xa->state[i].c2 + 0x80) >> 8; in read_samples()
241 xa->state[i].prevSample = xa->state[i].curSample; in read_samples()
242 xa->state[i].curSample = sample; in read_samples()
245 xa->bytesDecoded += (ft->encoding.bits_per_sample >> 3); in read_samples()
247 for (i = 0; i < ft->signal.channels && done < len; i++) { in read_samples()
249 sample = LNIBBLE(xa->buf[xa->bufPos+i]); in read_samples()
250 sample = (sample << 28) >> xa->state[i].shift; in read_samples()
252 xa->state[i].curSample * xa->state[i].c1 + in read_samples()
253 xa->state[i].prevSample * xa->state[i].c2 + 0x80) >> 8; in read_samples()
255 xa->state[i].prevSample = xa->state[i].curSample; in read_samples()
256 xa->state[i].curSample = sample; in read_samples()
259 xa->bytesDecoded += (ft->encoding.bits_per_sample >> 3); in read_samples()
262 xa->bufPos += ft->signal.channels; in read_samples()
265 if (done == 0) { in read_samples()
266 return 0; in read_samples()
273 priv_t * xa = (priv_t *) ft->priv; in stopread() local
278 free(xa->buf); in stopread()
279 xa->buf = NULL; in stopread()
280 free(xa->state); in stopread()
281 xa->state = NULL; in stopread()
286 LSX_FORMAT_HANDLER(xa) in LSX_FORMAT_HANDLER() argument
288 static char const * const names[] = {"xa", NULL }; in LSX_FORMAT_HANDLER()