|
|
|
@ -64,14 +64,14 @@ struct wav_desc { /* format-specific parameters */
|
|
|
|
|
#define ltohs(b) (b)
|
|
|
|
|
#else
|
|
|
|
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
|
|
|
|
#define htoll(b) \
|
|
|
|
|
(((((b) ) & 0xFF) << 24) | \
|
|
|
|
|
((((b) >> 8) & 0xFF) << 16) | \
|
|
|
|
|
((((b) >> 16) & 0xFF) << 8) | \
|
|
|
|
|
((((b) >> 24) & 0xFF) ))
|
|
|
|
|
#define htoll(b) \
|
|
|
|
|
(((((b) ) & 0xFF) << 24) | \
|
|
|
|
|
((( (b) >> 8) & 0xFF) << 16) | \
|
|
|
|
|
((( (b) >> 16) & 0xFF) << 8) | \
|
|
|
|
|
((( (b) >> 24) & 0xFF) ))
|
|
|
|
|
#define htols(b) \
|
|
|
|
|
(((((b) ) & 0xFF) << 8) | \
|
|
|
|
|
((((b) >> 8) & 0xFF) ))
|
|
|
|
|
(((((b) ) & 0xFF) << 8) | \
|
|
|
|
|
((( (b) >> 8) & 0xFF) ))
|
|
|
|
|
#define ltohl(b) htoll(b)
|
|
|
|
|
#define ltohs(b) htols(b)
|
|
|
|
|
#else
|
|
|
|
@ -110,8 +110,8 @@ static int check_header_fmt(FILE *f, int hsize, int hz)
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if (((ltohl(freq) != 8000) && (ltohl(freq) != 16000)) ||
|
|
|
|
|
((ltohl(freq) == 8000) && (hz != 8000)) ||
|
|
|
|
|
((ltohl(freq) == 16000) && (hz != 16000))) {
|
|
|
|
|
((ltohl(freq) == 8000) && (hz != 8000)) ||
|
|
|
|
|
((ltohl(freq) == 16000) && (hz != 16000))) {
|
|
|
|
|
ast_log(LOG_WARNING, "Unexpected frequency mismatch %d (expecting %d)\n", ltohl(freq),hz);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
@ -153,7 +153,9 @@ static int check_header(FILE *f, int hz)
|
|
|
|
|
ast_log(LOG_WARNING, "Read failed (size)\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
|
|
|
|
size = ltohl(size);
|
|
|
|
|
#endif
|
|
|
|
|
if (fread(&formtype, 1, 4, f) != 4) {
|
|
|
|
|
ast_log(LOG_WARNING, "Read failed (formtype)\n");
|
|
|
|
|
return -1;
|
|
|
|
@ -170,30 +172,32 @@ static int check_header(FILE *f, int hz)
|
|
|
|
|
for(;;)
|
|
|
|
|
{
|
|
|
|
|
char buf[4];
|
|
|
|
|
|
|
|
|
|
/* Begin data chunk */
|
|
|
|
|
if (fread(&buf, 1, 4, f) != 4) {
|
|
|
|
|
|
|
|
|
|
/* Begin data chunk */
|
|
|
|
|
if (fread(&buf, 1, 4, f) != 4) {
|
|
|
|
|
ast_log(LOG_WARNING, "Read failed (block header format)\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
/* Data has the actual length of data in it */
|
|
|
|
|
if (fread(&data, 1, 4, f) != 4) {
|
|
|
|
|
}
|
|
|
|
|
/* Data has the actual length of data in it */
|
|
|
|
|
if (fread(&data, 1, 4, f) != 4) {
|
|
|
|
|
ast_log(LOG_WARNING, "Read failed (block '%.4s' header length)\n", buf);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
data = ltohl(data);
|
|
|
|
|
}
|
|
|
|
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
|
|
|
|
data = ltohl(data);
|
|
|
|
|
#endif
|
|
|
|
|
if (memcmp(&buf, "fmt ", 4) == 0) {
|
|
|
|
|
if (check_header_fmt(f, data, hz))
|
|
|
|
|
return -1;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if(memcmp(buf, "data", 4) == 0 )
|
|
|
|
|
if(memcmp(buf, "data", 4) == 0 )
|
|
|
|
|
break;
|
|
|
|
|
ast_log(LOG_DEBUG, "Skipping unknown block '%.4s'\n", buf);
|
|
|
|
|
if (fseek(f,data,SEEK_CUR) == -1 ) {
|
|
|
|
|
if (fseek(f,data,SEEK_CUR) == -1 ) {
|
|
|
|
|
ast_log(LOG_WARNING, "Failed to skip '%.4s' block: %d\n", buf, data);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#if 0
|
|
|
|
|
curpos = lseek(fd, 0, SEEK_CUR);
|
|
|
|
@ -461,13 +465,14 @@ static int wav_seek(struct ast_filestream *fs, off_t sample_offset, int whence)
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (whence == SEEK_SET)
|
|
|
|
|
if (whence == SEEK_SET) {
|
|
|
|
|
offset = samples + min;
|
|
|
|
|
else if (whence == SEEK_CUR || whence == SEEK_FORCECUR)
|
|
|
|
|
} else if (whence == SEEK_CUR || whence == SEEK_FORCECUR) {
|
|
|
|
|
offset = samples + cur;
|
|
|
|
|
else if (whence == SEEK_END)
|
|
|
|
|
} else if (whence == SEEK_END) {
|
|
|
|
|
offset = max - samples;
|
|
|
|
|
if (whence != SEEK_FORCECUR) {
|
|
|
|
|
}
|
|
|
|
|
if (whence != SEEK_FORCECUR) {
|
|
|
|
|
offset = (offset > max)?max:offset;
|
|
|
|
|
}
|
|
|
|
|
/* always protect the header space. */
|
|
|
|
|