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

Drivers for sound cards
  • Quantum

    Готовых программ две - плеер и DOOM, ещё diamond портирует SDL. Все компилируются с sound.lib из SDK. Для ассемблера я выложу inc версию, программировать вызовы драйвера напрямую неудобно.

    >Скачать текущую версию с SVN?
    Всегда качай последние версии с SVN.

    >На компе со встроенным AD выдаёт -1 и -1 в global control и global status
    Тогда он вообще не должен играть. Контроллер или отключён в БИОС или в спящем режиме или БИОС его совсем не настроила. Надо смотреть регистры PCI

    На втором компе значения правильные. Там идут ещё какие нибудь сообщения, пишет "create primary buffer" ?
    Запусти pcidev и посмотри номера IRQ, возможно они не назначены.
  • Serge wrote: >На компе со встроенным AD выдаёт -1 и -1 в global control и global status
    Тогда он вообще не должен играть. Контроллер или отключён в БИОС или в спящем режиме или БИОС его совсем не настроила. Надо смотреть регистры PCI
    Раньше же прекрасно играло на этом компе. Устройство включено в настройках BIOS. В Win32 и FreeBSD оно исправно работает. Твой драйвер загружается, буфер создаётся, потом на доске выходит сообщение play, т.е. всё нормально работает, но только без звука. Ранше то звук был... Проходит около 2-4х секунд и поток, который общается с драйвером виснет. Это наблюдается и в твоём плеере, и в моём тестовом приложении. Новый драйвер с SVN я ещё не ставил.
    Serge wrote: На втором компе значения правильные. Там идут ещё какие нибудь сообщения, пишет "create primary buffer" ?
    Нет, других сообщений нет. Просто говит, что девайс не найден и драйвер дальше не грузится.
    Serge wrote: На втором компе значения правильные. Там идут ещё какие нибудь сообщения, пишет "create primary buffer" ?
    Запусти pcidev и посмотри номера IRQ, возможно они не назначены.
    В прошлый раз ты пришёл именно к этому заключению. Так почему бы не назначить устройству IRQ программно из драйвера? Винда и Линукс, наверное, так и поступают с этим кодеком.

    Обновил ядро и все драйверы. Всё равно при первом обращении к драйверу выводится сообщение MENUET01 Intel ICH6. Значения global не изменились - по прежнему FFFFFFFF. Звука тоже нет и поток вскоре после начала воспроизведения виснет. Мне кажется, что он виснет когда буфер полностью заполняется... На компе с ICH0 обновление ещё не тестил.
  • Виноват. Забыл залить драйвер на SVN. Правильная версия #562.

    >Раньше же прекрасно играло на этом компе

    Что-то изменилось в конфигурации или настройках BIOS. -1 означает что порты не читаются, значит или неназначены адреса ввода-вывода или контроллер в спящем режиме.

    Новый драйвер делает больше проверок и выводит дамп регистров. Напиши что получается.
  • Serge wrote: Что-то изменилось в конфигурации или настройках BIOS. -1 означает что порты не читаются, значит или неназначены адреса ввода-вывода или контроллер в спящем режиме.
    Если мне память не изменяет, раньше у тебя было 3 драйвера: интеловский, сис и другой. Тот другой как раз и работал с этим кодеком SoundMAX Digital Audio. Единственным недостатком было то, что аудио выводилось не на колонки, а в line-out. Значения global были не -1. Той старой версии драйверов у меня не сохранилось, к сожалению. Старый плеер есть, а драйверы куда-то пропали...

    В самом компе изменилось только следующее:
    Теперь включен контроллер USB, т.к. ваш новый релиз с ним уже не конфликтует, что меня сразу обрадовало. Кстати, может стоит попробовать отключить?
    Поменял память. Обьём остался прежним, но планок теперь 1, а не 2.
    Serge wrote: Новый драйвер делает больше проверок и выводит дамп регистров. Напиши что получается.
    Хорошо.
  • Quantum

    Попробуй поотключать все ненужные порты COM LPT USB
  • Спасибо, что разъяснил насчёт CD... У меня тоже многосессионные не читаются
  • Насчёт проигрывателя: хорошо бы сделать список воспроизведения. Потому что вчера слушал виолончельные сюиты Баха, каждая сюита состоит из пяти частей и каждая часть у меня представлена отдельным файлом. В идеале надо поместить эти файлы в список воспроизведения, тогда они будут воспроизводиться один за другим, как и положено...
    Кстати, виолончель воспроизводится очень достоверно, включая самые низкие звуки, за что автору респект :)
  • Загрузил новый драйвер. Вот результат:
    Intel 802801FB (ICH6)
    PCI command 00000007
    PCI status 00000290
    codec io base 0000EC01
    controller io base 0000E8C1
    codec mmio base DFFFFE00
    controller mmio base DFFFFD00
    global control FFFFFFFF
    global status FFFFFFFF
    device not found
    sound service not loaded

    Т.к. драйвер на этом этапе прекращает загрузку, буфер уже не создаётся. Поэтому проигрывание по крайней мере уже не зависает.

    Попробовал отключить всё лишнее: USB, LPT, RS232 и т.д. Результат остался прежним.

    Вот что ещё пишет винда об этом кодеке:
    SoundMAX Integrated Digital Audio
    Bus PCI 0, device 30, function 2
    I/O: EC00 - ECFF
    I/O: E8C0 - E8FF
    mio: DFFFFE00 - DFFFFFFF
    mio: DFFFFD00 - DFFFFDFF
    IRQ: 23

    В винде этот девайс исправно работает, причём звук выводится прямо на колонки, а не в line-out.

    Пока листал конфигурацию биоса вспомнил ещё одну важную деталь: не так давно я обновил прошивку биоса.

    А теперь старичёк ICH0:
    Intel 802801AA (ICH)
    PCI command 00000005
    PCI status 00000280
    codec io base 00001201
    controller io base 00001301
    codec mmio base 00000000
    controller mmio base 00000000
    global control 00000002
    global status 00000100
    unknown codec id 43525934
    creating primary buffer
    device not found
    Sound service not loaded

    В настройках винды:
    I/O: 1200-12FF
    I/O: 1300-133F
    IRQ: 09
  • Атауальпа
    Плейлист уже сделан. Читать тут http://meos.sysbin.com/viewtopic.php?t=771
  • Quantum

    Я понял в чем дело. Это всё заморочки с БИОС. Начиная с ICH4 драйвер работает с контроллером через mmio. У меня БИОС выравнивает эти диапазоны на начало страницы, а у тебя нет. Баг я исправлю а пока можно так:
    открываешь sound.asm, находишь dd (CTRL_ICH6 shl 16)+VID_INTEL,msg_ICH6,set_ICH4
    и меняешь set_ICH4 на set_ICH. После этого должно заработать.

    С ICH0 тоже всё нормально. У тебя там биос забывала назначить IRQ. Значит находишь незанятый номер или ещё лучше резервируешь вектор в BIOS setup. И правишь sound.asm в заголовке
    REMAP_IRQ equ 0
    IRQ_LINE equ 0
    на
    REMAP_IRQ equ 1
    IRQ_LINE equ номер вектора
    и снимаешь коментарии

    Code: Select all

       if REMAP_IRQ
               call get_LPC_bus
               cmp eax, -1
               jz .fail
               mov [lpc_bus], 0  ;eax
               call remap_irq
         end if
    должно помочь
  • Теперь вот, что выводит на ICH6:
    global control 00000002
    global status 10700000
    Analog Devices
    create primary buffer

    Потом я создаю свой буфер и получаю его размер: 00010000.

    Но при первом вызове SND_OUT происходит зависание системы. Выводится сообщение play (или start play или типа того). Прерывание не возвращает управление. Тоже самое наблюдается и в твоём плеере.

    Кстати, попутно возникло 2 вопроса:

    1. Размер буферов фиксированный и всегда равен 0x10000, если явно не указывать размер? Мне нужен размер, чтобы расчитать количество блоков для синхронизации. На данный момент я не указываю размер, а запрашиваю его после создания буфера. Если размер фиксирован, то это сильно упростит расчёты.

    2. Функция SND_OUT что-то возвращает, в смысле кода ошибки?
    Last edited by Quantum on Tue Jul 03, 2007 4:03 am, edited 1 time in total.
  • Попробовал назначить прерывание для ICH0...

    Сначала посмотрел в pcidev. Вот как он охарактеризовал мой кодек:
    VendID 8086
    DevID 2415
    Bus# 00
    Dev# 1F
    Fnc 05
    Rev 02
    Class 04
    Subclass 01
    Interface 00
    IRQ 00
    Остальное разглядеть не удалось, т.к. не влезает в экран при разрешении 640x480, а бОльшее разрешение через загрузочное меню установить не удалось.

    Есть у меня 2 свободных прерывания: 5 и 10.

    Попробовал пересобрать драйвер под 10е прерывание. Компилятор ругнулся на инструкцию call [PciApi]. Поменял на call DWORD [PciApi] - собралось без ошибок. При загрузке драйвера дело доходит до create primary buffer и поток самоубивается. Попробовал с резервированием IRQ в настройках биоса и без, с 10м и 5м прерыванием - результат одинаков.

    Решил ещё поменять call DWORD [PciApi] на call PciApi. Поток больше не виснет, но результат теперь такой же каким был до переназначения IRQ:

    Intel 802801AA (ICH)
    PCI command 00000005
    PCI status 00000280
    codec io base 00001201
    controller io base 00001301
    codec mmio base 00000000 ; почему тут всегда пусто?
    controller mmio base 00000000 ; и тут?
    global control 00000002
    global status 00000100
    unknown codec id 43525934 ; кстати, пора бы уже занести его в список...
    creating primary buffer
    device not found
    Sound service not loaded
  • Quantum

    Баг c ICH6 исправил. Проверь SVN.
    Как плеер зависает ? Значит что-то не в порядке. Может там IRQ расшарено ? У тебя последний дистриб ?
    Пришли мне код прграммы.

    SND_OUT работает как waveout. Ты передаёшь ей указатель и размер своего буфера. Функция не вернёт управление пока не перекачает себе все данные. 64 Кб размер внутреннего буфера.
    Не совсем понял о какой синхронизации речь. Если ты выводищь звук через waveout то общий алгоритм такой

    Code: Select all

      while(true)
      {
         генерируем нужное количество семплов в заданом формате
         waveout(); //если семплов очень много поток будет блокирован
                          //пока все данные не будут считаны
      };
    
    >ICH0
    IRQ_LINE equ 10 исправил ?
  • Serge wrote: Баг c ICH6 исправил. Проверь SVN.
    Бинарники и исходники выдают ошибку 403.
    Как плеер зависает ?
    Нет, на ICH6 после исправления set_ICH4 -> set_ICH зависает не плеер, а система целиком. Просто баг имеет место быть и при использовании твоего плеера, и при использовании моего тестового приложения. Короче, дело тут не в пользовательском коде, а в драйвере.
    Может там IRQ расшарено ? У тебя последний дистриб ?
    Подозреваю, что этот вопрос относится к системе с ICH0. Есть и расшареные IRQ, но я задействовал только те, которые гарантированно никем не используются: 5 и 10. С резервированием и без. Результат всегда был одним и тем же. Кстати, обрати внимание на момент с call [PciApi] в моём предыдущем посте. Я могу освободить ещё пару-тройку IRQ (3, 4 и, кажется, ещё 7). Проверить? Дистрибутив везде последний (с SVN).
    SND_OUT работает как waveout.
    Вопрос не об этом, а о возвращаемом значении. Она же в твоём инклуде обьявлена не как void. Поэтому я подумал, что, возможно, предусмотрены коды ошибок на случай если функция не сможет перекачать данные по той или иной причине.
    64 Кб размер внутреннего буфера.
    Фиксированно и меняться в рамках текущей основной версии не будет? Т.е. SND_GETBUFFSIZE всегда будет возвращать 64К, если при SND_CREATE_BUFF вместо размера указать 0, так?
    Не совсем понял о какой синхронизации речь.
    В движке предусмотрены функции, которые возвращают текущий pattern/order, средние значения громкости в правом и левом каналах и т.д. Все эти функции синхронизируются с текущей позицией в буфере проигрывания посредством очереди, а не в живую. Чтобы эта фишка с очередью давала максимально приближённый результат, необходимо знать размер буфера.

    Code: Select all

      while(true)
      {
         генерируем нужное количество семплов в заданом формате
         waveout(); //если семплов очень много поток будет блокирован
                          //пока все данные не будут считаны
      };
    
    Сейчас схема такая:

    Первым делом вызываем _uFMOD_PlaySong - эта функция распаковывает XM, грузит драйвер, проверяет версию создаёт буфер и заполняет его полностью, после чего возвращает управление. 0 - ошибка, не 0 - всё нормально. В доску отладки при отключенном режиме NODEBUG выводится подробный отчёт.

    Потом пользовательский код обязан периодически вызывать функцию _uFMOD_WaveOut, чтобы дозаписать в буфер следующий блок PCM данных. В тестовом приложении я вызываю эту функцию в цикле обработки событий окна.

    Есть ещё куча вспомогательных функций:
    _uFMOD_StopSong, _uFMOD_GetRowOrder, _uFMOD_GetStats, _uFMOD_SetVolume, _uFMOD_GetTime, _uFMOD_GetTitle, _uFMOD_Pause, _uFMOD_Resume, _uFMOD_Jump2Pattern
    Все эти функции можно вызывать в любой момент и из любого потока.
    >ICH0
    IRQ_LINE equ 10 исправил ?
    И 10 и 5...
  • Who is online

    Users browsing this forum: No registered users and 3 guests