Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9653/src
Modified Files: Tag: devel_0_39 s_midi_alsa.c Log Message: iohannes's autoconnect patch
Index: s_midi_alsa.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/s_midi_alsa.c,v retrieving revision 1.1.2.2.2.3 retrieving revision 1.1.2.2.2.4 diff -C2 -d -r1.1.2.2.2.3 -r1.1.2.2.2.4 *** s_midi_alsa.c 21 Aug 2005 11:28:24 -0000 1.1.2.2.2.3 --- s_midi_alsa.c 6 Oct 2005 18:41:42 -0000 1.1.2.2.2.4 *************** *** 48,53 **** --- 48,61 ---- int i; snd_seq_client_info_t *alsainfo; + /* do we want to connect pd automatically with other devices ?; see below! */ + /* LATER: think about a flag to enable/disable automatic connection + * (sometimes it could be a pain) + */ + int autoconnect = 1; alsa_nmidiin = 0; alsa_nmidiout = 0; + + if (nmidiout == 0 && nmidiin == 0) return; + if(nmidiin>MAXMIDIINDEV ) { *************** *** 74,96 **** return; } ! for (i=0;i<nmidiout;i++) { int port; sprintf(portname,"Pure Data Midi-In %d",i+1); ! port = snd_seq_create_simple_port(midi_handle,portname,SND_SEQ_PORT_CAP_WRITE |SND_SEQ_PORT_CAP_SUBS_WRITE , SND_SEQ_PORT_TYPE_APPLICATION); ! alsa_midiinfd[i] = port; if (port < 0) goto error; }
! for (i=0;i<nmidiin;i++) { int port; sprintf(portname,"Pure Data Midi-Out %d",i+1); ! port = snd_seq_create_simple_port(midi_handle,portname, SND_SEQ_PORT_CAP_SUBS_READ | SND_SEQ_PORT_CAP_READ, SND_SEQ_PORT_TYPE_APPLICATION); ! alsa_midioutfd[i] = port; if (port < 0) goto error; }
- if (nmidiout == 0 && nmidiin == 0) return; snd_seq_client_info_malloc(&alsainfo); snd_seq_get_client_info(midi_handle,alsainfo); --- 82,107 ---- return; } ! for (i=0;i<nmidiin;i++) { int port; sprintf(portname,"Pure Data Midi-In %d",i+1); ! port = snd_seq_create_simple_port(midi_handle,portname, ! SND_SEQ_PORT_CAP_WRITE |SND_SEQ_PORT_CAP_SUBS_WRITE, ! SND_SEQ_PORT_TYPE_APPLICATION); ! alsa_midiinfd[i] = port; if (port < 0) goto error; }
! for (i=0;i<nmidiout;i++) { int port; sprintf(portname,"Pure Data Midi-Out %d",i+1); ! port = snd_seq_create_simple_port(midi_handle,portname, ! SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, ! SND_SEQ_PORT_TYPE_APPLICATION); ! alsa_midioutfd[i] = port; if (port < 0) goto error; }
snd_seq_client_info_malloc(&alsainfo); snd_seq_get_client_info(midi_handle,alsainfo); *************** *** 104,109 **** alsa_nmidiout = nmidiout; alsa_nmidiin = nmidiin; return; ! error: sys_setalarm(1000000); post("couldn't open alsa MIDI output device"); --- 115,179 ---- alsa_nmidiout = nmidiout; alsa_nmidiin = nmidiin; + + /* JMZ: connect all available devices to pd */ + if (autoconnect) + { + + snd_seq_client_info_t *cinfo; + snd_seq_port_info_t *pinfo; + + snd_seq_port_subscribe_t *subs; + snd_seq_addr_t other, topd, frompd; + /* since i don't know how to connect multiple ports + * (connect everything to each port, modulo,...), + * i only fully connect where we have only one single port + */ + if(alsa_nmidiin) + { + topd.client =client; + topd.port =alsa_midiinfd[0]; + } + if(alsa_nmidiout) + { + frompd.client =client; + frompd.port =alsa_midioutfd[0]; + } + + snd_seq_port_subscribe_alloca(&subs); + + snd_seq_client_info_alloca(&cinfo); + snd_seq_port_info_alloca(&pinfo); + snd_seq_client_info_set_client(cinfo, -1); + while (snd_seq_query_next_client(midi_handle, cinfo) >= 0) + { + /* reset query info */ + int client_id=snd_seq_client_info_get_client(cinfo); + + if((SND_SEQ_CLIENT_SYSTEM != client_id)&&(client != client_id)) + { /* skipping port 0 and ourself */ + snd_seq_port_info_set_client(pinfo, client_id); + snd_seq_port_info_set_port(pinfo, -1); + while (snd_seq_query_next_port(midi_handle, pinfo) >= 0) + { + other.client=client_id; + other.port =snd_seq_port_info_get_port(pinfo); + if(1==alsa_nmidiin) /* only autoconnect 1st port */ + { + snd_seq_port_subscribe_set_sender(subs, &other); + snd_seq_port_subscribe_set_dest(subs, &topd); + snd_seq_subscribe_port(midi_handle, subs); + } + if(1==alsa_nmidiout) /* only autoconnect 1st port */ + { + snd_seq_port_subscribe_set_sender(subs, &frompd); + snd_seq_port_subscribe_set_dest(subs, &other); + snd_seq_subscribe_port(midi_handle, subs); + } + } + } + } + } return; ! error: sys_setalarm(1000000); post("couldn't open alsa MIDI output device");