mirror of
https://github.com/MiSTer-devel/MidiLink_MiSTer.git
synced 2026-05-24 03:04:13 +00:00
Binary file not shown.
@@ -19,6 +19,8 @@ MT32_ROM_ZIP="$MT32_ROM_DIR/mt32_roms.zip"
|
||||
MP3_DIR="/media/fat/MP3"
|
||||
MIDI_DIR="/media/fat/MIDI"
|
||||
MIDILINK_BIN="/sbin/midilink"
|
||||
MLINKUTIL_BIN="/sbin/mlinkutil"
|
||||
BIN_REPO="https://github.com/bbond007/MiSTer_MidiLink/blob/master/"
|
||||
echo "Checking Internet..."
|
||||
if ! ping -q -w1 -c1 google.com &>/dev/null
|
||||
then
|
||||
@@ -77,8 +79,18 @@ if [ -f "$MIDILINK_BIN" ]; then
|
||||
else
|
||||
echo "Old MidiLink not found"
|
||||
fi
|
||||
if [ -f "$MLINKUTIL_BIN" ]; then
|
||||
echo "Removing old MLinkUTIL"
|
||||
else
|
||||
echo "Old MLinkUTIL not found"
|
||||
fi
|
||||
echo "Downloading MidiLink"
|
||||
curl -kL "https://github.com/bbond007/MiSTer_MidiLink/blob/master/midilink?raw=true" -o $MIDILINK_BIN
|
||||
curl -kL $BIN_REPO"midilink?raw=true" -o $MIDILINK_BIN
|
||||
echo "Downloading MLinkUTIL"
|
||||
curl -kL $BIN_REPO"mlinkutil?raw=true" -o $MLINKUTIL_BIN
|
||||
echo "Setting permissions : $MIDILINK_BIN, $MLINKUTIL_BIN"
|
||||
chmod 755 $MIDILINK_BIN
|
||||
chmod 755 $MLINKUTIL_BIN
|
||||
echo "Rebooting in:"
|
||||
sleep 1
|
||||
echo "3"
|
||||
|
||||
Binary file not shown.
33
MidiLink.INI
33
MidiLink.INI
@@ -10,7 +10,7 @@ FSYNTH_VOLUME = -1
|
||||
MIXER_CONTROL = Master
|
||||
MUNT_ROM_PATH = /media/fat/linux/mt32-rom-data
|
||||
FSYNTH_SOUNDFONT = /media/fat/linux/soundfonts/SC-55.sf2
|
||||
UDP_SERVER = 192.168.1.157
|
||||
UDP_SERVER = 192.168.1.130
|
||||
UDP_SERVER_PORT = 1999
|
||||
UDP_SERVER_FILTER = FALSE
|
||||
UDP_FLOW = 0
|
||||
@@ -24,22 +24,31 @@ TCP_TERM_ROWS = 23
|
||||
TCP_FLOW = 3
|
||||
TCP_SOUND = TRUE
|
||||
DELAYSYSEX = TRUE
|
||||
|
||||
[MINIMIG]
|
||||
TCP_TERM_ROWS = 22
|
||||
|
||||
[C64]
|
||||
MIDI_BAUD = 2400
|
||||
TCP_BAUD = 2400
|
||||
TCP_TERM_ROWS = 24
|
||||
TCP_ATH_DELAY = 0
|
||||
#USB_SERIAL_MODULE = /media/fat/pl2303.ko
|
||||
|
||||
[AO486]
|
||||
MIDI_BAUD = 38400
|
||||
TCP_SOUND_CONNECT = /media/fat/SOUNDS/connect_sav.wav
|
||||
|
||||
[ATARIST]
|
||||
TCP_BAUD = 31250
|
||||
TCP_BAUD = 19200
|
||||
UDP_BAUD = 31250
|
||||
TCP_BAUD_ALT = 19200
|
||||
UDP_BAUD_ALT = 19200
|
||||
TCP_BAUD_ALT = 19200
|
||||
|
||||
[C64]
|
||||
TCP_TERM_TRANS = PETSKII
|
||||
MIDI_BAUD = 2400
|
||||
TCP_BAUD = 2400
|
||||
TCP_TERM_ROWS = 24
|
||||
TCP_ATH_DELAY = 0
|
||||
|
||||
[FXCAST]
|
||||
TCP_BAUD = 19200
|
||||
UDP_BAUD = 31250
|
||||
|
||||
[MINIMIG]
|
||||
TCP_TERM_ROWS = 22
|
||||
USB_SERIAL_BAUD = 9600
|
||||
|
||||
|
||||
|
||||
38
README.md
38
README.md
@@ -75,26 +75,36 @@ SoftMPU option ***
|
||||
|
||||
The 'midilink' daemon currently supports following switches / options:
|
||||
|
||||
TESTMIDI - this option sends a middle 'c' note to the MIDI device
|
||||
TESTMIDI - this option sends a middle 'c' note to the MIDI device
|
||||
once the daemon is started.
|
||||
|
||||
QUIET - this option suppresses MIDI debug output.
|
||||
BAUD - Specify BAUD rate...
|
||||
|
||||
MUNT - Use MUNT SoftSynth (no USB MIDI adapter
|
||||
required)
|
||||
QUIET - this option suppresses MIDI debug output.
|
||||
|
||||
FSYNTH - Use FluidSynth SoftSynth (no USB MIDI adapter
|
||||
required)
|
||||
MUNT - Use MUNT SoftSynth (no USB MIDI adapter
|
||||
required)
|
||||
|
||||
UDP - Send MIDI to UDP Port (INI setting MIDI_SERVER /
|
||||
MIDI_SERVER_PORT)
|
||||
FSYNTH - Use FluidSynth SoftSynth (no USB MIDI adapter
|
||||
required)
|
||||
|
||||
TCP - Works like a modem with AT commands:
|
||||
(ATDT, ATBAUD, ATIPADDR, +++ATH)
|
||||
UDP - Send MIDI to UDP Port (INI setting MIDI_SERVER /
|
||||
MIDI_SERVER_PORT)
|
||||
|
||||
MENU - starts based on /tmp/ML_MUNT, /tmp/ML_UDP,
|
||||
/tmp/ML_FSYNTH, /tmp/ML_TCP used with MiSTer
|
||||
Menu to set mode of operation.
|
||||
UDPMUNT - Listen on UDP port and send to MUNT
|
||||
|
||||
UDPMUNTGM - Listen on UDP port and send to MUNT (GM mapping)
|
||||
|
||||
UDPFSYNTH - Listen on UDP port and send to FluidSynth
|
||||
|
||||
TCP - Works like a modem with AT commands:
|
||||
(ATDT, ATBAUD, ATIPADDR, +++ATH)
|
||||
|
||||
USBSER - Connect to USB serial converter
|
||||
|
||||
MENU - starts based on /tmp/ML_MUNT, /tmp/ML_UDP,
|
||||
/tmp/ML_FSYNTH, /tmp/ML_TCP /tmp/ML_USBSER
|
||||
used with MiSTer Menu to set mode of operation.
|
||||
|
||||
The MidiLink.INI file:
|
||||
|
||||
@@ -200,6 +210,8 @@ The MidiLink.INI file:
|
||||
#TCP_SOUND_CONNECT = --> optional WAV file for TCP modem
|
||||
connect
|
||||
|
||||
USB_SERIAL_BAUD = 9600 --> Set USB serial baud to 9600
|
||||
|
||||
DELAYSYSEX = TRUE --> This option fixes "Buffer Overflow"
|
||||
error on Roland MT-32 Rev0.
|
||||
|
||||
|
||||
3
config.h
3
config.h
@@ -14,7 +14,8 @@
|
||||
static char * midiLinkINI = "/media/fat/linux/MidiLink.INI";
|
||||
static char * midiLinkDIR = "/media/fat/linux/MidiLink.DIR";
|
||||
static char * serialDevice = "/dev/ttyS1";
|
||||
static char * helloStr = "MiSTer MidiLink 2.9a BB7";
|
||||
static char * serialDeviceUSB = "/dev/ttyUSB0";
|
||||
static char * helloStr = "MiSTer MidiLink 2.9d BB7";
|
||||
static unsigned char test_note[3] = {0x90, 60, 127};
|
||||
static char * midiINDevice = "/dev/midi2";
|
||||
static char * midiDevice = "/dev/midi1";
|
||||
|
||||
22
ini.c
22
ini.c
@@ -25,6 +25,8 @@ extern int TCPBaudRate;
|
||||
extern int UDPBaudRate_alt;
|
||||
extern int TCPBaudRate_alt;
|
||||
extern int MIDIBaudRate;
|
||||
extern int USBSerBaudRate;
|
||||
extern char USBSerModule[100];
|
||||
extern int TCPFlow;
|
||||
extern int TCPDTR;
|
||||
extern int TCPQuiet;
|
||||
@@ -45,6 +47,7 @@ extern int TCPATHDelay;
|
||||
extern enum ASCIITRANS TCPAsciiTrans;
|
||||
extern enum SOFTSYNTH TCPSoftSynth;
|
||||
extern int MUNTCPUMask;
|
||||
extern int FSYNTHCPUMask;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
@@ -127,11 +130,16 @@ char ini_process_key_value_pair(char * key, char * value)
|
||||
{
|
||||
ini_int(value, &MUNTCPUMask);
|
||||
}
|
||||
|
||||
else if(strcmp("FSYNTH_VOLUME", key) == 0)
|
||||
{
|
||||
misc_replace_char(value, strlen(value), '%', 0x00);
|
||||
ini_int(value, &fsynthVolume);
|
||||
}
|
||||
else if (strcmp("FSYNTH_CPU_MASK", key) == 0)
|
||||
{
|
||||
ini_int(value, &FSYNTHCPUMask);
|
||||
}
|
||||
else if(strcmp("MODEM_VOLUME", key) == 0)
|
||||
{
|
||||
misc_replace_char(value, strlen(value), '%', 0x00);
|
||||
@@ -193,6 +201,14 @@ char ini_process_key_value_pair(char * key, char * value)
|
||||
{
|
||||
ini_int(value, &MIDIBaudRate);
|
||||
}
|
||||
else if (strcmp("USB_SERIAL_BAUD", key) == 0)
|
||||
{
|
||||
ini_int(value, &USBSerBaudRate);
|
||||
}
|
||||
else if (strcmp("USB_SERIAL_MODULE", key) == 0)
|
||||
{
|
||||
ini_str(key, value, USBSerModule, sizeof(USBSerModule));
|
||||
}
|
||||
else if (strcmp("TCP_TERM_ROWS", key) == 0)
|
||||
{
|
||||
ini_uint(value, &TCPTermRows);
|
||||
@@ -300,6 +316,7 @@ void ini_print_settings(int p)
|
||||
else
|
||||
misc_print(p, " - MUNT_VOLUME --> Default (don't set)\n");
|
||||
misc_print(p, " - MUNT_CPU_MASK --> %d\n",MUNTCPUMask);
|
||||
misc_print(p, " - FSYNTH_CPU_MASK --> %d\n",FSYNTHCPUMask);
|
||||
if(fsynthVolume != -1)
|
||||
misc_print(p, " - FSYNTH_VOLUME --> %d%c\n", fsynthVolume, '%');
|
||||
else
|
||||
@@ -383,6 +400,11 @@ void ini_print_settings(int p)
|
||||
misc_print(p, " - TCP_SOUND_CONNECT --> '%s'\n", modemConnectSndWAV);
|
||||
else
|
||||
misc_print(p, " - TCP_SOUND_CONNECT --> Software\n");
|
||||
if(USBSerBaudRate > 0)
|
||||
misc_print(p, " - USB_SERIAL_BAUD --> %d\n", USBSerBaudRate);
|
||||
else
|
||||
misc_print(p, " - USB_SERIAL_BAUD --> Default (don't change)\n");
|
||||
misc_print(p, " - USB_SERIAL_MODULE --> '%s'\n", USBSerModule);
|
||||
misc_print(p, " - DELAYSYSEX --> %s\n", DELAYSYSEX?"TRUE":"FALSE");
|
||||
misc_print(p, " - MT32_LCD_MSG --> '%s'\n", MT32LCDMsg);
|
||||
misc_print(p, "\n");
|
||||
|
||||
441
main.c
441
main.c
@@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <libgen.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
@@ -43,11 +44,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define DEFAULT_TCPDTR 1
|
||||
#define DEFAULT_TCPQuiet 0
|
||||
|
||||
enum MODE {ModeUSBMIDI, ModeTCP, ModeUDP, ModeMUNT, ModeMUNTGM, ModeFSYNTH};
|
||||
enum MODE {ModeUSBMIDI, ModeTCP, ModeUDP, ModeUSBSER, ModeMUNT, ModeMUNTGM, ModeFSYNTH, ModeUDPMUNT, ModeUDPMUNTGM, ModeUDPFSYNTH};
|
||||
|
||||
int MIDI_DEBUG = TRUE;
|
||||
static enum MODE mode = ModeUSBMIDI;
|
||||
static int fdSerial = -1;
|
||||
static int fdSerialUSB = -1;
|
||||
static int fdMidi = -1;
|
||||
static int fdMidiIN = -1;
|
||||
static int socket_in = -1;
|
||||
@@ -74,18 +76,20 @@ int modemVolume = DEFAULT_modemVolume;
|
||||
int midilinkPriority = 0;
|
||||
int UDPBaudRate = -1;
|
||||
int TCPBaudRate = -1;
|
||||
int UDPBaudRate_alt = -1;
|
||||
int TCPBaudRate_alt = -1;
|
||||
int UDPBaudRate_alt = -1;
|
||||
int TCPBaudRate_alt = -1;
|
||||
int MIDIBaudRate = -1;
|
||||
int USBSerBaudRate = -1;
|
||||
char USBSerModule[100] = "";
|
||||
enum ASCIITRANS TCPAsciiTrans = DEFAULT_TCPAsciiTrans;
|
||||
int TCPFlow = DEFAULT_TCPFlow;
|
||||
int TCPDTR = DEFAULT_TCPDTR;
|
||||
int UDPFlow = -1;
|
||||
int MODEMSOUND = DEFAULT_MODEMSOUND;
|
||||
int TCPQuiet = DEFAULT_TCPQuiet;
|
||||
|
||||
int TCPATHDelay = 900;
|
||||
int MUNTCPUMask = 1;
|
||||
int MUNTCPUMask = -1;
|
||||
int FSYNTHCPUMask = -1;
|
||||
enum SOFTSYNTH TCPSoftSynth = FluidSynth;
|
||||
unsigned int TCPTermRows = DEFAULT_TCPTermRows;
|
||||
unsigned int DELAYSYSEX = FALSE;
|
||||
@@ -96,6 +100,7 @@ static pthread_t midiInThread;
|
||||
static pthread_t midiINInThread;
|
||||
static pthread_t socketInThread;
|
||||
static pthread_t socketLstThread;
|
||||
static pthread_t serialInThread;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
@@ -104,8 +109,6 @@ void set_pcm_volume(int value)
|
||||
{
|
||||
if(value != -1)
|
||||
{
|
||||
//if(misc_check_module_loaded("snd_dummy"))
|
||||
// strcpy(mixerControl, "Master");
|
||||
char buf[30];
|
||||
sprintf(buf, "amixer set %s %d%c", mixerControl, value, '%');
|
||||
misc_print(0, "Setting '%s' to %d%\n", mixerControl, value);
|
||||
@@ -137,24 +140,23 @@ int start_munt()
|
||||
int midiPort = -1;
|
||||
set_pcm_volume(muntVolume);
|
||||
if(strlen(MUNTOptions) > misc_count_str_chr(MUNTOptions, ' '))
|
||||
misc_print(0, "Starting --> mt32d : Options --> '%s'\n", MUNTOptions);
|
||||
misc_print(0, "Starting --> mt32d : Options --> '%s' ", MUNTOptions);
|
||||
else
|
||||
{
|
||||
misc_print(0, "Starting --> mt32d");
|
||||
if (CPUMASK != MUNTCPUMask)
|
||||
if (CPUMASK != MUNTCPUMask)
|
||||
misc_print(0, " : CPUMASK = %d", MUNTCPUMask);
|
||||
misc_print(0, "\n");
|
||||
}
|
||||
misc_print(0, "\n");
|
||||
sprintf(buf, "taskset %d mt32d %s -f %s &", MUNTCPUMask, MUNTOptions, MUNTRomPath);
|
||||
system(buf);
|
||||
int loop = 0;
|
||||
do
|
||||
{
|
||||
if (loop > 0)
|
||||
misc_print(0, "Looking for MUNT port (%d / 2)\n", loop);
|
||||
sleep(2);
|
||||
midiPort = alsa_get_midi_port("MT-32");
|
||||
loop++;
|
||||
}
|
||||
while(midiPort < 0 && loop < 3);
|
||||
} while (midiPort < 0 && loop < 3);
|
||||
return midiPort;
|
||||
}
|
||||
|
||||
@@ -167,17 +169,21 @@ int start_fsynth()
|
||||
char buf[256];
|
||||
int midiPort = -1;
|
||||
set_pcm_volume(fsynthVolume);
|
||||
misc_print(0, "Starting --> fluidsynth\n");
|
||||
sprintf(buf, "taskset %d fluidsynth -is -a alsa -m alsa_seq %s &", CPUMASK, fsynthSoundFont);
|
||||
misc_print(0, "Starting --> fluidsynth");
|
||||
if (CPUMASK != FSYNTHCPUMask)
|
||||
misc_print(0, " : CPUMASK = %d", FSYNTHCPUMask);
|
||||
misc_print(0, "\n");
|
||||
sprintf(buf, "taskset %d fluidsynth -is -a alsa -m alsa_seq %s &", FSYNTHCPUMask, fsynthSoundFont);
|
||||
system(buf);
|
||||
int loop = 0;
|
||||
do
|
||||
{
|
||||
sleep(2);
|
||||
if(loop > 0)
|
||||
misc_print(0, "Looking for FluidSynth port (%d / 13)\n", loop);
|
||||
sleep(3);
|
||||
midiPort = alsa_get_midi_port("FLUID Synth");
|
||||
loop++;
|
||||
}
|
||||
while(midiPort < 0 && loop < 5);
|
||||
} while (midiPort < 0 && loop < 14);
|
||||
return midiPort;
|
||||
}
|
||||
|
||||
@@ -310,6 +316,17 @@ void play_dial_sound(char * tmp, char * ipAddr)
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// write_[sequencer]_packet()
|
||||
// this is for ALSA sequencer interface
|
||||
//
|
||||
void write_alsa_packet(char * buf, int bufLen)
|
||||
{
|
||||
alsa_send_midi_raw(buf, bufLen);
|
||||
show_debug_buf("SEQU OUT ", buf, bufLen);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// void * tcplst_thread_function(void * x)
|
||||
@@ -340,7 +357,7 @@ void * tcplst_thread_function (void * x)
|
||||
play_connect_sound(buf);
|
||||
if(TCPQuiet == 0)
|
||||
misc_swrite_no_trans(fdSerial, "\r\nCONNECT %d\r\n", baudRate);
|
||||
serial2_set_DCD(fdSerial, TRUE);
|
||||
serial2_set_DCD(serialDevice, fdSerial, TRUE);
|
||||
do
|
||||
{
|
||||
rdLen = read(socket_in, buf, sizeof(buf));
|
||||
@@ -359,7 +376,7 @@ void * tcplst_thread_function (void * x)
|
||||
} while (socket_in != -1);
|
||||
if(TCPQuiet == 0)
|
||||
misc_swrite_no_trans(fdSerial, "\r\nNO CARRIER\r\n");
|
||||
serial2_set_DCD(fdSerial, FALSE);
|
||||
serial2_set_DCD(serialDevice, fdSerial, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -429,6 +446,27 @@ void * udpsock_thread_function (void * x)
|
||||
} while (TRUE);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// void * udpsock_thread_function2(void * x)
|
||||
// Thread function for UDP input for external device like Raspberry Pi
|
||||
//
|
||||
void * udpsock_thread_function2 (void * x)
|
||||
{
|
||||
unsigned char buf[100];
|
||||
int rdLen;
|
||||
do
|
||||
{
|
||||
rdLen = udpsock_read(socket_in, (char *) buf, sizeof(buf));
|
||||
if (rdLen > 0)
|
||||
{
|
||||
write_alsa_packet(buf, rdLen);
|
||||
//show_debug_buf("USOCK2 IN", buf, rdLen);
|
||||
}
|
||||
} while (TRUE);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// void do_check_modem_hangup(char * buf, int bufLen)
|
||||
@@ -463,7 +501,7 @@ void do_check_modem_hangup(int * socket, char * buf, int bufLen)
|
||||
{
|
||||
tcpsock_close(*socket);
|
||||
*socket = -1;
|
||||
serial2_set_DCD(fdSerial, FALSE);
|
||||
serial2_set_DCD(serialDevice, fdSerial, FALSE);
|
||||
sprintf(tmp, "\r\nHANG-UP DETECTED\r\n");
|
||||
misc_print(1, "HANG-UP Detected --> %d\n", delay);
|
||||
misc_swrite(fdSerial, tmp);
|
||||
@@ -686,7 +724,7 @@ int handle_at_command(char * lineBuf)
|
||||
serial_do_tcdrain(fdSerial);
|
||||
if(MODEMSOUND)
|
||||
sleep(1);
|
||||
serial2_set_DCD(fdSerial, FALSE);
|
||||
serial2_set_DCD(serialDevice, fdSerial, FALSE);
|
||||
socket_out = tcpsock_client_connect(ipAddr, iPort, fdSerial);
|
||||
}
|
||||
if(socket_out > 0)
|
||||
@@ -700,7 +738,7 @@ int handle_at_command(char * lineBuf)
|
||||
serial_do_tcdrain(fdSerial);
|
||||
sleep(1);
|
||||
int status = pthread_create(&socketInThread, NULL, tcpsock_thread_function, NULL);
|
||||
serial2_set_DCD(fdSerial, TRUE);
|
||||
serial2_set_DCD(serialDevice, fdSerial, TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
@@ -886,7 +924,7 @@ int handle_at_command(char * lineBuf)
|
||||
char * strRows = &lineBuf[6];
|
||||
if(!misc_is_number(strRows))
|
||||
{
|
||||
for (int i = 50; i > 0; i--)
|
||||
for (int i = 50; i > 1; i--)
|
||||
misc_swrite(fdSerial, "\r\n%2d", i);
|
||||
}
|
||||
else
|
||||
@@ -1143,6 +1181,30 @@ void * midi_thread_function (void * x)
|
||||
} while (TRUE);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// void * serial_thread_function(void * x)
|
||||
// Thread function for /dev/ttyUSB input
|
||||
//
|
||||
void * serial_thread_function (void * x)
|
||||
{
|
||||
unsigned char buf [100];
|
||||
int rdLen;
|
||||
do
|
||||
{
|
||||
rdLen = read(fdSerialUSB, &buf, sizeof(buf));
|
||||
if (rdLen > 0)
|
||||
{
|
||||
write(fdSerial, buf, rdLen);
|
||||
show_debug_buf("SERIAL IN ", buf, rdLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
misc_print(1, "ERROR: serial_thread_function() reading %s --> %d : %s \n", serialDeviceUSB, rdLen, strerror(errno));
|
||||
}
|
||||
} while (TRUE);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// write_midi_packet()
|
||||
@@ -1235,7 +1297,6 @@ void * midiINin_thread_function (void * x)
|
||||
// write_socket_packet()
|
||||
// this is for TCP/IP
|
||||
//
|
||||
|
||||
void write_socket_packet(int sock, char * buf, int bufLen)
|
||||
{
|
||||
if (mode == ModeTCP)
|
||||
@@ -1253,17 +1314,6 @@ void write_socket_packet(int sock, char * buf, int bufLen)
|
||||
show_debug_buf("SOCK OUT ", buf, bufLen);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// write_[sequencer]_packet()
|
||||
// this is for ALSA sequencer interface
|
||||
//
|
||||
void write_alsa_packet(char * buf, int bufLen)
|
||||
{
|
||||
alsa_send_midi_raw(buf, bufLen);
|
||||
show_debug_buf("SEQU OUT ", buf, bufLen);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// void show_line()
|
||||
@@ -1286,6 +1336,7 @@ void show_line()
|
||||
void close_fd()
|
||||
{
|
||||
if (fdSerial > 0) close (fdSerial);
|
||||
if (fdSerial > 0) close (fdSerialUSB);
|
||||
if (fdMidi > 0) close (fdMidi);
|
||||
if (fdMidiIN > 0) close (fdMidiIN);
|
||||
if (socket_in > 0) tcpsock_close(socket_in);
|
||||
@@ -1331,6 +1382,8 @@ int main(int argc, char *argv[])
|
||||
int altBaud = FALSE;
|
||||
char coreName[30] = "";
|
||||
MUNTCPUMask = CPUMASK;
|
||||
FSYNTHCPUMask = CPUMASK;
|
||||
|
||||
unsigned char buf[256];
|
||||
//catch_signal(SIGTERM);
|
||||
misc_print(0, "\e[2J\e[H");
|
||||
@@ -1342,6 +1395,12 @@ int main(int argc, char *argv[])
|
||||
|
||||
if(misc_check_file(midiLinkINI))
|
||||
ini_read_ini(midiLinkINI, coreName, 0);
|
||||
else
|
||||
{
|
||||
midiLinkINI = basename(midiLinkINI);
|
||||
if(misc_check_file(midiLinkINI))
|
||||
ini_read_ini(midiLinkINI, coreName, 0);
|
||||
}
|
||||
|
||||
if (misc_check_args_option(argc, argv, "QUIET"))
|
||||
MIDI_DEBUG = FALSE;
|
||||
@@ -1351,20 +1410,18 @@ int main(int argc, char *argv[])
|
||||
if (midilinkPriority != 0)
|
||||
misc_set_priority(midilinkPriority);
|
||||
|
||||
int MIDI = misc_check_device(midiDevice);
|
||||
|
||||
if (misc_check_args_option(argc, argv, "MENU") && !MIDI)
|
||||
if (!misc_check_device(midiDevice) && misc_check_args_option(argc, argv, "MENU"))
|
||||
{
|
||||
if (misc_check_file("/tmp/ML_MUNT") && !MIDI) mode = ModeMUNT;
|
||||
if (misc_check_file("/tmp/ML_MUNTGM") && !MIDI) mode = ModeMUNTGM;
|
||||
if (misc_check_file("/tmp/ML_FSYNTH") && !MIDI) mode = ModeFSYNTH;
|
||||
if (misc_check_file("/tmp/ML_UDP")) {mode = ModeUDP; altBaud = FALSE;}
|
||||
if (misc_check_file("/tmp/ML_TCP")) {mode = ModeTCP; altBaud = FALSE;}
|
||||
if (misc_check_file("/tmp/ML_UDP_ALT")) {mode = ModeUDP; altBaud = TRUE; }
|
||||
if (misc_check_file("/tmp/ML_TCP_ALT")) {mode = ModeTCP; altBaud = TRUE; }
|
||||
if (misc_check_file("/tmp/ML_USBMIDI")) mode = ModeUSBMIDI;
|
||||
if (mode != ModeMUNT && mode != ModeMUNTGM && mode != ModeFSYNTH &&
|
||||
mode != ModeTCP && mode != ModeUDP)
|
||||
if (misc_check_file("/tmp/ML_MUNT")) mode = ModeMUNT;
|
||||
if (misc_check_file("/tmp/ML_MUNTGM")) mode = ModeMUNTGM;
|
||||
if (misc_check_file("/tmp/ML_FSYNTH")) mode = ModeFSYNTH;
|
||||
if (misc_check_file("/tmp/ML_UDP")) { mode = ModeUDP; altBaud = FALSE; }
|
||||
if (misc_check_file("/tmp/ML_TCP")) { mode = ModeTCP; altBaud = FALSE; }
|
||||
if (misc_check_file("/tmp/ML_UDP_ALT")) { mode = ModeUDP; altBaud = TRUE; }
|
||||
if (misc_check_file("/tmp/ML_TCP_ALT")) { mode = ModeTCP; altBaud = TRUE; }
|
||||
if (misc_check_file("/tmp/ML_USBMIDI")) mode = ModeUSBMIDI;
|
||||
if (misc_check_file("/tmp/ML_USBSER")) mode = ModeUSBSER;
|
||||
if (mode == ModeUSBMIDI) // no USB MIDI
|
||||
{
|
||||
misc_print(0, "MENU --> FSYNTH\n");
|
||||
mode = ModeFSYNTH;
|
||||
@@ -1372,42 +1429,56 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
else
|
||||
{
|
||||
if(misc_check_args_option(argc, argv, "MUNT")) mode = ModeMUNT;
|
||||
if(misc_check_args_option(argc, argv, "MUNTGM")) mode = ModeMUNTGM;
|
||||
if(misc_check_args_option(argc, argv, "FSYNTH")) mode = ModeFSYNTH;
|
||||
if(misc_check_args_option(argc, argv, "UDP")) {mode = ModeUDP; altBaud = FALSE;}
|
||||
if(misc_check_args_option(argc, argv, "TCP")) {mode = ModeTCP; altBaud = FALSE;}
|
||||
if(misc_check_args_option(argc, argv, "UDPALT")) {mode = ModeUDP; altBaud = TRUE; }
|
||||
if(misc_check_args_option(argc, argv, "TCPALT")) {mode = ModeTCP; altBaud = TRUE; }
|
||||
if(misc_check_args_option(argc, argv, "USBMIDI")) mode = ModeUSBMIDI;
|
||||
if(misc_check_args_option(argc, argv, "MUNT")) mode = ModeMUNT;
|
||||
if(misc_check_args_option(argc, argv, "MUNTGM")) mode = ModeMUNTGM;
|
||||
if(misc_check_args_option(argc, argv, "FSYNTH")) mode = ModeFSYNTH;
|
||||
if(misc_check_args_option(argc, argv, "UDP")) { mode = ModeUDP; altBaud = FALSE; }
|
||||
if(misc_check_args_option(argc, argv, "TCP")) { mode = ModeTCP; altBaud = FALSE; }
|
||||
if(misc_check_args_option(argc, argv, "UDPALT")) { mode = ModeUDP; altBaud = TRUE; }
|
||||
if(misc_check_args_option(argc, argv, "TCPALT")) { mode = ModeTCP; altBaud = TRUE; }
|
||||
if(misc_check_args_option(argc, argv, "USBMIDI")) mode = ModeUSBMIDI;
|
||||
if(misc_check_args_option(argc, argv, "USBSER")) mode = ModeUSBSER;
|
||||
if(misc_check_args_option(argc, argv, "UDPMUNT")) mode = ModeUDPMUNT;
|
||||
if(misc_check_args_option(argc, argv, "UDPMUNTGM")) mode = ModeUDPMUNTGM;
|
||||
if(misc_check_args_option(argc, argv, "UDPFSYNTH")) mode = ModeUDPFSYNTH;
|
||||
}
|
||||
|
||||
killall_mpg123(0);
|
||||
killall_aplaymidi(0);
|
||||
killall_softsynth(3);
|
||||
|
||||
if (mode == ModeMUNT || mode == ModeMUNTGM || mode == ModeFSYNTH)
|
||||
if (mode == ModeMUNT || mode == ModeMUNTGM || mode == ModeFSYNTH ||
|
||||
mode == ModeUDPMUNT || mode == ModeUDPMUNTGM || mode == ModeUDPFSYNTH)
|
||||
{
|
||||
/* Disable this so we can run UDPMUNT & UDPFSYNTH on RPi or other linux device.
|
||||
if(!misc_check_device(MrAudioDevice)) // && misc_check_file("/etc/asound.conf"))
|
||||
{
|
||||
misc_print(0, "ERROR: You have no MrAudio device in kernel --> %s\n", MrAudioDevice);
|
||||
close_fd();
|
||||
return -1;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
if (!misc_check_device(PCMDevice))
|
||||
{
|
||||
//misc_print(0, "ERROR: You have no PCM device loading --> snd-dummy module\n");
|
||||
//system ("modprobe snd-dummy");
|
||||
misc_print(0, "ERROR: You have no PCM device --> %s\n", PCMDevice);
|
||||
close_fd();
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (mode == ModeMUNT || mode == ModeMUNTGM)
|
||||
midiPort = start_munt();
|
||||
else if (mode == ModeFSYNTH)
|
||||
midiPort = start_fsynth();
|
||||
|
||||
switch(mode)
|
||||
{
|
||||
case ModeMUNT:
|
||||
case ModeMUNTGM:
|
||||
case ModeUDPMUNT:
|
||||
case ModeUDPMUNTGM:
|
||||
midiPort = start_munt();
|
||||
break;
|
||||
case ModeFSYNTH:
|
||||
case ModeUDPFSYNTH:
|
||||
midiPort = start_fsynth();
|
||||
break;
|
||||
}
|
||||
|
||||
if (midiPort < 0)
|
||||
{
|
||||
@@ -1416,49 +1487,73 @@ int main(int argc, char *argv[])
|
||||
return -3;
|
||||
}
|
||||
}
|
||||
fdSerial = open(serialDevice, O_RDWR | O_NOCTTY | O_SYNC);
|
||||
if (fdSerial < 0)
|
||||
|
||||
//these modes don't need serial port. all others do :)
|
||||
if (mode != ModeUDPMUNT && mode != ModeUDPMUNTGM && mode != ModeUDPFSYNTH )
|
||||
{
|
||||
misc_print(0, "ERROR: opening %s: %s\n", serialDevice, strerror(errno));
|
||||
close_fd();
|
||||
return -4;
|
||||
}
|
||||
serial_set_interface_attribs(fdSerial);
|
||||
if (altBaud && mode == ModeUDP && UDPBaudRate_alt != -1)
|
||||
{
|
||||
baudRate = UDPBaudRate_alt;
|
||||
}
|
||||
else if (mode == ModeUDP && UDPBaudRate != -1)
|
||||
{
|
||||
baudRate = UDPBaudRate;
|
||||
}
|
||||
else if (mode == ModeTCP)
|
||||
{
|
||||
if(altBaud && TCPBaudRate_alt != -1)
|
||||
baudRate = TCPBaudRate_alt;
|
||||
else if(TCPBaudRate != -1)
|
||||
baudRate = TCPBaudRate;
|
||||
else
|
||||
baudRate = 115200;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(MIDIBaudRate != -1)
|
||||
baudRate = MIDIBaudRate;
|
||||
fdSerial = open(serialDevice, O_RDWR | O_NOCTTY | O_SYNC);
|
||||
if (fdSerial < 0)
|
||||
{
|
||||
misc_print(0, "ERROR: opening %s: %s\n", serialDevice, strerror(errno));
|
||||
close_fd();
|
||||
return -4;
|
||||
}
|
||||
serial_set_interface_attribs(fdSerial);
|
||||
|
||||
int result = misc_check_args_option(argc, argv, "BAUD");
|
||||
if(result && (result + 1 < argc))
|
||||
{
|
||||
char * ptr;
|
||||
baudRate = strtol(argv[result + 1], &ptr, 10);
|
||||
if (!serial2_is_valid_rate (baudRate))
|
||||
{
|
||||
misc_print(0, "ERROR : BAUD not valid --> %s\n", argv[result + 1]);
|
||||
return -5;
|
||||
}
|
||||
}
|
||||
else if (altBaud && mode == ModeUDP && UDPBaudRate_alt != -1)
|
||||
{
|
||||
baudRate = UDPBaudRate_alt;
|
||||
}
|
||||
else if (mode == ModeUDP && UDPBaudRate != -1)
|
||||
{
|
||||
baudRate = UDPBaudRate;
|
||||
}
|
||||
else if (mode == ModeTCP)
|
||||
{
|
||||
if(altBaud && TCPBaudRate_alt != -1)
|
||||
baudRate = TCPBaudRate_alt;
|
||||
else if(TCPBaudRate != -1)
|
||||
baudRate = TCPBaudRate;
|
||||
else
|
||||
baudRate = 115200;
|
||||
}
|
||||
else if (mode == ModeUSBSER)
|
||||
{
|
||||
if(USBSerBaudRate != -1)
|
||||
baudRate = USBSerBaudRate;
|
||||
else
|
||||
baudRate = 115200;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strcmp(coreName, "AO486") == 0)
|
||||
baudRate = 38400;
|
||||
if(MIDIBaudRate != -1)
|
||||
baudRate = MIDIBaudRate;
|
||||
else
|
||||
baudRate = 31250;
|
||||
{
|
||||
if (strcmp(coreName, "AO486") == 0)
|
||||
baudRate = 38400;
|
||||
else
|
||||
baudRate = 31250;
|
||||
}
|
||||
}
|
||||
|
||||
serial_set_flow_control(fdSerial, 0);
|
||||
serial2_set_baud(serialDevice, fdSerial, baudRate);
|
||||
serial_do_tcdrain(fdSerial);
|
||||
serial2_set_DCD(serialDevice, fdSerial, (mode == ModeTCP)?FALSE:TRUE);
|
||||
}
|
||||
|
||||
serial_set_flow_control(fdSerial, 0);
|
||||
serial2_set_baud(serialDevice, fdSerial, baudRate);
|
||||
serial_do_tcdrain(fdSerial);
|
||||
serial2_set_DCD(fdSerial, (mode == ModeTCP)?FALSE:TRUE);
|
||||
|
||||
|
||||
if (mode == ModeMUNT || mode == ModeMUNTGM || mode == ModeFSYNTH)
|
||||
{
|
||||
if(alsa_open_seq(midiPort, (mode == ModeMUNTGM)?1:0))
|
||||
@@ -1467,6 +1562,7 @@ int main(int argc, char *argv[])
|
||||
if(strlen(MT32LCDMsg) > 0)
|
||||
write_alsa_packet(buf, misc_MT32_LCD(MT32LCDMsg, buf));
|
||||
//This loop handles softSynth MUNT/FluidSynth
|
||||
misc_print(0, "Starting --> local MIDI loop :)\n");
|
||||
do
|
||||
{
|
||||
int rdLen = read(fdSerial, buf, sizeof(buf));
|
||||
@@ -1481,7 +1577,7 @@ int main(int argc, char *argv[])
|
||||
else
|
||||
{
|
||||
close_fd();
|
||||
return -4;
|
||||
return -6;
|
||||
}
|
||||
close_fd();
|
||||
return 0;
|
||||
@@ -1489,6 +1585,40 @@ int main(int argc, char *argv[])
|
||||
|
||||
switch(mode)
|
||||
{
|
||||
case ModeUDPMUNT:
|
||||
case ModeUDPMUNTGM:
|
||||
case ModeUDPFSYNTH:
|
||||
if(alsa_open_seq(midiPort, (mode == ModeUDPMUNTGM)?1:0))
|
||||
{
|
||||
show_line();
|
||||
if(strlen(MT32LCDMsg) > 0)
|
||||
write_alsa_packet(buf, misc_MT32_LCD(MT32LCDMsg, buf));
|
||||
socket_in = udpsock_server_open(UDPServerPort);
|
||||
if(socket_in > 0)
|
||||
{
|
||||
misc_print(0, "Socket Listener created on port %d.\n", UDPServerPort);
|
||||
status = pthread_create(&socketInThread, NULL, udpsock_thread_function2, NULL);
|
||||
if (status == -1)
|
||||
{
|
||||
misc_print(0, "ERROR: unable to create UDP socket input thread.\n");
|
||||
close_fd();
|
||||
return -8;
|
||||
}
|
||||
misc_print(0, "UDP Socket input thread(2) created.\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
misc_print(0, "ERROR: unable to create UDP listener --> '%s'\n", strerror(errno));
|
||||
close_fd();
|
||||
return -9;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
close_fd();
|
||||
return -10;
|
||||
}
|
||||
break;
|
||||
case ModeUDP:
|
||||
{
|
||||
if(UDPFlow > 0)
|
||||
@@ -1505,34 +1635,34 @@ int main(int argc, char *argv[])
|
||||
if(socket_in > 0)
|
||||
{
|
||||
misc_print(0, "Socket Listener created on port %d.\n", UDPServerPort);
|
||||
status = pthread_create(&socketInThread, NULL, udpsock_thread_function, NULL);
|
||||
status = pthread_create(&socketInThread, NULL, udpsock_thread_function, NULL);
|
||||
if (status == -1)
|
||||
{
|
||||
misc_print(0, "ERROR: unable to create socket input thread.\n");
|
||||
misc_print(0, "ERROR: unable to create UDP socket input thread.\n");
|
||||
close_fd();
|
||||
return -6;
|
||||
return -11;
|
||||
}
|
||||
misc_print(0, "Socket input thread created.\n");
|
||||
misc_print(0, "UDP Socket input thread(1) created.\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
misc_print(0, "ERROR: unable to create UDP listener --> '%s'\n", strerror(errno));
|
||||
close_fd();
|
||||
return -7;
|
||||
return -12;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
misc_print(0, "ERROR: unable to open UDP port --> '%s'\n", strerror(errno));
|
||||
close_fd();
|
||||
return -8;
|
||||
return -13;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
misc_print(0, "ERROR: in INI File (UDP_SERVER) --> %s\n", midiLinkINI);
|
||||
close_fd();
|
||||
return -9;
|
||||
return -14;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1540,7 +1670,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
if(TCPFlow > 0)
|
||||
serial_set_flow_control(fdSerial, TCPFlow);
|
||||
//serial2_set_DCD(fdSerial, FALSE);
|
||||
//serial2_set_DCD(sericlDevice, fdSerial, FALSE);
|
||||
serial_set_timeout(fdSerial, 1);
|
||||
socket_lst = tcpsock_server_open(TCPServerPort);
|
||||
if(socket_lst != -1)
|
||||
@@ -1550,7 +1680,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
misc_print(0, "ERROR: unable to create socket listener thread.\n");
|
||||
close_fd();
|
||||
return -10;
|
||||
return -15;
|
||||
}
|
||||
misc_print(0, "Socket listener thread created.\n");
|
||||
}
|
||||
@@ -1558,7 +1688,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
misc_print(0, "ERROR: unable to create socket listener --> '%s'\n", strerror(errno));
|
||||
close_fd();
|
||||
return -11;
|
||||
return -16;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1569,7 +1699,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
misc_print(0, "ERROR: cannot open %s: %s\n", midiDevice, strerror(errno));
|
||||
close_fd();
|
||||
return -12;
|
||||
return -17;
|
||||
}
|
||||
|
||||
if (misc_check_device(midiINDevice))
|
||||
@@ -1579,7 +1709,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
misc_print(0, "ERROR: cannot open %s: %s\n", midiINDevice, strerror(errno));
|
||||
close_fd();
|
||||
return -13;
|
||||
return -18;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1597,7 +1727,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
misc_print(0, "ERROR: unable to create *MIDI input thread.\n");
|
||||
close_fd();
|
||||
return -14;
|
||||
return -19;
|
||||
}
|
||||
misc_print(0, "MIDI1 input thread created.\n");
|
||||
misc_print(0, "CONNECT : %s --> %s & %s\n", midiINDevice, serialDevice, midiDevice);
|
||||
@@ -1608,12 +1738,56 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
misc_print(0, "ERROR: unable to create MIDI input thread.\n");
|
||||
close_fd();
|
||||
return -14;
|
||||
return -20;
|
||||
}
|
||||
misc_print(0, "MIDI input thread created.\n");
|
||||
misc_print(0, "CONNECT : %s <--> %s\n", serialDevice, midiDevice);
|
||||
}
|
||||
break;
|
||||
case ModeUSBSER:
|
||||
{
|
||||
if (!misc_check_device(serialDeviceUSB))
|
||||
{
|
||||
if(strlen(USBSerModule) > 0)
|
||||
{
|
||||
misc_print(0, "WARNING: You have no '%s' device - loading --> %s\n", serialDeviceUSB, USBSerModule);
|
||||
sprintf(buf, "insmod %s", USBSerModule);
|
||||
}
|
||||
else
|
||||
{
|
||||
misc_print(0, "ERROR: You have no '%s' device! --> maybe set 'USB_SERIAL_MODULE = ' in '%s'?\n", serialDeviceUSB, midiLinkINI);
|
||||
close_fd();
|
||||
return -21;
|
||||
}
|
||||
system(buf);
|
||||
}
|
||||
|
||||
fdSerialUSB = open(serialDeviceUSB, O_RDWR);
|
||||
if (fdSerialUSB < 0)
|
||||
{
|
||||
misc_print(0, "ERROR: cannot open %s: %s\n", serialDeviceUSB, strerror(errno));
|
||||
close_fd();
|
||||
return -22;
|
||||
}
|
||||
|
||||
serial_set_flow_control(fdSerial, 3); //RTS/CTS
|
||||
serial_set_flow_control(fdSerialUSB, 3);
|
||||
serial_set_interface_attribs(fdSerialUSB);
|
||||
serial2_set_baud(serialDeviceUSB, fdSerialUSB, baudRate);
|
||||
serial_do_tcdrain(fdSerialUSB);
|
||||
serial2_set_DCD(serialDeviceUSB, fdSerialUSB, TRUE);
|
||||
|
||||
status = pthread_create(&serialInThread, NULL, serial_thread_function, NULL);
|
||||
if (status == -1)
|
||||
{
|
||||
misc_print(0, "ERROR: unable to create serial input thread.\n");
|
||||
close_fd();
|
||||
return -23;
|
||||
}
|
||||
misc_print(0, "MIDI input thread created.\n");
|
||||
misc_print(0, "CONNECT : %s <--> %s\n", serialDevice, serialDeviceUSB);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
show_line();
|
||||
@@ -1629,13 +1803,38 @@ int main(int argc, char *argv[])
|
||||
write_midi_packet(buf, misc_MT32_LCD(MT32LCDMsg, buf));
|
||||
}
|
||||
//This main loop handles USB MIDI
|
||||
misc_print(0, "Starting --> USB MIDI loop :)\n");
|
||||
do
|
||||
{
|
||||
int rdLen = read(fdSerial, buf, sizeof(buf));
|
||||
if (rdLen > 0)
|
||||
write_midi_packet(buf, rdLen);
|
||||
else if (rdLen < 0)
|
||||
misc_print(1, "ERROR: (USB) from read: %d: %s\n", rdLen, strerror(errno));
|
||||
misc_print(1, "ERROR: (USBMIDI) from read: %d: %s\n", rdLen, strerror(errno));
|
||||
} while (TRUE);
|
||||
break;
|
||||
case ModeUSBSER:
|
||||
//This main loop handles USB serial
|
||||
misc_print(0, "Starting --> USB Serial loop :)\n");
|
||||
do
|
||||
{
|
||||
int rdLen = read(fdSerial, buf, sizeof(buf));
|
||||
if (rdLen > 0)
|
||||
{
|
||||
show_debug_buf("SERIAL OUT ", buf, rdLen);
|
||||
write(fdSerialUSB, buf, rdLen);
|
||||
}
|
||||
else if (rdLen < 0)
|
||||
misc_print(1, "ERROR: (USBSER) from read: %d: %s\n", rdLen, strerror(errno));
|
||||
} while (TRUE);
|
||||
break;
|
||||
case ModeUDPMUNT:
|
||||
case ModeUDPMUNTGM:
|
||||
case ModeUDPFSYNTH:
|
||||
misc_print(0, "Starting --> UDP Synth loop :)\n");
|
||||
do
|
||||
{
|
||||
sleep(1);
|
||||
} while (TRUE);
|
||||
break;
|
||||
case ModeUDP:
|
||||
@@ -1651,6 +1850,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
//This main loop handles UDP
|
||||
misc_print(0, "Starting --> UDP loop :)\n");
|
||||
do
|
||||
{
|
||||
int rdLen = read(fdSerial, buf, sizeof(buf));
|
||||
@@ -1665,6 +1865,7 @@ int main(int argc, char *argv[])
|
||||
break;
|
||||
case ModeTCP :
|
||||
//This main loop handles TCP
|
||||
misc_print(0, "Starting --> TCP loop :)\n");
|
||||
do
|
||||
{
|
||||
int rdLen = read(fdSerial, buf, sizeof(buf));
|
||||
|
||||
138
misc.c
138
misc.c
@@ -26,7 +26,9 @@
|
||||
//
|
||||
//
|
||||
static char pauseStr[] = "[PAUSE]";
|
||||
static char pauseDel[sizeof(pauseStr)];
|
||||
static char pauseDel[sizeof(pauseStr)] = "";
|
||||
static char pauseSpc[sizeof(pauseStr)] = "";
|
||||
|
||||
static pthread_mutex_t print_lock;
|
||||
static pthread_mutex_t swrite_lock;
|
||||
extern int MIDI_DEBUG;
|
||||
@@ -215,11 +217,11 @@ int misc_check_args_option (int argc, char *argv[], char * option)
|
||||
if(argc > 1)
|
||||
for (int i = 1; i< argc; i++)
|
||||
{
|
||||
char * arg = strdup(argv[i]);
|
||||
misc_str_to_upper(arg);
|
||||
if (strcmp(arg, option) == 0)
|
||||
result = TRUE;
|
||||
free(arg);
|
||||
if (strcasecmp(argv[i], option) == 0)
|
||||
{
|
||||
result = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
free(OPTION);
|
||||
return result;
|
||||
@@ -399,7 +401,6 @@ long misc_get_timeval_diff(struct timeval * start, struct timeval * stop)
|
||||
return ((secs) * 1000 + usecs/1000.0);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// int misc_check_module_loaded (char * modName)
|
||||
@@ -611,6 +612,23 @@ void misc_d_type_to_str(unsigned char type, char * buf)
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
//char * misc_get_clrScr()
|
||||
//
|
||||
char * misc_get_clrScr()
|
||||
{
|
||||
switch(TCPAsciiTrans)
|
||||
{
|
||||
case AsciiToPetskii:
|
||||
return "\x93";
|
||||
break;
|
||||
default:
|
||||
return "\e[2J\e[H";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// int misc_list_files(char * path, int fdSerial, int rows, char * fileName, int * DIR)
|
||||
@@ -628,12 +646,12 @@ int misc_list_files(char * path, int fdSerial, int rows, char * fileName, int *
|
||||
unsigned char c;
|
||||
char prompt[10] = "";
|
||||
char strRows[10] = "";
|
||||
char clrScr[] = "\e[2J\e[H";
|
||||
char promptEnd[] = "END #? --> ";
|
||||
char promptMore[] = "MORE #? --> ";
|
||||
char strType[4] = "";
|
||||
int result = FALSE;
|
||||
|
||||
|
||||
fileName[0] = (char) 0x00;
|
||||
sprintf(strRows, "%d", rows);
|
||||
char * path2 = malloc(strlen(path) + 3);
|
||||
@@ -646,7 +664,7 @@ int misc_list_files(char * path, int fdSerial, int rows, char * fileName, int *
|
||||
}
|
||||
else
|
||||
{
|
||||
misc_swrite(fdSerial, clrScr);
|
||||
misc_swrite(fdSerial, misc_get_clrScr());
|
||||
while (index < max)
|
||||
{
|
||||
if(strlen(namelist[index]->d_name) > 0 &&
|
||||
@@ -733,11 +751,11 @@ int misc_list_files(char * path, int fdSerial, int rows, char * fileName, int *
|
||||
else
|
||||
page++;
|
||||
count = 0;
|
||||
misc_swrite(fdSerial, clrScr);
|
||||
misc_swrite(fdSerial, misc_get_clrScr());
|
||||
if (c == 'Q')
|
||||
break;
|
||||
//else if(index < max) //no clear on exit
|
||||
// misc_swrite(fdSerial, clrScr);
|
||||
// misc_swrite(fdSerial, misc_get_clrScr());
|
||||
}
|
||||
}
|
||||
for(index = 0; index < max; index++)
|
||||
@@ -784,19 +802,40 @@ int misc_MT32_LCD(char * MT32Message, char * buf)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c, int CR)
|
||||
// void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c)
|
||||
//
|
||||
void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c, int CR)
|
||||
void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c)
|
||||
{
|
||||
(*rowcount)++;
|
||||
if (*rowcount == rows)
|
||||
{
|
||||
if (CR)
|
||||
misc_swrite(fdSerial, "\r\n");
|
||||
if(pauseSpc[0] != ' ')
|
||||
{
|
||||
memset(pauseSpc, ' ', strlen(pauseStr));
|
||||
pauseSpc[sizeof(pauseSpc)-1] = 0x00;
|
||||
}
|
||||
misc_swrite(fdSerial, "\r\n");
|
||||
misc_swrite(fdSerial, pauseStr);
|
||||
while (read(fdSerial, &c, 1) == 0) {};
|
||||
if(pauseDel[0] != 0x08)
|
||||
memset(pauseDel, 0x08, sizeof(pauseDel));
|
||||
while (read(fdSerial, c, 1) == 0) {};
|
||||
switch(TCPAsciiTrans)
|
||||
{
|
||||
case AsciiToPetskii:
|
||||
if(pauseDel[0] != 0x14)
|
||||
{
|
||||
memset(pauseDel, 0x14, strlen(pauseStr)); //C64
|
||||
pauseDel[sizeof(pauseDel)-1] = 0x00;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if(pauseDel[0] != 0x08)
|
||||
{
|
||||
memset(pauseDel, 0x08, strlen(pauseStr));
|
||||
pauseDel[sizeof(pauseDel)-1] = 0x00;
|
||||
}
|
||||
break;
|
||||
}
|
||||
misc_swrite(fdSerial, pauseDel);
|
||||
misc_swrite(fdSerial, pauseSpc);
|
||||
misc_swrite(fdSerial, pauseDel);
|
||||
*rowcount = 0;
|
||||
*c = toupper(*c);
|
||||
@@ -820,7 +859,7 @@ void misc_show_at_commands(int fdSerial, int rows)
|
||||
misc_swrite(fdSerial, "\n");
|
||||
misc_swrite(fdSerial, athelp[index]);
|
||||
index++;
|
||||
misc_do_rowcheck(fdSerial, rows, &rowcount, &c, TRUE);
|
||||
misc_do_rowcheck(fdSerial, rows, &rowcount, &c);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -830,19 +869,25 @@ void misc_show_at_commands(int fdSerial, int rows)
|
||||
//
|
||||
int misc_file_to_serial(int fdSerial, char * fileName, int rows)
|
||||
{
|
||||
char str[1014];
|
||||
char str[1024];
|
||||
FILE * file;
|
||||
int index = 0;
|
||||
int rowcount = 0;
|
||||
char c = (char) 0x00;
|
||||
file = fopen(fileName, "r");
|
||||
if (file)
|
||||
{
|
||||
misc_swrite(fdSerial, "\r\n");
|
||||
while (fgets(str, sizeof(str), file)!= NULL)
|
||||
//misc_swrite(fdSerial, "\r\n");
|
||||
while (fgets(str, sizeof(str), file) != NULL && c != 'Q')
|
||||
{
|
||||
misc_swrite(fdSerial, str);
|
||||
misc_swrite(fdSerial, "\r");
|
||||
misc_do_rowcheck(fdSerial, rows, &rowcount, &c, FALSE);
|
||||
if(rowcount != 0 || index == 0)
|
||||
misc_swrite(fdSerial, "\n");
|
||||
misc_replace_char(str, strlen(str), '\n', 0x00);
|
||||
misc_replace_char(str, strlen(str), '\r', 0x00);
|
||||
misc_swrite(fdSerial, str);
|
||||
index++;
|
||||
misc_do_rowcheck(fdSerial, rows, &rowcount, &c);
|
||||
}
|
||||
fclose(file);
|
||||
return TRUE;
|
||||
@@ -895,49 +940,56 @@ int misc_get_core_name(char * buf, int maxBuf)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// char * misc_hayes_flow_to_str(int flow)
|
||||
// char * misc_hayes_flow_to_str(int flow)
|
||||
//
|
||||
char * misc_hayes_flow_to_str(int flow)
|
||||
{
|
||||
switch(flow)
|
||||
{
|
||||
case 0: return "Diasble Flow-control";
|
||||
case 3: return "RTS/CTS";
|
||||
case 4: return "XON/XOFF";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
case 0:
|
||||
return "Diasble Flow-control";
|
||||
case 3:
|
||||
return "RTS/CTS";
|
||||
case 4:
|
||||
return "XON/XOFF";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// char * misc_hayes_DTR_to_str(int dtr)
|
||||
// char * misc_hayes_DTR_to_str(int dtr)
|
||||
//
|
||||
char * misc_hayes_DTR_to_str(int dtr)
|
||||
{
|
||||
switch(dtr)
|
||||
{
|
||||
case 1: return "Normal";
|
||||
case 2: return "Hangup";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
case 1:
|
||||
return "Normal";
|
||||
case 2:
|
||||
return "Hangup";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// char * misc_hayes_ATQ_to_str(int dtr)
|
||||
// char * misc_hayes_ATQ_to_str(int dtr)
|
||||
//
|
||||
char * misc_hayes_ATQ_to_str(int dtr)
|
||||
{
|
||||
switch(dtr)
|
||||
{
|
||||
case 0: return "Normal";
|
||||
case 1: return "Quite - no result codes";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
case 0:
|
||||
return "Normal";
|
||||
case 1:
|
||||
return "Quite - no result codes";
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
4
misc.h
4
misc.h
@@ -27,7 +27,7 @@ int misc_file_to_serial(int fdSerial, char * fileName, int rows);
|
||||
int misc_count_str_chr(char * str, char chr);
|
||||
int misc_MT32_LCD(char * MT32Message, char * buf);
|
||||
void misc_show_at_commands(int fdSerial, int rows);
|
||||
void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c, int CR);
|
||||
void misc_do_rowcheck(int fdSerial, int rows, int * rowcount, char * c);
|
||||
int misc_get_core_name(char * buf, int maxBuf);
|
||||
char misc_replace_char(char * str, int strLen, char old, char new);
|
||||
int misc_do_pipe(int fdSerial, char * path, char * command,
|
||||
@@ -39,5 +39,7 @@ int misc_do_pipe(int fdSerial, char * path, char * command,
|
||||
char * misc_hayes_flow_to_str(int flow);
|
||||
char * misc_hayes_DTR_to_str(int dtr);
|
||||
char * misc_hayes_ATQ_to_str(int dtr);
|
||||
char * misc_get_clrScr();
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
||||
15
mlinkutil.c
15
mlinkutil.c
@@ -47,6 +47,17 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
serial2_set_baud(serialDevice, fdSerial, baud);
|
||||
close(fdSerial);
|
||||
if(misc_check_device(serialDeviceUSB))// && misc_check_file("/tmp/ML_USBSER"))
|
||||
{
|
||||
fdSerial = open(serialDeviceUSB, O_RDWR | O_NOCTTY | O_SYNC);
|
||||
if (fdSerial < 0)
|
||||
{
|
||||
misc_print(0, "ERROR: opening %s: %s\n", serialDeviceUSB, strerror(errno));
|
||||
return -3;
|
||||
}
|
||||
serial2_set_baud(serialDeviceUSB, fdSerial, baud);
|
||||
close(fdSerial);
|
||||
}
|
||||
bShowInfo = FALSE;
|
||||
}
|
||||
|
||||
@@ -95,14 +106,14 @@ int main(int argc, char *argv[])
|
||||
else
|
||||
{
|
||||
printf("ERROR --> unable to connect to FluidSynth:9800\n");
|
||||
return -4;
|
||||
return -11;
|
||||
}
|
||||
bShowInfo = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("ERROR --> unable to open file '%s'\n", argv[result+1]);
|
||||
return -3;
|
||||
return -10;
|
||||
}
|
||||
}
|
||||
if (bShowInfo)
|
||||
|
||||
@@ -138,12 +138,12 @@ int serial2_set_DTR(int fdSerial, int on)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// int serial2_set_DCD(int fdSerial, int on)
|
||||
// int serial2_set_DCD(char * serialDevice, int fdSerial, int on)
|
||||
//
|
||||
int serial2_set_DCD(int fdSerial, int on)
|
||||
int serial2_set_DCD(char * serialDevice, int fdSerial, int on)
|
||||
{
|
||||
int result;
|
||||
result = serial2_set_DTR(fdSerial, on);
|
||||
misc_print(1, "Setting DCD --> %s\n",on?"TRUE":"FALSE");
|
||||
misc_print(1, "Setting DCD (%s) --> %s\n", serialDevice, on?"TRUE":"FALSE");
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user