diff options
author | Miller Puckette <millerpuckette@users.sourceforge.net> | 2005-07-16 01:43:18 +0000 |
---|---|---|
committer | Miller Puckette <millerpuckette@users.sourceforge.net> | 2005-07-16 01:43:18 +0000 |
commit | 4cbd55491dd86ea99e1ea8190a20bd13e0f328ae (patch) | |
tree | 4e85a9ef44fea72ab6fb02bbe22d33af260c936b /pd/src/s_midi.c | |
parent | ad9d49bf213f525d122656fc7dc55287b9ae00f0 (diff) |
fixed bugs, adopted some patches.
svn path=/trunk/; revision=3347
Diffstat (limited to 'pd/src/s_midi.c')
-rw-r--r-- | pd/src/s_midi.c | 141 |
1 files changed, 134 insertions, 7 deletions
diff --git a/pd/src/s_midi.c b/pd/src/s_midi.c index fbab4283..77943121 100644 --- a/pd/src/s_midi.c +++ b/pd/src/s_midi.c @@ -42,6 +42,8 @@ t_midiqelem midi_inqueue[MIDIQSIZE]; int midi_inhead, midi_intail; static double sys_midiinittime; +int sys_midiapi = API_DEFAULT; + /* this is our current estimate for at what "system" real time the current logical time's output should occur. */ static double sys_dactimeminusrealtime; @@ -99,11 +101,24 @@ static double sys_getmidiinrealtime( void) static void sys_putnext( void) { int portno = midi_outqueue[midi_outtail].q_portno; - if (midi_outqueue[midi_outtail].q_onebyte) - sys_putmidibyte(portno, midi_outqueue[midi_outtail].q_byte1); - else sys_putmidimess(portno, midi_outqueue[midi_outtail].q_byte1, - midi_outqueue[midi_outtail].q_byte2, - midi_outqueue[midi_outtail].q_byte3); +#ifdef USEAPI_ALSA + if (sys_midiapi == API_ALSA) + { + if (midi_outqueue[midi_outtail].q_onebyte) + sys_alsa_putmidibyte(portno, midi_outqueue[midi_outtail].q_byte1); + else sys_alsa_putmidimess(portno, midi_outqueue[midi_outtail].q_byte1, + midi_outqueue[midi_outtail].q_byte2, + midi_outqueue[midi_outtail].q_byte3); + } + else +#endif /* ALSA */ + { + if (midi_outqueue[midi_outtail].q_onebyte) + sys_putmidibyte(portno, midi_outqueue[midi_outtail].q_byte1); + else sys_putmidimess(portno, midi_outqueue[midi_outtail].q_byte1, + midi_outqueue[midi_outtail].q_byte2, + midi_outqueue[midi_outtail].q_byte3); + } midi_outtail = (midi_outtail + 1 == MIDIQSIZE ? 0 : midi_outtail + 1); } @@ -441,6 +456,11 @@ void sys_pollmidiqueue( void) post("delay %d", (int)(1000 * (newtime - lasttime))); lasttime = newtime; #endif +#ifdef USEAPI_ALSA + if (sys_midiapi == API_ALSA) + sys_alsa_poll_midi(); + else +#endif /* ALSA */ sys_poll_midi(); /* OS dependent poll for MIDI input */ sys_pollmidioutqueue(); sys_pollmidiinqueue(); @@ -448,6 +468,9 @@ void sys_pollmidiqueue( void) /******************** dialog window and device listing ********************/ +#ifdef USEAPI_ALSA +void midi_alsa_init( void); +#endif #ifdef USEAPI_OSS void midi_oss_init( void); #endif @@ -458,6 +481,21 @@ static int midi_midiindev[MAXMIDIINDEV]; static int midi_nmidioutdev; static int midi_midioutdev[MAXMIDIOUTDEV]; + +void sys_get_midi_apis(char *buf) +{ + int n = 0; + strcpy(buf, "{ "); + sprintf(buf + strlen(buf), "{default-MIDI %d} ", API_DEFAULT); n++; +#ifdef USEAPI_ALSA + sprintf(buf + strlen(buf), "{ALSA-MIDI %d} ", API_ALSA); n++; +#endif + strcat(buf, "}"); + /* then again, if only one API (or none) we don't offer any choice. */ + if (n < 2) + strcpy(buf, "{}"); + +} void sys_get_midi_params(int *pnmidiindev, int *pmidiindev, int *pnmidioutdev, int *pmidioutdev) { @@ -486,13 +524,24 @@ static void sys_save_midi_params( void sys_open_midi(int nmidiindev, int *midiindev, int nmidioutdev, int *midioutdev, int enable) { +#ifdef USEAPI_ALSA + midi_alsa_init(); +#endif #ifdef USEAPI_OSS midi_oss_init(); #endif if (enable) +#ifdef USEAPI_ALSA + if (sys_midiapi == API_ALSA) + sys_alsa_do_open_midi(nmidiindev, midiindev, nmidioutdev, midioutdev); + else +#endif /* ALSA */ sys_do_open_midi(nmidiindev, midiindev, nmidioutdev, midioutdev); sys_save_midi_params(nmidiindev, midiindev, nmidioutdev, midioutdev); + + sys_vgui("set pd_whichmidiapi %d\n", sys_midiapi); + } /* open midi using whatever parameters were last used */ @@ -514,6 +563,12 @@ void sys_listmididevs(void ) char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE]; int nindevs = 0, noutdevs = 0, i; +#ifdef USEAPI_ALSA + if (sys_midiapi == API_ALSA) + midi_alsa_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, + MAXNDEV, DEVDESCSIZE); + else +#endif /* ALSA */ midi_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, MAXNDEV, DEVDESCSIZE); @@ -535,6 +590,50 @@ void sys_listmididevs(void ) } } +void sys_set_midi_api(int which) +{ + sys_midiapi = which; + if (sys_verbose) + post("sys_midiapi %d", sys_midiapi); +} + +void glob_midi_properties(t_pd *dummy, t_floatarg flongform); + +void glob_midi_setapi(void *dummy, t_floatarg f) +{ + int newapi = f; + if (newapi) + { + if (newapi == sys_midiapi) + { + //if (!midi_isopen()) + // s_reopen_midi(); + } + else + { +#ifdef USEAPI_ALSA + if (sys_midiapi == API_ALSA) + sys_alsa_close_midi(); + else +#endif + sys_close_midi(); + sys_midiapi = newapi; + /* bash device params back to default */ + midi_nmidiindev = midi_nmidioutdev = 1; + //midi_midiindev[0] = midi_midioutdev[0] = DEFAULTMIDIDEV; + //midi_midichindev[0] = midi_midichoutdev[0] = SYS_DEFAULTCH; + sys_reopen_midi(); + } + + glob_midi_properties(0, 0); + } + else //if (midi_isopen()) + { + sys_close_midi(); + //midi_state = 0; + } +} + extern t_class *glob_pdobject; /* start an midi settings dialog window */ @@ -589,6 +688,19 @@ void glob_midi_properties(t_pd *dummy, t_floatarg flongform) midioutdev3 = (noutdev > 2 && midioutdev[2]>=0 ? midioutdev[2]+1 : 0); midioutdev4 = (noutdev > 3 && midioutdev[3]>=0 ? midioutdev[3]+1 : 0); +#ifdef USEAPI_ALSA + if (sys_midiapi == API_ALSA) + sprintf(buf, +"pdtk_alsa_midi_dialog %%s \ +%s %d %d %d %d %s %d %d %d %d \ +%d 1\n", + indevliststring, + midiindev1, midiindev2, midiindev3, midiindev4, + outdevliststring, + midioutdev1, midioutdev2, midioutdev3, midioutdev4, + (flongform != 0)); + else +#endif sprintf(buf, "pdtk_midi_dialog %%s \ %s %d %d %d %d %s %d %d %d %d \ @@ -598,6 +710,7 @@ void glob_midi_properties(t_pd *dummy, t_floatarg flongform) outdevliststring, midioutdev1, midioutdev2, midioutdev3, midioutdev4, (flongform != 0)); + gfxstub_deleteforkey(0); gfxstub_new(&glob_pdobject, (void *)glob_midi_properties, buf); } @@ -609,6 +722,7 @@ void glob_midi_dialog(t_pd *dummy, t_symbol *s, int argc, t_atom *argv) int nmidioutdev, midioutdev[MAXMIDIOUTDEV]; int i, nindev, noutdev; int newmidiindev[4], newmidioutdev[4]; + int alsadevin, alsadevout; for (i = 0; i < 4; i++) { @@ -632,7 +746,20 @@ void glob_midi_dialog(t_pd *dummy, t_symbol *s, int argc, t_atom *argv) noutdev++; } } + alsadevin = atom_getintarg(8, argc, argv); + alsadevout = atom_getintarg(9, argc, argv); + +#ifdef USEAPI_ALSA + if (sys_midiapi == API_ALSA) + { + sys_alsa_close_midi(); + sys_open_midi(alsadevin, newmidiindev, alsadevout, newmidioutdev, 1); + } + else +#endif + { + sys_close_midi(); + sys_open_midi(nindev, newmidiindev, noutdev, newmidioutdev, 1); + } - sys_close_midi(); - sys_open_midi(nindev, newmidiindev, noutdev, newmidioutdev, 1); } |