Драйвер звука для COVOX'а

Drivers for sound cards
  • По IRQ или по значениям портов, которые зависят от звуковой карты
    А должно всё это зависеть от драйвера
    Процедура shed обрабатывает IRQ 0 (и переключает задачи).
    Мдя, вставил перед вызовом PlayNote, предварительно переведя систему на 44100. Сразу пришлось убрать из загрузки скринсейвер (мешает собака, каждую секунду вылезает), система начала тормозить.
    Так как плеер SB определяет необходимость загрузки по тикам системы и по состоянию всяких IRQ, я, соответственно, ничего не услышал.

    Так дальше жить нельзя!

    Вот некоторые замечания насчёт поддержки звука:
    1. Добрался до компьютера с SB совместимой картой и при прослушивании 44100 mono услышал звук с шумом около 100 гц (очень раздражает). При воспроизведении stereo данный глюк пропадает и при этом я не заметил этого стерео. Видимо воспроизведение идёт не на 8бит mono/stereo а на 16бит mono.
    2. Используется один звуковой буфер из-за чего нет возможности загружать следующую порцию звука при воспроизведении. В следствие чего возникает задержка между воспроизводимыми блоками максимальной величиной 256 переключений (или сколько там позволено).
    3. При воспроизведении звука через SB (в стандартной Колибри 0.5.2), одновременно попытался сохранить RAM-диск. Последствием этих нехитрых действий стала порча звукового файла. Серьёзный баг!!!

    Выводы:
    1. Необходимо, либо разделить имеющийся буфер на два меняющихся, либо выделить ещё одну страничку для второго буфера. Таким образом, можно будет загружать новые порции не дожидаясь окончания воспроизведения. А в перспективе, микширование звука с разных процессов.
    2. Переписать звуковой плеер с поддержкой нового драйвера, или вычеркнуть его из дистриба, чтобы ничего не запарывал. А о возможности загрузки нового звукового блока спрашивать у драйвера. Для этого необходимо добавить функциональности 55-ой функции (во сказанул!), когда-нибудь всё равно придётся это сделать.
    3. Писать драйвера под различные звуковухи или продумать поддержку ковокса!!! (пока зашёл в тупик, неохота всю систему переписывать для того, чтобы она начала тормозить)

    Вопросы:
    1. Есть ли свободная страничка, для поддержки 2-го буфера?
    2. Я правильно вставил вызов драйвера в цикле переключения задач?
    3. Это вообще кого-нибудь интересует?

    P.S. Начинает надоедать. А может, ну его нафик! Заброшу это и вернусь обратно, в Linux User Group, там мой проект уже протух и дизайн гниёт. http://www.lug.cheb.ru
  • 1. Можно выделить ее динамически, можно найти неиспользуемое место в memmap.inc, можно просто выделить ее в неинциалированных данных:

    Code: Select all

    uglobal
      some_mem rb 4096
    endg
    2. Вставил-то правильно, однако передача байт в порт на частоте 44100 Гц пригодна только для однозадачных систем. В многозадачных системах это слишком частое переключение задач/вызов прерывания. С слишком частым переключением задач можно бороться переключая задачи только каждый 441 раз. С слишком частым вызовом прерывания бороться нельзя ни как :(. Нормальные звуковые карты поддерживают передачу данных через DMA (или через шину) с прерыванием в случае необходимости новых данных... Но этот режим программировать намного сложнее...
    3. Специалистов по звуку нет...

    Как именно SB определяет момент передачи данных я не знаю - надо смотреть в его исходники.
  • 3. Специалистов по звуку нет...
    А я вот в цикле переключения задач не могу разобраться
    С слишком частым переключением задач можно бороться переключая задачи только каждый 441 раз
    cmp [virtual_timer_tick],441
    je переключение_задачи; переход к переключению задачи
    inc [virtual_timer_tick]
    call play_sound

    куда сей блок вставить, и какую часть кода внести в блок переключение_задачи?
    Как именно SB определяет момент передачи данных я не знаю - надо смотреть в его исходники.
    Я уже в нём ковыряюсь, кое что придётся изменить. Заодно драйвер звука, при невозможности выполнить какое-либо действие, в eax будет выдавать код ошибки. Так программы будут узнавать загрузился звуковой блок или нет. Может после этого моя C-Media не будет вешать систему.

    В файле memmap.inc обнаружил следующее:
    2A0000 -> 2B00ff wav device data
    Зачем нужны адреса 2B0000 -> 2B00FF ? Может 2B0000 -> 2BFFFF выделить для второго звукового буфера?
  • 0xFF байт используются по-видимому для хранения статуса SB. Если их переместить, то можно будет использовать 0x2b0000-0x2bffff для второго буфера.
    На счет исправления irq0. Попробуй (у меня работает, но с некоторыми глюками :( ) заменить начало на следующее:

    Code: Select all

    irq0:
       save_ring3_context
    	mov   ax, os_data
    	mov   ds, ax
    	mov   es, ax
    	cmp   [virtual_counter],441
    	je    .norm
    	cmp   [0xffff],byte 2
    	je    .norm
    	inc   [virtual_counter]
    	inc   [context_counter]
    ;	call  your_play_sound
    	mov   al,0x20   ; send End Of Interrupt signal
       mov   dx,0x20
       out   dx,al
    	restore_ring3_context
    	iret
    .norm:
    	mov   [virtual_counter],0
    ;далее идет mov edi,[0x3000] и.т.д.
    ;где-то далее добавь строчку virtual_counter dd ?
    
  • Hater, твой COVOX прост и хорош с одной стороны, но ПОЛНОСТЬЮ ПОДЧИНЯЕТ СЕБЕ РЕСУРСЫ!
    Эта "жертва" Не приемлема и НЕ нужна Ни одной уважающей себя системе! Пока мы творим на архитектуре именно PC это именно ТАК!
    Теперь немного вспомним про дискретизацию... господин Котельников законоположил, что частота дик-ции КАК МИНИМУМ в 2 раза превышает МАКСИМАЛЬНУЮ частоту "восстанавливаемого по отсчетам" (цифровым замерам, кодам...) воспроизведения.
    Итого: 20кГц звука (как макс потолок) = 40 кГц СТРОГОГО СТАБИЛЬНОГО ВО ВРЕМЕНИ(период таймера НЕ пляшет!)! Тактирования задачи воспроизведения звука на COVO`е!
    Кто будет тактировать такое на PC машине? Однозначно можно ответить в пользу использования прерывания таймера IRQ0, кае самого старшего по приоритету... + CPU ресурс потребуется, дабы это прерывание в системе обслужить... Короче я весбма подробно и логично подвел, считаю к правильным выводам и размышлениям, не буду дальше засорять форум, своим монологом.
    Мой реальный совет "бывалого" ;) если дружишь и с паялом и с железками и реально ИНТЕРЕСНО железки побеждать займись AC97 звуком, НАВЕРНЯКА НЕ ПРОГОРИШЬ во всех отношениях и опыта и просвещения и это устройство СЛИШКОМ СЕРИЙНО внедрено и выпускается и далее, значит не дураки это дулают!
    Еще большущий плюс ЭТО СТАНДАРТ!!! А это реальный бальзам на душу кодера, истирзанного проклятыми враждующими производителями железяк... уж поверь.
    В принципе в данном вопросе мог бы предложить некое сотрудничество и обоюдовыгодное дело...
    У меня есть реальная потреба в человеке желающего знать как, пр..... + помочь в доводке кода по AC97 "так сказать на месте"(т.е. у себя) + мои наставления, доки, некое убучение драйверной теме, помощь и удаленный анализ, правки со своей стороны. Короче по сути, пройти мимо машин с VIA823x южного моста, очень не хочется, по причине, что мой код для AC97 на ней не идет, а вблизи такой тачки нету :( НУЖЕН РЕАЛЬНЫЙ парниша с такой тачкой. Ты писал, что AC97 у тебя есть, случаЁм не такова ли у тебя и есть ли желание поработать в данном ключе (базовый код -ДОС вариант, это принципиально).
    Ознакомиться и попробовать можно так: http://www.atom-os.narod.ru/edit_versions/ac97_302.zip
    Надеюсь на Ваше трезвомыслие, уважаемые! Постараюсь заглядывать сюда, если Вы не против :)
  • VaStaNi, извини, что долго не отвечал, после работы сразу лёг спать. Насчёт COVOX'а, я предлагаю не новый стандарт, а всего лишь альтернативу, на уровне исходников, которые можно распространять вместе с основными исходниками. Для тех людей, чья звуковуха пока не поддержана - возможность вразрез производительности получить функциональность. По этому затею с COVOX'ом бросать не собираюсь.
    По поводу AC97. У меня VIA8233, но я ей не пользуюсь (использую какую-то C-Media 5.1). Для проверки твоей программы пришлось в биосе её включить. Звука, как ты уже писал, не было. По этому могу пока отослать отчёт. Если укажешь мыло. Пока в данном девайсе не разбирался, но в дальнейшем придётся, т.к. у нас это более распространённая девайсина чем от интела. По поводу тестирования драйверов, могу привести короткое описание того, что у меня дома:
    Комп №1: моник 14", P166(разогнан до 188), 32Mb, 4.1Gb, S3 Virge 4Mb, Crystal (совместим с SB16 pro), сетевуха Realtek (не помню какая). Нууу пооолный Menueeeet :-)
    Комп №2: моник 17", Athlon XP 1700+, 128Mb PC133, 20Gb, GF 4 MX440 SE 64Mb, C-Media 5.1, сетевуха 10Mbit Х.З. (из кучи нерабочих нашлась рабочая)

    halyavin, спасибо, проверю. Я почти переделал стандартный wav плеер (убираю всё связанное с IRQ), потом буду тестировать. Может досовый драйвер эмулирующий SB перестанет вешать систему после секунды воспроизведения. В планах написание нового плеера с поддержкой новых подфункций.
  • Hater wrote:я предлагаю не новый стандарт, а всего лишь альтернативу, на уровне исходников, которые можно распространять вместе с основными исходниками. Для тех людей, чья звуковуха пока не поддержана - возможность вразрез производительности получить функциональность. По этому затею с COVOX'ом бросать не собираюсь.
    м-да... похоже ты меня "не услышал". Математика, даже самая простая, все же наука о фактах :0) если без ошибок считать. Делать, в смысле творить, хорошее занятие и полезное, но ведь еще лучше, когда есть максимум пользы и не только 2-3 людям... Советую еще раз прикинуть вопрос о тактировании COVOX`а его потребности в частоте, качестве 8 битного LPT ЦАП с учетом еще и того что это моно... Ну реально желающих будет, столько, столько тех кто хотел бы удовлетворить свое любопытство, скажем, в таком вопросе как АЦП-ЦАП и выделение огибающей сигнала...
    В принципе данная ось, насколько мне известно НЕ МОЖЕТ обеспечить жёсткое временное тактирование (период) короче чем период таймера (IRQ0).
    Hater wrote: По поводу AC97. У меня VIA8233, но я ей не пользуюсь (использую какую-то C-Media 5.1). Для проверки твоей программы пришлось в биосе её включить. Звука, как ты уже писал, не было. По этому могу пока отослать отчёт. Если укажешь мыло. Пока в данном девайсе не разбирался, но в дальнейшем придётся, т.к. у нас это более распространённая девайсина чем от интела.
    Спасибо. Отчет в принципе имеется, а чего нет, писал. Ну если будет желание или придешь в результате к AC97, скажешь сам. Мыло в перечне пользователей видно.
  • Затею с covoxом бросать ненадо.

    Это не оффотоп,а для тех кто не слышал звука covox.
    COVOX music from ЭЛЕКТРОНИКА БК 0010(-01) :
    menuetosgame.narod.ru/games/minimum.mp3
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • Закончил драйвер для COVOX'а. Хотя код ещё сырой, но уже можно слушать wav-файлы через стандартный плеер. Так как в стандартном плеере буржуи что-то намудрили с 8/16 бит mono/stereo, то звук получается с какими-то шумами, и так так определение момента загрузки звука в буфер определяется по каким-то хитрым вычислениям с тиками системы, то иногда на звуковых стыках происходят различные аномалии. Завтра буду тестировать при 22050 тиках таймера на обоих компах.


    И снова вопрос. Как из системной функции в регистрах возвращать получившиеся значения?
  • Code: Select all

    servetable:
    ;...
      dd my_function
    ;...
    my_function:
    ;передача данных приложению через регистры
      mov [esp+36],eax_value
      mov [esp+24],ebx_value
      mov [esp+32],ecx_value
      mov [esp+28],edx_value
      mov [esp+12],esi_value
      mov [esp+8],edi_value
      ret
    
  • Сделал 2-ух буферный драйвер для ковокса, только что-то не так. Ввёл следующие подфункции:
    ebx=3
    в eax должно возвращаться состояние буфера 0-свободный, 1-занят первый буфер, 2-занят второй буфер, 3-заняты оба буфера. Так что, получается, что для непрерывного воспроизведения необходимо загружать новую порцию звука, когда состояние буфера не равно 3. Но для поддержки стандартных программ при заполненных буферах звук всё равно загрузится в неиспользуемый буфер.

    ebx=4 - приостановить воспроизведение, "очистить" используемый буфер, перейти к следующему.

    Но что-то не так. А именно, Kolibri не хочет работать с большими программами. Так, например, для проверки 3-ей подфункции написал простую прогу в код которой внёс wav-файл. Но система напрочь отказалась его нормально запускать(играет первый блок, а дальше, визжит какая-то ботва), а fasm под Колибри не смог откомпилить.

    Что там насчёт поддержки больших программ?

    В чём может быть проблема моей программы? Занимает моя прога 7 389 177 байт. Вот пример заголовка:
    Use32
    org 0x0
    db 'MENUET01' ; 8 byte id
    dd 0x01 ; header version
    dd START ; start of code
    dd I_END ; size of image
    dd 0x820000 ; memory for app
    dd 0x820000-0x10000 ; esp
    dd 0x0 , 0x0 ; I_Param , I_Icon
    могу привести все исходники, хотя разобраться в них будет непросто (для вычислений номера буфера, куда можно заносить новый блок, использовал булевы операции)
  • Если считаешь, что проблема именно с большой программой, то считай CRC инициализированной области.
    Каким образом блок записывается в память ядра?
    PS. esp растет вниз, поэтому указывать его равным 0x820000-0x10000 вместо 0x820000 не имеет ни какого смысла.
    PSPS fasm выделяет фиксированный размер памяти. Если нужно больше, то он не может скомпилировать программу (в MeOs).
  • Hater


    А как на счёт ECP/EPP? Там вроде можно DMA использовать?
  • А где можно скачать этот драйвер? А то у меня в КолибриОС звук не работаетhttp://board.kolibrios.org/posting.php?mode=reply&f=3&t=376#
    In GNU we trust ;-)
  • Who is online

    Users browsing this forum: No registered users and 5 guests