Re: i810 audio patch

Nathan Bryant
2001-12-04T22:49:54Z

> this may be due to an output underrun... or i suppose lost interrupt
> is also possible.
>
> i think it might be wise to use
> get_available_read_data/get_free_write_space from i810_poll instead of
> dmabuf->count directly. i'll try this and see if it works...

No good. I tried the following, thinking that the underrun handling in
get_free_write_space would help, but it does the same thing.

What interrupt do we get upon underrun, are we dropping the
dmabuf->enable or DAC_RUNNING state when that happens?

--

static unsigned int i810_poll(struct file *file, struct
poll_table_struct *wait){
struct i810_state *state = (struct i810_state *)file->private_data;
struct dmabuf *dmabuf = &state->dmabuf;
unsigned long flags;
unsigned int mask = 0;
int count;

if(!dmabuf->ready)
return 0;
poll_wait(file, &dmabuf->wait, wait);
spin_lock_irqsave(&state->card->lock, flags);
if (file->f_mode & FMODE_READ && dmabuf->enable & ADC_RUNNING) {
count = i810_get_available_read_data(state);
if (count >= (signed)dmabuf->userfragsize)
mask |= POLLIN | POLLRDNORM;
}
if (file->f_mode & FMODE_WRITE && dmabuf->enable & DAC_RUNNING) {
count = i810_get_free_write_space(state);
if (count >= (signed)dmabuf->userfragsize)
mask |= POLLOUT | POLLWRNORM;
}
spin_unlock_irqrestore(&state->card->lock, flags);
return mask;
}