Prints information about the ALSA sequencer subsystem.
#include <QCommandLineParser>
#include <QStringList>
#include <QTextStream>
#include <QIODevice>
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
#define right Qt::right
#define left Qt::left
#define endl Qt::endl
#define hex Qt::hex
#define dec Qt::dec
#endif
QString PGM_NAME = QStringLiteral("drumstick-sysinfo");
QString PGM_DESCRIPTION = QStringLiteral("ALSA Sequencer System Info");
QTextStream cout(stdout, QIODevice::WriteOnly);
QTextStream cerr(stderr, QIODevice::WriteOnly);
void queryTimers()
{
cout << endl << "ALSA Timers" << endl;
cout << "type___ Name________________ c/s/C/D/S Freq." << endl;
TimerIdList::ConstIterator it;
for( it = lst.constBegin(); it != lst.constEnd(); ++it )
{
try {
Timer* timer =
new Timer(
id, SND_TIMER_OPEN_NONBLOCK);
cout << qSetFieldWidth(8) << left << info.
getId()
<< qSetFieldWidth(20) << left << info.
getName().leftJustified(20,
' ',
true)
<< qSetFieldWidth(0) << " "
<< id.getClass() << "/" << id.getSlaveClass() << "/"
<< id.getCard() << "/" << id.getDevice() << "/"
<< id.getSubdevice() << " ";
cout << "SLAVE";
} else {
cout << freq << " Hz";
}
cout << endl;
delete timer;
cerr <<
"Error opening timer:" << err.
qstrError();
}
}
delete query;
}
{
cout << endl << "ALSA Queues" << endl;
cout << "id Queue_Name__________ Timer_Name__________ owner status "
<< " state PPQ Tempo BPM Ticks Time" << endl;
foreach( int q, queues ) {
if (queue != nullptr) {
QString tname;
try {
Timer* timer =
new Timer(tid, SND_TIMER_OPEN_NONBLOCK);
delete timer;
} catch (...) {
tname = "inaccessible";
}
cout << qSetFieldWidth(3) << left << qinfo.
getId()
<< qSetFieldWidth(20) << qinfo.
getName().leftJustified(20,
' ',
true)
<< qSetFieldWidth(0) << " "
<< qSetFieldWidth(20) << tname.leftJustified(20, ' ', true)
<< qSetFieldWidth(6) << right << qinfo.
getOwner()
<< qSetFieldWidth(7) << (qinfo.
isLocked() ?
"locked" :
"free")
<< qSetFieldWidth(8) << (qsts.
isRunning() ?
"running" :
"stopped")
<< qSetFieldWidth(4) << qtmp.
getPPQ()
<< endl;
delete queue;
}
}
}
QString clientTypeName(snd_seq_client_type_t ctype)
{
if (ctype == SND_SEQ_USER_CLIENT)
return "User";
if (ctype == SND_SEQ_KERNEL_CLIENT)
return "Kernel";
return "Unknown";
}
QString portTypeNames(int ptype)
{
QStringList lst;
if ((ptype & SND_SEQ_PORT_TYPE_HARDWARE) != 0)
lst << "Hardware";
if ((ptype & SND_SEQ_PORT_TYPE_SOFTWARE) != 0)
lst << "Software";
if ((ptype & SND_SEQ_PORT_TYPE_PORT) != 0)
lst << "Port";
if ((ptype & SND_SEQ_PORT_TYPE_DIRECT_SAMPLE) != 0)
lst << "Direct Sample";
if ((ptype & SND_SEQ_PORT_TYPE_MIDI_GENERIC) != 0)
lst << "MIDI Generic";
if ((ptype & SND_SEQ_PORT_TYPE_MIDI_GM) != 0)
lst << "GM";
if ((ptype & SND_SEQ_PORT_TYPE_MIDI_GM2) != 0)
lst << "GM2";
if ((ptype & SND_SEQ_PORT_TYPE_MIDI_GS) != 0)
lst << "GS";
if ((ptype & SND_SEQ_PORT_TYPE_MIDI_MT32) != 0)
lst << "MT32";
if ((ptype & SND_SEQ_PORT_TYPE_MIDI_XG) != 0)
lst << "XG";
if ((ptype & SND_SEQ_PORT_TYPE_SAMPLE) != 0)
lst << "Sample";
if ((ptype & SND_SEQ_PORT_TYPE_SPECIFIC) != 0)
lst << "Specific";
if ((ptype & SND_SEQ_PORT_TYPE_SYNTH) != 0)
lst << "Synth";
if ((ptype & SND_SEQ_PORT_TYPE_APPLICATION) != 0)
lst << "Application";
if ((ptype & SND_SEQ_PORT_TYPE_SYNTHESIZER) != 0)
lst << "Synthesizer";
return " (" + lst.join(", ") + ")";
}
{
QStringList lst;
QString sname = QString(
"%1:%2").arg(
static_cast<int>(s.
getAddr()->client))
.arg(
static_cast<int>(s.
getAddr()->port));
lst << sname;
}
return lst.join(", ");
}
{
cout << endl << "ALSA Sequencer clients" << endl;
cout <<
"Client " << qSetFieldWidth(4) << left << cinfo.
getClientId()
<< qSetFieldWidth(0) <<
" : \"" << cinfo.
getName() <<
"\" ["
<< "]" << endl;
cout <<
" Port " << qSetFieldWidth(4) << right << pinfo.
getPort()
<< qSetFieldWidth(0) <<
" : \"" << pinfo.
getName() <<
"\""
<< endl;
if ( from.count() > 0 )
cout << " Connected From: " << subsNames(from) << endl;
if ( to.count() > 0 )
cout << " Connecting To: " << subsNames(to) << endl;
}
}
}
void systemInfo()
{
cout << PGM_DESCRIPTION << ", version: "<< QStringLiteral(QT_STRINGIFY(VERSION)) << endl;
cout << "Runtime ALSA library: "
<< getRuntimeALSALibraryVersion() << endl;
cout << "Runtime ALSA drivers: "
cout << "Numeric ALSA compiled library: "
<< hex << SND_LIB_VERSION << endl;
cout << "Numeric ALSA runtime library: "
<< getRuntimeALSALibraryNumber() << endl;
cout << "Numeric ALSA runtime driver: "
queryTimers();
queryQueues(client);
queryClients(client);
delete client;
}
int main(int argc, char **argv)
{
const QString ERRORSTR = QStringLiteral("Fatal error from the ALSA sequencer. "
"This usually happens when the kernel doesn't have ALSA support, "
"or the device node (/dev/snd/seq) doesn't exists, "
"or the kernel module (snd_seq) is not loaded. "
"Please check your ALSA/MIDI configuration.");
QCoreApplication app(argc, argv);
QCoreApplication::setApplicationName(PGM_NAME);
QCoreApplication::setApplicationVersion(QStringLiteral(QT_STRINGIFY(VERSION)));
QCommandLineParser parser;
parser.setApplicationDescription(PGM_DESCRIPTION);
auto helpOption = parser.addHelpOption();
auto versionOption = parser.addVersionOption();
parser.process(app);
if (parser.isSet(versionOption) || parser.isSet(helpOption)) {
return 0;
}
try {
systemInfo();
cerr << ERRORSTR <<
" Returned error was: " << ex.
qstrError() << endl;
} catch (...) {
cerr << ERRORSTR << endl;
}
return 0;
}
Classes managing ALSA Sequencer clients.
Classes managing ALSA Sequencer queues.
Classes managing ALSA Timers.
QueueTimer & getTimer()
Gets a QueueTimer object reference.
QueueStatus & getStatus()
Gets a QueueStatus object reference.
QueueInfo & getInfo()
Gets a QueueInfo object reference.
QueueTempo & getTempo()
Gets a QueueTempo object reference.
Port information container.
unsigned int getType()
Gets the port type.
SubscribersList getReadSubscribers() const
Gets the list of read subscribers.
int getPort()
Gets the port number.
QString getName()
Gets the port name.
SubscribersList getWriteSubscribers() const
Gets the list of write subscribers.
Queue information container.
bool isLocked()
Returns the locking status of the queue.
int getOwner()
Gets the owner's client id of the queue.
int getId()
Gets the queue's numeric identifier.
QString getName()
Gets the queue name.
bool isRunning()
Gets the queue's running state.
snd_seq_tick_time_t getTickTime()
Gets the musical time (ticks) of the queue.
double getClockTime()
Gets the clock time in seconds of the queue.
float getRealBPM()
Gets the queue's real BPM tempo in beats per minute.
float getNominalBPM()
Gets the queue's nominal BPM tempo (in beats per minute)
int getPPQ()
Gets the PPQ (parts per quarter note) resolution of the queue.
const snd_timer_id_t * getId()
Gets the timer identifier record.
Exception class for ALSA Sequencer errors.
Subscriber container class.
const snd_seq_addr_t * getAddr()
Gets the subscriber's address.
ALSA Timer identifier container.
ALSA Timer information container.
bool isSlave()
Check if the timer is slave (depends on another device)
QString getId()
Gets the string identifier.
QString getName()
Gets the timer name.
long getFrequency()
Gets the timer frequency in Hz.
ALSA Timer inquiry helper.
TimerIdList getTimers() const
Gets the list of available timers.
TimerInfo & getTimerInfo()
Gets the timer info object.
int getMaxQueues()
Get the system's maximum number of queues.
int getCurrentQueues()
Get the system's current number of queues.
int getMaxPorts()
Get the system's maximum number of ports.
int getMaxChannels()
Get the system's maximum number of channels.
SystemInfo & getSystemInfo()
Gets a SystemInfo instance with the updated state of the system.
snd_seq_client_type_t getClientType()
Gets the client's type.
int getRuntimeALSADriverNumber()
Gets the runtime ALSA drivers version number.
QList< int > getAvailableQueues()
Get a list of the existing queues.
void setClientName(QString const &newName)
Changes the public name of the ALSA sequencer client.
QList< ClientInfo > ClientInfoList
List of sequencer client information.
int getCurrentClients()
Get the system's current number of clients.
ClientInfoList getAvailableClients()
Gets the list of clients from the ALSA sequencer.
QString getRuntimeALSADriverVersion()
Gets the runtime ALSA drivers version string.
QString getName()
Gets the client's name.
int getClientId()
Gets the client's numeric identifier.
QString getCompiledALSALibraryVersion()
ALSA library version at build time.
void open(const QString deviceName="default", const int openMode=SND_SEQ_OPEN_DUPLEX, const bool blockMode=false)
Open the sequencer device.
int getMaxClients()
Get the system's maximum number of clients.
PortInfoList getPorts() const
Gets the ports list.
QString qstrError() const
Gets the human readable error message from the error code.
QList< PortInfo > PortInfoList
List of port information objects.
QList< Subscriber > SubscribersList
List of subscribers.
QList< TimerId > TimerIdList
List of timer identifiers.
Drumstick ALSA library wrapper.
SequencerError Exception class.
Classes managing ALSA sequencer subscriptions.