227 |
* ioctls |
* ioctls |
228 |
*/ |
*/ |
229 |
int |
int |
230 |
snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, void *arg) |
snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, int __user *arg) |
231 |
{ |
{ |
232 |
int value; |
int value; |
233 |
|
|
234 |
if (cmd == SNDCTL_SEQ_CTRLRATE) { |
if (cmd == SNDCTL_SEQ_CTRLRATE) { |
235 |
debug_printk(("ctrl rate\n")); |
debug_printk(("ctrl rate\n")); |
236 |
/* if *arg == 0, just return the current rate */ |
/* if *arg == 0, just return the current rate */ |
237 |
if (get_user(value, (int *)arg)) |
if (get_user(value, arg)) |
238 |
return -EFAULT; |
return -EFAULT; |
239 |
if (value) |
if (value) |
240 |
return -EINVAL; |
return -EINVAL; |
241 |
value = ((timer->oss_tempo * timer->oss_timebase) + 30) / 60; |
value = ((timer->oss_tempo * timer->oss_timebase) + 30) / 60; |
242 |
return put_user(value, (int *)arg) ? -EFAULT : 0; |
return put_user(value, arg) ? -EFAULT : 0; |
243 |
} |
} |
244 |
|
|
245 |
if (timer->dp->seq_mode == SNDRV_SEQ_OSS_MODE_SYNTH) |
if (timer->dp->seq_mode == SNDRV_SEQ_OSS_MODE_SYNTH) |
257 |
return snd_seq_oss_timer_continue(timer); |
return snd_seq_oss_timer_continue(timer); |
258 |
case SNDCTL_TMR_TEMPO: |
case SNDCTL_TMR_TEMPO: |
259 |
debug_printk(("timer tempo\n")); |
debug_printk(("timer tempo\n")); |
260 |
if (get_user(value, (int *)arg)) |
if (get_user(value, arg)) |
261 |
return -EFAULT; |
return -EFAULT; |
262 |
return snd_seq_oss_timer_tempo(timer, value); |
return snd_seq_oss_timer_tempo(timer, value); |
263 |
case SNDCTL_TMR_TIMEBASE: |
case SNDCTL_TMR_TIMEBASE: |
264 |
debug_printk(("timer timebase\n")); |
debug_printk(("timer timebase\n")); |
265 |
if (get_user(value, (int *)arg)) |
if (get_user(value, arg)) |
266 |
return -EFAULT; |
return -EFAULT; |
267 |
if (value < MIN_OSS_TIMEBASE) |
if (value < MIN_OSS_TIMEBASE) |
268 |
value = MIN_OSS_TIMEBASE; |
value = MIN_OSS_TIMEBASE; |