Воспроизведение 24-битного звука невозможно

Я пытаюсь воспроизвести 24-битный аудиофайл с моим приложением AutoHotkey. Он просто использует SoundPlay. У Windows 7 нет проблем, однако пользователи Windows XP не могут воспроизводить 24-битные файлы.

В документации говорится:

Все ОС Windows должны иметь возможность играть .wav файлы. Однако другие файлы (.mp3,.avi и т.д.), возможно, не будет воспроизводиться, если правильные кодеки или функции не установлены в ОС.

Возможные исправления, упомянутые в статье Как играть в 24-битные файлы WAV в Windows Media Player, устраняют проблему для проигрывателя Windows Media, однако не для autohotkey:

Пошаговое руководство

  • Загрузите Legacy HD Audio Filter
  • regsvr32.exe AudioTypeConvert.ax
  • Воспроизведение 24-битного файла в Windows Media Player (работает) и AHK (без звука).
  • regsvr32.exe/u AudioTypeConvert.ax для удаления

Ожидаемое поведение: воспроизведение аудиофайлов без ошибок как в Windows Media Player, так и в приложениях AutoHotkey. Фактическое поведение: воспроизведение аудиофайлов без ошибок только в Windows Media Player и не воспроизводится в приложениях AutoHotkey в Windows XP.

Дальнейшее исследование

Как упоминалось в форумах AutoHotKey, SoundPlay использует mciSendString под капотом, и более подробную информацию о характере ошибки можно получить, позвонив это прямо.

Используя альтернативный DLL-вызов mciSendString, я получаю сообщение об ошибке 320, которое соответствует MCIERR_WAVE_OUTPUTSINUSE

Все осциллограммы, которые могут воспроизводить файлы в текущем формате, используются. Подождите, пока одно из этих устройств не станет бесплатным; затем повторите попытку.

Как воспроизвести 24-битные аудиофайлы в Windows XP в моем приложении AutoHotkey?

Тестируемое приложение на основе SoundPlay (download)

#NoEnv 
SetWorkingDir %A_ScriptDir%
FileSelectFile, f
SoundPlay, %f%
Msgbox, You should hear audio - except for 24bit wave files under Windows XP.

тестовое приложение на основе MCI (download)

#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
}

Ответ 1

Я бы конвертировал 24-битный файл в 16-битный файл, если это вообще возможно.