Browse Source

Fix running espeak-ng on big-endian architectures.

Patch by Samuel Thibault.
master
Reece H. Dunn 8 years ago
parent
commit
8320581675
1 changed files with 24 additions and 0 deletions
  1. 24
    0
      src/libespeak-ng/spect.c

+ 24
- 0
src/libespeak-ng/spect.c View File

#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <endian.h>


#include <espeak-ng/espeak_ng.h> #include <espeak-ng/espeak_ng.h>
#include <espeak-ng/speak_lib.h> #include <espeak-ng/speak_lib.h>
fread(&frame->nx, sizeof(short), 1, stream); fread(&frame->nx, sizeof(short), 1, stream);
fread(&frame->markers, sizeof(short), 1, stream); fread(&frame->markers, sizeof(short), 1, stream);
fread(&frame->amp_adjust, sizeof(short), 1, stream); fread(&frame->amp_adjust, sizeof(short), 1, stream);
frame->nx = le16toh(frame->nx);
frame->markers = le16toh(frame->markers);
frame->amp_adjust = le16toh(frame->amp_adjust);


if (file_format_type == 2) { if (file_format_type == 2) {
fread(&ix, sizeof(short), 1, stream); // spare fread(&ix, sizeof(short), 1, stream); // spare
fread(&frame->peaks[ix].pkheight, sizeof(short), 1, stream); fread(&frame->peaks[ix].pkheight, sizeof(short), 1, stream);
fread(&frame->peaks[ix].pkwidth, sizeof(short), 1, stream); fread(&frame->peaks[ix].pkwidth, sizeof(short), 1, stream);
fread(&frame->peaks[ix].pkright, sizeof(short), 1, stream); fread(&frame->peaks[ix].pkright, sizeof(short), 1, stream);
frame->formants[ix].freq = le16toh(frame->formants[ix].freq);
frame->formants[ix].bandw = le16toh(frame->formants[ix].bandw);
frame->peaks[ix].pkfreq = le16toh(frame->peaks[ix].pkfreq);
frame->peaks[ix].pkheight = le16toh(frame->peaks[ix].pkheight);
frame->peaks[ix].pkwidth = le16toh(frame->peaks[ix].pkwidth);
frame->peaks[ix].pkright = le16toh(frame->peaks[ix].pkright);
if (frame->peaks[ix].pkheight > 0) if (frame->peaks[ix].pkheight > 0)
frame->keyframe = 1; frame->keyframe = 1;


fread(&frame->peaks[ix].klt_bw, sizeof(short), 1, stream); fread(&frame->peaks[ix].klt_bw, sizeof(short), 1, stream);
fread(&frame->peaks[ix].klt_ap, sizeof(short), 1, stream); fread(&frame->peaks[ix].klt_ap, sizeof(short), 1, stream);
fread(&frame->peaks[ix].klt_bp, sizeof(short), 1, stream); fread(&frame->peaks[ix].klt_bp, sizeof(short), 1, stream);
frame->peaks[ix].klt_bw = le16toh(frame->peaks[ix].klt_bw);
frame->peaks[ix].klt_ap = le16toh(frame->peaks[ix].klt_ap);
frame->peaks[ix].klt_bp = le16toh(frame->peaks[ix].klt_bp);
} }
} }


if (file_format_type > 0) { if (file_format_type > 0) {
for (ix = 0; ix < N_KLATTP2; ix++) for (ix = 0; ix < N_KLATTP2; ix++)
{
fread(frame->klatt_param + ix, sizeof(short), 1, stream); fread(frame->klatt_param + ix, sizeof(short), 1, stream);
frame->klatt_param[ix] = le16toh(frame->klatt_param[ix]);
}
} }


spect_data = malloc(sizeof(USHORT) * frame->nx); spect_data = malloc(sizeof(USHORT) * frame->nx);
frame->max_y = 0; frame->max_y = 0;
for (ix = 0; ix < frame->nx; ix++) { for (ix = 0; ix < frame->nx; ix++) {
fread(&x, sizeof(short), 1, stream); fread(&x, sizeof(short), 1, stream);
x = le16toh(x);
spect_data[ix] = x; spect_data[ix] = x;
if (x > frame->max_y) frame->max_y = x; if (x > frame->max_y) frame->max_y = x;
} }
} }


fread(&id1, sizeof(uint32_t), 1, stream); fread(&id1, sizeof(uint32_t), 1, stream);
id1 = le32toh(id1);
fread(&id2, sizeof(uint32_t), 1, stream); fread(&id2, sizeof(uint32_t), 1, stream);
id2 = le32toh(id2);


if ((id1 == FILEID1_SPECTSEQ) && (id2 == FILEID2_SPECTSEQ)) if ((id1 == FILEID1_SPECTSEQ) && (id2 == FILEID2_SPECTSEQ))
spect->file_format = 0; // eSpeak formants spect->file_format = 0; // eSpeak formants
} }


fread(&name_len, sizeof(uint32_t), 1, stream); fread(&name_len, sizeof(uint32_t), 1, stream);
name_len = le32toh(name_len);
if (name_len > 0) { if (name_len > 0) {
if ((spect->name = (char *)malloc(name_len)) == NULL) { if ((spect->name = (char *)malloc(name_len)) == NULL) {
fclose(stream); fclose(stream);
fread(&spect->amplitude, sizeof(short), 1, stream); fread(&spect->amplitude, sizeof(short), 1, stream);
fread(&spect->max_y, sizeof(short), 1, stream); fread(&spect->max_y, sizeof(short), 1, stream);
fread(&temp, sizeof(short), 1, stream); // unused fread(&temp, sizeof(short), 1, stream); // unused
n = le16toh(n);
spect->amplitude = le16toh(spect->amplitude);
spect->max_y = le16toh(spect->max_y);
temp = le16toh(temp);


if (n == 0) { if (n == 0) {
fclose(stream); fclose(stream);

Loading…
Cancel
Save