|
|
|
|
|
|
|
|
int max = 0; |
|
|
int max = 0; |
|
|
int length; |
|
|
int length; |
|
|
int sr1, sr2; |
|
|
int sr1, sr2; |
|
|
bool failed; |
|
|
|
|
|
int len; |
|
|
int len; |
|
|
bool resample_wav = false; |
|
|
|
|
|
const char *fname2; |
|
|
|
|
|
char fname_temp[100]; |
|
|
|
|
|
char msg[120]; |
|
|
|
|
|
int scale_factor = 0; |
|
|
int scale_factor = 0; |
|
|
|
|
|
|
|
|
fseek(f, 24, SEEK_SET); |
|
|
fseek(f, 24, SEEK_SET); |
|
|
|
|
|
|
|
|
fseek(f, 40, SEEK_SET); |
|
|
fseek(f, 40, SEEK_SET); |
|
|
|
|
|
|
|
|
if ((sr1 != samplerate_native) || (sr2 != sr1*2)) { |
|
|
if ((sr1 != samplerate_native) || (sr2 != sr1*2)) { |
|
|
char command[sizeof(path_home)+250]; |
|
|
|
|
|
|
|
|
|
|
|
failed = false; |
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_MKSTEMP |
|
|
|
|
|
strcpy(fname_temp, "/tmp/espeakXXXXXX"); |
|
|
|
|
|
int fd_temp; |
|
|
|
|
|
if ((fd_temp = mkstemp(fname_temp)) >= 0) |
|
|
|
|
|
close(fd_temp); |
|
|
|
|
|
#else |
|
|
|
|
|
strcpy(fname_temp, tmpnam(NULL)); |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
fname2 = fname; |
|
|
|
|
|
len = strlen(fname); |
|
|
|
|
|
if (strcmp(&fname[len-4], ".wav") == 0) { |
|
|
|
|
|
strcpy(msg, fname); |
|
|
|
|
|
msg[len-4] = 0; |
|
|
|
|
|
fname2 = msg; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
sprintf(command, "sox \"%s/%s.wav\" -r %d -c1 -t wav %s\n", phsrc, fname2, samplerate_native, fname_temp); |
|
|
|
|
|
if (system(command) != 0) |
|
|
|
|
|
failed = true; |
|
|
|
|
|
|
|
|
|
|
|
if (failed || (GetFileLength(fname_temp) <= 0)) { |
|
|
|
|
|
if (resample_fails < 2) |
|
|
|
|
|
error("Resample command failed: %s", command); |
|
|
|
|
|
resample_fails++; |
|
|
|
|
|
|
|
|
|
|
|
if (sr1 != samplerate_native) |
|
|
|
|
|
error("Can't resample (%d to %d): %s", sr1, samplerate_native, fname); |
|
|
|
|
|
else |
|
|
|
|
|
error("WAV file is not mono: %s", fname); |
|
|
|
|
|
remove(fname_temp); |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
f = fopen(fname_temp, "rb"); |
|
|
|
|
|
if (f == NULL) { |
|
|
|
|
|
error("Can't read temp file: %s", fname_temp); |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
if (f_report != NULL) |
|
|
|
|
|
fprintf(f_report, "resampled %s\n", fname); |
|
|
|
|
|
resample_count++; |
|
|
|
|
|
resample_wav = true; |
|
|
|
|
|
fseek(f, 40, SEEK_SET); // skip past the WAV header, up to before "data length" |
|
|
|
|
|
|
|
|
if (sr1 != samplerate_native) |
|
|
|
|
|
error("Can't resample (%d to %d): %s", sr1, samplerate_native, fname); |
|
|
|
|
|
else |
|
|
|
|
|
error("WAV file is not mono: %s", fname); |
|
|
|
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
displ = ftell(f_phdata); |
|
|
displ = ftell(f_phdata); |
|
|
|
|
|
|
|
|
length++; |
|
|
length++; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (resample_wav == true) { |
|
|
|
|
|
fclose(f); |
|
|
|
|
|
remove(fname_temp); |
|
|
|
|
|
} |
|
|
|
|
|
return displ | 0x800000; // set bit 23 to indicate a wave file rather than a spectrum |
|
|
return displ | 0x800000; // set bit 23 to indicate a wave file rather than a spectrum |
|
|
} |
|
|
} |
|
|
|
|
|
|