Как под Dos проиграть wav файл?

Тема в разделе "WASM.AUDIO", создана пользователем AceOfTrump, 28 апр 2006.

  1. AceOfTrump

    AceOfTrump New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2006
    Сообщения:
    23
    Как вывести звук на колонки под Dos? Помогите пожалуйста.
     
  2. trash

    trash New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2006
    Сообщения:
    143
    Адрес:
    х.з.
    К сожалению - задача эта не простая. Нужно знать какая звуковая карта, инициализирована ли она в досе, и конечно её ресурсы (порты ввода-вывода, каналы DMA, IRQ).
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    AceOfTrump

    Обратись к сорцам mplayer - FreeBSD, он же как-то работает, узнаешь как звук кидать, а потом зная формат, а его www.ya.ru или Roustem могут подсказать сделаешь че надо,главное работа с портами ввода\вывода
     
  4. trash

    trash New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2006
    Сообщения:
    143
    Адрес:
    х.з.


    Согласен! Можно вводить/выводить звук НАПРЯМУЮ, не используя геморных DMA/IRQ.
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    AceOfTrump

    Есть же доки SoundBlaster. На programmersheaven есть примеры.
     
  6. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Во-первых надо исходить из того, что на современных PCI-звучках классических портов FM/DSP саунд бластера может и не быть. Тому пример мой SB Live 5.1 -- "родные" порты карты лежат на B400h, плюс их можно перемещать. Для старых программ работающих напрямую с 22xh эмулируется SB16 драйвером sbemul от креатива (который хукает порты по 220h и тп). Вывод звука без DMA (aka direct-mode) сей драйвер кстати не эмулирует (что однажды стало для меня весьма приятным открытием).

    Во-вторых... Если забить на всё и предполагать наличие SB-compatible карты или ее эмуляции, то проблема вполне решается. Если лень что-то делать, можно найти в интернете немало готовых звуковых движков для SB/Adlib/GUS/etc.
     
  7. trash

    trash New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2006
    Сообщения:
    143
    Адрес:
    х.з.
    Эмуляция SB - это ацтой. Я в BIOS'e всегда его вырубаю, чтоб не нагружал систему на AC97! Другое дело если работаешь в ДОС под эмуляторм ПС или с настоящей SB AWE64 железкой!
     
  8. trash

    trash New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2006
    Сообщения:
    143
    Адрес:
    х.з.
    з.ы

    Тут еще надо исходники драйверов поглядеть. От линух, минуэт. Декомпилить драйвера винды.



    А то все им лень, понимаешь!
     
  9. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Эмуляция SB AC97 -- с другой оперы, это на уровне железа, sbemul и его аналоги же эмулируют SB с помощью хуков в IOPM.
     
  10. trash

    trash New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2006
    Сообщения:
    143
    Адрес:
    х.з.




    Хм... Это значит что sbemul делает переход в PM и переводит ДОС в V86?
     
  11. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    sbemul -- это драйвер под вынь. Под ДОС другие драйвера (те, что с sbeset, sbeinit и тп), которые, afair, требуют загруженного EMM386 со всеми вытекающими V86-последствиями. ;)
     
  12. AceOfTrump

    AceOfTrump New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2006
    Сообщения:
    23
    А драйверов под Дос где можно накачать, не подскажете? Я поискал и не нашел.
     
  13. AceOfTrump

    AceOfTrump New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2006
    Сообщения:
    23
    У меня есть код проги, проигрывающей wav от Зубкова одна с DMA, другая без, но чтоб под Дос работали они, я так понял нужны дрова или нет... Помогите разобраться.



    Первый:


    Код (Text):
    1.  
    2. ; wavdir.asm
    3. ; воспроизводит файл c:\windows\media\tada.wav, не используя DMA
    4. ; нормально работает только под DOS в реальном режиме
    5. ; (то есть не в окне DOS (Windows) и не под EMM386, QEMM или другими
    6. ; подобными программами)
    7. ;
    8. ; Компиляция:
    9. ; TASM:
    10. ;  tasm /m wavdir.asm
    11. ;  tlink /t /x wavdir.obj
    12. ; MASM:
    13. ;  ml /c wavdir.asm
    14. ;  link wavdir.obj,,NUL,,,
    15. ;  exe2bin wavdir.exe wavdir.com
    16. ; WASM:
    17. ;  wasm wavdir.asm
    18. ;  wlink file wavdir.obj form DOS COM
    19. ;
    20.  
    21. FILESPEC equ 'c:\windows\media\tada.wav' ; имя файла tada.wav с
    22.             ; полным путем (замените на c:\windows\tada.wav для
    23.             ; старых версий Windows)
    24. SBPORT equ 220h ; базовый порт звуковой платы (замените, если у вас он
    25.         ; отличается)
    26.  
    27.     .model  tiny
    28.     .code
    29.     .186            ; для pusha/popa
    30. org 100h        ; COM-программа
    31. start:
    32.     call    dsp_reset   ; сброс и инициализация DSP
    33.     jc  no_blaster
    34.     mov bl,0D1h ; команда DSP D1h
    35.     call    dsp_write   ; включить звук
    36.     call    open_file   ; открыть и прочитать tada.wav
    37.     call    hook_int8   ; перехватить прерывание таймера
    38.     mov bx,5        ; делитель таймера для частоты 22 050 Hz
    39.                 ; (на самом деле соответствует 23 867 Hz)
    40.     call    reprogram_pit   ; перепрограммировать таймер
    41.  
    42. main_loop:          ; основной цикл
    43.     cmp byte ptr finished_flag,0
    44.     je  main_loop   ; выполняется, пока finished_flag равен нулю
    45.  
    46.     mov bx,0FFFFh   ; делитель таймера для частоты 18,2 Hz
    47.     call    reprogram_pit   ; перепрограммировать таймер
    48.     call    restore_int8    ; восстановить IRQ0
    49. no_blaster:
    50.     ret
    51.  
    52. buffer_addr dw  offset buffer   ; адрес текущего играемого байта
    53. old_int08h  dd  ?       ; старый обработчик INT 08h (IRQ0)
    54. finished_flag   db  0   ; флаг завершения
    55. filename    db  FILESPEC,0  ; имя файла tada.wav с полным путем
    56.  
    57. ; обработчик INT 08h (IRQ0)
    58. ; посылает байты из буфера в звуковую плату
    59. int08h_handler  proc    far
    60.     pusha           ; сохранить регистры
    61.     cmp byte ptr cs:finished_flag,1 ; если флаг уже 1,
    62.     je  exit_handler        ; ничего не делать,
    63.     mov di,word ptr cs:buffer_addr ; иначе: DI = адрес текущего
    64.                     ; байта
    65.     mov bl,10h      ; команда DSP 10h
    66.     call    dsp_write       ; непосредственный 8-битный вывод
    67.     mov bl,byte ptr cs:[di] ; BL = байт данных для вывода
    68.     call    dsp_write
    69.     inc di          ; DI = адрес следующего байта
    70.     cmp di,offset buffer+27459  ; 27 459 - длина звука в tada.wav,
    71.     jb  not_finished        ; если весь буфер пройден,
    72.     mov byte ptr cs:finished_flag,1 ; установить флаг в 1,
    73. not_finished:               ; иначе:
    74.     mov word ptr cs:buffer_addr,di ; сохранить текущий адрес
    75. exit_handler:
    76.     mov al,20h      ; завершить обработчик аппаратного прерывания,
    77.     out 20h,al      ; послав неспецифичный EOI (см. гл. 1.2.10)
    78.     popa            ; восстановить регистры
    79.     iret
    80. int08h_handler  endp
    81.  
    82. ; процедура dsp_reset
    83. ; сброс и инициализация DSP
    84. dsp_reset proc near
    85.     mov dx,SBPORT+6 ; порт 226h - регистр сброса DSP
    86.     mov al,1    ; запись единицы в него начинает инициализацию
    87.     out dx,al
    88.     mov cx,40   ; небольшая пауза
    89. dsploop:
    90.     in  al,dx
    91.     loop    dsploop
    92.     mov al,0    ; запись нуля завершает инициализацию
    93.     out dx,al   ; теперь DSP готов к работе
    94. ; проверить, есть ли DSP вообще
    95.     add dx,8    ; порт 22Eh - состояние буфера чтения DSP
    96.     mov cx,100
    97. check_port:
    98.     in  al,dx       ; прочитать состояние буфера
    99.     and al,80h  ; проверить бит 7
    100.     jz  port_not_ready  ; если ноль - порт еще не готов
    101.     sub dx,4    ; иначе: порт 22Ah - чтение данных из DSP
    102.     in  al,dx
    103.     add dx,4    ; и снова порт 22Eh,
    104.     cmp al,0AAh ; если прочиталось число AAh - DSP присутствует
    105.             ; и действительно готов к работе,
    106.     je  good_reset
    107. port_not_ready:
    108.     loop    check_port ; если нет - повторить проверку 100 раз
    109. bad_reset:
    110.     stc     ; и сдаться
    111.     ret     ; выход с CF = 1,
    112. good_reset:
    113.     clc     ; если инициализация прошла успешно
    114.     ret     ; выход с CF = 0
    115. dsp_reset endp
    116.  
    117. ; процедура dsp_write
    118. ; посылает байт из BL в DSP
    119. dsp_write proc near
    120.     mov dx,SBPORT+0Ch ; порт 22Ch - ввод данных/команд DSP
    121. write_loop:     ; подождать готовности буфера записи DSP
    122.     in  al,dx       ; прочитать порт 22Ch
    123.     and al,80h  ; и проверить бит 7,
    124.     jnz write_loop ; если он не ноль - подождать еще,
    125.     mov al,bl       ; иначе:
    126.     out dx,al       ; послать данные
    127.     ret
    128. dsp_write endp
    129.  
    130. ; процедура reprogram_pit
    131. ; перепрограммирует канал 0 системного таймера на новую частоту
    132. ; Ввод: BX = делитель частоты
    133. reprogram_pit   proc    near
    134.     cli     ; запретить прерывания
    135.     mov al,00110110b ; канал 0, запись младшего и старшего байтов,
    136.                 ; режим работы 3, формат счетчика - двоичный
    137.     out 43h,al  ; послать это в регистр команд первого таймера
    138.     mov al,bl       ; младший байт делителя -
    139.     out 40h,al  ; в регистр данных канала 0
    140.     mov al,bh       ; и старший байт -
    141.     out 40h,al  ; туда же
    142.     sti     ; теперь IRQ0 вызывается с частотой 1 193 180/BX Hz
    143.     ret
    144. reprogram_pit   endp
    145.  
    146. ; процедура hook_int8
    147. ; перехватывает прерывание INT 08h (IRQ0)
    148. hook_int8 proc  near
    149.     mov ax,3508h    ; AH = 35h, AL = номер прерывания
    150.     int 21h     ; получить адрес старого обработчика
    151.     mov word ptr old_int08h,bx  ; сохранить его в old_int08h
    152.     mov word ptr old_int08h+2,es
    153.     mov ax,2508h    ; AH = 25h, AL = номер прерывания
    154.     mov dx,offset int08h_handler ; DS:DX - адрес обработчика
    155.     int 21h     ; установить обработчик
    156.     ret
    157. hook_int8 endp
    158.  
    159. ; процедура restore_int8
    160. ; восстанавливает прерывание INT 08h (IRQ0)
    161. restore_int8    proc near
    162.     mov ax,2508h    ; AH = 25h, AL = номер прерывания
    163.     lds dx,dword ptr old_int08h ; DS:DX - адрес обработчика
    164.     int 21h     ; установить старый обработчик
    165.     ret
    166. restore_int8    endp
    167.  
    168. ; процедура open_file
    169. ; открывает файл filename и копирует звуковые данные из него, считая его файлом
    170. ; tada.wav, в буфер buffer
    171. open_file proc near
    172.     mov ax,3D00h    ; AH = 3Dh, AL = 00
    173.     mov dx,offset filename ; DS:DX - ASCIZ-имя файла с путем
    174.     int 21h     ; открыть файл для чтения,
    175.     jc  error_exit  ; если не удалось открыть файл - выйти
    176.     mov bx,ax       ; идентификатор файла в BX
    177.     mov ax,4200h    ; AH = 42h, AL = 0
    178.     mov cx,0        ; CX:DX - новое значение указателя
    179.     mov dx,38h ; по этому адресу начинаются данные в tada.wav
    180.     int 21h     ; переместить файловый указатель
    181.     mov ah,3Fh  ; AH = 3Fh
    182.     mov cx,27459 ; это - длина звуковых данных в файле tada.wav
    183.     mov dx,offset buffer ; DS:DX - адрес буфера
    184.     int 21h     ; чтение файла
    185.     ret
    186. error_exit:         ; если не удалось открыть файл
    187.     mov ah,9        ; AH = 09h
    188.     mov dx,offset notopenmsg ; DS:DX = сообщение об ошибке
    189.     int 21h     ; открыть файл для чтения
    190.     int 20h     ; конец программы
    191. notopenmsg  db  'Could not open file',0Dh,0Ah
    192.         db  'Exiting',0Dh,0Ah,'$'
    193. open_file endp
    194.  
    195. buffer:     ; здесь начинается буфер длиной 27 459 байтов
    196.     end start
    197.  




    И второй:


    Код (Text):
    1.  
    2. ; wavdma.asm
    3. ; Пpимеp пpогpаммы, пpоигpывающей файл C:\WINDOWS\MEDIA\TADA.WAV
    4. ; на звуковой каpте пpи помощи DMA
    5. ;
    6. ; Комниляция:
    7. ; TASM:
    8. ;  tasm /m wavdma.asm
    9. ;  tlink /t /x wavdma.obj
    10. ; MASM:
    11. ;  ml /c wavdma.asm
    12. ;  link wavdma.obj,,NUL,,,
    13. ;  exe2bin wavdma.exe wavdma.com
    14. ; WASM:
    15. ;  wasm wavdma.asm
    16. ;  wlink file wavdma.obj form DOS COM
    17. ;
    18. FILESPEC equ 'c:\windows\media\tada.wav' ; замените на c:\windows\tada.wav
    19.                      ; для старых версий windows
    20. SBPORT  equ 220h
    21. ; SBDMA equ 1       ; процедура program_dma расчитана только на канал 1
    22. SBIRQ   equ 5       ; только IRQ0-IRQ7
    23.     .model  tiny
    24.     .code
    25.     .186
    26.     org 100h        ; COM-программа
    27. start:
    28.     call    dsp_reset   ; инициализация DSP
    29.     jc  no_blaster
    30.     mov bl,0D1h     ; команда 0D1h
    31.     call    dsp_write   ; включить звук
    32.     call    open_file   ; прочитать файл в буфер
    33.     call    hook_sbirq  ; перехватить прерывание
    34.     mov bl,40h      ; команда 40h
    35.     call    dsp_write   ; установка скорости передачи
    36.     mov bl,0B2h     ; константа для 11025Hz/Stereo
    37.     call    dsp_write
    38.     call    program_dma ; начнём DMA-передачу данных
    39.  
    40. main_loop:          ; основной цикл
    41.     cmp byte ptr finished_flag,0
    42.     je  main_loop   ; выход когда байт finished_flag = 1
    43.  
    44.     call    restore_sbirq   ; восстановить прерывание
    45. no_blaster:
    46.     ret
    47.  
    48. old_sbirq   dd  ?   ; адрес старого обработчика
    49. finished_flag   db  0   ; флаг окончания работы
    50. filename    db  FILESPEC,0  ; имя файла
    51.  
    52. ; обработчик прерывания звуковой карты
    53. ; устанавливает флаг finished_flag в 1
    54. sbirq_handler   proc    far
    55.     push    ax
    56.     mov byte ptr cs:finished_flag,1 ; установить флаг
    57.     mov al,20h      ; послать команду EOI
    58.     out 20h,al      ; в контроллер прерываний
    59.     pop ax
    60.     iret
    61. sbirq_handler   endp
    62.  
    63. ; процедура dsp_reset
    64. ; сброс и инициализация DSP
    65. dsp_reset proc near
    66.     mov dx,SBPORT+6 ; порт 226h - регистр сброса DSP
    67.     mov al,1    ; запись в него единицы запускает инициализацию
    68.     out dx,al
    69.     mov cx,40   ; небольшая пауза
    70. dsploop:
    71.     in  al,dx
    72.     loop    dsploop
    73.     mov al,0    ; запись нуля завершает инициализацию
    74.     out dx,al   ; теперь DSP готов к работе
    75.  
    76.     add dx,8    ; порт 22Eh - бит 7 при чтении указывает на занятость
    77.     mov cx,100  ; буфера записи DSP
    78. check_port:
    79.     in  al,dx   ; прочитаем состояние буфера записи
    80.     and al,80h  ; если бит 7 ноль
    81.     jz  port_not_ready  ; порт ещё не готов
    82.     sub dx,4    ; иначе: порт 22Ah - чтение данных из DSP
    83.     in  al,dx
    84.     add dx,4    ; порт снова 22Eh
    85.     cmp al,0AAh ; проверим, что DSP возвращает 0AAh при чтении -
    86.             ; это сигнал его готовности к работе
    87.     je  good_reset
    88. port_not_ready:
    89.     loop    check_port ; повторить проверку на 0AAh 100 раз
    90. bad_reset:
    91.     stc     ; если Sound Blaster не откликается
    92.     ret     ; вернуться с CF=1
    93. good_reset:
    94.     clc     ; если инициализация прошла успешно
    95.     ret     ; вернуться с CF=0
    96. dsp_reset endp
    97.  
    98. ; процедура dsp_write
    99. ; посылает байт из BL в DSP
    100. dsp_write proc near
    101.     mov dx,SBPORT+0Ch ; порт 22Ch - ввод данных/команд DSP
    102. write_loop:     ; подождём готовности буфера записи DSP
    103.     in  al,dx   ; прочитаем порт 22Ch
    104.     and al,80h  ; и проверим бит 7
    105.     jnz write_loop ; если он не ноль - подождём ещё
    106.     mov al,bl   ; иначе:
    107.     out dx,al   ; пошлём данные
    108.     ret
    109. dsp_write endp
    110.  
    111. ; процедура hook_sbirq
    112. ; перехватывает прерывание звуковой карты и разрешает его
    113. hook_sbirq proc near
    114.     mov ax,3508h+SBIRQ  ; AH=35h, AL=номер прерывания
    115.     int 21h     ; получим адрес старого обработчика
    116.     mov word ptr old_sbirq,bx   ; и сохраним его
    117.     mov word ptr old_sbirq+2,es
    118.     mov ax,2508h+SBIRQ  ; AH=25h, AL=номер прерывания
    119.     mov dx,offset sbirq_handler ; установим новый обработчик
    120.     int 21h
    121.     mov cl,1
    122.     shl cl,SBIRQ
    123.     not cl      ; построим битовую маску
    124.     in  al,21h      ; прочитаем OCW1
    125.     and al,cl       ; разрешим прерывание
    126.     out 21h,al      ; запишем OCW1
    127.     ret
    128. hook_sbirq endp
    129.  
    130. ; процедура restore_sbirq
    131. ; восстановим обработчик и запретим прерывание
    132. restore_sbirq   proc near
    133.     mov ax,3508h+SBIRQ  ; AH=25h AL=номер прерывания
    134.     lds dx,dword ptr old_sbirq
    135.     int 21h     ; восстановим обработчик
    136.     mov cl,1
    137.     shl cl,SBIRQ    ; построим битовую маску
    138.     in  al,21h      ; прочитаем OCW1
    139.     or  al,cl       ; запретим прерывание
    140.     out 21h,al      ; запишем OCW1
    141.     ret
    142. restore_sbirq   endp
    143.  
    144. ; процедура open_file
    145. ; открывает файл filename и копирует звуковые данные из него, считая что
    146. ; это - tada.wav, в буфер buffer
    147. open_file proc near
    148.     mov ax,3D00h    ; AH=3Dh AL=00
    149.     mov dx,offset filename  ; DS:DX - ASCIZ-строка с именем файла
    150.     int 21h     ; открыть файл для чтения
    151.     jc  error_exit  ; если не удалось открыть файл - выйти
    152.     mov bx,ax       ; идентификатор файла в BX
    153.     mov ax,4200h    ; AH=42h, AL=0
    154.     mov cx,0        ; CX:DX - новое значение указателя
    155.     mov dx,38h  ; по этому адресу начинаются данные в tada.wav
    156.     int 21h     ; переместим файловый указатель
    157.     mov ah,3Fh      ; AH=3Fh
    158.     mov cx,27459 ; это - длина данных в файле tada.wav
    159.     push    ds
    160.     mov dx,ds
    161.     and dx,0F000h   ; выровняем буфер на границу 4K-страницы
    162.     add dx,1000h    ; для DMA
    163.     mov ds,dx
    164.     mov dx,0        ; DS:DX - адрес буфера
    165.     int 21h     ; чтение файла
    166.     pop ds
    167.     ret
    168. error_exit:         ; если не удалось открыть файл
    169.     mov ah,9        ; AH=09h
    170.     mov dx,offset notopenmsg    ; DS:DX = адрес сообщения об ошибке
    171.     int 21h     ; вывод строки на экран
    172.     int 20h     ; конец программы
    173. notopenmsg  db  'Could not open file',0Dh,0Ah   ; сообщение об ошибке
    174.         db  'Exiting',0Dh,0Ah,'$'
    175. open_file endp
    176.  
    177. ; процедура program_dma
    178. ; настраивает канал 1 DMA
    179. program_dma proc near
    180.     mov al,5    ; замаскируем канал 1
    181.     out 0Ah,al
    182.     xor al,al   ; обнулим счётчик
    183.     out 0Ch,al
    184.     mov al,49h  ; установим режим передачи
    185.             ; (используйте 59h для автоинициализации)
    186.     out 0Bh,al
    187.  
    188.     push    cs
    189.     pop dx
    190.     and dh,0F0h
    191.     add dh,10h  ; вычислим адрес буфера
    192.  
    193.     xor ax,ax
    194.     out 02h,al  ; запишем младшие 8 бит
    195.     out 02h,al  ; запишем следующие 8 бит
    196.     mov al,dh
    197.     shr al,4
    198.     out 83h,al  ; запишем старшие 4 бита
    199.  
    200.     mov ax,27459    ; длина данных в tada.wav
    201.     dec ax      ; DMA требует длину-1
    202.     out 03h,al      ; запишем младшие 8 бит длины
    203.     mov al,ah
    204.     out 03h,al      ; запишем старшие 8 бит длины
    205.     mov al,1
    206.     out 0Ah,al      ; снимем маску с канала 1
    207.  
    208.     mov bl,14h      ; команда 14h
    209.     call    dsp_write   ; 8-битное простое DMA-воспроизведение
    210.     mov bx,27459    ; размер данных в tada.wav
    211.     dec bx      ; минус 1
    212.     call    dsp_write   ; запишем в DSP младшие 8 бит длины
    213.     mov bl,bh
    214.     call    dsp_write   ; и старшие
    215.     ret
    216. program_dma endp
    217.     end start
    218.  
     
  14. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Саунд из под ДОС, говоришь?...

    Ну вот тебе ссылочка

    http://www.meos.sysbin.com/viewtopic.php?t=317&postdays=0&postorder=asc&start=15

    дальше покопаешься, почитаешь, как люди реально AC97 непосредственно через порты "иметь" пытаются, но без серьезного изучения мануалов по дровам южный мост + кодек AC97 - ничего поБыстрячку, Ленивого и путного не выйдет!

    Тут хожено-перхожено многими! Плюс перекопано, погуглено, осмыслено, опробовано. Успехов!
     
  15. AceOfTrump

    AceOfTrump New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2006
    Сообщения:
    23
    Спасибо всем.
     
  16. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    А кто может объяснить, как проиграть WAV длиной более 64К? Проигрывание блоками связано с ухудшением качества (шелчки в колонках во время подгрузки буфера).
    Есть возможность воспроизведения с автоинициализацией (как у DMA так и DSP), но у меня что-то не выходит. Есть ли у кого пример или описание (подробное) как реализовать такой режим? Простое проигрывание с подгрузкой у меня есть.
    Заранее спасибо!
     
  17. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Xerx

    А зачем себя ограничивать 64 килоб.? Просто выделить еще пяток сегментофф / двадцаток через DPMI или еще как-то под кольцевой буфер?...
     
  18. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Chingachguk
    В SB16 нужно сначала загрузить буфер (на карту), потом дать команду play и подождать пока буфер не проиграется весь, т.к. подгружать новые данные в процессе проигрывания нельзя - нужно сначала остановить. Буфер получается совсем не кольцевой и никакого DMA в этой реализации не поддерживалось.
     
  19. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Quantum

    Мда, я не понял вопроса ;(

    А не спасает подгрузка маленькими буферами (по 1 килобайту к примеру) ? Тогда пауза будет меньше - ?
     
  20. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Нос fac et vinces:

    Usually, the double-buffering method is used for auto-initialize DMA mode transfer. The application allocates a stationary DMA buffer which must not straddle a 64 KB physical page boundary. The DSP block transfer size is then set to half of the DMA buffer size. After every DSP block size transfer, the DSP will generate an interrupt. On receiving the interrupt, the application can then transfer data to/from (depending on layback/recording) that half of the DMA buffer whose data has just been transferred.
    ...
    Auto-initialize DMA mode is crucial when dealing with high data rates. To give you some idea of the numbers involved, CD-quality sound (16-bit stereo at 44.1 kHz) involves transferring data at a rate of 176.4 KB/s. Under these conditions, using singlecycle DMA mode would produce less than optimal sound quality because of the time needed to reprogram the DMA and DSP to start transferring a new block at the end of every block of data. The delay between the blocks (though it may be brief), is enough to distort the sound.