【发布时间】:2011-01-02 04:01:20
【问题描述】:
我有一张支持多个扬声器的声卡 (Creative SB X-Fi)。我想做的是用 C++(Windows 7 环境,Visual Studio IDE)编写一个程序,它将向我连接的 4 个扬声器之一播放给定的单声道 wav 文件。关于将实现这一目标的具体功能,任何人都可以为我指出正确的方向吗?我尝试用谷歌搜索解决方案并没有取得成果。谢谢。
【问题讨论】:
我有一张支持多个扬声器的声卡 (Creative SB X-Fi)。我想做的是用 C++(Windows 7 环境,Visual Studio IDE)编写一个程序,它将向我连接的 4 个扬声器之一播放给定的单声道 wav 文件。关于将实现这一目标的具体功能,任何人都可以为我指出正确的方向吗?我尝试用谷歌搜索解决方案并没有取得成果。谢谢。
【问题讨论】:
您可以使用 DirectSound 通过一组环绕声扬声器播放声音。请参阅MSDN page "Sounds in 3-D"。
【讨论】:
我建议先尝试 Ben Voigt 的答案,因为如果成功,它可能会更容易、更灵活。
但如果由于某种原因没有,另一种选择如下。
基本上,当您想从特定扬声器播放单声道 .wav 时,将其转换为 6 声道 .wav,在其中五个声道上无声,但包含来自声道上单声道 .wav 的数据您希望它播放的扬声器。
这应该很容易做到,因为 .wav 文件格式非常简单。基本思想是单声道 .wav 文件中的声音数据将由(通常)每个音频样本的两字节对组成,例如:
1234 2ab3 def0 ce18 ....
要将数据转换为多通道,您需要为其他通道插入静音(零)。例如,对于通道 0(左前),您可以使用:
1234 0000 0000 0000 0000 0000 2ab3 0000 0000 0000 0000 0000 def0 0000 0000 0000 0000 0000 (etc)
而你会使用右前方:
0000 1234 0000 0000 0000 0000 0000 2ab3 0000 0000 0000 0000 0000 def0 0000 0000 0000 0000 (etc)
(有关订单请咨询此list of speaker assignments。)
你还需要处理文件头,但是wave file header format很简单;您需要将 NumChannels 从 1 更改为 6,ByteRate 从任何值更改为相同的值乘以 6,BlockAlign 和 Subchunk2Size 类似。
请注意,我实际上并没有测试过以上任何一个,但它不应该花费太多时间来进行实验。如果它不起作用,可能需要将较新的 WAVE_FORMAT_EXTENSIBLE 数据添加到文件中 - 更繁琐但仍然不太难;这是useful page describing these extensions to the .wav format。
【讨论】:
【讨论】: