You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 02:24:21