2010-02-08 5 views
8

Je voudrais être en mesure de produire du son depuis Haskell. J'utilise actuellement GHC 6.10 sous OS X (Snow Leopard). J'ai essayé de construire la bibliothèque de jack (using JackOSX) et la bibliothèque de PortAudio, mais aucun d'entre eux n'a semblé efficace. Existe-t-il un moyen relativement simple de faire de la sortie audio en direct à partir d'un programme Haskell sur un Mac?Sortie audio Haskell sous OS X?

Edit: Clarté

Répondre

5

J'utilise PortAudio avec succès.

Je pris quelques extraits de mon programme de jouet pour faire un exemple « echo » très simple, ci-dessous.

(course avec un casque ceci est une boucle de rétroaction du micro aux haut-parleurs et peut devenir très fort après quelques commentaires arrondit)

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 

ici Œuvres dans Leopard avec GHC 6.10.4.

Mon propre programme de jeu n'utilise en réalité que l'entrée audio, et il délivre des zéros à la sortie audio (sans faire ce que PortAudio se plaint).

+0

Comment avez-vous installé la bibliothèque portaudio elle-même? Je l'ai installé via macports et maintenant la bibliothèque haskell se plaint que la bibliothèque portaudio est la mauvaise architecture. – Edward

+1

Donc, apparemment, cela est lié à Snow Leopard étant tous les 64 bits par défaut, mais GHC étant encore 32 bits. Essayer de construire Portaudio comme 32 bits échoue également. – Edward

+0

@Edward Amsden: Je n'ai pas utilisé macports. J'ai fait 'configure' ..' make install' pour la version stable v19_20071207. Bonne chance. – yairchu