From e5da0160edebec81d2befdfb7ba15c82430cdce1 Mon Sep 17 00:00:00 2001 From: bbond007 Date: Wed, 15 Jul 2020 22:03:45 -0400 Subject: [PATCH] Refactor & Cleanup --- main.c | 62 ++++++++++----------------------------- midilink | Bin 61528 -> 61528 bytes modem.c | 86 ++++++++++++++++++++++++++++++++++--------------------- modem.h | 3 +- 4 files changed, 70 insertions(+), 81 deletions(-) diff --git a/main.c b/main.c index fed4847..2c8ee57 100644 --- a/main.c +++ b/main.c @@ -22,21 +22,17 @@ along with this program. If not, see . #include #include #include -#include #include #include #include "serial.h" #include "serial2.h" -#include "config.h" #include "misc.h" #include "udpsock.h" #include "tcpsock.h" #include "alsa.h" #include "ini.h" #include "modem.h" - -#define DEFAULT_TCPFlow -1 -#define DEFAULT_TCPDTR 1 +#include "config.h" enum MODE {ModeUSBMIDI, ModeTCP, ModeUDP, ModeUSBSER, ModeMUNT, ModeMUNTGM, ModeFSYNTH, ModeUDPMUNT, ModeUDPMUNTGM, ModeUDPFSYNTH}; @@ -46,18 +42,11 @@ static int fdMidi = -1; static int fdMidiIN = -1; int MIDI_DEBUG = TRUE; -int socket_lst = -1; -int socket_out = -1; -int fdSerial = -1; int socket_in = -1; +int socket_out = -1; +int socket_lst = -1; +int fdSerial = -1; int baudRate = -1; -char MT32LCDMsg[21] = "MiSTer MidiLink! BB7"; -char fsynthSoundFont [150] = "/media/fat/linux/soundfonts/SC-55.sf2"; -char MUNTRomPath[150] = "/media/fat/linux/mt32-rom-data"; -char UDPServer [100] = ""; -char mixerControl[20] = "Master"; -char MUNTOptions[30] = ""; -char USBSerModule[100] = ""; int muntVolume = -1; int fsynthVolume = -1; int midilinkPriority = 0; @@ -67,8 +56,8 @@ int UDPBaudRate_alt = -1; int TCPBaudRate_alt = -1; int MIDIBaudRate = -1; int USBSerBaudRate = -1; -int TCPFlow = DEFAULT_TCPFlow; -int TCPDTR = DEFAULT_TCPDTR; +int TCPFlow = -1; +int TCPDTR = 1; int UDPFlow = -1; int MUNTCPUMask = -1; int FSYNTHCPUMask = -1; @@ -76,6 +65,13 @@ unsigned int DELAYSYSEX = FALSE; unsigned int UDPServerPort = 1999; unsigned int TCPServerPort = 23; unsigned int UDPServerFilterIP = FALSE; +char MT32LCDMsg[21] = "MiSTer MidiLink! BB7"; +char fsynthSoundFont [150] = "/media/fat/linux/soundfonts/SC-55.sf2"; +char MUNTRomPath[150] = "/media/fat/linux/mt32-rom-data"; +char UDPServer [100] = ""; +char mixerControl[20] = "Master"; +char MUNTOptions[30] = ""; +char USBSerModule[100] = ""; static pthread_t midiInThread; static pthread_t midiINInThread; @@ -246,7 +242,6 @@ void write_midi_packet(char * buf, int bufLen) } } - /////////////////////////////////////////////////////////////////////////////////////// // // write_socket_packet() @@ -269,7 +264,6 @@ void write_socket_packet(int sock, char * buf, int bufLen) show_debug_buf("SOCK OUT ", buf, bufLen); } - /////////////////////////////////////////////////////////////////////////////////////// // // void * udpsock_thread_function(void * x) @@ -305,7 +299,6 @@ void * udpsock_thread_function_ext (void * x) if (rdLen > 0) { write_alsa_packet(buf, rdLen); - //show_debug_buf("USOCK2 IN", buf, rdLen); } } while (TRUE); } @@ -389,33 +382,6 @@ void * serial_thread_function (void * x) } while (TRUE); } -/////////////////////////////////////////////////////////////////////////////////////// -// -// int get_softsynth_port(int softSynth) -// -// -int get_softsynth_port(int softSynth) -{ - int midiPort = alsa_get_midi_port("MT-32"); - if (midiPort == -1) - midiPort = alsa_get_midi_port("FLUID Synth"); - if (midiPort == -1) - { - switch(softSynth) - { - case MUNT: - midiPort = start_munt(); - break; - case FluidSynth: - midiPort = start_fsynth(); - break; - case -1: //do nothing. - break; - } - } - return midiPort; -} - /////////////////////////////////////////////////////////////////////////////////////// // // test_midi_device() @@ -502,6 +468,7 @@ int main(int argc, char *argv[]) misc_print(0, "\e[2J\e[H"); misc_print(0, helloStr); misc_print(0, "\n"); + misc_get_core_name(coreName, sizeof(coreName)); misc_print(0, "CORE --> '%s'\n", coreName); @@ -781,6 +748,7 @@ int main(int argc, char *argv[]) break; case ModeTCP: { + modem_set_defaults(); if(TCPFlow > 0) serial_set_flow_control(fdSerial, TCPFlow); //serial2_set_DCD(sericlDevice, fdSerial, FALSE); diff --git a/midilink b/midilink index 7b6cf0cac8661ad62e4d00503809aa8c041e6e1d..206979c01f28a44faf3ba2abf968a4253bb80a09 100755 GIT binary patch delta 22085 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 UNhL)4py0+5)A7^&ayZ`_I diff --git a/modem.c b/modem.c index ca72f00..a4f03f3 100644 --- a/modem.c +++ b/modem.c @@ -1,18 +1,3 @@ -/*-------------------------------------------------------------------- -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . ----------------------------------------------------------------------*/ - #include #include #include @@ -39,7 +24,6 @@ along with this program. If not, see . #define DEFAULT_TCPDTR 1 #define DEFAULT_TCPQuiet 0 - enum SOFTSYNTH TCPSoftSynth = FluidSynth; enum ASCIITRANS TCPAsciiTrans = DEFAULT_TCPAsciiTrans; char MP3Path[500] = "/media/fat/MP3"; @@ -56,13 +40,13 @@ int modemVolume = DEFAULT_modemVolume; int TCPQuiet = DEFAULT_TCPQuiet; int MODEMSOUND = DEFAULT_MODEMSOUND; +extern int MIDI_DEBUG; extern int CPUMASK; extern int MODEMSOUND; -extern int fdSerial; +extern int socket_in; extern int socket_out; extern int socket_lst; -extern int socket_in; -extern int MIDI_DEBUG; +extern int fdSerial; extern int baudRate; extern int TCPQuiet; extern int modemVolume; @@ -77,11 +61,12 @@ extern char * serialDevice; extern char * helloStr; extern char fsynthSoundFont[]; -static pthread_t socketInThread; +static pthread_t socketInThread; +int start_munt(); +int start_fsynth(); void show_debug_buf(char * descr, char * buf, int bufLen); void killall_softsynth(int delay); -int get_softsynth_port(int softSynth); void set_pcm_volume(int value); /////////////////////////////////////////////////////////////////////////////////////// @@ -120,6 +105,33 @@ void modem_killall_aplay(int delay) sleep(delay); } +/////////////////////////////////////////////////////////////////////////////////////// +// +// int modem_get_softsynth_port(int softSynth) +// +// +int modem_get_softsynth_port(int softSynth) +{ + int midiPort = alsa_get_midi_port("MT-32"); + if (midiPort == -1) + midiPort = alsa_get_midi_port("FLUID Synth"); + if (midiPort == -1) + { + switch(softSynth) + { + case MUNT: + midiPort = start_munt(); + break; + case FluidSynth: + midiPort = start_fsynth(); + break; + case -1: //do nothing. + break; + } + } + return midiPort; +} + /////////////////////////////////////////////////////////////////////////////////////// // // void modem_play_conenct_sound(char * tmp) @@ -291,6 +303,21 @@ void * modem_tcplst_thread_function (void * x) } while(TRUE); } +/////////////////////////////////////////////////////////////////////////////////////// +// +// void modem_set_defaults() +// +// +void modem_set_defaults() +{ + MODEMSOUND = DEFAULT_MODEMSOUND; + modemVolume = DEFAULT_modemVolume; + TCPAsciiTrans = DEFAULT_TCPAsciiTrans; + TCPTermRows = DEFAULT_TCPTermRows; + TCPFlow = DEFAULT_TCPFlow; + TCPDTR = DEFAULT_TCPDTR; + TCPQuiet = DEFAULT_TCPQuiet; +} /////////////////////////////////////////////////////////////////////////////////////// // @@ -465,7 +492,6 @@ int do_file_picker(char * pathBuf, char * fileNameBuf) return result; } - /////////////////////////////////////////////////////////////////////////////////////// // // BOOL modem_handle_at_command(char * lineBuf) @@ -627,7 +653,7 @@ int modem_handle_at_command(char * lineBuf) modem_killall_aplaymidi(0); misc_swrite(fdSerial, "\r\nMIDI --> OFF"); sleep(2); - int midiPort = get_softsynth_port(-1); + int midiPort = modem_get_softsynth_port(-1); if(midiPort != -1) { alsa_open_seq(midiPort, 0); @@ -642,7 +668,7 @@ int modem_handle_at_command(char * lineBuf) misc_swrite(fdSerial, "\r\nLoading --> FluidSynth"); killall_softsynth(3); TCPSoftSynth = FluidSynth; - get_softsynth_port(TCPSoftSynth); + modem_get_softsynth_port(TCPSoftSynth); } else if(lineBuf[5] == '2') { @@ -651,7 +677,7 @@ int modem_handle_at_command(char * lineBuf) misc_swrite(fdSerial, "\r\nLoading --> MUNT"); killall_softsynth(3); TCPSoftSynth = MUNT; - get_softsynth_port(TCPSoftSynth); + modem_get_softsynth_port(TCPSoftSynth); } else if(lineBuf[5] == 'S' && lineBuf[6] == 'F') { @@ -677,7 +703,7 @@ int modem_handle_at_command(char * lineBuf) { KILL_MP3_SLEEP; modem_killall_aplaymidi(0); - int midiPort = get_softsynth_port(TCPSoftSynth); + int midiPort = modem_get_softsynth_port(TCPSoftSynth); chdir("/root"); sprintf(tmp, "taskset %d aplaymidi --port %d \"%s/%s\" 2> /tmp/aplaymidi & ", CPUMASK, midiPort, MIDIPath, fileName);; misc_print(1, "Play MIDI --> %s\n", tmp); @@ -864,13 +890,7 @@ int modem_handle_at_command(char * lineBuf) else if (memcmp(lineBuf, "ATZ", 3) == 0) { misc_print(1, "Resetting TCP defaults...\n"); - MODEMSOUND = DEFAULT_MODEMSOUND; - modemVolume = DEFAULT_modemVolume; - TCPAsciiTrans = DEFAULT_TCPAsciiTrans; - TCPTermRows = DEFAULT_TCPTermRows; - TCPFlow = DEFAULT_TCPFlow; - TCPDTR = DEFAULT_TCPDTR; - TCPQuiet = DEFAULT_TCPQuiet; + modem_set_defaults(); TELNET_NEGOTIATE = TRUE; misc_print(1, "Reloading INI defaults...\n"); misc_get_core_name(tmp, sizeof(tmp)); diff --git a/modem.h b/modem.h index 84d0f0d..af8013a 100644 --- a/modem.h +++ b/modem.h @@ -11,7 +11,8 @@ void modem_killall_aplaymidi(int delay); void modem_killall_mpg123(int delay); void * modem_tcplst_thread_function (void * x); void * modem_tcpsock_thread_function (void * x); - +int modem_get_softsynth_port(int softSynth); +void modem_set_defaults();