1

我在从 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.
    

另外,一开始我正在重置声卡并打开 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 读取样本,请告诉我。谢谢!

4

1 回答 1

0

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

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

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

于 2017-06-03T09:51:51.080 回答