Page 22 of 66

Posted: Thu Jul 05, 2007 3:14 am
by bw
Оказывается в моем случае ac97snd все же работает. Только не понятно как его запускать. Получилось только через KFM. Через cmd и коммандную строку из меню, ничего не вышло.
Делал так: ac97snd /hd0/1/test.mp3

..bw

Posted: Thu Jul 05, 2007 7:17 am
by Mario79
OFFTOP
Наличие 2-х сетевых карт часто приводит к проблемам даже в ХР. Я еще не на одном компе не смог нормально заставить работать вторую сетевуху.
А однажды когда воткнул контроллер USB в PCI относительно старого компа (что-то вроде Celeron333), то он вообще отказывался включаться.
/OFFTOP

Posted: Thu Jul 05, 2007 1:21 pm
by Serge
Quantum

Виснет драйвер из архива ? Я тестил его на ICH5 - никакиз проблем

Posted: Thu Jul 05, 2007 7:32 pm
by Quantum
2 Serge:
Да, виснет именно драйвер из архива (который ставит IRQ 5). На ICH6 виснет поток, а на ICH - система. На данный момент на обоих машинах со всеми версиями драйвера и всеми конфигурациями pic было зафиксировано 3 возможных варианта развития событий:
1. Либо выводится ошибка при запуске драйвера (устройство не найдено, irq не валидный и т.д.) В этом случае ничего не виснет.
2. Либо драйвер загружается без ошибок, но первый SND_OUT (а конкретнее функция wave_out из infinity.asm) приводит к зависанию.
3. Либо при назначении/переназначении прерывания всё виснет. При этом на доску ничего не выводится (не успевает). До SND_OUT дело даже не доходит.

В предыдущих постах я описал каким версиям драйвера и при какой конфигурации наблюдаются данные симптомы.

Встроенная утилита для тестирования железа OEM, которая загружается биосом из нулевого раздела ЖД, определила мой кодек ICH6 так:
Intel ICH6 Audio with AD1980
AC'97 controller revision 03h
AC'97 controller I/O base E8C0h
Codec I/O base addres EC00h
IRQ 4

PIC 8259 compatible

Значения сходятся с теми, что выдаёт твой драйвер. Только адреса mmio тут не указаны.

Данная утилита провела ряд тестов кодека (reset, suspend, аналоговое и цифровое проигрывание, сурраунд и т.д.) - все тесты завершились успешно. В логе я заметил упоминание чего-то вроде windows sound system, встроенного в кодек.

Может, есть возможность исправить обработчик установленного IRQ, чтоб он работал даже если прерывание зашарено?

Кстати, я уже практически дописал дистрибутив uFMOD для Колибри. Раз уж мне не суждено пока послушать его персонально, может, я его вышлю тебе для тестов?

2 Mario79:
Обе сетевухи я отключил перед тестированием.

Posted: Thu Jul 05, 2007 9:09 pm
by Quantum
В /programs/media/ac97snd/trunk отсутствуют проекты pe2kos, pow_test, ac97 и sound. mp3dec и mpg со скрипом собрались.

Posted: Fri Jul 06, 2007 12:29 am
by Serge
Quantum

http://infinity-sound.narod.ru/ich6.7z Ядро пропатчено, теперь irq3 и 4 доступны.
Есть подозрение что БИОС назначает прерывание на ICH0 но забывает записать PCICFG. Проверь этот драйвер. Меня интересует строка irq remap и ещё create primary buffer... done.

Posted: Fri Jul 06, 2007 1:52 am
by Quantum
Serge
Проверил на старом ICH. Теперь я вообще ничего не понимаю. При первом тесте вышло вот что:
irq remap
00000009
потом уже знакомые данные и потом:
create primary buffer...done
IRQ что-то invalid or not assigned
Service not loaded

А недоумение у меня вызывает IRQ, т.к. судя по pcidev на IRQ 9 висит девайс начинающийся на "serial" (полное название не видно, т.к. разрешение 640x480) Оба ком-порта у меня назначены на IRQ 3 и 4. Поэтому я думаю, что этот "serial" - USB.

Тогда я зарезервировал в настройках биоса IRQ 9 и снова попробовал загрузить драйвер:
irq remap
0000000B ; почему теперь 11 а не 9???
далее идут сообщения идентичные прежним.

В этот момент IRQ B назначен тому же "serial", котоый раньше висел на 9м.

На ICH6 ещё не тестил.

Posted: Fri Jul 06, 2007 2:39 am
by Quantum
На ICH6 теперь ЗАРАБОТАЛОООО!!! Но пока не совсем корректно. В отладочный буфер выводится пулемётная очередь из сообщений "AC97 IRQ". Поэтому звук очень обрывочный. Да и шапку сообщений при инициализации драйвера не видно. Убери этот "AC97 IRQ" скорее :)

Posted: Fri Jul 06, 2007 7:23 am
by Serge
Quantum
Я был прав. БИОС действительно назначает прерывание ICH0 и забывает записать номер в PCICFG.
Потому система висла когда я переназначал прерывание.

Для ICH6 скачай последний SVN и замени строку
ATTCH_IRQ equ 0000111010111000b

Posted: Fri Jul 06, 2007 12:34 pm
by Serge
Quantum

Сделал патч для ICH0 и залил на SVN. Надо просто скомпилировать без изменений.
Для ICH6 добавил директивы условной компиляции USE_COM_IRQ в kernel.asm и sound.asm, если не удаётся выбрать подходящее прерывание в БИОС.

Posted: Fri Jul 06, 2007 6:53 pm
by Quantum
Так-с. Начнём с хорошей новости: на ICH теперь всё замечательно работает!!!

А теперь плохая новость: на ICH6 при первом тесте система зависла. Тогда я решил закомментировать ugly bios patch, т.к. касательно конфигурации ICH6 он всё равно не нужен. После этого кодек заработал, но с заметными тормозами, хотя тут я использую совсем простенький и коротенький wav. По сравнению с ICH (PIII и всего 64Мб памяти), где теперь прекрасно проигрываются mp3, ICH6 (PIV и 512Мб памяти) немного тормозит даже при проигрывании wav, а mp3 я пока не могу тут попробовать.

И ещё напрягает, что нужно всё время переключать колонки с основного разьёма в другой. Гугл нашёл несколько сообщений в разных *никсовых форумах о похожей проблеме: на SoundMAX'е AD1980 при использовании старых драйверов OSS/ALSA звук выводиться не в тот разьём. Установка новых драйверов устраняет проблему.

Но в целом прогресс на лицо - это здорово!

Posted: Fri Jul 06, 2007 8:30 pm
by Quantum
Не работает SND_GETPOS. Глянув в исходник infinity.asm, стало ясно, что эта функция возвращает не курсор проигрывания в буфере, а курсор + базу буфера. Исправил код на такой:

mov ebx, [edx+STREAM.in_rp]
sub ebx,[edx+STREAM.in_base] ; добавил эту строчку
xor eax, eax
ret

Теперь в отладчике всегда получаю одно значение: 0x4080. Что делать?

Судя по исходнику, курсор in_rp оновляется по ходу проигрывания внутри wave_out. Но я не посылаю SND_OUT, а заполняю сначала весь буфер через SND_SETBUFF, потом посылаю SND_PLAY и по ходу проигрывания (SND_GETPOS) дозаполняю буфер через SND_SETBUFF.

Переделал пока библиотеку под SND_OUT и убрал SND_GETPOS, но поток почему-то сильно тормозит.

Posted: Fri Jul 06, 2007 10:42 pm
by Serge
Quantum

SND_GETPOS предназначена только для статических буферов, SND_PLAY и SND_SETBUFF игнорируют буферы с флагом PCM_OUT. Смотри исходники внимательнее.

Code: Select all

proc play_buffer stdcall, str:dword, flags:dword
           mov ebx, [str]
           mov eax, [ebx+STREAM.format]
           test eax, PCM_OUT
           jnz .fail
 
proc GetBufferPos stdcall, str:dword
           mov edx, [str]
           test [edx+STREAM.format], PCM_OUT+PCM_RING
           jnz .fail

proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword
           mov edx, [str]
           test [edx+STREAM.format], PCM_OUT
            jnz .fail
Если звук создан с флагом PCM_OUT то звук выводится только через вызов SND_OUT. Других вариантов нет.

>После этого кодек заработал, но с заметными тормозами

Я уже не понимаю этих проблем с ICH6. Чипсет практически копия ICH5 и виснуть не должен. И откуда берутся тормоза ? Что показывает CPU ? Как распределяется загрузка процессов. У меня mp3 проигрываются без сбоев при работающем лабиринте со 100% загрузкой процессора. Кстати какие прерывания БИОС назначила COM портам ? И ещё предыдущая версия выводила AC97 IRQ. Эта надпись появляется если только загрузить драйвер ? Например запустить ac97snd без параметров после загрузки системы ?

Posted: Fri Jul 06, 2007 11:07 pm
by Quantum
2 Serge:
> SND_GETPOS предназначена только для статических буферов
Да, я уже заметил комментарий в исходнике. Такие пометки нужно указывать хотя бы в заголовочном файле, раз уж документации пока нет. Статический буфер - это буфер, который проигрывается без зацикливания или с чем это вообще едят?

> SND_PLAY и SND_SETBUFF игнорируют буферы с флагом PCM_OUT.
Этот флаг у меня явно не указан. Зачем он предусмотрен?

> Чипсет практически копия ICH5 и виснуть не должен.
После того как я закомментировал твой патч (который предназначен для ICH), зависания на ICH6 больше не наблюдалось. Возможно, он и не тормозит даже. По крайней мере простейший wav уже играет нормально.

> И ещё предыдущая версия выводила AC97 IRQ. Эта надпись появляется если только загрузить драйвер ?
Без параметров тогда запускать не пробовал. Позже проверю.

Posted: Sat Jul 07, 2007 12:16 am
by Serge
Патч не должен виснуть. Это альтернативный способ узнать линию IRQ. Он универсален и годится для любого интелловского чипсета.


Есть три вида буферов - статические (PCM_STATIC), потоковые (PCM_OUT) и кольцевые (PCM_RING).
Самый простой для програмирования - потоковый. Просто создаешь буфер и потом выводишь в него данные при помощи WaveOut() (SND_OUT). Статического буфер не сильно отличается от буфера в DirectSound. SND_SETBUFF заполняет буфер, SND_GETPOS и SND_SETPOS получают и устанавливают текущую позицию в буфере. В SND_GETPOS действительно ошибка, правильный код
mov ebx, [edx+STREAM.in_rp]
sub ebx, [edx+STREAM.in_base]
sub ebx, 128
xor eax, eax
ret

Кольцевой предназначен специально для игр потому что позволяет выводить звук с маленькой задержкой. Это аналог Direct Sound буфера с событиями, поделённого на две части.