2015-11-17 5 views
1

У меня возникла проблема с чтением сэмплов из АЦП звуковой карты Sound Blaster 16.Звуковая карта Sound Blaster 16 в сборе x86 - чтение с АЦП

Окружающая среда: Я работаю над 32-разрядным хостом Windows XP в Windows 8.1 64-бит через Oracle VirtualBox 5.0.10. Я подражаю своей программе сборки с помощью DOSBox. Я пишу программу в сборке x86 и компилирую ее с помощью ML.

Чтобы сделать так, я хотел бы прочитать сэмплированный звук с АЦП звуковой карты с моего компьютера. Звук должен быть доставлен микрофоном (встроенным в мой ноутбук) или линейным входом.

Проблема: Когда я пытаюсь прочитать образец из АЦП, я всегда получаю одинаковые данные. Кажется, что я читаю данные из АЦП, которые не заполняются образцами звука, доставленными на компьютер с помощью микрофона или линейного входа. Возможно, моя программа не может «поймать» звук с микрофона.

Дополнительная информация:

  1. И в ОС Windows 8.1 и микрофон Windows XP работает. Я проверил это на панели управления. Кроме того, использование Windows Sound Recorder отлично работает на обеих ОС.

  2. Как я уже упоминал, возможно, я не включаю микрофон в своем приложении, и я не могу «поймать» звук с микрофона. Теперь, чтобы прочитать образцы, я использую следующий алгоритм:

    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, если это возможно. Я читал тоны литературы, и я не могу справиться с моей проблемой. Если вы знаете, почему я не могу читать образцы из АЦП, пожалуйста, дайте мне знать. Благодаря!

+1

Устранение переменных. Сначала проверьте правильность вашей конфигурации: найдите какую-нибудь программу DOS, которая может записывать с карты SoundBlaster, или закрутите микрофон к динамикам. Тогда вы знаете все, но ваш код работает. Для бонусных очков, обратный инженер говорит программное обеспечение, сравнивающее то, что они делают с тем, что вы делаете. –

+0

Зацикливание заднего микрофона на громкоговорители бессмысленно - как я уже упоминал, я всегда получаю то же значение от АЦП. Более того, как вы видите, я печатаю этот символ на stdout, и я понимаю, что это значение всегда 127 (dec). Таким образом, переключение микрофона на динамики приводит только к двум «ударам». Волны нет, сигнал постоянный, поэтому я ничего не слышу. Я попытаюсь найти какую-то программу в Интернете, запись которой звучит из Sound Blaster 16. – bargro

+0

Я предлагаю найти другую программу *, чтобы сделать это. То, что вы знаете, работает. –

ответ

0

Возможно, вы не выбрали микрофон для ввода в АЦП.

Sound Blaster 16 имеет входной микшер и выходной микшер. АЦП оцифровывает значения, выводимые из входного микшера. Входной микшер может принимать сигналы от микрофона, CD-плеера, линейного входа или MIDI-выхода, но между ними и микшером есть переключатель. Для записи с микрофона вы должны закрыть переключатель, который соединяет микрофон с входным микшером.

Существует также контроль усиления для выхода микшера на АЦП и управление усилением для входа микрофона в микшер. Если любой из них повернут полностью вниз, АЦП не получит никакого сигнала от микрофона.