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发行版.)
这是我使用 SDL-1.2 编写的代码:
\n\nmodule 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\nRun Code Online (Sandbox Code Playgroud)\n\n程序最终运行良好,但是
\n\ncabal install依赖依赖项了。所以我\xe2\x80\x99会很高兴阅读更好的答案。
\n| 归档时间: |
|
| 查看次数: |
515 次 |
| 最近记录: |