[ALSA] seq-timer: restrict timer frequencies
Modules: ALSA sequencer When no default timer frequency has been set, initialize_timer() just uses the maximum frequency supported by the timer, which is ridiculously high on 96 kHz timers. This patch introduces a default frequency of 1000 Hz for this case, and makes sure that a frequency set by the user isn't too high. Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
This commit is contained in:
committed by
Jaroslav Kysela
parent
051b516533
commit
87ef7779be
@@ -34,6 +34,11 @@ extern int seq_default_timer_device;
|
|||||||
extern int seq_default_timer_subdevice;
|
extern int seq_default_timer_subdevice;
|
||||||
extern int seq_default_timer_resolution;
|
extern int seq_default_timer_resolution;
|
||||||
|
|
||||||
|
/* allowed sequencer timer frequencies, in Hz */
|
||||||
|
#define MIN_FREQUENCY 10
|
||||||
|
#define MAX_FREQUENCY 6250
|
||||||
|
#define DEFAULT_FREQUENCY 1000
|
||||||
|
|
||||||
#define SKEW_BASE 0x10000 /* 16bit shift */
|
#define SKEW_BASE 0x10000 /* 16bit shift */
|
||||||
|
|
||||||
static void snd_seq_timer_set_tick_resolution(seq_timer_tick_t *tick,
|
static void snd_seq_timer_set_tick_resolution(seq_timer_tick_t *tick,
|
||||||
@@ -325,17 +330,26 @@ int snd_seq_timer_stop(seq_timer_t * tmr)
|
|||||||
static int initialize_timer(seq_timer_t *tmr)
|
static int initialize_timer(seq_timer_t *tmr)
|
||||||
{
|
{
|
||||||
snd_timer_t *t;
|
snd_timer_t *t;
|
||||||
|
unsigned long freq;
|
||||||
|
|
||||||
t = tmr->timeri->timer;
|
t = tmr->timeri->timer;
|
||||||
snd_assert(t, return -EINVAL);
|
snd_assert(t, return -EINVAL);
|
||||||
|
|
||||||
|
freq = tmr->preferred_resolution;
|
||||||
|
if (!freq)
|
||||||
|
freq = DEFAULT_FREQUENCY;
|
||||||
|
else if (freq < MIN_FREQUENCY)
|
||||||
|
freq = MIN_FREQUENCY;
|
||||||
|
else if (freq > MAX_FREQUENCY)
|
||||||
|
freq = MAX_FREQUENCY;
|
||||||
|
|
||||||
tmr->ticks = 1;
|
tmr->ticks = 1;
|
||||||
if (tmr->preferred_resolution &&
|
if (!(t->hw.flags & SNDRV_TIMER_HW_SLAVE)) {
|
||||||
! (t->hw.flags & SNDRV_TIMER_HW_SLAVE)) {
|
|
||||||
unsigned long r = t->hw.resolution;
|
unsigned long r = t->hw.resolution;
|
||||||
if (! r && t->hw.c_resolution)
|
if (! r && t->hw.c_resolution)
|
||||||
r = t->hw.c_resolution(t);
|
r = t->hw.c_resolution(t);
|
||||||
if (r) {
|
if (r) {
|
||||||
tmr->ticks = (unsigned int)(1000000000uL / (r * tmr->preferred_resolution));
|
tmr->ticks = (unsigned int)(1000000000uL / (r * freq));
|
||||||
if (! tmr->ticks)
|
if (! tmr->ticks)
|
||||||
tmr->ticks = 1;
|
tmr->ticks = 1;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user