Assembly 读取和播放程序集中的.wav文件

Assembly 读取和播放程序集中的.wav文件,assembly,x86,wav,Assembly,X86,Wav,我想写一个汇编x86程序,在其中读取并播放.wav文件。我在谷歌上搜索了一个典型的.wav文件的结构,发现subchunk部分有一些可用的数据 我已经理解了以下内容,我想确定它是否正确,以便开始编码: 采样率只是将原始模拟信号采样为数字值(可能表示频率)的速率。我想我在播放.wav文件时与此值无关。Byterate是我必须发送字节的速率(某种程度上与任何声音文件的“属性”中的“比特率”相关) 例如,我必须打开扬声器,发送字节,等待一段时间——这是通过时钟频率和字节数(在一秒钟内发送的字节数)计算

我想写一个汇编x86程序,在其中读取并播放.wav文件。我在谷歌上搜索了一个典型的.wav文件的结构,发现subchunk部分有一些可用的数据

我已经理解了以下内容,我想确定它是否正确,以便开始编码:
采样率只是将原始模拟信号采样为数字值(可能表示频率)的速率。我想我在播放.wav文件时与此值无关。Byterate是我必须发送字节的速率(某种程度上与任何声音文件的“属性”中的“比特率”相关)

例如,我必须打开扬声器,发送字节,等待一段时间——这是通过时钟频率和字节数(在一秒钟内发送的字节数)计算出来的——关闭扬声器,然后再等待一段时间。 这是正确的吗

我不知道我能用2通道.wav文件做什么。频道是否为不同端口的扬声器


最后一件事是,我不知道如何计算打开或关闭扬声器的时间-空闲循环CPU-有字节在手。因为不同的指令需要不同的时钟周期来完成。

WAV文件是从编解码器导出的线性样本。你必须以相同的速率播放它们,除非你插值或抽取它们

我记得,WAV文件格式对多个通道使用交错

为了解码文件,您需要采样的宽度(位数)、采样频率(赫兹)和存在的通道数


这是什么操作系统?

用汇编语言编写这样一个程序有什么可能的原因?我不得不这么做,因为我的教授给了我这个项目。那么为什么你要向网络陌生人寻求帮助,而不是直接向你的教授寻求帮助呢?什么操作系统?如果Windows/*nix,您是否应该/允许使用其服务?WAV是一种Windows格式…请使用它所在的Windows。是的,在文件的开头有一个部分,我们可以在其中找到上述所有信息。但我真的不知道该怎么处理这些频道。当发送字节时,如果字节属于右通道还是左通道,会有什么区别?这不一定会有区别,而且很容易交换。您还可以将两个通道相加,并将两个通道的相加转换为单声道。这是一个奇怪的程序,因为Window支持WAV。我想这样做需要为声音设备加载一个缓冲区,以及一个反映缓冲区播放持续时间的计时器。我真的很抱歉表现得像个傻瓜,但我不明白。示例字节是要发送的字节吗?如果是,是不同端口的通道;因此,我必须将右声道的一个字节发送到与左声道不同的地址?例如,报头指示16位48KHz立体声。这意味着文件包含(在头之后)16位样本,格式为:第一个样本是左通道,第二个样本是右通道。继续以这种方式读取文件,直到完成为止。如果在中读取整个文件,则可以使用16位寄存器保存样本、movsw指令和字ptr(或仅字)前缀。使用48KHz,这意味着每个样本的时间为20.8333 us。因此,如果您将1000个样本写入声音缓冲区,则需要返回并在1000*20.8333 us=20.8毫秒时写入更多样本。我已经很长时间没有使用Windows声卡了,但此类设备使用“乒乓”缓冲区。也就是说,您加载一个缓冲区(ping),而另一个缓冲区正在播放(pong)。通常,设备有一个状态查询,以确定在任何给定时刻可以写入多少字节。您的样品将按采样率使用。你必须及时回来给它更多的样品。