summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Jonsson <spamatica@gmail.com>2010-07-18 21:33:51 +0000
committerRobert Jonsson <spamatica@gmail.com>2010-07-18 21:33:51 +0000
commit6a65acc8616f159e6ead854ee33571dbdac8fc94 (patch)
treee9c60c1efefd960bab6ff5f269a3f3e5aaa0dd27
parent296d5ed159e36041cd863563c1f53ed812e719da (diff)
improve timer error handling
-rw-r--r--muse/ChangeLog2
-rw-r--r--muse/muse/driver/alsatimer.cpp7
-rw-r--r--muse/muse/driver/dummyaudio.cpp9
-rw-r--r--muse/muse/midiseq.cpp6
4 files changed, 20 insertions, 4 deletions
diff --git a/muse/ChangeLog b/muse/ChangeLog
index d829a6e4..09b431f8 100644
--- a/muse/ChangeLog
+++ b/muse/ChangeLog
@@ -1,3 +1,5 @@
+18.07.2010
+ * Fixed: Handle errors during timer initialization more gracefully (rj)
15.07.2010
* Added: Volume control for audio metronome (rj)
12.07.2010
diff --git a/muse/muse/driver/alsatimer.cpp b/muse/muse/driver/alsatimer.cpp
index 277ecd34..f8294bec 100644
--- a/muse/muse/driver/alsatimer.cpp
+++ b/muse/muse/driver/alsatimer.cpp
@@ -55,7 +55,7 @@
};
int max_ids = sizeof(test_ids) / sizeof(int);
long best_res = LONG_MAX;
- int best_dev = SND_TIMER_GLOBAL_SYSTEM;
+ int best_dev = -1; // SND_TIMER_GLOBAL_SYSTEM;
int i;
if (id || info || params) {
@@ -89,6 +89,9 @@
device = best_dev;
}
+ if(best_dev==-1)
+ return -1; // no working timer found
+
sprintf(timername, "hw:CLASS=%i,SCLASS=%i,CARD=%i,DEV=%i,SUBDEV=%i", devclass, sclass, card, device, subdevice);
if ((err = snd_timer_open(&handle, timername, SND_TIMER_OPEN_NONBLOCK))<0) {
fprintf(stderr, "AlsaTimer::initTimer(): timer open %i (%s)\n", err, snd_strerror(err));
@@ -142,7 +145,7 @@
setTick = (1000000000 / snd_timer_info_get_resolution(info)) / freq;
if (setTick == 0) {
- // return, print error if freq i below 500 (timing will suffer)
+ // return, print error if freq is below 500 (timing will suffer)
if (((1000000000.0 / snd_timer_info_get_resolution(info)) / snd_timer_params_get_ticks(params)) < 500) {
fprintf(stderr,"AlsaTimer::setTimerTicks(): requested freq %u Hz too high for timer (max is %g)\n",
freq, 1000000000.0 / snd_timer_info_get_resolution(info));
diff --git a/muse/muse/driver/dummyaudio.cpp b/muse/muse/driver/dummyaudio.cpp
index 54b1609f..d7c2e127 100644
--- a/muse/muse/driver/dummyaudio.cpp
+++ b/muse/muse/driver/dummyaudio.cpp
@@ -260,10 +260,15 @@ static void* dummyLoop(void* ptr)
unsigned int tickRate = sampleRate / segmentSize;
AlsaTimer timer;
- fprintf(stderr, "Finding best alsa timer for dummy driver:\n");
+ fprintf(stderr, "Get alsa timer for dummy driver:\n");
timer.setFindBestTimer(false);
int fd = timer.initTimer();
-
+ if (fd==-1) {
+ QMessageBox::critical( 0, /*tr*/(QString("Failed to start timer for dummy audio driver!")),
+ /*tr*/(QString("No functional timer was available.\n"
+ "Alsa timer not available, check if module snd_timer is available and /dev/snd/timer is available")));
+ }
+
/* Depending on nature of the timer, the requested tickRate might not
* be available. The return value is the nearest available frequency,
* so use this to reset our dummpy sampleRate to keep everything
diff --git a/muse/muse/midiseq.cpp b/muse/muse/midiseq.cpp
index e5692a6a..7d7dedef 100644
--- a/muse/muse/midiseq.cpp
+++ b/muse/muse/midiseq.cpp
@@ -8,6 +8,8 @@
// (C) Copyright 2003 Werner Schweer (ws@seh.de)
//=========================================================
+#include <qmessagebox.h>
+#include <qobject.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
@@ -273,6 +275,10 @@ signed int MidiSeq::selectTimer()
}
delete timer;
timer=NULL;
+ QMessageBox::critical( 0, /*tr*/(QString("Failed to start timer!")),
+ /*tr*/(QString("No functional timer was available.\n"
+ "RTC timer not available, check if /dev/rtc is available and readable by current user\n"
+ "Alsa timer not available, check if module snd_timer is available and /dev/snd/timer is available")));
printf("No functional timer available!!!\n");
exit(1);
}