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

Drivers for sound cards
  • OFFTOP
    Наличие 2-х сетевых карт часто приводит к проблемам даже в ХР. Я еще не на одном компе не смог нормально заставить работать вторую сетевуху.
    А однажды когда воткнул контроллер USB в PCI относительно старого компа (что-то вроде Celeron333), то он вообще отказывался включаться.
    /OFFTOP
  • Quantum

    Виснет драйвер из архива ? Я тестил его на ICH5 - никакиз проблем
  • 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:
    Обе сетевухи я отключил перед тестированием.
  • В /programs/media/ac97snd/trunk отсутствуют проекты pe2kos, pow_test, ac97 и sound. mp3dec и mpg со скрипом собрались.
  • Quantum

    http://infinity-sound.narod.ru/ich6.7z Ядро пропатчено, теперь irq3 и 4 доступны.
    Есть подозрение что БИОС назначает прерывание на ICH0 но забывает записать PCICFG. Проверь этот драйвер. Меня интересует строка irq remap и ещё create primary buffer... done.
  • 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 ещё не тестил.
  • На ICH6 теперь ЗАРАБОТАЛОООО!!! Но пока не совсем корректно. В отладочный буфер выводится пулемётная очередь из сообщений "AC97 IRQ". Поэтому звук очень обрывочный. Да и шапку сообщений при инициализации драйвера не видно. Убери этот "AC97 IRQ" скорее :)
  • Quantum
    Я был прав. БИОС действительно назначает прерывание ICH0 и забывает записать номер в PCICFG.
    Потому система висла когда я переназначал прерывание.

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

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

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

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

    Но в целом прогресс на лицо - это здорово!
  • Не работает 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, но поток почему-то сильно тормозит.
    Last edited by Quantum on Fri Jul 06, 2007 10:49 pm, edited 1 time in total.
  • 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 без параметров после загрузки системы ?
  • 2 Serge:
    > SND_GETPOS предназначена только для статических буферов
    Да, я уже заметил комментарий в исходнике. Такие пометки нужно указывать хотя бы в заголовочном файле, раз уж документации пока нет. Статический буфер - это буфер, который проигрывается без зацикливания или с чем это вообще едят?

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

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

    > И ещё предыдущая версия выводила AC97 IRQ. Эта надпись появляется если только загрузить драйвер ?
    Без параметров тогда запускать не пробовал. Позже проверю.
  • Патч не должен виснуть. Это альтернативный способ узнать линию 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 буфера с событиями, поделённого на две части.
  • Who is online

    Users browsing this forum: No registered users and 1 guest