Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3400
Modified Files:
Tag: devel_0_38
s_midi_alsa.c
Log Message:
hopefully fixed memory leak ...
Index: s_midi_alsa.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/s_midi_alsa.c,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -C2 -d -r1.1.2.1 -r1.1.2.2
*** s_midi_alsa.c 5 Nov 2004 13:33:19 -0000 1.1.2.1
--- s_midi_alsa.c 2 May 2005 09:29:47 -0000 1.1.2.2
***************
*** 26,42 ****
static snd_seq_t *midi_handle;
! static int alsa_port;
! static int alsa_initialized;
! static void alsa_midiout(int fd, int n)
! {
! /*snd_midi_event_encode_byte();
! char b = n;
! if ((write(fd, (char *) &b, 1)) != 1)
! perror("midi write");*/
! }
- #define O_MIDIFLAG O_NDELAY
! unsigned short CombineBytes(unsigned char First, unsigned char Second)
{
unsigned short _14bit;
--- 26,34 ----
static snd_seq_t *midi_handle;
! static snd_midi_event_t *midiev;
!
! static unsigned short CombineBytes(unsigned char First, unsigned char Second)
{
unsigned short _14bit;
***************
*** 52,58 ****
char portname[50];
! int err;
int client;
int i;
if (nmidiin>0 && nmidiout>0)
err = snd_seq_open(&midi_handle,"default",SND_SEQ_OPEN_DUPLEX,0);
--- 44,53 ----
char portname[50];
! int err = 0;
int client;
int i;
+ alsa_nmidiin = 0;
+ alsa_nmidiout = 0;
+
if (nmidiin>0 && nmidiout>0)
err = snd_seq_open(&midi_handle,"default",SND_SEQ_OPEN_DUPLEX,0);
***************
*** 70,92 ****
for (i=0;i<nmidiout;i++)
{
sprintf(portname,"Pure Data Midi-In %d",i+1);
! alsa_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] = alsa_port;
}
for (i=0;i<nmidiin;i++)
{
sprintf(portname,"Pure Data Midi-Out %d",i+1);
! alsa_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] = alsa_port;
! }
!
! // alsa_port = snd_seq_create_simple_port(midi_handle,portname,SND_SEQ_PORT_CAP_DUPLEX |SND_SEQ_PORT_CAP_SUBS_WRITE | SND_SEQ_PORT_CAP_SUBS_READ , SND_SEQ_PORT_TYPE_APPLICATION);
! //alsa_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);
! if (alsa_port < 0)
! {
! sys_setalarm(1000000);
! post("couldn't open alsa MIDI output device");
! return;
}
snd_seq_client_info_t *alsainfo;
snd_seq_client_info_malloc(&alsainfo);
--- 65,85 ----
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_t *alsainfo;
snd_seq_client_info_malloc(&alsainfo);
***************
*** 95,102 ****
client = snd_seq_client_info_get_client(alsainfo);
snd_seq_set_client_info(midi_handle,alsainfo);
post("Opened Alsa Client %d in:%d out:%d",client,nmidiin,nmidiout);
sys_setalarm(0);
alsa_nmidiout = nmidiout;
! alsa_initialized = nmidiin;
}
--- 88,102 ----
client = snd_seq_client_info_get_client(alsainfo);
snd_seq_set_client_info(midi_handle,alsainfo);
+ snd_seq_client_info_free(alsainfo);
post("Opened Alsa Client %d in:%d out:%d",client,nmidiin,nmidiout);
sys_setalarm(0);
+ snd_midi_event_new(20,&midiev);
alsa_nmidiout = nmidiout;
! alsa_nmidiin = nmidiin;
! return;
! error:
! sys_setalarm(1000000);
! post("couldn't open alsa MIDI output device");
! return;
}
***************
*** 106,115 ****
void sys_putmidimess(int portno, int a, int b, int c)
{
! int aa;
! int channel;
! snd_midi_event_t *dev;
snd_seq_event_t ev;
snd_seq_ev_clear(&ev);
- dev = (snd_midi_event_t*)malloc(30);
if (portno >= 0 && portno < alsa_nmidiout)
{
--- 106,112 ----
void sys_putmidimess(int portno, int a, int b, int c)
{
! int channel;
snd_seq_event_t ev;
snd_seq_ev_clear(&ev);
if (portno >= 0 && portno < alsa_nmidiout)
{
***************
*** 157,160 ****
--- 154,159 ----
void sys_putmidibyte(int portno, int byte)
{
+
+ post("putmidibyte not implemented, please report as a bug");
/* snd_midi_event_t *dev;
snd_seq_event_t ev;
***************
*** 172,214 ****
}
- #if 0 /* this is the "select" version which doesn't work with OSS
- driver for emu10k1 (it doesn't implement select.) */
- void sys_poll_midi(void)
- {
- int i, throttle = 100;
- struct timeval timout;
- int did = 1, maxfd = 0;
- while (did)
- {
- fd_set readset, writeset, exceptset;
- did = 0;
- if (throttle-- < 0)
- break;
- timout.tv_sec = 0;
- timout.tv_usec = 0;
-
- FD_ZERO(&writeset);
- FD_ZERO(&readset);
- FD_ZERO(&exceptset);
- for (i = 0; i < alsa_nmidiin; i++)
- {
- if (alsa_midiinfd[i] > maxfd)
- maxfd = alsa_midiinfd[i];
- FD_SET(alsa_midiinfd[i], &readset);
- }
- select(maxfd+1, &readset, &writeset, &exceptset, &timout);
- for (i = 0; i < alsa_nmidiin; i++)
- if (FD_ISSET(alsa_midiinfd[i], &readset))
- {
- char c;
- int ret = read(alsa_midiinfd[i], &c, 1);
- if (ret <= 0)
- fprintf(stderr, "Midi read error\n");
- else sys_midibytein(i, (c & 0xff));
- did = 1;
- }
- }
- }
- #else
/* this version uses the asynchronous "read()" ... */
--- 171,174 ----
***************
*** 218,225 ****
int count, alsa_source;
int i;
- snd_midi_event_t *dev;
snd_seq_event_t *midievent = NULL;
! snd_midi_event_new(20,&dev);
! snd_midi_event_init(dev);
count = snd_seq_event_input_pending(midi_handle,1);
if (count != 0)
--- 178,188 ----
int count, alsa_source;
int i;
snd_seq_event_t *midievent = NULL;
!
! if (alsa_nmidiout == 0 && alsa_nmidiin == 0) return;
!
! snd_midi_event_init(midiev);
!
! if (!alsa_nmidiout && !alsa_nmidiin) return;
count = snd_seq_event_input_pending(midi_handle,1);
if (count != 0)
***************
*** 227,231 ****
if (midievent != NULL)
{
! count = snd_midi_event_decode(dev,buf,20,midievent);
alsa_source = midievent->dest.port;
for(i=0;i<count;i++)
--- 190,194 ----
if (midievent != NULL)
{
! count = snd_midi_event_decode(midiev,buf,20,midievent);
alsa_source = midievent->dest.port;
for(i=0;i<count;i++)
***************
*** 233,249 ****
//post("received %d midi bytes\n",count);
}
- snd_midi_event_free(dev);
}
- #endif
void sys_close_midi()
{
- /*int i;
- for (i = 0; i < alsa_nmidiin; i++)
- close(alsa_midiinfd[i]);
- for (i = 0; i < alsa_nmidiout; i++)
- close(alsa_midioutfd[i]);*/
alsa_nmidiin = alsa_nmidiout = 0;
snd_seq_close(midi_handle);
}
--- 196,206 ----
//post("received %d midi bytes\n",count);
}
}
void sys_close_midi()
{
alsa_nmidiin = alsa_nmidiout = 0;
snd_seq_close(midi_handle);
+ snd_midi_event_free(midiev);
}
***************
*** 266,270 ****
ndev = maxndev;
for (i = 0; i < ndev; i++)
! sprintf(indevlist + i * devdescsize, "OSS MIDI device #%d", i+1);
*nindevs = ndev;
--- 223,227 ----
ndev = maxndev;
for (i = 0; i < ndev; i++)
! sprintf(indevlist + i * devdescsize, "ALSA MIDI device #%d", i+1);
*nindevs = ndev;
***************
*** 272,276 ****
ndev = maxndev;
for (i = 0; i < ndev; i++)
! sprintf(outdevlist + i * devdescsize, "OSS MIDI device #%d", i+1);
*noutdevs = ndev;
}
--- 229,233 ----
ndev = maxndev;
for (i = 0; i < ndev; i++)
! sprintf(outdevlist + i * devdescsize, "ALSA MIDI device #%d", i+1);
*noutdevs = ndev;
}