Page 20 of 66

Posted: Mon Jul 02, 2007 3:19 am
by Quantum
Я подготовил исправленную версию но не успел к дистрибу а с нынешними программами она не совместима надо всё обновлять и опять начнётся путаница.
Какие ещё программы сейчас используют этот драйвер? Может, пока не поздно, лучше уж обновить, хотя нынешнее соглашение меня лично не раздражает.
Кстати если драйвер пишет MENUET01 обнови его, это ошибка.
Это драйвер из текущего дистрибутива. Скачать текущую версию с SVN?
Какие именно значения выводятся ?

Code: Select all

global control 00000002
global status  00000100
unknown manufacturer
unknown chip
С длинными именами файлов проблем нет а вот диски должны быть записаны только в одну сессию
Ясно.

На компе со встроенным AD выдаёт -1 и -1 в global control и global status. Это ничего? Буфер играет, но звука нет. Контроль громкости ничего в доску отладки не выводит.

Posted: Mon Jul 02, 2007 7:33 am
by Serge
Quantum

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

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

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

На втором компе значения правильные. Там идут ещё какие нибудь сообщения, пишет "create primary buffer" ?
Запусти pcidev и посмотри номера IRQ, возможно они не назначены.

Posted: Mon Jul 02, 2007 8:33 am
by Quantum
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 обновление ещё не тестил.

Posted: Mon Jul 02, 2007 2:55 pm
by Serge
Виноват. Забыл залить драйвер на SVN. Правильная версия #562.

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

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

Новый драйвер делает больше проверок и выводит дамп регистров. Напиши что получается.

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

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

Posted: Mon Jul 02, 2007 8:34 pm
by Serge
Quantum

Попробуй поотключать все ненужные порты COM LPT USB

Posted: Mon Jul 02, 2007 9:08 pm
by DmitrySokolowsky
Спасибо, что разъяснил насчёт CD... У меня тоже многосессионные не читаются

Posted: Mon Jul 02, 2007 9:13 pm
by DmitrySokolowsky
Насчёт проигрывателя: хорошо бы сделать список воспроизведения. Потому что вчера слушал виолончельные сюиты Баха, каждая сюита состоит из пяти частей и каждая часть у меня представлена отдельным файлом. В идеале надо поместить эти файлы в список воспроизведения, тогда они будут воспроизводиться один за другим, как и положено...
Кстати, виолончель воспроизводится очень достоверно, включая самые низкие звуки, за что автору респект :)

Posted: Mon Jul 02, 2007 9:57 pm
by Quantum
Загрузил новый драйвер. Вот результат:
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

Posted: Mon Jul 02, 2007 10:42 pm
by Leency
Атауальпа
Плейлист уже сделан. Читать тут http://meos.sysbin.com/viewtopic.php?t=771

Posted: Mon Jul 02, 2007 11:40 pm
by Serge
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
должно помочь

Posted: Tue Jul 03, 2007 12:44 am
by Quantum
Теперь вот, что выводит на ICH6:
global control 00000002
global status 10700000
Analog Devices
create primary buffer

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

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

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

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

2. Функция SND_OUT что-то возвращает, в смысле кода ошибки?

Posted: Tue Jul 03, 2007 4:01 am
by Quantum
Попробовал назначить прерывание для 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

Posted: Tue Jul 03, 2007 8:19 am
by Serge
Quantum

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

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

Code: Select all

  while(true)
  {
     генерируем нужное количество семплов в заданом формате
     waveout(); //если семплов очень много поток будет блокирован
                      //пока все данные не будут считаны
  };
>ICH0
IRQ_LINE equ 10 исправил ?

Posted: Tue Jul 03, 2007 6:43 pm
by Quantum
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...