如何从跨平台的Haskell代码播放音频文件

Joa*_*ner 7 linux windows audio haskell

我正在编写一个在Linux,Windows和OS X上运行的Haskell命令行应用程序.我现在必须从中播放音频文件(.wav,.ogg.mp3).我将如何实现一个功能

playAudioFile :: FilePath -> IO ()
Run Code Online (Sandbox Code Playgroud)

甚至更好

playAudio :: ByteString -> IO ()
Run Code Online (Sandbox Code Playgroud)

只是适用于所有系统?

(我很高兴调用常见的命令行工具,也不介意将它们捆绑为Windows发行版.)

Joa*_*ner 3

这是我使用 SDL-1.2 编写的代码:

\n\n
module PlaySound (withSound, playSound) where\n\nimport Control.Monad\nimport System.IO\nimport System.Directory\nimport Data.Foldable\nimport Control.Exception\nimport qualified Data.ByteString.Lazy as B\nimport Foreign.ForeignPtr\n\nimport Graphics.UI.SDL as SDL\nimport Graphics.UI.SDL.Mixer as Mix\n\nwithSound :: IO a -> IO a\nwithSound = bracket_ init cleanup\n  where\n    init = do\n        SDL.init [SDL.InitAudio]\n        getError >>= traverse_ putStrLn\n        ok <- Mix.tryOpenAudio Mix.defaultFrequency Mix.AudioS16LSB 2  4096\n        unless ok $\n            putStrLn "Failed to open SDL audio device"\n\n    cleanup = do\n        Mix.closeAudio\n        SDL.quit\n\nplaySound :: B.ByteString -> IO ()\nplaySound content = do\n        dir <- getTemporaryDirectory\n        (tmp, h) <- openTempFile dir "sdl-input"\n        B.hPutStr h content\n        hClose h\n\n        mus <- Mix.loadMUS tmp\n        Mix.playMusic mus 1\n        wait\n\n        -- This would double-free the Music, as it is also freed via a\n        -- finalizer\n        --Mix.freeMusic mus\n        finalizeForeignPtr mus\n        removeFile tmp\n\nwait :: IO ()\nwait = do\n    SDL.delay 50\n    stillPlaying <- Mix.playingMusic\n    when stillPlaying wait\n
Run Code Online (Sandbox Code Playgroud)\n\n

程序最终运行良好,但是

\n\n\n\n

所以我\xe2\x80\x99会很高兴阅读更好的答案。

\n