diff rvinterf/etmsync/tmsaur.c @ 841:379574e5cf5e

fc-tmsync aur command implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 31 Jul 2021 08:29:24 +0000
parents
children 9da5fb3f42dd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/etmsync/tmsaur.c	Sat Jul 31 08:29:24 2021 +0000
@@ -0,0 +1,129 @@
+/*
+ * This fc-tmsync module implements aur commands and operations.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "etm.h"
+#include "audio.h"
+#include "limits.h"
+#include "localtypes.h"
+#include "exitcodes.h"
+
+extern u_char rvi_msg[];
+extern int rvi_msg_len;
+
+do_aur(param, data, size)
+	u_char *data;
+{
+	u_char cmdpkt[5];
+
+	cmdpkt[1] = ETM_AUDIO;
+	cmdpkt[2] = 'R';
+	cmdpkt[3] = param;
+	etm_pkt_exch(cmdpkt, 3);
+	if (rvi_msg[3]) {
+		fprintf(stderr, "target error %u in response to aur\n",
+			rvi_msg[3]);
+		return(ERROR_TARGET);
+	}
+	if (rvi_msg_len < size + 7) {
+		fprintf(stderr, "target error: aur response too short\n");
+		return(ERROR_TARGET);
+	}
+	if (rvi_msg[4] != 'R') {
+		fprintf(stderr, "target error: aur response wrong type\n");
+		return(ERROR_TARGET);
+	}
+	if (rvi_msg[5] != param) {
+		fprintf(stderr, "target error: aur response wrong index\n");
+		return(ERROR_TARGET);
+	}
+	bcopy(rvi_msg + 6, data, size);
+	return(0);
+}
+
+cmd_aur(argc, argv)
+	char **argv;
+{
+	unsigned param, word;
+	u_char data[62];
+	int size, rc, i;
+
+	param = strtoul(argv[1], 0, 0);
+	switch (param) {
+	case AUDIO_PATH_USED:
+	case AUDIO_MICROPHONE_MODE:
+	case AUDIO_MICROPHONE_GAIN:
+	case AUDIO_MICROPHONE_EXTRA_GAIN:
+	case AUDIO_MICROPHONE_OUTPUT_BIAS:
+	case AUDIO_SPEAKER_MODE:
+	case AUDIO_SPEAKER_GAIN:
+	case AUDIO_SPEAKER_FILTER:
+	case AUDIO_SPEAKER_BUZZER_STATE:
+	case AUDIO_MICROPHONE_SPEAKER_LOOP_SIDETONE:
+	case AUDIO_SPEAKER_VOLUME_LEVEL:
+		size = 1;
+		break;
+	case AUDIO_MICROPHONE_FIR:
+	case AUDIO_SPEAKER_FIR:
+		size = 62;
+		break;
+	case AUDIO_MICROPHONE_SPEAKER_LOOP_AEC:
+		size = 24;
+		break;
+	default:
+		fprintf(stderr, "error: unknown aur parameter\n");
+		return(ERROR_USAGE);
+	}
+	rc = do_aur(param, data, size);
+	if (rc)
+		return(rc);
+	switch (param) {
+	case AUDIO_PATH_USED:
+	case AUDIO_SPEAKER_VOLUME_LEVEL:
+		printf("%u\n", data[0]);
+		break;
+	case AUDIO_MICROPHONE_MODE:
+	case AUDIO_MICROPHONE_GAIN:
+	case AUDIO_MICROPHONE_EXTRA_GAIN:
+	case AUDIO_MICROPHONE_OUTPUT_BIAS:
+	case AUDIO_SPEAKER_MODE:
+	case AUDIO_SPEAKER_GAIN:
+	case AUDIO_SPEAKER_FILTER:
+	case AUDIO_SPEAKER_BUZZER_STATE:
+	case AUDIO_MICROPHONE_SPEAKER_LOOP_SIDETONE:
+		i = data[0];
+		if (i >= 128)
+			i -= 256;
+		printf("%d\n", i);
+		break;
+	case AUDIO_MICROPHONE_FIR:
+	case AUDIO_SPEAKER_FIR:
+		fputs("fir-coeff-table\n\n", stdout);
+		for (i = 0; i < 31; i++) {
+			printf("0x%04X", (data[i*2+1] << 8) | data[i*2]);
+			if (i == 7 || i == 15 || i == 23 || i == 30)
+				putchar('\n');
+			else
+				putchar(' ');
+		}
+		break;
+	case AUDIO_MICROPHONE_SPEAKER_LOOP_AEC:
+		fputs("aec-new", stdout);
+		for (i = 0; i < 12; i++) {
+			putchar(' ');
+			word = (data[i*2+1] << 8) | data[i*2];
+			if (word)
+				printf("0x%X", word);
+			else
+				putchar('0');
+		}
+		putchar('\n');
+		break;
+	}
+	return(0);
+}