20 #include <QReadLocker> 21 #include <QWriteLocker> 90 snd_timer_info_malloc(&m_Info);
99 snd_timer_info_malloc(&m_Info);
100 snd_timer_info_copy(m_Info, other);
109 snd_timer_info_malloc(&m_Info);
110 snd_timer_info_copy(m_Info, other.m_Info);
118 snd_timer_info_free(m_Info);
141 snd_timer_info_copy(m_Info, other.m_Info);
152 return (snd_timer_info_is_slave(m_Info) != 0);
162 return snd_timer_info_get_card(m_Info);
172 return QString(snd_timer_info_get_id(m_Info));
182 return QString(snd_timer_info_get_name(m_Info));
192 return snd_timer_info_get_resolution(m_Info);
205 return 1000000000L / res;
217 return snd_timer_info_sizeof();
228 return snd_timer_info_get_ticks(m_Info);
236 snd_timer_id_malloc(&m_Info);
245 snd_timer_id_malloc(&m_Info);
246 snd_timer_id_copy(m_Info, other);
261 snd_timer_id_malloc(&m_Info);
262 snd_timer_id_copy(m_Info, other.m_Info);
281 snd_timer_id_malloc(&m_Info);
294 snd_timer_id_free(m_Info);
317 snd_timer_id_copy(m_Info, other.m_Info);
340 snd_timer_id_set_class(m_Info, devclass);
351 return snd_timer_id_get_class(m_Info);
361 snd_timer_id_set_sclass(m_Info, devsclass);
371 return snd_timer_id_get_sclass(m_Info);
381 snd_timer_id_set_card(m_Info, card);
391 return snd_timer_id_get_card(m_Info);
401 snd_timer_id_set_device(m_Info, device);
411 return snd_timer_id_get_device(m_Info);
421 snd_timer_id_set_subdevice (m_Info, subdevice);
431 return snd_timer_id_get_subdevice(m_Info);
441 return snd_timer_id_sizeof();
452 deviceName.toLocal8Bit().data(),
467 deviceName.toLocal8Bit().data(),
478 snd_timer_query_close(m_Info);
488 snd_timer_id_set_class(tid.m_Info, SND_TIMER_CLASS_NONE);
491 int rc = snd_timer_query_next_device(m_Info, tid.m_Info);
492 if ((rc < 0) || (tid.
getClass() < 0)) {
495 m_timers.append(tid);
515 snd_timer_query_info(m_Info, m_GlobalInfo.m_Info);
526 snd_timer_query_params(m_Info, params);
536 snd_timer_query_params(m_Info, params);
546 snd_timer_query_status(m_Info, status);
554 snd_timer_ginfo_malloc(&m_Info);
563 snd_timer_ginfo_malloc(&m_Info);
564 snd_timer_ginfo_copy(m_Info, other);
573 snd_timer_ginfo_malloc(&m_Info);
574 snd_timer_ginfo_copy(m_Info, other.m_Info);
582 snd_timer_ginfo_free(m_Info);
605 snd_timer_ginfo_copy(m_Info, other.m_Info);
617 snd_timer_ginfo_set_tid (m_Info, m_Id.m_Info);
627 m_Id =
TimerId(snd_timer_ginfo_get_tid (m_Info));
638 return snd_timer_ginfo_get_flags (m_Info);
648 return snd_timer_ginfo_get_card (m_Info);
658 return QString(snd_timer_ginfo_get_id (m_Info));
668 return QString(snd_timer_ginfo_get_name (m_Info));
678 return snd_timer_ginfo_get_resolution (m_Info);
688 return snd_timer_ginfo_get_resolution_min (m_Info);
698 return snd_timer_ginfo_get_resolution_max(m_Info);
708 return snd_timer_ginfo_get_clients(m_Info);
718 return snd_timer_ginfo_sizeof();
726 snd_timer_params_malloc (&m_Info);
735 snd_timer_params_malloc (&m_Info);
736 snd_timer_params_copy (m_Info, other);
745 snd_timer_params_malloc (&m_Info);
746 snd_timer_params_copy (m_Info, other.m_Info);
755 snd_timer_params_free (m_Info);
778 snd_timer_params_copy (m_Info, other.m_Info);
789 snd_timer_params_set_auto_start (m_Info, auto_start ? 1 : 0);
799 return (snd_timer_params_get_auto_start (m_Info) != 0);
809 snd_timer_params_set_exclusive (m_Info, exclusive ? 1 : 0);
819 return (snd_timer_params_get_exclusive (m_Info) != 0);
829 snd_timer_params_set_early_event (m_Info, early_event ? 1 : 0);
839 return (snd_timer_params_get_early_event (m_Info) != 0);
849 snd_timer_params_set_ticks (m_Info, ticks);
859 return snd_timer_params_get_ticks (m_Info);
869 snd_timer_params_set_queue_size (m_Info, queue_size);
879 return snd_timer_params_get_queue_size (m_Info);
889 snd_timer_params_set_filter (m_Info, filter);
899 return snd_timer_params_get_filter (m_Info);
909 return snd_timer_params_sizeof();
917 snd_timer_status_malloc (&m_Info);
926 snd_timer_status_malloc (&m_Info);
927 snd_timer_status_copy (m_Info, other);
936 snd_timer_status_malloc (&m_Info);
937 snd_timer_status_copy (m_Info, other.m_Info);
945 snd_timer_status_free (m_Info);
968 snd_timer_status_copy (m_Info, other.m_Info);
979 return snd_timer_status_get_timestamp (m_Info);
989 return snd_timer_status_get_resolution (m_Info);
999 return snd_timer_status_get_lost (m_Info);
1009 return snd_timer_status_get_overrun (m_Info);
1019 return snd_timer_status_get_queue (m_Info);
1029 return snd_timer_status_sizeof();
1045 m_asyncHandler(nullptr),
1048 m_deviceName(deviceName)
1069 m_asyncHandler(nullptr),
1072 m_deviceName(deviceName)
1075 m_deviceName.toLocal8Bit().data(),
1092 m_asyncHandler(nullptr),
1096 m_deviceName = QString(
"hw:CLASS=%1,SCLASS=%2,CARD=%3,DEV=%4,SUBDEV=%5")
1098 .arg(
id.getSlaveClass())
1100 .arg(
id.getDevice())
1101 .arg(
id.getSubdevice());
1103 m_deviceName.toLocal8Bit().data(),
1123 int openMode,
QObject* parent )
1125 m_asyncHandler(nullptr),
1129 m_deviceName = QString(
"hw:CLASS=%1,SCLASS=%2,CARD=%3,DEV=%4,SUBDEV=%5")
1136 m_deviceName.toLocal8Bit().data(),
1146 if (m_thread !=
nullptr)
1169 return snd_async_handler_get_timer(m_asyncHandler);
1179 return snd_timer_poll_descriptors_count(m_Info);
1212 snd_timer_info (m_Info, m_TimerInfo.m_Info);
1234 return m_TimerStatus;
1273 return snd_timer_read(m_Info, buffer, size);
1287 snd_timer_tread_t tr;
1288 while (
read(&tr,
sizeof(tr)) ==
sizeof(tr) ) {
1289 int msecs = ((tr.tstamp.tv_sec - m_last_time.tv_sec) * 1000) +
1290 round((tr.tstamp.tv_nsec - m_last_time.tv_nsec) / 1000000.0);
1291 m_last_time = tr.tstamp;
1292 if ( m_handler !=
nullptr )
1305 if (m_thread ==
nullptr) {
1306 m_thread =
new TimerInputThread(
this, 500);
1317 if (m_thread !=
nullptr) {
1319 while (!m_thread->wait(500) && (counter < 10)) {
1322 if (!m_thread->isFinished()) {
1323 m_thread->terminate();
1340 snd_timer_info_t* info;
1341 long res, best_res = LONG_MAX;
1344 SND_TIMER_GLOBAL_SYSTEM
1345 , SND_TIMER_GLOBAL_RTC
1346 #ifdef SND_TIMER_GLOBAL_HPET 1347 , SND_TIMER_GLOBAL_HPET
1349 #ifdef SND_TIMER_GLOBAL_HRTIMER 1350 , SND_TIMER_GLOBAL_HRTIMER
1353 int max_global_timers =
sizeof(test_devs)/
sizeof(
int);
1354 int clas = SND_TIMER_CLASS_GLOBAL;
1355 int scls = SND_TIMER_SCLASS_NONE;
1357 int dev = SND_TIMER_GLOBAL_SYSTEM;
1362 snd_timer_info_alloca(&info);
1365 id.setSlaveClass(scls);
1368 id.setSubdevice(sdev);
1370 for( i = 0; i < max_global_timers; ++i )
1373 sprintf( timername,
"hw:CLASS=%i,SCLASS=%i,CARD=%i,DEV=%i,SUBDEV=%i",
1374 clas, scls, card, dev, sdev );
1375 err = snd_timer_open(&timer, timername, SND_TIMER_OPEN_NONBLOCK);
1376 if (err < 0)
continue;
1377 err = snd_timer_info(timer, info);
1379 is_slave = snd_timer_info_is_slave(info);
1380 res = snd_timer_info_get_resolution(info);
1381 if ((is_slave == 0) && (best_res > res)) {
1386 snd_timer_close(timer);
1402 return new Timer(
id, openMode, parent);
1409 Timer::TimerInputThread::run()
1413 if (m_timer ==
nullptr)
return;
1415 count = m_timer->getPollDescriptorsCount();
1416 fds = (pollfd *) calloc(count,
sizeof(
struct pollfd));
1417 if (fds ==
nullptr) {
1418 qWarning() <<
"allocation error!";
1421 fds->events = POLLIN;
1425 while (!stopped() && (m_timer !=
nullptr)) {
1426 m_timer->pollDescriptors(fds, count);
1427 if ((err = poll(fds, count, m_Wait)) < 0) {
1428 qWarning() <<
"poll error " << err <<
"(" << strerror(err) <<
")";
1433 qWarning() <<
"timer time out";
1437 m_timer->doEvents();
1440 qWarning() <<
"exception in input thread";
1450 Timer::TimerInputThread::stopped()
1452 QReadLocker locker(&m_mutex);
1460 Timer::TimerInputThread::stop()
1462 QWriteLocker locker(&m_mutex);
int getPollDescriptorsCount()
Gets the count of poll descriptors.
Error checking functions and macros.
TimerId * clone()
Copy the object.
ALSA Timer parameters container.
Timer(int cls, int scls, int card, int dev, int sdev, int openMode, QObject *parent=nullptr)
Constructor.
void stopEvents()
Stops the events dispatching thread.
TimerInfo * clone()
Copy the current object.
int getSizeOfInfo() const
Gets the size of the ALSA timer global info object.
QString getName()
Gets the timer name.
virtual ~TimerStatus()
Destructor.
long getResolution()
Gets the resolution in us.
virtual ~Timer()
Destructor.
long getQueueSize()
Gets the queue size.
Q_DECL_DEPRECATED long getTicks()
Gets the maximum timer ticks.
virtual ~TimerId()
Destructor.
long getFrequency()
Gets the timer frequency in Hz.
long getResolution()
Gets the timer resolution (timer period in nanoseconds)
unsigned long getResolution()
Gets the timer resolution in ns.
void setDevice(int device)
Sets the device number.
TimerId & operator=(const TimerId &other)
Assignment operator.
#define DRUMSTICK_ALSA_CHECK_WARNING(x)
This macro calls the check warning function.
TimerStatus * clone()
Copy the current object.
TimerGlobalInfo & operator=(const TimerGlobalInfo &other)
Assignment operator.
virtual ~TimerGlobalInfo()
Destructor.
The QObject class is the base class of all Qt objects.
void setClass(int devclass)
Set the class identifier.
int getDevice()
Gets the device number.
unsigned int getFilter()
Gets the event filter.
TimerGlobalInfo()
Default constructor.
QString getId()
Gets the timer ID string.
Classes managing ALSA Timers.
void getGlobalParams(snd_timer_gparams_t *params)
Gets the global timer parameters.
long getOverrun()
Gets the overrun count.
long getLost()
Gets the master tick lost count.
long getQueue()
Gets the count of used queue elements.
void doEvents()
Internal function to deliver the timer events using one of the two available methods: ...
void setExclusive(bool exclusive)
Sets the exclusive flag.
int getSizeOfInfo() const
Gets the size of the ALSA timer info object.
TimerGlobalInfo * clone()
Copy the current object.
void setSlaveClass(int devsclass)
Sets the Slave class.
int getSizeOfInfo() const
Gets the size of the ALSA timer ID object.
bool isSlave()
Check if the timer is slave (depends on another device)
unsigned int getClients()
Gets current timer clients.
TimerStatus & operator=(const TimerStatus &other)
Assignment operator.
void continueRunning()
Continue rolling the timer.
void readTimers()
Enumerate the available timers storing the results into an internal list.
int getSizeOfInfo() const
Gets the size of the ALSA timer status object.
int getSlaveClass()
Gets the slave class.
void setTimerId(const TimerId &tid)
Sets the timer identifier.
void setTimerParams(const TimerParams ¶ms)
Sets the timer parameters.
void setCard(int card)
Sets the card number.
unsigned long getMaxResolution()
Gets timer maximal resolution in ns.
TimerGlobalInfo & getGlobalInfo()
Get a TimerGlobalInfo object.
bool getExclusive()
Gets the timer's exclusive flag.
snd_timer_t * getTimerHandle()
Gets the ALSA timer handle.
void getGlobalStatus(snd_timer_gstatus_t *status)
Gets the global timer status.
int getCard()
Gets the card number.
void setTicks(long ticks)
Sets the timer ticks.
Global timer information container.
ALSA Timer identifier container.
TimerParams()
Default constructor.
QString getId()
Gets the string identifier.
virtual void handleTimerEvent(int ticks, int msecs)=0
Timer event handler.
void timerExpired(int ticks, int msecs)
This signal is emitted when the timer has expired, if there is not an event hander installed...
static Timer * bestGlobalTimer(int openMode, QObject *parent=nullptr)
Check and return the best available global Timer in the system, meaning the timer with higher frequen...
snd_htimestamp_t getTimestamp()
Gets the high resolution time-stamp.
virtual ~TimerParams()
Destructor.
long getTicks()
Gets the timer ticks.
TimerParams & operator=(const TimerParams &other)
Assignment operator.
void freeTimers()
Release the internal list of timers.
ALSA Timer information container.
TimerInfo & getTimerInfo()
Gets the timer info object.
unsigned long getMinResolution()
Gets timer minimal resolution in ns.
TimerParams * clone()
Copy the current object.
void setFilter(unsigned int filter)
Sets the event filter.
virtual ~TimerInfo()
Destructor.
void setEarlyEvent(bool early_event)
Sets the timer early event.
int getSubdevice()
Gets the subdevice number.
void pollDescriptors(struct pollfd *pfds, unsigned int space)
Gets poll descriptors.
TimerId & getTimerId()
Gets the timer identifier.
void setQueueSize(long queue_size)
Sets the queue size (32-1024)
int getCard()
Gets the card number.
bool getAutoStart()
Gets the automatic start flag.
void startEvents()
Starts the events dispatching thread.
void setSubdevice(int subdevice)
Sets the subdevice number.
unsigned int getFlags()
Gets the flags.
TimerInfo & operator=(const TimerInfo &other)
Assignment operator.
virtual ~TimerQuery()
Destructor.
void setGlobalParams(snd_timer_gparams_t *params)
Sets the global parameters.
void addAsyncTimerHandler(snd_async_callback_t callback, void *private_data)
Adds an asynchronous timer handler function.
int getSizeOfInfo() const
Gets the size of the ALSA timer parameters object.
void stop()
Stop rolling the timer.
void start()
Start rolling the timer.
TimerStatus()
Default constructor.
int getClass()
Gets the class identifier.
ALSA Timer status container.
void setAutoStart(bool auto_start)
Sets the automatic start flag.
QString getName()
Gets the timer name.
TimerQuery(const QString &deviceName, int openMode)
Constructor.
static TimerId bestGlobalTimerId()
Check and return the best available global TimerId in the system, meaning the timer with higher frequ...
int getCard()
Gets the card number.
bool getEarlyEvent()
Gets the timer early event.
TimerStatus & getTimerStatus()
Gets the timer status.
ssize_t read(void *buffer, size_t size)
Read bytes from the timer handle.
void pollDescriptorsRevents(struct pollfd *pfds, unsigned int nfds, unsigned short *revents)
Gets returned events from poll descriptors.
#define DRUMSTICK_ALSA_CHECK_ERROR(x)
This macro calls the check error function.