Page 23 of 66

Posted: Sat Jul 07, 2007 2:40 am
by Quantum
2 Serge:
> Патч не должен виснуть.
Виснет система - факт. Я закомментировал это:

Code: Select all

;;patch for some ugly BIOS
;           cmp [ctrl.vendor], VID_INTEL
;           jne .default

;           mov esi, msgIrqMap
;           call SysMsgBoardStr
;           stdcall PciRead8, 0, 0xF8, 0x61
;           and eax, 0xFF
;           call dword2str
;           call SysMsgBoardStr
;           btr eax, 7                 ;when bit 7 set remap disabled
;           jnc @F
;           xor eax, eax
;           jmp @F
теперь не виснет.

Создаю статический буфер (в формате указываю флаг PCM_STATIC). Заметил, что нужно явно задавать размер (0 тут не катит как в PCM_OUT). Задал размер = 64Кб. Потом я его заполняю целиком, 16 раз вызывая SND_SETBUFF по 4Кб за раз. Далее я задаю SND_PLAY - на доске появляется сообщение play start. Потом я начинаю периодически опрашивать позицию в фуфере, чтобы дозаполнить освободившееся место. Первый вызов SND_GETPOS возвращает pos = 0, т.е. проигрывание как бы ещё не начиналось. Странно, что позиция не успела сдвинуться хотя бы чуть-чуть... Через некоторое время снова вызываю SND_GETPOS. Теперь pos = 4000h, т.е. курсор сдвинулся на 16Кб. Ещё через какое-то время я снова вызываю SND_GETPOS и получаю, что pos снова = 4000h. В дальнейшем курсор просто замирает на этой позиции. Почему он дальше не играет? Никакая из функций ошибку не возвращает.

Posted: Sat Jul 07, 2007 7:04 am
by Serge
Quantum

Да насчёт всех чипсетов я погорячился. ICH6 уже PCI Express, там сложная система назначения вектора и похоже что они не исправили документацию. На всех предыдущих чипсетах контроллер был припаян к PIRQB#. На Express чипсетах это может быть любая линия.

Выводить поток через статический буфер с опросами занятие довольно муторное, тем более что они не проигрываются по кругу. Пришли мне код, так не разобраться.

Posted: Sat Jul 07, 2007 8:12 am
by Quantum
Serge

Оказалось, что SND_PLAY проигрывает 16Кб данных (хотя буфер я создал размером 64Кб) и останавливается. Поэтому после каждого цикла обновлений я добавил ещё один SND_PLAY (контрольный :-) Теперь курсор плавно пробегает по всему буферу, но звука нет :( В отладчике прекрасно видно как данные перекачиваются из миксера в буфер (ни одно прерывание нигде не возвращает ошибку), но колонки молчат. Если поменять схему на PCM_OUT, звук появляется, но мне не нравится, что используются блокирующие вызовы - это может быть нежелательным ограничением в некоторых приложениях. Да и звук всё время прерывается как будто размер буфера задан неправильно. Схема со статическим буфером более универсальна, как мне кажется.

> Выводить поток через статический буфер с опросами занятие довольно муторное, тем
> более что они не проигрываются по кругу.
В моём случае (после добавления SND_PLAY после каждого обновления) курсор движется по кругу. Вот точные значения, которые возвращает GETPOS:
0 16K 32K 48K 0 16K 32K 48K и т.д.

В коде долго разбираться, т.к. его очень много. Давай проверим сначала ключевые моменты:

При создании буфера я указываю size = 0x10000, flags = PCM_2_16_48 | PCM_STATIC. Может, нужен ещё какой-то флаг?

Потом буфер заполняется так:
0. 0x0000 - 0x0FFF
1. 0x1000 - 0x1FFF
2. 0x2000 - 0x2FFF
...
F. 0xF000 - 0xFFFF

И только потом я задаю первый SND_PLAY. По идее, тут оно должно по крайней мере пикнуть что-то в колонки, ведь так?

Posted: Sat Jul 07, 2007 9:14 am
by Serge
Quantum

SND_PLAY должен проигрывать буфер до конца. Попробуй PCM_2_16_44 или 2_16_24. 2_16_48 идёт на вывод без ресемплирования, фактически для него написан отдельный код и я его не очень много тестировал.

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

Пришли только код работы с драйвером. Иначе не разобраться в чем проблема.

Posted: Sat Jul 07, 2007 6:17 pm
by Quantum
ААААААА!!! А я второй день и третью ночь пытаюсь найти баг в своём коде. Переключился на 44.1 КГц - всё наконец заработало. За одно попробовал ещё 22.05 Кгц - тоже нормально.

Дамы и господа, сегодня uFMOD начинает официально поддерживать Колибри. Релизы можно хостить на сорсфорже?

Теперь нормально работают и статическая и стриминговая схемы. Кстати, теперь я понял почему звук раньше обрывался в SND_OUT. Твой wave_out - это как статический буфер только меньшего размера. Если в этом буфере проигрывалось около 1/4 или 1/2 от общей длины, создавалось ощущение "торможения". Я, кстати, раньше уже писал, что баг может быть как-то связан с размером буфера.

Желательно, конечно, исправить это дело, чтоб работало и без ресемплера. Причём звук одинаково обрывался на обоих кодеках: ICH и ICH6.

Posted: Sat Jul 07, 2007 9:17 pm
by Serge
Quantum

48 Кгц исправил, правда не тестил. А где можно скачать uFMOD ?

Posted: Sat Jul 07, 2007 9:55 pm
by Quantum
Serge
48 Кгц исправил, правда не тестил
Да, теперь всё нормально с 48КГц и драйвер уже не виснет на патче как в предыдущей версии (или ты просто убрал патч?)

Code: Select all

           test [edx+STREAM.format], PCM_STATIC
           jz .fail
Хоть бы предупредил, что GETPOS для PCM_OUT уже не работает.
А где можно скачать uFMOD ?
Версию для Колибри пока нельзя скачать. Сейчас я допишу документацию и поставлю галочку, чтоб можно было скачать с офф. сайта. Примеры пока только под Фасм и Насм в количестве 2 штуки: простейший фоновый плеер типа hello world и ещё плеер показывающий как использовать фишку с совмещением нескольких дорожек в одном файле. Потом сделаю примеры для других компиляторов. Плеера файлов пока нет. Как только ты выложишь недостающие файлы к исходникам ac97snd (см. сообщение выше), я постараюсь прикрутить к нему uFMOD. Кстати, как сделать файловую ассоциацию в KFM, чтоб при выборе XM'а запускался плеер? Но это всё отдельно от реализа.

Posted: Sat Jul 07, 2007 11:53 pm
by Serge
Quantum

Для PCM_OUT getpos просто не имеет смысла. Лучше сделать GET_FREE_SPACE.

От солюшена и vcproj мало толку потому что дерево каталогов не совпадает.
Для компиляции плеера всё есть. sdk/sound/src компилируется фасмом и собирается в sound.lib
mp3dec не нужен. mpg собирается в mpg.lib. Остальные файлы компилируются вместе и линкуются с mpg.lib и sound.lib

Опции линковки
AdditionalOptions="/MERGE:/merge:.data=.text /align:32"
AdditionalDependencies="$(OutDir)\mpg.lib $(OutDir)\sound.lib"
GenerateManifest="false"
IgnoreAllDefaultLibraries="true"
SubSystem="1"
LinkTimeCodeGeneration="1"
EntryPointSymbol="crtStartUp"
BaseAddress="0x00000000"
MergeSections=".rdata=.text "
FixedBaseAddress="2"

http://infinity-sound.narod.ru/sdk.7z здесь pe2kos.exe и готовая sound.lib

Posted: Sun Jul 08, 2007 1:24 am
by Quantum
Serge

Последняя ревизия драйвера как есть ругается на irq на ICH. Чтоб работало надо включить ту новую опцию для патча и пересобрать, так? Может, есть возможность сделать универсальную версию, чтоб работала и при нормальном irq и при "завуалированном" как у меня на ICH?

И ещё желательно рассмотреть возможность переназначения выхода в нужный разьём, а то всё время приходится переключать колонки при работе в Win32/Linux vs. Kolibri. Как я уже писал, судя по сообщениям в разных форумах, которые я нашёл гуглом, похоже, что это особенность данного кодека: стерео-выход является дефолтовым, а не тот "зелёный" что используется в других встроенных звуковухах для колонок.
Лучше сделать GET_FREE_SPACE.
Ещё лучше! Пока что это не критично.

Думаю, что теперь плеер соберётся. Займусь этим вопросом после релиза.

Posted: Sun Jul 08, 2007 5:45 am
by Quantum
Уже можно скачать бета-версию тут:
http://sourceforge.net/project/platform ... tform=3096

Тут руководство:
http://ufmod.sourceforge.net/Kolibri/ru.htm

Минимальный GUI-экзешник без сжатия и со встроенным ХМ-файлом получился размером 4997 байт.

Posted: Sun Jul 08, 2007 7:08 am
by Serge
Quantum

Да для ICH надо разблокировать патч.
Переназначение звукового выхода вещь плохо документированная. Я смотрел описания разных кодеков и ни фига толком не нашёл. Но разве Win не запоминает куда был подключён разъём ?

Posted: Sun Jul 08, 2007 8:06 am
by Quantum
Serge
Но разве Win не запоминает куда был подключён разъём ?
Винда выводит звук всегда в "зелёный" разьём, а твой драйвер - в "чёрный". Линукс 2.6 с ALSA - в "зелёный". Кстати, "чёрный" разьём в винде неприятно потрескивает, напоминая мне, что я забыл переключить колонки.

Posted: Sun Jul 08, 2007 11:56 am
by Serge
Quantum

Щелчки идут при автоопределении нагрузки. Потом Win запоминает конфигурацию и следующей загрузке уже не щёлкает.

Потестил примеры всё работает но mini иногда потрескивает.

Posted: Sun Jul 08, 2007 12:47 pm
by SPraid
Исправил баг в ядре с SB16 (недочет при переходе на плоское ядро).

Что мне нужно что бы mp3 играть??

помогите сделать obj файл (библиотеку), у которой несколько функций..
открытие файла и прочтение блока данных для проигрывания.. далее что бы можно применить в любом плеере.

Posted: Sun Jul 08, 2007 4:25 pm
by DmitrySokolowsky
Serge: пожалуйста, залей на SVN build.bat для проигрывателя или кинь сюда его содержание, потому что я не могу собрать, и не только я.