// // Programmer: Craig Stuart Sapp // Creation Date: Thu May 11 21:10:02 PDT 2000 // Last Modified: Sat Oct 13 14:51:43 PDT 2001 (updated for ALSA 0.9 interface) // Last Modified: Thu Jun 24 02:38:04 PDT 2004 (frozen as ALSA 0.9 interface) // Filename: ...sig/maint/code/control/Sequencer_alsa09.cpp // Web Address: http://sig.sapp.org/src/sig/Sequencer_alsa09.cpp // Syntax: C++ // // Description: Basic MIDI input/output functionality for the // Linux ALSA raw midi devices. This class // is inherited by the classes MidiInPort_alsa and // MidiOutPort_alsa. // #if defined(LINUX) && defined(ALSA09) #include "SigCollection.h" #include "Sequencer_alsa09.h" #include #include #include #include #include #include /* for reading filename for MIDI info */ // use the following include for older alsa 0.9: //#include // use the following include for newer alsa 0.9: #include #ifndef OLDCPP #include #else #include #endif typedef unsigned char uchar; // define static variables: int Sequencer_alsa09::class_count = 0; int Sequencer_alsa09::initialized = 0; // static variables for MIDI I/O information database int Sequencer_alsa09::indevcount = 0; int Sequencer_alsa09::outdevcount = 0; SigCollection Sequencer_alsa09::rawmidi_in; SigCollection Sequencer_alsa09::rawmidi_out; SigCollection Sequencer_alsa09::midiincard; SigCollection Sequencer_alsa09::midioutcard; SigCollection Sequencer_alsa09::midiindevice; SigCollection Sequencer_alsa09::midioutdevice; SigCollection Sequencer_alsa09::midiinname; SigCollection Sequencer_alsa09::midioutname; /////////////////////////////// // // Sequencer_alsa09::Sequencer_alsa09 -- // default value: autoOpen = 1; // Sequencer_alsa09::Sequencer_alsa09(int autoOpen) { if (class_count < 0) { cerr << "Unusual class instantiation count: " << class_count << endl; exit(1); } else if (class_count == 0) { buildInfoDatabase(); } // will not autoOpen class_count++; } ////////////////////////////// // // Sequencer_alsa09::~Sequencer_alsa09 -- // Sequencer_alsa09::~Sequencer_alsa09() { if (class_count == 1) { close(); removeInfoDatabase(); } else if (class_count <= 0) { cerr << "Unusual class instantiation count: " << class_count << endl; exit(1); } class_count--; } ////////////////////////////// // // Sequencer_alsa09::close -- close the sequencer device. The device // automatically closes once the program ends. // void Sequencer_alsa09::close(void) { int i; for (i=0; i= rawmidi_in.getSize()) { return; } if (rawmidi_in[index] != NULL) { snd_rawmidi_close(rawmidi_in[index]); rawmidi_in[index] = NULL; } } void Sequencer_alsa09::closeOutput(int index) { if (index < 0 || index >= rawmidi_out.getSize()) { return; } if (rawmidi_out[index] != NULL) { snd_rawmidi_close(rawmidi_out[index]); rawmidi_out[index] = NULL; } } ////////////////////////////// // // Sequencer_alsa09::displayInputs -- display a list of the // available MIDI input devices. // default values: out = cout, initial = "\t" // void Sequencer_alsa09::displayInputs(ostream& out, char* initial) { for (int i=0; i& cards, SigCollection& devices) { cards.setSize(0); devices.setSize(0); cards.allowGrowth(1); devices.allowGrowth(1); DIR* dir = opendir("/dev/snd"); if (dir == NULL) { cout << "Error determining ALSA MIDI info: no directory called /dev/snd" << endl; exit(1); } // read each file in the directory and store information if it is a MIDI dev int card; int device; struct dirent *dinfo; dinfo = readdir(dir); int count; while (dinfo != NULL) { if (strncmp(dinfo->d_name, "midi", 4) == 0) { count = sscanf(dinfo->d_name, "midiC%dD%d", &card, &device); if (count == 2) { cards.append(card); devices.append(device); } } dinfo = readdir(dir); } closedir(dir); cards.allowGrowth(0); devices.allowGrowth(0); } #endif /* LINUX and ALSA09 */ // md5sum: bed039b6889873ecff120cf0e8cfece0 Sequencer_alsa09.cpp [20050403]