Excel VBA飞机电气系统仿真中WAV音效仅首次播放问题求助
问题分析与解决方案
问题根源
你当前使用的sndPlaySoundAPI属于Windows旧版音频接口,不支持同时播放多个WAV文件。在异步模式(uFlags=1)下,第二次调用会直接终止当前播放的音频,但受限于API的单通道设计,新音频无法正常启动——这就是为什么无论先启动哪个发动机,只有第一个音效能播放的原因。
解决方案:改用mciSendStringAPI
mciSendString是更灵活的多媒体控制接口,支持为每个音频分配唯一标识(别名),实现多音频流同时播放。
步骤1:替换API声明
删除原有的sndPlaySound声明,添加以下代码到标准模块:
Option Explicit Public Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" ( _ ByVal lpstrCommand As String, _ ByVal lpstrReturnString As String, _ ByVal uReturnLength As Long, _ ByVal hwndCallback As Long) As Long
步骤2:编写多音频播放函数
Function PlayWavFileMulti(sPath As String, soundAlias As String) As Boolean Dim cmd As String Dim result As Long ' 打开音频文件并绑定唯一别名 cmd = "open """ & sPath & """ type waveaudio alias " & soundAlias result = mciSendString(cmd, vbNullString, 0, 0) If result <> 0 Then PlayWavFileMulti = False Exit Function End If ' 异步播放音频 cmd = "play " & soundAlias & " notify" result = mciSendString(cmd, vbNullString, 0, 0) ' 播放完成后自动释放资源(避免内存泄漏) cmd = "close " & soundAlias & " when done" mciSendString(cmd, vbNullString, 0, 0) PlayWavFileMulti = (result = 0) End Function
步骤3:修改发动机启动宏
为每个发动机的音效分配唯一别名,确保不会冲突:
Sub EngRunUp1() Dim sPath As String sPath = "C:\Users\srchr\Music\JetStart1.wav" PlayWavFileMulti sPath, "Engine1" End Sub Sub EngRunUp2() Dim sPath As String sPath = "C:\Users\srchr\Music\JetStart2.wav" PlayWavFileMulti sPath, "Engine2" End Sub
额外说明
- 若需要手动停止某个音效,可调用:
mciSendString "stop Engine1", vbNullString, 0, 0 mciSendString "close Engine1", vbNullString, 0, 0 - 确保音频文件路径正确,包含空格的路径已通过双引号处理,无需额外修改。
内容的提问来源于stack exchange,提问作者Steve R
相关产品推荐
相关产品推荐

