我正在尝试使用我的 AutoHotkey 应用程序播放 24 位音频文件。它只使用SoundPlay。Windows 7 没有问题,但是 Windows XP 用户无法播放 24 位文件。
文档说:
所有 Windows 操作系统都应该能够播放 .wav 文件。但是,如果操作系统上未安装正确的编解码器或功能,其他文件(.mp3、.avi 等)可能无法播放。
如何在 Windows Media Player 中播放 24 位 WAV 文件一文中提到的可能修复正在修复 Windows Media Player 的问题,但不适用于自动热键:
分步指南
- 下载旧版高清音频过滤器
- regsvr32.exe AudioTypeConvert.ax
- 在 windows 媒体播放器(工作)和 AHK(无声音)中播放 24 位文件。
- regsvr32.exe /u AudioTypeConvert.ax 卸载
预期行为:在 Windows Media Player 和 AutoHotkey 应用程序中播放音频文件时均无错误。实际行为:音频文件仅在 Windows Media Player 中无错误播放,在 Windows XP 下的 AutoHotkey 应用程序中无法播放。
进一步的调查
正如 AutoHotKey 论坛中提到的,SoundPlay 在后台使用mciSendString,可以通过直接调用它来获得有关错误性质的更多信息。
使用 mciSendString 替代 DLL 调用,我收到错误消息 320,它对应于MCIERR_WAVE_OUTPUTSINUSE
所有可以播放当前格式文件的波形设备都在使用中。等到这些设备之一空闲;然后,再试一次。
如何在我的 AutoHotkey 应用程序中在 Windows XP 中播放 24 位音频文件?
基于 SoundPlay 的测试应用程序(下载)
#NoEnv
SetWorkingDir %A_ScriptDir%
FileSelectFile, f
SoundPlay, %f%
Msgbox, You should hear audio - except for 24bit wave files under Windows XP.
基于 MCI 的测试应用程序(下载)
#NoEnv
SetWorkingDir %A_ScriptDir%
FileSelectFile, f
TryPlaySound(f)
Msgbox, You should hear audio - except for 24bit wave files under Windows XP.
; If SoundPlay does not work TryPlaySound
TryPlaySound( mFile )
{
; SKAN www.autohotkey.com/forum/viewtopic.php?p=361791#361791
VarSetCapacity( DN,16 ), DLLFunc := "winmm.dll\mciSendString" ( A_IsUnicode ? "W" : "A" )
DN := DllCall(DLLFunc, Str, "play " """" mFile """" "", Uint, 0, Uint, 0, Uint, 0)
Return DN
}