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

Drivers for sound cards
  • 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:
    
  • Мне немного другая задержка необходима, но всё равно, спасибо. Надо в 1/44100 или 1/22050 и так далее. В голову приходят только два способа:
    1. Временно сохранить значения регистров таймера и запрограммировать для задержки в 1/44100 секунды. Затем, по прерыванию от таймера пересылать байт из буфера в ковокс. По окончании воспроизведения вернуть состояние таймера в прежнее положение.
    но тут есть серьёзный недостаток, на сколько я понял, система замрёт на время воспроизведения звукового блока, а между воспроизведением следующего блока пройдёт немало времени.
    2. Перевести систему на 44100 переключений в секунду. И перед каждым переключением выполнять проверку на необходимость воспроизведения. И если надо воспроизводить, то пересылаем из буфера байт на ковокс, а затем выполняем переключение между процессами.
    Тут тоже не всё гладко. Придётся переписывать некоторые функции, например- задержка в 1/100 сек.

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

    А теперь основной вопрос. Используя первый метод, необходимы три куска кода для:
    1.Сохранение состояния таймера, и программироваие его на новую величину- 44100, 22050, 11025, 8000.
    2.Непосредственное выполнение задержки.
    3.Восстановление таймера.
  • Hater
    Нахрена козе баян, а волку жилетка?
    Это я к тому, что у тебя склонность как у любого начинающего программера (или генерала) решать проблемы в лоб. А обходные маневры на что? Это китайцев много, а нас мало...
    Какой смысл дергать систему ради всего одного устройства, которое к тому же не часто встретишь на компах.
    Может стоит запрограммировать контроллер DMA? Его всего то придется один раз запрограммировать, а дальше, оно без процессора шпарить будет.
  • Изучил (поверхностно) этот самый DMA. Много думал, ничего не понял. Как запрограммировать DMA для того, чтобы на порт принтера отправлять по одному байту 44100 раз в секунду, ведь ковокс- это всего лишь ЦАП и никаких синхросигналов и запросов у него нет?
    Схема его очень простая, и спаять её может даже школьник, который знает что такое резистор. Подключается всё это дело к LPT. Лично моё мнение - ковокс может стать доступной альтернативой стандартному SB из за своей простоты. И вообще для неимущих необходимы нулевые драйверы некоторых устройств. Например по причине отсутствия SB у меня не идёт квака.

    P.S. Продолжаю ждать ваших мнений по таймеру и DMA. Мне нужна ваша помощь, а то заброшу это дело!
  • Я так понимаю многие читатели этой темы не знают,что такое COVOX.Вот здесь
    ( http://www.sheppard.ru/articles/fe/covox/index.shtml) подробно обьяснено: что такое COVOX,как его сделать самому(очень просто! ),есть пример программы(на assemblere и Pascal),воспроизводящей звук через COVOX.

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

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

    Поддержка любого оборудовани (особенно такого экзотического) НУЖНА!, но зачем тратить драгоценные усилия на это, если есть возможность написать более стоющую программу.
  • В книге Зубкова С.В "Assembler для DOS,Windows и Unix" прекрасно описано устройство SoundBlasterов.А на странице 341 написано как его инициализировать(вы ведь в виндовс не перебираете порты вручную).Вся документация есть,только этим пока никто не занимается.

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

    А по поводу Звуковых карт, у меня их 2. Ac97 VIA и C-Media 5.1, но на все карты я написать не в состоянии.
  • Hater
    Да жаль, что нету у COVOX никаких запросов.
    Тогда есть вариант с включением вызова драйвера в процедуру переключающую задачи (call change_task). Так можно запрашивать проверку достаточно часто. Правда возникает вопрос, как считать время. Вернее откуда его брать, ведь таймер работает на 1/100.
    У меня тоже нету SB, однако, Квака нормально идет - сконфигурируй setup программы и должно работать.

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

    DoomEd Archangel
    Для того чтобы написать драйвер устройства надо это устройство иметь в наличии.
  • На процессорах Pentium и Celeron можно использовать команду rdtsc,а вот на процессорах от AMD вроде такой команды нет(хотя может в новых процессорах и появилась).
  • andrew_programmer
    На процессорах Pentium и Celeron можно использовать команду rdtsc
    Я уже над этим задумывался, но для подсчёта времени необходимо, как минимум, знать частоту проца

    Пока пришёл к выводу, что необходимо перевести систему на 44100 переключений (пока без изменений 5-й функции) и перед каждым переключением обращаться к драйверу ковокса.
    Куда поставить call драйвер ?
    Где и на какое значение нужно изменить время задержки для таймера?
  • Лучше уж использовать rtdsc,чем перепрограммировать системный таймер.А для определения частоты процессора в Колибри есть функция 18/5.
  • 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
    Однако возникнет много накладок, так как много чего привязано на таймер и будет работать не правильно.
  • 1) Все прерывания обрабатываются в sys32.inc - тебе нужно IRQ 0
    А можно немного подробнее, я не разобрался куда именно.

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

    Users browsing this forum: No registered users and 8 guests