// // 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) // Filename: ...sig/maint/code/control/Sequencer_alsa.cpp // Web Address: http://sig.sapp.org/src/sig/Sequencer_alsa.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(ALSA) #include "Collection.h" #include #include #include #include #include #include #include #include /* for reading filename for MIDI info */ #include "Sequencer_alsa.h" typedef unsigned char uchar; // define static variables: int Sequencer_alsa::class_count = 0; int Sequencer_alsa::initialized = 0; // static variables for MIDI I/O information database int Sequencer_alsa::indevcount = 0; int Sequencer_alsa::outdevcount = 0; Collection Sequencer_alsa::rawmidi_in; Collection Sequencer_alsa::rawmidi_out; Collection Sequencer_alsa::midiincard; Collection Sequencer_alsa::midioutcard; Collection Sequencer_alsa::midiindevice; Collection Sequencer_alsa::midioutdevice; Collection Sequencer_alsa::midiinname; Collection Sequencer_alsa::midioutname; /////////////////////////////// // // Sequencer_alsa::Sequencer_alsa -- // default value: autoOpen = 1; // Sequencer_alsa::Sequencer_alsa(int autoOpen) { if (class_count < 0) { std::cerr << "Unusual class instantiation count: " << class_count << std::endl; exit(1); } else if (class_count == 0) { buildInfoDatabase(); } // will not autoOpen class_count++; } ////////////////////////////// // // Sequencer_alsa::~Sequencer_alsa -- // Sequencer_alsa::~Sequencer_alsa() { if (class_count == 1) { close(); removeInfoDatabase(); } else if (class_count <= 0) { std::cerr << "Unusual class instantiation count: " << class_count << std::endl; exit(1); } class_count--; } ////////////////////////////// // // Sequencer_alsa::close -- close the sequencer device. The device // automatically closes once the program ends. // void Sequencer_alsa::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_alsa::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_alsa::displayInputs -- display a list of the // available MIDI input devices. // default values: out = std::cout, initial = "\t" // void Sequencer_alsa::displayInputs(std::ostream& out, char* initial) { for (int i=0; i& cards, Collection& devices) { cards.setSize(0); devices.setSize(0); cards.allowGrowth(1); devices.allowGrowth(1); DIR* dir = opendir("/dev/snd"); if (dir == NULL) { // std::cout << "Error determining ALSA MIDI info: no directory called /dev/snd" // << std::endl; // exit(1); } // read each file in the directory and store information if it is a MIDI dev else { 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 ALSA */ // md5sum: 8ccf0e750be06aeea90cdc8a7cc4499c - Sequencer_alsa.cpp =css= 20030102