Я успешно использую PortAudio.
Я взял несколько отрывков из своей игрушечной программы, чтобы сделать очень простой пример "эха" ниже:
(работает с наушниками. Это петля обратной связи от микрофона к динамикам и может стать очень громкой после нескольких раундов обратной связи)
import Control.Monad (forever)
import Data.Int (Int16)
import Foreign.Ptr (nullPtr)
import Sound.PortAudio
initPortAudio :: Int -> IO (PaStream Int16)
initPortAudio blockSize = do
Right NoError <- initialize
Just micDevIdx <- getDefaultInputDevice
Just spkDevIdx <- getDefaultOutputDevice
Right paStream <-
openStream
(Just (StreamParameters micDevIdx 1 PaInt16 0.1 nullPtr))
(Just (StreamParameters spkDevIdx 1 PaInt16 0.1 nullPtr))
44100 blockSize
:: IO (Either String (PaStream Int16))
Right NoError <- startStream paStream
let zeroBlock = replicate blockSize [0]
Right NoError <- writeStream paStream zeroBlock blockSize
return paStream
main :: IO ()
main = do
paStream <- initPortAudio blockSize
forever $ do
Right numSampsAvail <- getStreamReadAvailable paStream
Right curSamps <- readStream paStream 1 numSampsAvail
Right NoError <- writeStream paStream curSamps numSampsAvail
return ()
where
blockSize = 0x800
Работает здесь, в Leopard с GHC 6.10.4.
Моя собственная игрушечная программа на самом деле использует только аудиовход и выводит нули в аудиовыход (без этого жалуется PortAudio).