util/spkmodem-recv: handle sample errors correctly
when calling fread(), errno may be set to EOVEFLOW if the range being read will cause an integer overflow if end-of-file is reached, errno may not be set. when calling this function, you must check errno or check feof() - ferror() should also be checked, so this check is added immediately afterwards in the code ferror() does not set errno, so ERR() is used to set errno to ECANCELED as program exit status further separate reading of frames into a new function Signed-off-by: Leah Rowe <leah@libreboot.org>fsdg20230625
parent
979db74ca5
commit
3c2a287eea
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
#define FLUSH_TIMEOUT 1
|
#define FLUSH_TIMEOUT 1
|
||||||
|
#define ERR() (errno = errno ? errno : ECANCELED)
|
||||||
|
|
||||||
signed short frame[2 * SAMPLES_PER_FRAME];
|
signed short frame[2 * SAMPLES_PER_FRAME];
|
||||||
signed short pulse[2 * SAMPLES_PER_FRAME];
|
signed short pulse[2 * SAMPLES_PER_FRAME];
|
||||||
|
@ -30,6 +31,7 @@ char ascii = 0;
|
||||||
void handle_audio(void);
|
void handle_audio(void);
|
||||||
void print_char(void);
|
void print_char(void);
|
||||||
void fetch_sample(void);
|
void fetch_sample(void);
|
||||||
|
void read_frame(int ringpos);
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
|
@ -94,9 +96,7 @@ fetch_sample(void)
|
||||||
f1 -= pulse[ringpos];
|
f1 -= pulse[ringpos];
|
||||||
f1 += pulse[(ringpos + SAMPLES_PER_FRAME) % (2 * SAMPLES_PER_FRAME)];
|
f1 += pulse[(ringpos + SAMPLES_PER_FRAME) % (2 * SAMPLES_PER_FRAME)];
|
||||||
f2 -= pulse[(ringpos + SAMPLES_PER_FRAME) % (2 * SAMPLES_PER_FRAME)];
|
f2 -= pulse[(ringpos + SAMPLES_PER_FRAME) % (2 * SAMPLES_PER_FRAME)];
|
||||||
if (fread(frame + ringpos, 1, sizeof(frame[0]), stdin)
|
read_frame(ringpos);
|
||||||
!= sizeof(frame[0]))
|
|
||||||
err(errno = ECANCELED, "Could not read frame.");
|
|
||||||
|
|
||||||
pulse[ringpos] = (abs(frame[ringpos]) > THRESHOLD) ? 1 : 0;
|
pulse[ringpos] = (abs(frame[ringpos]) > THRESHOLD) ? 1 : 0;
|
||||||
if (pulse[ringpos++])
|
if (pulse[ringpos++])
|
||||||
|
@ -105,6 +105,16 @@ fetch_sample(void)
|
||||||
++lp;
|
++lp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
read_frame(int ringpos)
|
||||||
|
{
|
||||||
|
if (fread(frame + ringpos, 1, sizeof(frame[0]), stdin)
|
||||||
|
!= sizeof(frame[0]))
|
||||||
|
err(ERR(), "Could not read from frame.");
|
||||||
|
if (ferror(stdin) != 0)
|
||||||
|
err(ERR(), "Could not read from frame");
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
print_char(void)
|
print_char(void)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue