Page 1 of 3

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

Posted: Thu Jan 19, 2006 2:06 am
by Hater
Вот написал я драйвер для ковокса под колибри в виде SB16.inc, но необходимо выполнять задержку. Для этого нуждаюсь в куске кода выполняющего её (с использованием таймера или любого другого средства).

Posted: Fri Jan 20, 2006 1:29 pm
by halyavin

Code: Select all

;delay for 0.1 second
  mov  eax,[timer_ticks]
.loop:
  mov  ebx,[timer_ticks]
  sub  ebx,eax
  cmp  ebx,10 ;wait 10*0.01 second
  jge  .endloop
  call change_task
  jmp  .loop
.endloop:

Posted: Sat Feb 04, 2006 3:45 pm
by Hater
Мне немного другая задержка необходима, но всё равно, спасибо. Надо в 1/44100 или 1/22050 и так далее. В голову приходят только два способа:
1. Временно сохранить значения регистров таймера и запрограммировать для задержки в 1/44100 секунды. Затем, по прерыванию от таймера пересылать байт из буфера в ковокс. По окончании воспроизведения вернуть состояние таймера в прежнее положение.
но тут есть серьёзный недостаток, на сколько я понял, система замрёт на время воспроизведения звукового блока, а между воспроизведением следующего блока пройдёт немало времени.
2. Перевести систему на 44100 переключений в секунду. И перед каждым переключением выполнять проверку на необходимость воспроизведения. И если надо воспроизводить, то пересылаем из буфера байт на ковокс, а затем выполняем переключение между процессами.
Тут тоже не всё гладко. Придётся переписывать некоторые функции, например- задержка в 1/100 сек.

Какие мнения по этому поводу?

А теперь основной вопрос. Используя первый метод, необходимы три куска кода для:
1.Сохранение состояния таймера, и программироваие его на новую величину- 44100, 22050, 11025, 8000.
2.Непосредственное выполнение задержки.
3.Восстановление таймера.

Posted: Sat Feb 04, 2006 5:15 pm
by Mario79
Hater
Нахрена козе баян, а волку жилетка?
Это я к тому, что у тебя склонность как у любого начинающего программера (или генерала) решать проблемы в лоб. А обходные маневры на что? Это китайцев много, а нас мало...
Какой смысл дергать систему ради всего одного устройства, которое к тому же не часто встретишь на компах.
Может стоит запрограммировать контроллер DMA? Его всего то придется один раз запрограммировать, а дальше, оно без процессора шпарить будет.

Posted: Thu Feb 09, 2006 8:42 pm
by Hater
Изучил (поверхностно) этот самый DMA. Много думал, ничего не понял. Как запрограммировать DMA для того, чтобы на порт принтера отправлять по одному байту 44100 раз в секунду, ведь ковокс- это всего лишь ЦАП и никаких синхросигналов и запросов у него нет?
Схема его очень простая, и спаять её может даже школьник, который знает что такое резистор. Подключается всё это дело к LPT. Лично моё мнение - ковокс может стать доступной альтернативой стандартному SB из за своей простоты. И вообще для неимущих необходимы нулевые драйверы некоторых устройств. Например по причине отсутствия SB у меня не идёт квака.

P.S. Продолжаю ждать ваших мнений по таймеру и DMA. Мне нужна ваша помощь, а то заброшу это дело!

Posted: Thu Feb 09, 2006 11:32 pm
by andrew_programmer
Я так понимаю многие читатели этой темы не знают,что такое COVOX.Вот здесь
( http://www.sheppard.ru/articles/fe/covox/index.shtml) подробно обьяснено: что такое COVOX,как его сделать самому(очень просто! ),есть пример программы(на assemblere и Pascal),воспроизводящей звук через COVOX.

Человек,прочитавший эту статью,поймет,что НИКАКОГО DMA в COVOX'e НЕТ И НЕ БУДЕТ.

Hater,есть только один выход из этой проблемы - выводить звук в определенные интервалы времени.Например выводить звук 1/100 секунды,а следующую 1/100 секунды не выводить(чтобы другим программам было время),а потом обратно и т.д.При таких небольших задержках человек не заметить "заикания" звука.Причем драйвер можно писать прямо из Колибри(как драйвер принтера от Михаила Лизовина).

Posted: Fri Feb 10, 2006 1:06 am
by DoomEd Archangel
извиняюсь за оффтоп, но ведь есть куча инфы по саунд бластерам, почему бы не написать к ним драйвера? нпр. тут [http://copyhere.by.ru/pub/sblaster.zip и http://copyhere.by.ru/pub/sbprogs.rar] инфа под все (вроде бы) старые и новые СБ (правда на саксе)
так же интересно будет почитать http://geom.mgsu.ru/Docs/CodeNet/www.co ... sbprot.htm, http://geom.mgsu.ru/Docs/CodeNet/www.co ... sbprot.htm, и http://www.megalib.com/books/923/c20.htm

Поддержка любого оборудовани (особенно такого экзотического) НУЖНА!, но зачем тратить драгоценные усилия на это, если есть возможность написать более стоющую программу.

Posted: Fri Feb 10, 2006 7:31 am
by andrew_programmer
В книге Зубкова С.В "Assembler для DOS,Windows и Unix" прекрасно описано устройство SoundBlasterов.А на странице 341 написано как его инициализировать(вы ведь в виндовс не перебираете порты вручную).Вся документация есть,только этим пока никто не занимается.

Кстати,есть программы эмулирующие на COVOX SoundBlaster 1.0.Я вот подумал,наверное драйвер COVOX'а лучше писать не из Колибри,а в коде самой ос,потомучто у COVOX'а нет автоинициализации.Тогда воспроизведение музыки можно будет делать все также через 55-ю функцию.

Posted: Fri Feb 10, 2006 6:18 pm
by Hater
Кстати,есть программы эмулирующие на COVOX SoundBlaster 1.0.Я вот подумал,наверное драйвер COVOX'а лучше писать не из Колибри,а в коде самой ос,потомучто у COVOX'а нет автоинициализации.Тогда воспроизведение музыки можно будет делать все также через 55-ю функцию.
Дык, а я про что в первой мессаге писал и в третьей тоже. Я уже написал драйвер, он полностью эмулирует SB и 55-ю функцию, но есть проблема с синхронизацией звука. Прочитай мои выводы по этому поводу во 2-ом (моём) сообщении.

А по поводу Звуковых карт, у меня их 2. Ac97 VIA и C-Media 5.1, но на все карты я написать не в состоянии.

Posted: Fri Feb 10, 2006 7:21 pm
by Mario79
Hater
Да жаль, что нету у COVOX никаких запросов.
Тогда есть вариант с включением вызова драйвера в процедуру переключающую задачи (call change_task). Так можно запрашивать проверку достаточно часто. Правда возникает вопрос, как считать время. Вернее откуда его брать, ведь таймер работает на 1/100.
У меня тоже нету SB, однако, Квака нормально идет - сконфигурируй setup программы и должно работать.

andrew_programmer
Так не получится. Будет выводиться 1/100 сек звука, и на всех остальные приложения будет молчать - максимальная задержка 255*1/100 секунды, что точно неприемлемо.

DoomEd Archangel
Для того чтобы написать драйвер устройства надо это устройство иметь в наличии.

Posted: Fri Feb 10, 2006 10:12 pm
by andrew_programmer
На процессорах Pentium и Celeron можно использовать команду rdtsc,а вот на процессорах от AMD вроде такой команды нет(хотя может в новых процессорах и появилась).

Posted: Sat Feb 11, 2006 12:19 pm
by Hater
andrew_programmer
На процессорах Pentium и Celeron можно использовать команду rdtsc
Я уже над этим задумывался, но для подсчёта времени необходимо, как минимум, знать частоту проца

Пока пришёл к выводу, что необходимо перевести систему на 44100 переключений (пока без изменений 5-й функции) и перед каждым переключением обращаться к драйверу ковокса.
Куда поставить call драйвер ?
Где и на какое значение нужно изменить время задержки для таймера?

Posted: Sat Feb 11, 2006 3:11 pm
by andrew_programmer
Лучше уж использовать rtdsc,чем перепрограммировать системный таймер.А для определения частоты процессора в Колибри есть функция 18/5.

Posted: Sat Feb 11, 2006 7:59 pm
by Mario79
Hater
1) Все прерывания обрабатываются в sys32.inc - тебе нужно IRQ 0
2) kernel.asm
; TIMER SET TO 1/100 S

mov esi,boot_timer
call boot_log
mov al,0x34 ; set to 100Hz
out 0x43,al
mov al,0x9b ; lsb 1193180 / 1193
out 0x40,al
mov al,0x2e ; msb
out 0x40,al
Однако возникнет много накладок, так как много чего привязано на таймер и будет работать не правильно.

Posted: Tue Feb 14, 2006 10:38 pm
by Hater
1) Все прерывания обрабатываются в sys32.inc - тебе нужно IRQ 0
А можно немного подробнее, я не разобрался куда именно.

Драйвер почти переделал, скоро будет готов. Пока не наделал лишних ошибок, хотелось бы выяснить, каким образом программа (например стандартный WAV плеер) узнаёт, что можно заносить новую порцию звука в буфер?