Re: i810 audio patch

Doug Ledford (dledford@redhat.com)
Tue, 04 Dec 2001 18:09:10 -0500


Nathan Bryant wrote:

> Nathan Bryant wrote:
>
>> 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?

Yes, on underrun the DAC is stopped and dmabuf->enable is cleared.
That's clearly a bug in this case. However, it should only cause your
problem if you are in fact getting an underrun. Anyway, here's a
proposed fix you can try to see if that's what's causing the problem:

> --
>
> 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) {

if (file->f_mode & FMODE_READ && ((dmabuf->enable & ADC_RUNNING)
|| (dmabuf->trigger &
PCM_ENABLE_INPUT))) {

> 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) {

if (file->f_mode & FMODE_WRITE &&((dmabuf->enable & DAC_RUNNING)
|| (dmabuf->trigger &
PCM_ENABLE_OUTPUT))) {

> count = i810_get_free_write_space(state);
> if (count >= (signed)dmabuf->userfragsize)
> mask |= POLLOUT | POLLWRNORM;
> }
> spin_unlock_irqrestore(&state->card->lock, flags);
> return mask;
> }
>

-- 

Doug Ledford <dledford@redhat.com> http://people.redhat.com/dledford Please check my web site for aic7xxx updates/answers before e-mailing me about problems

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/