装配x86的Sound Blaster 16声卡 - 从ADC读取

时间:2015-11-17 01:48:17

标签: audio assembly soundcard

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

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

要做:我想从我的电脑读取声卡ADC的采样声音。声音应通过麦克风(内置于我的笔记本电脑中)或线路输入。

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

其他信息:

  1. Windows 8.1和Windows XP麦克风都正常工作。我在控制面板中检查了这个。此外,使用Windows录音机在两个操作系统上均可正常工作。

  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.
    
  3. 另外,在开始时我正在重置声卡并打开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的样品,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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