Merge "format_wav: Read 16khz wav samples properly"

changes/02/5502/1
Joshua Colp 8 years ago committed by Gerrit Code Review
commit b84abac144

@ -80,9 +80,8 @@ struct wav_desc { /* format-specific parameters */
static int check_header_fmt(FILE *f, int hsize, int hz) static int check_header_fmt(FILE *f, int hsize, int hz)
{ {
short format, chans, bysam, bisam; unsigned short format, chans, bysam, bisam;
int bysec; unsigned int freq, bysec;
int freq;
if (hsize < 16) { if (hsize < 16) {
ast_log(LOG_WARNING, "Unexpected header size %d\n", hsize); ast_log(LOG_WARNING, "Unexpected header size %d\n", hsize);
return -1; return -1;
@ -92,7 +91,7 @@ static int check_header_fmt(FILE *f, int hsize, int hz)
return -1; return -1;
} }
if (ltohs(format) != 1) { if (ltohs(format) != 1) {
ast_log(LOG_WARNING, "Not a supported wav file format (%d). Only PCM encoded, 16 bit, mono, 8kHz files are supported with a lowercase '.wav' extension.\n", ltohs(format)); ast_log(LOG_WARNING, "Not a supported wav file format (%d). Only PCM encoded, 16 bit, mono, 8kHz/16kHz files are supported with a lowercase '.wav' extension.\n", ltohs(format));
return -1; return -1;
} }
if (fread(&chans, 1, 2, f) != 2) { if (fread(&chans, 1, 2, f) != 2) {
@ -107,10 +106,9 @@ static int check_header_fmt(FILE *f, int hsize, int hz)
ast_log(LOG_WARNING, "Read failed (freq)\n"); ast_log(LOG_WARNING, "Read failed (freq)\n");
return -1; return -1;
} }
if (((ltohl(freq) != 8000) && (ltohl(freq) != 16000)) || freq = ltohl(freq);
((ltohl(freq) == 8000) && (hz != 8000)) || if ((freq != 8000 && freq != 16000) || freq != hz) {
((ltohl(freq) == 16000) && (hz != 16000))) { ast_log(LOG_WARNING, "Unexpected frequency mismatch %d (expecting %d)\n", freq, hz);
ast_log(LOG_WARNING, "Unexpected frequency mismatch %d (expecting %d)\n", ltohl(freq),hz);
return -1; return -1;
} }
/* Ignore the byte frequency */ /* Ignore the byte frequency */
@ -323,9 +321,15 @@ static int wav_open(struct ast_filestream *s)
/* We don't have any header to read or anything really, but /* We don't have any header to read or anything really, but
if we did, it would go here. We also might want to check if we did, it would go here. We also might want to check
and be sure it's a valid file. */ and be sure it's a valid file. */
struct wav_desc *tmp = (struct wav_desc *)s->_private; struct wav_desc *tmp = s->_private;
if ((tmp->maxlen = check_header(s->f, ast_format_get_sample_rate(s->fmt->format))) < 0) unsigned int sample_rate = ast_format_get_sample_rate(s->fmt->format);
tmp->maxlen = check_header(s->f, sample_rate);
if (tmp->maxlen < 0) {
return -1; return -1;
}
tmp->hz = sample_rate;
return 0; return 0;
} }

Loading…
Cancel
Save