Аудио на Haskell на OS X? - PullRequest
       11

Аудио на Haskell на OS X?

8 голосов
/ 08 февраля 2010

Я бы хотел иметь возможность выводить звук с Haskell. В настоящее время я использую GHC 6.10 на OS X (Snow Leopard). Я пытался собрать библиотеку jack (используя JackOSX) и библиотеку PortAudio, но ни одна из них не показалась эффективной. Есть ли относительно простой способ вывода живого звука из программы на Haskell на Mac?

Редактировать: Ясность

1 Ответ

5 голосов
/ 08 февраля 2010

Я успешно использую 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).

...