diff options
Diffstat (limited to 'util/spkmodem_recv')
| -rw-r--r-- | util/spkmodem_recv/spkmodem-recv.c | 138 | 
1 files changed, 66 insertions, 72 deletions
| diff --git a/util/spkmodem_recv/spkmodem-recv.c b/util/spkmodem_recv/spkmodem-recv.c index 30e13d8a..7de911ec 100644 --- a/util/spkmodem_recv/spkmodem-recv.c +++ b/util/spkmodem_recv/spkmodem-recv.c @@ -19,117 +19,111 @@  #define FREQ_DATA_MAX 60  #define THRESHOLD 500 -#define DEBUG 0 -#define FLUSH_TIMEOUT 1 +#define ERR() (errno = errno ? errno : ECANCELED) +#define reset_char() ascii = 0, ascii_bit = 7 -signed short frame[2 * SAMPLES_PER_FRAME]; -signed short pulse[2 * SAMPLES_PER_FRAME]; -int f1, f2, lp, ascii_bit = 7; +signed short frame[2 * SAMPLES_PER_FRAME], pulse[2 * SAMPLES_PER_FRAME]; +int ringpos, debug, freq_data, freq_separator, sample_count, ascii_bit = 7;  char ascii = 0;  void handle_audio(void); -void print_char(void);  void fetch_sample(void); +void read_frame(void); +int set_ascii_bit(void); +void print_char(void); +void print_stats(void);  int  main(int argc, char *argv[])  {  	int c; - -#ifdef HAVE_PLEDGE +#ifdef __OpenBSD__  	if (pledge("stdio", NULL) == -1) -		err(errno, "pledge"); +		err(ERR(), "pledge");  #endif - -	while ((c = getopt(argc, argv, "u")) != -1) { -		switch (c) { -		case 'u': -			setvbuf(stdout, NULL, _IONBF, 0); -			break; -		default: +	while ((c = getopt(argc, argv, "d")) != -1) { +		if (c != 'd')  			err(errno = EINVAL, NULL); -		} +		debug = 1;  	} - +	setvbuf(stdout, NULL, _IONBF, 0);  	while (!feof(stdin))  		handle_audio(); - +	if (errno && debug) +		err(errno, "Unhandled error, errno %d", errno);  	return errno;  }  void  handle_audio(void)  { -	static int llp = 0; - -	if (lp > (3 * SAMPLES_PER_FRAME)) { -		ascii_bit = 7; -		ascii = 0; -		lp = 0; -		llp++; -	} -	if (llp == FLUSH_TIMEOUT) -		if (fflush(stdout) == EOF) -			err(errno, NULL); - -	if ((f2 <= FREQ_SEP_MIN) || (f2 >= FREQ_SEP_MAX) -			|| (f1 <= FREQ_DATA_MIN) || (f1 >= FREQ_DATA_MAX)) { +	if (sample_count > (3 * SAMPLES_PER_FRAME)) +		sample_count = reset_char(); +	if ((freq_separator <= FREQ_SEP_MIN) || (freq_separator >= FREQ_SEP_MAX) +	    || (freq_data <= FREQ_DATA_MIN) || (freq_data >= FREQ_DATA_MAX)) {  		fetch_sample();  		return;  	} -	print_char(); - -	lp = 0; -	llp = 0; -	for (int i = 0; i < SAMPLES_PER_FRAME; i++) +	if (set_ascii_bit() < 0) +		print_char(); +	sample_count = 0; +	for (int sample = 0; sample < SAMPLES_PER_FRAME; sample++)  		fetch_sample();  }  void  fetch_sample(void)  { -	static int ringpos = 0; - -	f1 -= pulse[ringpos]; -	f1 += 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) -			!= sizeof(frame[0])) -		err(errno = ECANCELED, "Could not read frame."); +	freq_data -= pulse[ringpos]; +	freq_data += pulse[(ringpos + SAMPLES_PER_FRAME) +	    % (2 * SAMPLES_PER_FRAME)]; +	freq_separator -= pulse[(ringpos + SAMPLES_PER_FRAME) +	    % (2 * SAMPLES_PER_FRAME)]; + +	read_frame(); +	if ((pulse[ringpos] = (abs(frame[ringpos]) > THRESHOLD) ? 1 : 0)) +		++freq_separator; +	++ringpos; +	ringpos %= 2 * SAMPLES_PER_FRAME; +	++sample_count; +} -	if (abs(frame[ringpos]) > THRESHOLD) { /* rising/falling edge(pulse) */ -		pulse[ringpos] = 1; -		f2++; -	} else { -		pulse[ringpos] = 0; -	} +void +read_frame(void) +{ +	if ((fread(frame + ringpos, 1, sizeof(frame[0]), stdin) +	    != sizeof(frame[0])) || (ferror(stdin) != 0)) +		err(ERR(), "Could not read from frame."); +} -	ringpos++; -	ringpos %= 2 * SAMPLES_PER_FRAME; -	lp++; +int +set_ascii_bit(void) +{ +	if (debug) +		print_stats(); +	if (freq_data < FREQ_DATA_THRESHOLD) +		ascii |= (1 << ascii_bit); +	--ascii_bit; +	return ascii_bit;  }  void  print_char(void)  { -#if DEBUG -	long stdin_pos = 0; -	if ((stdin_pos = ftell(stdin)) == -1) -		err(errno, NULL); -	printf ("%d %d %d @%ld\n", f1, f2, FREQ_DATA_THRESHOLD, -			stdin_pos - sizeof(frame)); -#endif -	if (f1 < FREQ_DATA_THRESHOLD) -		ascii |= (1 << ascii_bit); -	ascii_bit--; -	if (ascii_bit < 0) { -#if DEBUG +	if (debug)  		printf("<%c, %x>", ascii, ascii); -#else +	else  		printf("%c", ascii); -#endif -		ascii_bit = 7; -		ascii = 0; -	} +	reset_char(); +} + +void +print_stats(void) +{ +	long stdin_pos = 0; +	if ((stdin_pos = ftell(stdin)) == -1) +		err(ERR(), NULL); +	printf ("%d %d %d @%ld\n", freq_data, freq_separator, +	    FREQ_DATA_THRESHOLD, stdin_pos - sizeof(frame));  } | 
