RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : UniAudio дрова для es1370


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : Дмитрий Барамзин
To : Alexey Smirnov
Subj : UniAudio дрова для es1370

Попробуй поправить обработчик прерываний в alsa/pci/ens1370.c

/*
* Interrupt handler
*/

static void snd_audiopci_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
ensoniq_t *ensoniq = snd_magic_cast(ensoniq_t, dev_id, return);
unsigned int status, sctrl;

#ifdef TARGET_OS2
int fOurIrq = 0;
#endif
if (ensoniq == NULL)
return;

status = inl(ES_REG(ensoniq, STATUS));
if (!(status & ES_INTR))
return;

#ifdef TARGET_OS2
if(status & (0x8|0x4|0x2|0x1)) fOurIrq = TRUE;
#endif

spin_lock(&ensoniq->reg_lock);
sctrl = ensoniq->sctrl;
if (status & ES_DAC1)
sctrl &= ~ES_P1_INT_EN;
if (status & ES_DAC2)
sctrl &= ~ES_P2_INT_EN;
if (status & ES_ADC)
sctrl &= ~ES_R1_INT_EN;
outl(sctrl, ES_REG(ensoniq, SERIAL));
outl(ensoniq->sctrl, ES_REG(ensoniq, SERIAL));
spin_unlock(&ensoniq->reg_lock);

if (status & ES_UART) {
snd_ensoniq_midi_interrupt(ensoniq);
}
if (status & ES_DAC2) {
snd_pcm_period_elapsed(ensoniq->playback2_substream);
}
if (status & ES_ADC) {
snd_pcm_period_elapsed(ensoniq->capture_substream);
}
if (status & ES_DAC1) {
snd_pcm_period_elapsed(ensoniq->playback1_substream);
}

Это, насколько я понимаю, важно
#ifdef TARGET_OS2
if (fOurIrq) {
eoi_irq(irq);
}
#endif //TARGET_OS2

}

и еще попробуй следующее:
в alsa/core/pcm_lib.c в функции snd_interval_refine сделай также

/* r <- v */
int snd_interval_refine(snd_interval_t *i, const snd_interval_t *v)
{
int changed = 0;
assert(!snd_interval_empty(i));
if (i->min < v->min) {
i->min = v->min;
i->openmin = v->openmin;
changed = 1;
} else if (i->min == v->min && !i->openmin && v->openmin) {
i->openmin = 1;
changed = 1;
}
if (i->max > v->max) {
i->max = v->max;
i->openmax = v->openmax;
changed = 1;
} else if (i->max == v->max && !i->openmax && v->openmax) {
i->openmax = 1;
changed = 1;
}
if (!i->integer && v->integer) {
i->integer = 1;
changed = 1;
}
if (i->integer) {
if (i->openmin) {
// i->min++;
i->openmin = 0;
}
if (i->openmax) {
// i->max--;
i->openmax = 0;
}
} else if (!i->openmin && !i->openmax && i->min == i->max)
i->integer = 1;
if (snd_interval_checkempty(i)) {
snd_interval_none(i);
return -EINVAL;
}
return changed;
}

без этих изменений у меня карточка( CT5880 ) тоже не пела.



Wed 08 Jan 2003 11:05 Mozilla/5.0 (OS/2; U; Warp 4.5; en-US; rv:1.1b) Gecko/200207




Programmed by Dmitri Maximovich, Dmitry I. Platonoff, Eugen Kuleshov.
25.09.99 (c) 1999, RU/2. All rights reserved.
Rewritten by Dmitry Ban. All rights ignored.