У меня возникла проблема с чтением сэмплов из АЦП звуковой карты Sound Blaster 16.Звуковая карта Sound Blaster 16 в сборе x86 - чтение с АЦП
Окружающая среда: Я работаю над 32-разрядным хостом Windows XP в Windows 8.1 64-бит через Oracle VirtualBox 5.0.10. Я подражаю своей программе сборки с помощью DOSBox. Я пишу программу в сборке x86 и компилирую ее с помощью ML.
Чтобы сделать так, я хотел бы прочитать сэмплированный звук с АЦП звуковой карты с моего компьютера. Звук должен быть доставлен микрофоном (встроенным в мой ноутбук) или линейным входом.
Проблема: Когда я пытаюсь прочитать образец из АЦП, я всегда получаю одинаковые данные. Кажется, что я читаю данные из АЦП, которые не заполняются образцами звука, доставленными на компьютер с помощью микрофона или линейного входа. Возможно, моя программа не может «поймать» звук с микрофона.
Дополнительная информация:
И в ОС Windows 8.1 и микрофон Windows XP работает. Я проверил это на панели управления. Кроме того, использование Windows Sound Recorder отлично работает на обеих ОС.
Как я уже упоминал, возможно, я не включаю микрофон в своем приложении, и я не могу «поймать» звук с микрофона. Теперь, чтобы прочитать образцы, я использую следующий алгоритм:
1. Write 20h to DSP. a. Read data from 22Ch (my sound card start from 220h, I checked it and it works - see below) until the most significant bit will be 0. b. Write 20h to 22Ch. 2. Read value from DSP. a. Read data from 22Eh until the most significant bit will be 1. b. Read data from 22Ah.
Кроме того, в самом начале я делаю сброс звуковой карты и поворота SPEAKER на (написав d1h к 22Ch) (?).
Самое главное, что я МОГУ ОТПРАВИТЬ ЗВУК НА ЗВУКОВОЙ КАРТОЧКУ. Да, я посылаю прямоугольный сигнал DSP, и я получаю шум в своих динамиках. Я использую следующий алгоритм:
1. Write 10h to DSP (to 22Ch, procedure as above).
2. Write data byte (F0h) to DSP (to 22Ch).
3. Repeat for the second tone (1Ah to 22Ch).
Кроме того, я делаю сброс звуковой карты и Тьюринг динамик, но - что это немного интересно - это не имеет значения. Если я не сброшу карту, и я не включил динамик, я все еще могу слышать шум после отправки данных в ЦАП.
Итак, по-моему, все в порядке с виртуальной машиной, звуковой картой и т. Д., И единственная ошибка в том, что я не могу записать звук с микрофона.
Существует кусок кода, который я использую, чтобы прочитать образцы из АЦП:
readSample proc
; Write 20h to DSP
pollWriteBuffer:
mov dx, 22Ch
in al, dx
and al, 10000000B
cmp al, 0
jne pollWriteBuffer
mov dx, 22Ch
mov al, 20h
out dx, al
; Read value from DSP
pollReadBuffer:
mov dx, 22Eh
in al, dx
and al, 10000000B
cmp al, 10000000B
jne pollReadBuffer
mov dx, 22Ah
in al, dx
;--- TEST ---;
mov ah, 02h
mov dl, al
int 21h
;------------;
ret
readSample endp
Обратите внимание, что я хотел бы избежать использования доступа DMA, если это возможно. Я читал тоны литературы, и я не могу справиться с моей проблемой. Если вы знаете, почему я не могу читать образцы из АЦП, пожалуйста, дайте мне знать. Благодаря!
Устранение переменных. Сначала проверьте правильность вашей конфигурации: найдите какую-нибудь программу DOS, которая может записывать с карты SoundBlaster, или закрутите микрофон к динамикам. Тогда вы знаете все, но ваш код работает. Для бонусных очков, обратный инженер говорит программное обеспечение, сравнивающее то, что они делают с тем, что вы делаете. –
Зацикливание заднего микрофона на громкоговорители бессмысленно - как я уже упоминал, я всегда получаю то же значение от АЦП. Более того, как вы видите, я печатаю этот символ на stdout, и я понимаю, что это значение всегда 127 (dec). Таким образом, переключение микрофона на динамики приводит только к двум «ударам». Волны нет, сигнал постоянный, поэтому я ничего не слышу. Я попытаюсь найти какую-то программу в Интернете, запись которой звучит из Sound Blaster 16. – bargro
Я предлагаю найти другую программу *, чтобы сделать это. То, что вы знаете, работает. –