sound, SB, AC97 и другое

Drivers for sound cards
  • Такого правила нет. В ДОС контроллер прерываний настроен так, что IRQ_0 соответствует INT_8, а IRQ_2 - INT_0x0A. В Колибри IRQ_0 = INT_0x20. Если надо установить обработчик IRQ есть импортируемая AttachIntHandler или attach_int_handler если драйвер в ядре.
    P.S. Часть irq уже занята так что доступны 5,7,9,0xA,0xB.
  • to Serge
    То есть на самом деле для своевременной подгрузки данных нужно ждать поступления соответствующего IRQ? Я об этом подозревал, но недостаток опыта сказался. Однако что делать, если мой PNP BIOS выделяет для SB карточки IRQ_2?
    В каком формате и как передаёт AC97WAV проигрыватель данные драйверу? В существующих драйверах я разобрался, но недостаточно, остались неясными вышеописанные моменты.
  • Плеер не работает непосредственно с драйвером железа. Это делает infinity - системный ресемплер/микшер. При каждом прерывании драйвер вызывает callback функцию которая записывает смикшированный звук в первичный буфер в формате 16 бит стерео 48КГц. Это не очень совместимо с SB потому что у него максимум 44100, но ресемплеры можно настроить на этот формат. За каждое прерывание записывается 16 Кб. Этого достаточно для равномерного проигрывания.
    Irq_2 довольно нестандартный вариант. Стоит посмотреть распределение прерываний в системе. Попробуй назначить прерываение вручную или отключить ненужные порты, особенно usb. В крайнем случае можно и ядро поправить. Это совсем не сложно.
  • to Serge
    Спасибо за информацию. Буду копаться, если не разберусь спрошу ещё.
  • Надо учесть ещё один момент.
    AC97 DMA работает со списками буферов (BDL) аналогично IDE. Первичный буфер в 64 Кб разбит на четыре части по 16 Кб которые проигрываются по-кругу без остановок.
    Когда происходит прерывание данные для буфера который должен воспроизводиться уже полностью готовы и выбираются ДМА немедленно, а микшер производит запись в следующий сегмент. При такой схеме нет щелчков если прерывания надолго замаскированы, а в Колибри такое бывает.
  • to Serge
    У SB это называется auto-init DMA mode. Буфер какого-либо размера разбит на два (в документации это называется наоборот - создан буфер двойного размера), он заполнен данными, которые в цикле проигрываются, пока не сбросят карту или не прервут этот режим соответствующей командой, когда доходит до середины буфера, генерится прерывание, хэндлер которого заполняет первую половину буфера новыми данными, пока воспроизводится вторая. Когда она закончится снова идёт переход к первой половине, генерится прерывание, оповещающие о необходимости записать новые данные в неё, далее процесс повторяется, пока не произойдёт нечто прерывающее этот процесс (смотри выше). Т.е. как я понимаю у AC97 то же, что и у SB, только вместо 2 частей - 4.
  • В общем похоже, только интелловские контроллеры не умеют гонять буферы по кругу. Они работают со списком буферов (BDL) и когда доходят до конца списка останавливаются. Максимум в списке 32 элемента и номер последнего элемента записывается в регистр lvi(last valid index). Чтобы не мудрить с BDL я заполнил его последовательно адресами сегментов 0 1 2 3 0 1 2 3... и после каждого прерывания по кругу обновляю lvi. В принципе можно обойтись и двумя сегментами. Раньше я писал в буфер с запасом, потом выяснил что система успевает обработать прерывания, но схему менять не стал.
  • Ура, товарищи! Материнка ASUS P4P800-E Deluxe, чипсет Intel 865PE, интегрированный звук Realtek ALC850 - Ac97-плеер РАБОТАЕТ!

    С большим удовольствием послушал "Аквариум" под Колибри.

    Всем, всем - ОГРОМНОЕ СПАСИБО!

    Image

    : Входя на форум, в поле "Логин", я ввёл "root"... Но потом, призадумавшись, стёр и ввёл-таки своё имя пользователя. :D :D :D
  • Версия драйвера sis.obj на svn не рабочая (по крайней мере у меня), в дистре 0710 (вродебы) и в Колибри AZ от Diamonda также, а в 0700 вполне работоспособная.
    Для последнего драйвера доска выдает чтото типа:

    detect hardvare
    Silicon Integrated Systems
    7012 AC97 controller
    PCI command 00000005
    PCI status 00000290
    codec io base 0000E001
    controller io base 0000E401
    codec mmio base 00000000
    controller mmio base 00000000
    global control 00000002
    global status 00300100
    device not found
    Sound service not loaded
    Sound service not installed

    А для драйвера из 0700:

    detect hardvare
    Silicon Integrated Systems
    7012 AC97 controller
    init codec
    global control 00000002
    global status 00300100
    unknown manufacturer
    unknown chip
    create primary buffer
    service installed

    У меня встроенная звуковуха SiS7012 на материнке SIS 651-M (Чипсеты: SIS650GX B0 Northbridge и SIS962L Southbridge (так в книжке написано))
    Заглянул на огонёк
  • Alver
    Проверь последний SVN и напиши работает или нет. Там какая-то фигня непонятная с кодеком.
  • Serge

    Проверил, теперь работает.
    Заглянул на огонёк
  • Alver

    А что пишет ? Чип кодека определяется ?
  • Serge
    Пишет типа этого:
    detect hardvare
    Silicon Integrated Systems
    7012 AC97 controller
    PCI command 00000005
    PCI status 00000290
    codec io base 0000E001
    controller io base 0000E401
    codec mmio base 00000000
    controller mmio base 00000000
    global control 00000002
    global status 00300100
    unknown codec id 00004961
    create primary buffer ...done
    start play
    Заглянул на огонёк
  • Alver
    Похоже это CMedia 9739, только id чипа читается не полностью. А в Win или другим программами удаётся определить чип ?
  • Who is online

    Users browsing this forum: No registered users and 31 guests