// Copyright 2022-2023 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. #include #include #include #include "usb_mixer.h" #define MIXER_UNIT_DISPLAY_VALUE 2 #define MIXER_UNIT_DISPLAY_MIN 3 #define MIXER_UNIT_DISPLAY_MAX 4 #define MIXER_UNIT_DISPLAY_RES 5 // TODO // res, min, max int mixer_init(void) { /* Open the connection to the USB mixer */ if (usb_mixer_connect() == USB_MIXER_FAILURE) { return USB_MIXER_FAILURE; } return USB_MIXER_SUCCESS; } int mixer_deinit(void) { // Close the connection to the USB mixer if (usb_mixer_disconnect() == USB_MIXER_FAILURE) { return USB_MIXER_FAILURE; } return USB_MIXER_SUCCESS; } int mixer_display(unsigned int mixer_index, unsigned int type) { int i = 0; int j = 0; int num_inputs = usb_mixer_get_num_inputs(mixer_index); int num_outputs = usb_mixer_get_num_outputs(mixer_index); printf("\n"); switch (type) { case MIXER_UNIT_DISPLAY_VALUE: //mixer_update_all_values(mixer_index); printf(" Mixer Values (%d)\n", mixer_index); printf(" ----------------\n\n"); break; case MIXER_UNIT_DISPLAY_MIN: printf(" Mixer Ranges Min (%d)\n", mixer_index); printf(" --------------------\n\n"); break; case MIXER_UNIT_DISPLAY_MAX: printf(" Mixer Ranges Max (%d)\n", mixer_index); printf(" --------------------\n\n"); break; case MIXER_UNIT_DISPLAY_RES: printf(" Mixer Ranges Res (%d)\n", mixer_index); printf(" --------------------\n\n"); break; default: return USB_MIXER_FAILURE; break; } printf(" \t\t\t"); printf("Mixer Outputs\n"); printf("\t\t "); for (i = 0; i < num_outputs; i++) { printf(" %d", i+1); } printf("\n"); for (i = 0; i < num_inputs; i++) { printf(" %-20s", usb_mixer_get_input_name(mixer_index,i)); for (j = 0; j < num_outputs; j++) { switch (type) { case MIXER_UNIT_DISPLAY_VALUE: { double mixNodeVal = usb_mixer_get_value(mixer_index, (i*num_outputs)+j); int nodeid = (i*num_outputs)+j; if (mixNodeVal <= -127.996)// todo shoud be < min { printf("\t%3d:[ %s ]", nodeid,"-inf"); } else { printf("\t%3d:[%08.03f]", nodeid, mixNodeVal); } } break; case MIXER_UNIT_DISPLAY_MIN: { int nodeid = (i*num_outputs)+j; printf("\t%3d:[%08.03f]", nodeid, usb_mixer_get_min(mixer_index, (i*num_outputs)+j)) ; } break; case MIXER_UNIT_DISPLAY_MAX: { int nodeid = (i*num_outputs)+j; printf("\t%3d:[%08.03f]", nodeid, usb_mixer_get_max(mixer_index, (i*num_outputs)+j)) ; } break; case MIXER_UNIT_DISPLAY_RES: { int nodeid = (i*num_outputs)+j; printf("\t%3d:[%08.03f]", nodeid, usb_mixer_get_res(mixer_index, (i*num_outputs)+j)) ; } break; default: return USB_MIXER_FAILURE; break; } } printf("\n"); } printf("\n"); return USB_MIXER_SUCCESS; } /* Displays basic mixer information */ int mixer_display_info(void) { unsigned int i = 0; int num_mixers = usb_mixer_get_num_mixers(); printf("\n"); printf(" Mixer Info\n"); printf(" ----------\n\n"); printf(" Mixers : %d\n\n", num_mixers); for (i = 0; i < num_mixers; i++) { int num_inputs = usb_mixer_get_num_inputs(i); int num_outputs = usb_mixer_get_num_outputs(i); printf(" Mixer %d\n", i); printf(" -------\n"); printf(" Inputs : %d\n" " Outputs : %d\n\n", num_inputs, num_outputs); printf(" Mixer Output Labels:\n"); for(int j = 0; j < num_outputs; j++) { printf(" %d: %s\n", j,usb_mixer_get_output_name(i,j)); } //printf("\n Selectable Inputs (%d): \n", usb_mixsel_get_input_count(i)); //for(int j = 0; j < usb_mixsel_get_input_count(i); j++) //{ // printf(" %d: %s\n", j, usb_mixsel_get_input_string(i,j)); //} } printf("\n"); return USB_MIXER_SUCCESS; } void display_available_mixer_sources(int mixIndex) { printf("\n"); printf(" Available Mixer Sources (%d)\n", mixIndex); printf(" -------------------------\n\n"); for(int j = 0; j < usb_mixsel_get_input_count(mixIndex); j++) { printf(" %d: %s\n", j, usb_mixsel_get_input_string(mixIndex,j)); } } /* Gets the current mixer inputs from the device an displays them */ void display_mixer_sources(int mixerIndex) { printf("\n"); printf(" Current Mixer Sources (%d)\n", mixerIndex); printf(" -------------------------\n\n"); /* Note, mixSel output cound and mixer input chan count should be the same! */ printf(" Number of mixer sources: %d\n", usb_mixsel_get_output_count(mixerIndex)); /* Get the current channel number for every mixer input */ for(int i = 0; i < usb_mixsel_get_output_count(mixerIndex); i++) { int inputChan = (int)usb_mixsel_get_state(mixerIndex, i); char *str = usb_mixer_get_input_name(mixerIndex,inputChan); printf(" Mixer input %d: Source chan id: %d (%s)\n", i, inputChan, str); } } /* set mixer source */ void set_mixer_source(unsigned mixerIndex, unsigned dst, unsigned src) { usb_mixsel_set_state(mixerIndex, dst, src); /* String lookup */ char *str = usb_mixer_get_input_name(mixerIndex, dst); int state = usb_mixsel_get_state(mixerIndex, dst); printf("\n Set mixer(%d) input %d to device input %d (%s)\n", mixerIndex, dst, state, str); } void display_aud_channel_map() { printf("\n"); printf(" Audio Output Channel Map\n"); printf(" ------------------------\n\n"); for (int i=0;i>8), offset&0xff, unitId, data); } void print_levels(const char* levelTitle, unsigned char* levels, int levelBytes) { unsigned levelCount = levelBytes/2; unsigned short* levelData = (unsigned short*) levels; printf("\n %s Level Data\n" " ----------------------\n\n" "%d bytes (%d channels) returned:\n" , levelTitle, levelBytes, levelCount); for(int i = 0; i