sound, SB, AC97 и другое
-
В общем, сел я 31декабря писать драйвер для SB16, благо готовых для DOS достаточно, документация тоже есть. Почти закончил на бумаге(в голове, до блокнота лень тянутся), уже почти готов был реализовывать, но упёрся в очень обидную лажу:How to hook an interrupt in KOS? Not an IRQ, but INT? Для непрерывного воспроизведения нужно hook прерывание по следующеву правилу: (SB IRQ)+8, то есть, например, если SB на IRQ2, то нужно int 0xA. А текущая реализация об этом не подозревает, поэтому имеем щелчки, гудение, и прочий хлам. Если интересно, то прочитанные мной доки ныне здесь: http://www.febr7.narod.ru/sbc_prog.7z
Такого правила нет. В ДОС контроллер прерываний настроен так, что 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.
P.S. Часть irq уже занята так что доступны 5,7,9,0xA,0xB.
to Serge
То есть на самом деле для своевременной подгрузки данных нужно ждать поступления соответствующего IRQ? Я об этом подозревал, но недостаток опыта сказался. Однако что делать, если мой PNP BIOS выделяет для SB карточки IRQ_2?
В каком формате и как передаёт AC97WAV проигрыватель данные драйверу? В существующих драйверах я разобрался, но недостаточно, остались неясными вышеописанные моменты.
То есть на самом деле для своевременной подгрузки данных нужно ждать поступления соответствующего IRQ? Я об этом подозревал, но недостаток опыта сказался. Однако что делать, если мой PNP BIOS выделяет для SB карточки IRQ_2?
В каком формате и как передаёт AC97WAV проигрыватель данные драйверу? В существующих драйверах я разобрался, но недостаточно, остались неясными вышеописанные моменты.
Плеер не работает непосредственно с драйвером железа. Это делает infinity - системный ресемплер/микшер. При каждом прерывании драйвер вызывает callback функцию которая записывает смикшированный звук в первичный буфер в формате 16 бит стерео 48КГц. Это не очень совместимо с SB потому что у него максимум 44100, но ресемплеры можно настроить на этот формат. За каждое прерывание записывается 16 Кб. Этого достаточно для равномерного проигрывания.
Irq_2 довольно нестандартный вариант. Стоит посмотреть распределение прерываний в системе. Попробуй назначить прерываение вручную или отключить ненужные порты, особенно usb. В крайнем случае можно и ядро поправить. Это совсем не сложно.
Irq_2 довольно нестандартный вариант. Стоит посмотреть распределение прерываний в системе. Попробуй назначить прерываение вручную или отключить ненужные порты, особенно usb. В крайнем случае можно и ядро поправить. Это совсем не сложно.
to Serge
Спасибо за информацию. Буду копаться, если не разберусь спрошу ещё.
Спасибо за информацию. Буду копаться, если не разберусь спрошу ещё.
Надо учесть ещё один момент.
AC97 DMA работает со списками буферов (BDL) аналогично IDE. Первичный буфер в 64 Кб разбит на четыре части по 16 Кб которые проигрываются по-кругу без остановок.
Когда происходит прерывание данные для буфера который должен воспроизводиться уже полностью готовы и выбираются ДМА немедленно, а микшер производит запись в следующий сегмент. При такой схеме нет щелчков если прерывания надолго замаскированы, а в Колибри такое бывает.
AC97 DMA работает со списками буферов (BDL) аналогично IDE. Первичный буфер в 64 Кб разбит на четыре части по 16 Кб которые проигрываются по-кругу без остановок.
Когда происходит прерывание данные для буфера который должен воспроизводиться уже полностью готовы и выбираются ДМА немедленно, а микшер производит запись в следующий сегмент. При такой схеме нет щелчков если прерывания надолго замаскированы, а в Колибри такое бывает.
to Serge
У SB это называется auto-init DMA mode. Буфер какого-либо размера разбит на два (в документации это называется наоборот - создан буфер двойного размера), он заполнен данными, которые в цикле проигрываются, пока не сбросят карту или не прервут этот режим соответствующей командой, когда доходит до середины буфера, генерится прерывание, хэндлер которого заполняет первую половину буфера новыми данными, пока воспроизводится вторая. Когда она закончится снова идёт переход к первой половине, генерится прерывание, оповещающие о необходимости записать новые данные в неё, далее процесс повторяется, пока не произойдёт нечто прерывающее этот процесс (смотри выше). Т.е. как я понимаю у AC97 то же, что и у SB, только вместо 2 частей - 4.
У 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-плеер РАБОТАЕТ!
С большим удовольствием послушал "Аквариум" под Колибри.
Всем, всем - ОГРОМНОЕ СПАСИБО!
: Входя на форум, в поле "Логин", я ввёл "root"... Но потом, призадумавшись, стёр и ввёл-таки своё имя пользователя.
С большим удовольствием послушал "Аквариум" под Колибри.
Всем, всем - ОГРОМНОЕ СПАСИБО!
: Входя на форум, в поле "Логин", я ввёл "root"... Но потом, призадумавшись, стёр и ввёл-таки своё имя пользователя.
Версия драйвера 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 (так в книжке написано))
Для последнего драйвера доска выдает чтото типа:
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 и напиши работает или нет. Там какая-то фигня непонятная с кодеком.
Проверь последний 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
Пишет типа этого:
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 или другим программами удаётся определить чип ?
Похоже это CMedia 9739, только id чипа читается не полностью. А в Win или другим программами удаётся определить чип ?
Who is online
Users browsing this forum: No registered users and 31 guests