使用Haskell绑定保存Pulse Audio流

时间:2015-07-14 04:28:05

标签: haskell audio io pulseaudio

使用pulse-simple包我制作了以下代码:

main=do
    s<-simpleNew Nothing "example" Record Nothing "this is an example application"
      (SampleSpec (F32 LittleEndian) 44100 1) Nothing Nothing
    xs<-simpleRead s $ 44100*10 :: IO [Float]
    simpleFree s
    play xs

play :: [Float] -> IO ()
play d = do
    s<-simpleNew Nothing "example" Play Nothing "this is an example application"
        (SampleSpec (F32 LittleEndian) 44100 1) Nothing Nothing
    simpleWrite s d
    simpleDrain s
    simpleFree s

这可以录制并录制10秒的音频,然后播放。

我现在想要编码并保存音频文件(作为.wav rr无论如何),以便它可以在另一个程序中播放或转换。我认为这更像是一个音频问题,所以对于非Haskell人来说,我基本上有一系列长度为44100 * 10的花车。我怀疑我还需要一些其他的库。

提前致谢。

1 个答案:

答案 0 :(得分:3)

似乎WAVE package中的Data.WAVE模块应该完成这项工作。

将您的[Float]转换为[Int32],这构成waveSamples记录的WAVE字段。填写WAVEHeader的其余部分,然后使用putWAVEFile编写文件。

import Data.WAVE

writeWaveFile :: String -> [Float] -> IO ()
writeWaveFile path floats = putWAVEFile path wave
  where wave = WAVE wHeader wSamples
        wHeader = WAVEHeader { waveNumChannels = 1
                             , waveFrameRate = 44100
                             , waveBitsPerSample = 32 -- or maybe 8?
                             , waveFrames = Nothing
                             }
        wSamples = [[ ... | x <- floats ]]

使用合适的...功能填写Float -> Int32