我从Sound Blaster 16声卡的ADC读取样本时遇到问题。

环境:我正在通过Oracle VirtualBox 5.0.10在Windows 8.1 64位的Windows XP 32位主机上工作。我正在用DOSBox模拟我的汇编程序。我正在用汇编x86编写程序,并使用ML进行编译。

要做的事情:我想从计算机读取声卡ADC的采样声音。声音应通过麦克风(内置在笔记本电脑中)或线路输入来传递。

问题:当我尝试从ADC读取样本时,我总是得到相同的数据。似乎我正在从ADC读取数据,该数据没有被麦克风或线路输入传递到计算机的声音样本所填充。也许我的程序无法“捕捉”麦克风的声音。

附加信息:

  • 在Windows 8.1和Windows XP麦克风中均可使用。我在“控制面板”中进行了检查。另外,在两个操作系统上使用Windows录音机都可以正常工作。
  • 正如我之前提到的,可能我没有在应用程序中打开麦克风,也无法从麦克风“捕获”声音。现在,要读取示例,我正在使用以下算法:
    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).
    

    另外,我正在重置声卡并打开扬声器,但是-有点有趣-没关系。如果我不重置卡并且不打开扬声器,则在将数据发送到DAC之后,我仍然能够听到噪音。

    因此,我认为使用虚拟机,声卡等都可以,而且唯一的错误是我无法从麦克风捕获声音。

    我使用一段代码从ADC读取样本:
        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访问。我读过文学作品,无法解决自己的问题。如果您知道为什么我无法从ADC读取样本,请告诉我。谢谢!

    最佳答案

    您可能没有选择麦克风输入ADC。

    Sound Blaster 16具有输入混音器和输出混音器。 ADC将输入混频器输出的值数字化。输入混音器可以从麦克风,CD播放器,线路输入或MIDI输出接收信号,但是在每个输入和混音器之间都有一个开关。要从麦克风录制,必须关闭将麦克风连接到输入混音器的开关。

    还有一个用于混音器输出到ADC的增益控制,以及一个用于麦克风输入到混频器的增益控制。如果将其中任何一个完全调低,则ADC将不会从麦克风接收任何信号。

    关于audio - 组件x86中的Sound Blaster 16声卡-从ADC读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33747811/

    10-11 09:02