static int startread(sox_format_t * ft) { char magic[4]; float rate; uint32_t channels, ft_encoding; unsigned i, bits_per_sample; sox_encoding_t encoding; uint16_t code, size; if (lsx_readchars(ft, magic, sizeof(magic))) return SOX_EOF; for (i = 0; id[i].desc && memcmp(magic, id[i].str, sizeof(magic)); ++i); if (!id[i].desc) { lsx_fail_errno(ft, SOX_EHDR, "sf: can't find IRCAM identifier"); return SOX_EOF; } lsx_report("found %s identifier", id[i].desc); ft->encoding.reverse_bytes = id[i].reverse_bytes; if (lsx_readf(ft, &rate) || lsx_readdw(ft, &channels) || lsx_readdw(ft, &ft_encoding)) return SOX_EOF; if (!(encoding = sox_enc(ft_encoding, &bits_per_sample))) { lsx_fail_errno(ft, SOX_EFMT, "sf: unsupported encoding %#x)", ft_encoding); return SOX_EOF; } do { if (lsx_readw(ft, &code) || lsx_readw(ft, &size)) return SOX_EOF; if (code == SF_COMMENT) { char * buf = lsx_calloc(1, (size_t)size + 1); /* +1 ensures null-terminated */ if (lsx_readchars(ft, buf, (size_t) size) != SOX_SUCCESS) { free(buf); return SOX_EOF; } sox_append_comments(&ft->oob.comments, buf); free(buf); } else if (lsx_skipbytes(ft, (size_t) size)) return SOX_EOF; } while (code); if (lsx_skipbytes(ft, FIXED_HDR - (size_t)lsx_tell(ft))) return SOX_EOF; return lsx_check_read_params(ft, channels, rate, encoding, bits_per_sample, (uint64_t)0, sox_true); }
/* * Open file in sndfile. */ static int startread(sox_format_t * ft) { priv_t * sf = (priv_t *)ft->priv; unsigned bits_per_sample; sox_encoding_t encoding; sox_rate_t rate; start(ft); sf->sf_file = sf_open_fd(fileno(ft->fp), SFM_READ, sf->sf_info, 1); ft->fp = NULL; /* Transfer ownership of fp to LSF */ drain_log_buffer(ft); if (sf->sf_file == NULL) { memset(ft->sox_errstr, 0, sizeof(ft->sox_errstr)); strncpy(ft->sox_errstr, sf_strerror(sf->sf_file), sizeof(ft->sox_errstr)-1); free(sf->sf_file); return SOX_EOF; } if (!(encoding = sox_enc(sf->sf_info->format, &bits_per_sample))) { lsx_fail_errno(ft, SOX_EFMT, "unsupported sndfile encoding %#x", sf->sf_info->format); return SOX_EOF; } /* Don't believe LSF's rate for raw files */ if ((sf->sf_info->format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW && !ft->signal.rate) { lsx_warn("`%s': sample rate not specified; trying 8kHz", ft->filename); rate = 8000; } else rate = sf->sf_info->samplerate; #ifdef HAVE_SFC_SET_SCALE_FLOAT_INT_READ if ((sf->sf_info->format & SF_FORMAT_SUBMASK) == SF_FORMAT_FLOAT) { sf_command(sf->sf_file, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE); sf_command(sf->sf_file, SFC_SET_CLIPPING, NULL, SF_TRUE); } #endif #if 0 /* FIXME */ sox_append_comments(&ft->oob.comments, buf); #endif return check_read_params(ft, (unsigned)sf->sf_info->channels, rate, encoding, bits_per_sample, (off_t)(sf->sf_info->frames * sf->sf_info->channels)); }