Lines Matching refs:ft
124 int (*read_fmt)(sox_format_t *ft, uint32_t len);
135 static int wav_ima_adpcm_fmt(sox_format_t *ft, uint32_t len) in wav_ima_adpcm_fmt() argument
137 priv_t *wav = ft->priv; in wav_ima_adpcm_fmt()
142 lsx_fail_errno(ft, SOX_EOF, in wav_ima_adpcm_fmt()
147 err = lsx_read_fields(ft, &len, "h", &wav->samplesPerBlock); in wav_ima_adpcm_fmt()
151 bytesPerBlock = lsx_ima_bytes_per_block(ft->signal.channels, in wav_ima_adpcm_fmt()
155 lsx_fail_errno(ft, SOX_EOF, in wav_ima_adpcm_fmt()
164 lsx_malloc(ft->signal.channels * wav->samplesPerBlock * sizeof(short)); in wav_ima_adpcm_fmt()
174 static unsigned short ImaAdpcmReadBlock(sox_format_t * ft) in ImaAdpcmReadBlock() argument
176 priv_t * wav = (priv_t *) ft->priv; in ImaAdpcmReadBlock()
181 bytesRead = lsx_readbuf(ft, wav->packet, (size_t)wav->blockAlign); in ImaAdpcmReadBlock()
188 …samplesThisBlock = lsx_ima_samples_in((size_t)0, (size_t)ft->signal.channels, bytesRead, (size_t) … in ImaAdpcmReadBlock()
200 lsx_ima_block_expand_i(ft->signal.channels, wav->packet, wav->samples, samplesThisBlock); in ImaAdpcmReadBlock()
209 static int wav_ms_adpcm_fmt(sox_format_t *ft, uint32_t len) in wav_ms_adpcm_fmt() argument
211 priv_t *wav = ft->priv; in wav_ms_adpcm_fmt()
217 lsx_fail_errno(ft, SOX_EOF, in wav_ms_adpcm_fmt()
222 err = lsx_read_fields(ft, &len, "hh", &wav->samplesPerBlock, &wav->nCoefs); in wav_ms_adpcm_fmt()
226 bytesPerBlock = lsx_ms_adpcm_bytes_per_block(ft->signal.channels, in wav_ms_adpcm_fmt()
230 lsx_fail_errno(ft, SOX_EOF, in wav_ms_adpcm_fmt()
238 lsx_fail_errno(ft, SOX_EOF, in wav_ms_adpcm_fmt()
245 lsx_fail_errno(ft, SOX_EOF, "wave header error: cbSize too small"); in wav_ms_adpcm_fmt()
251 lsx_malloc(ft->signal.channels * wav->samplesPerBlock * sizeof(short)); in wav_ms_adpcm_fmt()
255 wav->ms_adpcm_data = lsx_ms_adpcm_alloc(ft->signal.channels); in wav_ms_adpcm_fmt()
257 err = lsx_read_fields(ft, &len, "*h", in wav_ms_adpcm_fmt()
276 static unsigned short AdpcmReadBlock(sox_format_t * ft) in AdpcmReadBlock() argument
278 priv_t * wav = (priv_t *) ft->priv; in AdpcmReadBlock()
284 bytesRead = lsx_readbuf(ft, wav->packet, (size_t) wav->blockAlign); in AdpcmReadBlock()
291 …samplesThisBlock = lsx_ms_adpcm_samples_in((size_t)0, (size_t)ft->signal.channels, bytesRead, (siz… in AdpcmReadBlock()
299 …errmsg = lsx_ms_adpcm_block_expand_i(wav->ms_adpcm_data, ft->signal.channels, wav->nCoefs, wav->ls… in AdpcmReadBlock()
311 static int xxxAdpcmWriteBlock(sox_format_t * ft) in xxxAdpcmWriteBlock() argument
313 priv_t * wav = (priv_t *) ft->priv; in xxxAdpcmWriteBlock()
317 chans = ft->signal.channels; in xxxAdpcmWriteBlock()
330 if (lsx_writebuf(ft, wav->packet, (size_t) wav->blockAlign) != wav->blockAlign) in xxxAdpcmWriteBlock()
332 lsx_fail_errno(ft,SOX_EOF,"write error"); in xxxAdpcmWriteBlock()
351 static int wav_gsm_fmt(sox_format_t *ft, uint32_t len) in wav_gsm_fmt() argument
353 priv_t *wav = ft->priv; in wav_gsm_fmt()
356 err = lsx_read_fields(ft, &len, "h", &wav->samplesPerBlock); in wav_gsm_fmt()
361 lsx_fail_errno(ft, SOX_EOF, "format[%s]: expects blockAlign(%d) = %d", in wav_gsm_fmt()
367 lsx_fail_errno(ft, SOX_EOF, in wav_gsm_fmt()
378 static int wavgsminit(sox_format_t * ft) in wavgsminit() argument
381 priv_t * wav = (priv_t *) ft->priv; in wavgsminit()
386 lsx_fail_errno(ft,SOX_EOF,"cannot create GSM object"); in wavgsminit()
391 …lsx_fail_errno(ft,SOX_EOF,"error setting gsm_option for WAV49 format. Recompile gsm library with -… in wavgsminit()
401 static void wavgsmdestroy(sox_format_t * ft) in wavgsmdestroy() argument
403 priv_t * wav = (priv_t *) ft->priv; in wavgsmdestroy()
408 static size_t wavgsmread(sox_format_t * ft, sox_sample_t *buf, size_t len) in wavgsmread() argument
410 priv_t * wav = (priv_t *) ft->priv; in wavgsmread()
415 ft->sox_errno = SOX_SUCCESS; in wavgsmread()
424 bytes = lsx_readbuf(ft, frame, (size_t)65); in wavgsmread()
434 lsx_fail_errno(ft,SOX_EOF,"error during gsm decode"); in wavgsmread()
440 lsx_fail_errno(ft,SOX_EOF,"error during gsm decode"); in wavgsmread()
452 static int wavgsmflush(sox_format_t * ft) in wavgsmflush() argument
455 priv_t * wav = (priv_t *) ft->priv; in wavgsmflush()
465 if (lsx_writebuf(ft, frame, (size_t) 65) != 65) in wavgsmflush()
467 lsx_fail_errno(ft,SOX_EOF,"write error"); in wavgsmflush()
476 static size_t wavgsmwrite(sox_format_t * ft, const sox_sample_t *buf, size_t len) in wavgsmwrite() argument
478 priv_t * wav = (priv_t *) ft->priv; in wavgsmwrite()
482 ft->sox_errno = SOX_SUCCESS; in wavgsmwrite()
488 SOX_SAMPLE_TO_SIGNED_16BIT(buf[done++], ft->clips); in wavgsmwrite()
493 rc = wavgsmflush(ft); in wavgsmwrite()
501 static void wavgsmstopwrite(sox_format_t * ft) in wavgsmstopwrite() argument
503 priv_t * wav = (priv_t *) ft->priv; in wavgsmstopwrite()
505 ft->sox_errno = SOX_SUCCESS; in wavgsmstopwrite()
508 wavgsmflush(ft); in wavgsmstopwrite()
512 if(lsx_writeb(ft, 0)) in wavgsmstopwrite()
513 lsx_fail_errno(ft,SOX_EOF,"write error"); in wavgsmstopwrite()
518 wavgsmdestroy(ft); in wavgsmstopwrite()
527 static int wav_pcm_fmt(sox_format_t *ft, uint32_t len) in wav_pcm_fmt() argument
529 priv_t *wav = ft->priv; in wav_pcm_fmt()
533 ft->encoding.encoding = SOX_ENCODING_UNSIGNED; in wav_pcm_fmt()
535 ft->encoding.encoding = SOX_ENCODING_SIGN2; in wav_pcm_fmt()
537 lsx_fail_errno(ft, SOX_EFMT, "%d bytes per sample not suppored", bps); in wav_pcm_fmt()
620 static int wavfail(sox_format_t *ft, int tag, const char *name) in wavfail() argument
623 lsx_fail_errno(ft, SOX_EHDR, "WAVE format '%s' (%04x) not supported", in wavfail()
626 lsx_fail_errno(ft, SOX_EHDR, "Unknown WAVE format %04x", tag); in wavfail()
631 static int wav_read_fmt(sox_format_t *ft, uint32_t len) in wav_read_fmt() argument
633 priv_t *wav = ft->priv; in wav_read_fmt()
639 sox_encoding_t user_enc = ft->encoding.encoding; in wav_read_fmt()
643 lsx_fail_errno(ft, SOX_EHDR, "WAVE file fmt chunk is too short"); in wav_read_fmt()
647 err = lsx_read_fields(ft, &len, "hhiihh", in wav_read_fmt()
667 err = lsx_read_fields(ft, &len, "h", &wExtSize); in wav_read_fmt()
673 lsx_fail_errno(ft, SOX_EOF, in wav_read_fmt()
684 lsx_fail_errno(ft, SOX_EHDR, "WAVE file fmt chunk is too short"); in wav_read_fmt()
688 err = lsx_read_fields(ft, &len, "hih14x", in wav_read_fmt()
696 lsx_fail_errno(ft, SOX_EHDR, in wav_read_fmt()
706 if (ft->signal.channels == 0 || ft->signal.channels == wChannels) in wav_read_fmt()
707 ft->signal.channels = wChannels; in wav_read_fmt()
711 if (ft->signal.channels == 0) { in wav_read_fmt()
712 lsx_fail_errno(ft, SOX_EHDR, "Channel count is zero"); in wav_read_fmt()
716 if (ft->signal.rate == 0 || ft->signal.rate == dwSamplesPerSecond) in wav_read_fmt()
717 ft->signal.rate = dwSamplesPerSecond; in wav_read_fmt()
723 return wavfail(ft, wav->formatTag, NULL); in wav_read_fmt()
726 ft->encoding.encoding = fmt->encoding; in wav_read_fmt()
729 if (fmt->read_fmt(ft, len)) in wav_read_fmt()
732 return wavfail(ft, wav->formatTag, fmt->name); in wav_read_fmt()
736 if (!ft->encoding.bits_per_sample || in wav_read_fmt()
737 ft->encoding.bits_per_sample == wav->bitsPerSample) in wav_read_fmt()
738 ft->encoding.bits_per_sample = wav->bitsPerSample; in wav_read_fmt()
742 if (user_enc && user_enc != ft->encoding.encoding) { in wav_read_fmt()
744 ft->encoding.encoding = user_enc; in wav_read_fmt()
761 static int read_chunk_header(sox_format_t *ft, char tag[4], uint32_t *len) in read_chunk_header() argument
765 r = lsx_readbuf(ft, tag, 4); in read_chunk_header()
769 return lsx_readdw(ft, len); in read_chunk_header()
779 static int startread(sox_format_t *ft) in startread() argument
781 priv_t *wav = ft->priv; in startread()
796 ft->sox_errno = SOX_SUCCESS; in startread()
797 wav->ignoreSize = ft->signal.length == SOX_IGNORE_LENGTH; in startread()
798 ft->encoding.reverse_bytes = MACHINE_IS_BIGENDIAN; in startread()
800 if (read_chunk_header(ft, magic, &clen)) in startread()
805 ft->encoding.reverse_bytes = MACHINE_IS_LITTLEENDIAN; in startread()
810 lsx_fail_errno(ft, SOX_EHDR, "WAVE: RIFF header not found"); in startread()
816 if (lsx_readbuf(ft, magic, 4) < 4 || memcmp(magic, "WAVE", 4)) { in startread()
817 lsx_fail_errno(ft, SOX_EHDR, "WAVE header not found"); in startread()
821 while (!read_chunk_header(ft, magic, &clen)) { in startread()
823 off_t cstart = lsx_tell(ft); in startread()
827 lsx_fail_errno(ft, SOX_EHDR, "invalid chunk ID found"); in startread()
838 lsx_fail_errno(ft, SOX_EHDR, "ds64 chunk too small"); in startread()
847 err = lsx_read_fields(ft, &len, "qqq", in startread()
858 err = wav_read_fmt(ft, clen); in startread()
870 err = lsx_read_fields(ft, &len, "i", &val); in startread()
884 wav->dataStart = lsx_tell(ft); in startread()
889 if (!ft->seekable) in startread()
896 pos = lsx_tell(ft); in startread()
900 lsx_fail_errno(ft, SOX_EHDR, "malformed chunk %s", magic); in startread()
904 err = lsx_seeki(ft, cstart + clen - pos, SEEK_CUR); in startread()
918 lsx_fail_errno(ft, SOX_EOF, "fmt chunk not found"); in startread()
923 lsx_fail_errno(ft, SOX_EOF, "data chunk not found"); in startread()
927 if (ft->seekable) in startread()
928 lsx_seeki(ft, wav->dataStart, SEEK_SET); in startread()
931 if (wav->numSamples * wav->blockAlign == qwDataLength * ft->signal.channels) in startread()
932 wav->numSamples /= ft->signal.channels; in startread()
943 lsx_ms_adpcm_samples_in(qwDataLength, ft->signal.channels, in startread()
952 lsx_ima_samples_in(qwDataLength, ft->signal.channels, in startread()
961 wavgsminit(ft); in startread()
967 wav->numSamples = div_bits(qwDataLength, ft->encoding.bits_per_sample) in startread()
968 / ft->signal.channels; in startread()
971 ft->signal.length = SOX_UNSPEC; in startread()
973 ft->signal.length = wav->numSamples * ft->signal.channels; in startread()
975 return lsx_rawstartread(ft); in startread()
986 static size_t read_samples(sox_format_t *ft, sox_sample_t *buf, size_t len) in read_samples() argument
988 priv_t *wav = ft->priv; in read_samples()
991 ft->sox_errno = SOX_SUCCESS; in read_samples()
994 len = min(len, wav->numSamples * ft->signal.channels); in read_samples()
998 switch (ft->encoding.encoding) { in read_samples()
1009 wav->blockSamplesRemaining = ImaAdpcmReadBlock(ft); in read_samples()
1011 wav->blockSamplesRemaining = AdpcmReadBlock(ft); in read_samples()
1023 if (ct > wav->blockSamplesRemaining * ft->signal.channels) in read_samples()
1024 ct = wav->blockSamplesRemaining * ft->signal.channels; in read_samples()
1027 wav->blockSamplesRemaining -= ct / ft->signal.channels; in read_samples()
1042 wav->numSamples -= done / ft->signal.channels; in read_samples()
1048 done = wavgsmread(ft, buf, len); in read_samples()
1053 done = lsx_rawread(ft, buf, len); in read_samples()
1063 done -= done % ft->signal.channels; in read_samples()
1065 if (done / ft->signal.channels > wav->numSamples) in read_samples()
1068 wav->numSamples -= done / ft->signal.channels; in read_samples()
1077 static int stopread(sox_format_t * ft) in stopread() argument
1079 priv_t * wav = (priv_t *) ft->priv; in stopread()
1081 ft->sox_errno = SOX_SUCCESS; in stopread()
1088 switch (ft->encoding.encoding) in stopread()
1092 wavgsmdestroy(ft); in stopread()
1104 static int startwrite(sox_format_t * ft) in startwrite() argument
1106 priv_t * wav = (priv_t *) ft->priv; in startwrite()
1109 ft->sox_errno = SOX_SUCCESS; in startwrite()
1111 if (ft->encoding.encoding != SOX_ENCODING_MS_ADPCM && in startwrite()
1112 ft->encoding.encoding != SOX_ENCODING_IMA_ADPCM && in startwrite()
1113 ft->encoding.encoding != SOX_ENCODING_GSM) in startwrite()
1115 rc = lsx_rawstartwrite(ft); in startwrite()
1122 if (!ft->signal.length && !ft->seekable) in startwrite()
1125 rc = wavwritehdr(ft, 0); /* also calculates various wav->* info */ in startwrite()
1141 for (ch=0; ch<ft->signal.channels; ch++) in startwrite()
1143 sbsize = ft->signal.channels * wav->samplesPerBlock; in startwrite()
1152 return wavgsminit(ft); in startwrite()
1219 static int wavwritehdr(sox_format_t * ft, int second_header) in wavwritehdr() argument
1221 priv_t * wav = (priv_t *) ft->priv; in wavwritehdr()
1252 if (ft->signal.channels > UINT16_MAX) { in wavwritehdr()
1253 lsx_fail_errno(ft, SOX_EOF, "Too many channels (%u)", in wavwritehdr()
1254 ft->signal.channels); in wavwritehdr()
1258 dwSamplesPerSecond = ft->signal.rate; in wavwritehdr()
1259 wChannels = ft->signal.channels; in wavwritehdr()
1260 wBitsPerSample = ft->encoding.bits_per_sample; in wavwritehdr()
1263 switch (ft->encoding.encoding) in wavwritehdr()
1287 lsx_fail_errno(ft,SOX_EOF,"Channels(%d) must be <= 16",wChannels); in wavwritehdr()
1299 lsx_fail_errno(ft,SOX_EOF,"Channels(%d) must be <= 16",wChannels); in wavwritehdr()
1303 wBlockAlign = ft->signal.rate / 11008; in wavwritehdr()
1315 ft->signal.length /= max(1, ft->signal.channels); in wavwritehdr()
1316 wChannels = ft->signal.channels = 1; in wavwritehdr()
1331 lsx_fail_errno(ft, SOX_EOF, "Too many channels (%u)", in wavwritehdr()
1332 ft->signal.channels); in wavwritehdr()
1346 second_header ? wav->numSamples : ft->signal.length / wChannels; in wavwritehdr()
1355 && strcmp(ft->filetype, "wavpcm")) { in wavwritehdr()
1372 if (!second_header && !ft->signal.length) in wavwritehdr()
1379 dwAvgBytesPerSec = (double)wBlockAlign*ft->signal.rate / (double)wSamplesPerBlock + 0.5; in wavwritehdr()
1386 if (ft->encoding.reverse_bytes == MACHINE_IS_LITTLEENDIAN) in wavwritehdr()
1390 lsx_writes(ft, "RIFX"); in wavwritehdr()
1393 lsx_writes(ft, "RIFF"); in wavwritehdr()
1394 lsx_writedw(ft, wRiffLength); in wavwritehdr()
1395 lsx_writes(ft, "WAVE"); in wavwritehdr()
1396 lsx_writes(ft, "fmt "); in wavwritehdr()
1397 lsx_writedw(ft, wFmtSize); in wavwritehdr()
1398 lsx_writew(ft, isExtensible ? WAVE_FORMAT_EXTENSIBLE : wFormatTag); in wavwritehdr()
1399 lsx_writew(ft, wChannels); in wavwritehdr()
1400 lsx_writedw(ft, dwSamplesPerSecond); in wavwritehdr()
1401 lsx_writedw(ft, dwAvgBytesPerSec); in wavwritehdr()
1402 lsx_writew(ft, wBlockAlign); in wavwritehdr()
1403 lsx_writew(ft, wBitsPerSample); /* end info common to all fmts */ in wavwritehdr()
1414 if (strcmp(ft->filetype, "amb")) { in wavwritehdr()
1422 lsx_writew(ft, 22); in wavwritehdr()
1423 lsx_writew(ft, wBitsPerSample); /* No padding in container */ in wavwritehdr()
1424 lsx_writedw(ft, dwChannelMask); /* Speaker mapping is something reasonable */ in wavwritehdr()
1425 lsx_writew(ft, wFormatTag); in wavwritehdr()
1426 lsx_writebuf(ft, guids[!strcmp(ft->filetype, "amb")], (size_t)14); in wavwritehdr()
1431 lsx_writew(ft,wExtSize); in wavwritehdr()
1437 lsx_writew(ft, wSamplesPerBlock); in wavwritehdr()
1440 lsx_writew(ft, wSamplesPerBlock); in wavwritehdr()
1441 lsx_writew(ft, 7); /* nCoefs */ in wavwritehdr()
1443 lsx_writew(ft, (uint16_t)(lsx_ms_adpcm_i_coef[i][0])); in wavwritehdr()
1444 lsx_writew(ft, (uint16_t)(lsx_ms_adpcm_i_coef[i][1])); in wavwritehdr()
1448 lsx_writew(ft, wSamplesPerBlock); in wavwritehdr()
1456 lsx_writes(ft, "fact"); in wavwritehdr()
1457 lsx_writedw(ft,dwFactSize); in wavwritehdr()
1458 lsx_writedw(ft,dwSamplesWritten); in wavwritehdr()
1461 lsx_writes(ft, "data"); in wavwritehdr()
1462 lsx_writedw(ft, dwDataLength); /* data chunk size */ in wavwritehdr()
1491 static size_t write_samples(sox_format_t * ft, const sox_sample_t *buf, size_t len) in write_samples() argument
1493 priv_t * wav = (priv_t *) ft->priv; in write_samples()
1496 ft->sox_errno = SOX_SUCCESS; in write_samples()
1513 xxxAdpcmWriteBlock(ft); in write_samples()
1521 len = wavgsmwrite(ft, buf, len); in write_samples()
1522 wav->numSamples += (len/ft->signal.channels); in write_samples()
1528 len = lsx_rawwrite(ft, buf, len); in write_samples()
1529 wav->numSamples += (len/ft->signal.channels); in write_samples()
1534 static int stopwrite(sox_format_t * ft) in stopwrite() argument
1536 priv_t * wav = (priv_t *) ft->priv; in stopwrite()
1538 ft->sox_errno = SOX_SUCCESS; in stopwrite()
1546 xxxAdpcmWriteBlock(ft); in stopwrite()
1550 wavgsmstopwrite(ft); in stopwrite()
1558 …lsx_padbytes(ft, (size_t)((wav->numSamples + wav->samplesPerBlock - 1)/wav->samplesPerBlock*wav->b… in stopwrite()
1567 if (ft->signal.length && wav->numSamples <= 0xffffffff && in stopwrite()
1568 wav->numSamples == ft->signal.length) in stopwrite()
1570 if (!ft->seekable) in stopwrite()
1573 if (lsx_seeki(ft, (off_t)0, SEEK_SET) != 0) in stopwrite()
1575 lsx_fail_errno(ft,SOX_EOF,"Can't rewind output file to rewrite .wav header."); in stopwrite()
1579 return (wavwritehdr(ft, 1)); in stopwrite()
1591 static int seek(sox_format_t * ft, uint64_t offset) in seek() argument
1593 priv_t * wav = (priv_t *) ft->priv; in seek()
1595 if (ft->encoding.bits_per_sample & 7) in seek()
1596 lsx_fail_errno(ft, SOX_ENOTSUP, "seeking not supported with this encoding"); in seek()
1604 wav->blockAlign * ft->signal.channels / 2; in seek()
1605 gsmoff -= gsmoff % (wav->blockAlign * ft->signal.channels); in seek()
1607 ft->sox_errno = lsx_seeki(ft, (off_t)(gsmoff + wav->dataStart), SEEK_SET); in seek()
1608 if (ft->sox_errno == SOX_SUCCESS) { in seek()
1614 wav->numSamples = ft->signal.length - (new_offset / ft->signal.channels); in seek()
1617 double wide_sample = offset - (offset % ft->signal.channels); in seek()
1618 double to_d = wide_sample * ft->encoding.bits_per_sample / 8; in seek()
1620 …ft->sox_errno = (to != to_d)? SOX_EOF : lsx_seeki(ft, (off_t)wav->dataStart + (off_t)to, SEEK_SET); in seek()
1621 if (ft->sox_errno == SOX_SUCCESS) in seek()
1622 wav->numSamples -= (size_t)wide_sample / ft->signal.channels; in seek()
1625 return ft->sox_errno; in seek()