2016-08-26 5 views
2

В настоящее время я пытаюсь воспроизвести аудиофайлы в Haskell с помощью OpenAl. Для этого я пытаюсь получить код примера в репозитории ALUT git (https://github.com/haskell-openal/ALUT/blob/master/examples/Basic/PlayFile.hs) для работы. Однако он отказывается производить звук. Что мне здесь не хватает?Нет звука с Haskell OpenAl

{- 
    PlayFile.hs (adapted from playfile.c in freealut) 
    Copyright (c) Sven Panne 2005-2016 
    This file is part of the ALUT package & distributed under a BSD-style license. 
    See the file LICENSE. 
-} 

import Control.Monad (when, unless) 
import Data.List (intersperse) 
import Sound.ALUT 
import System.Exit (exitFailure) 
import System.IO (hPutStrLn, stderr) 

-- This program loads and plays a variety of files. 

playFile :: FilePath -> IO() 
playFile fileName = do 
    -- Create an AL buffer from the given sound file. 
    buf <- createBuffer (File fileName) 

    -- Generate a single source, attach the buffer to it and start playing. 
    source <- genObjectName 
    buffer source $= Just buf 
    play [source] 

    -- Normally nothing should go wrong above, but one never knows... 
    errs <- get alErrors 
    unless (null errs) $ do 
     hPutStrLn stderr (concat (intersperse "," [ d | ALError _ d <- errs ])) 
     exitFailure 

    -- Check every 0.1 seconds if the sound is still playing. 
    let waitWhilePlaying = do 
      sleep 0.1 
      state <- get (sourceState source) 
      when (state == Playing) $ 
      waitWhilePlaying 
    waitWhilePlaying 

main :: IO() 
main = do 
    -- Initialise ALUT and eat any ALUT-specific commandline flags. 
    withProgNameAndArgs runALUT $ \progName args -> do 

     -- Check for correct usage. 
     unless (length args == 1) $ do 
     hPutStrLn stderr ("usage: " ++ progName ++ " <fileName>") 
     exitFailure 

     -- If everything is OK, play the sound file and exit when finished. 
     playFile (head args) 

К сожалению, пока у меня нет ошибок, я также не могу слышать звук. Pavucontrol также, похоже, ничего не обнаруживает (на вкладке «Воспроизведение» нет дополнительных потоков).

Их пример HelloWorld в том же репозитории git также не дал ни ошибок, ни звука.

Я также попытался функцией OpenALInfo на хранилище же мерзавец (https://github.com/haskell-openal/ALUT/blob/master/examples/Basic/OpenALInfo.hs), что еще больше доказывает, что я на самом деле подключение к OpenAL, и дает некоторую информацию о версиях, которые могут или не могут быть полезны:

ALC version: 1.1 
ALC extensions: 
    ALC_ENUMERATE_ALL_EXT, ALC_ENUMERATION_EXT, ALC_EXT_CAPTURE, 
    ALC_EXT_DEDICATED, ALC_EXT_disconnect, ALC_EXT_EFX, 
    ALC_EXT_thread_local_context, ALC_SOFTX_device_clock, 
    ALC_SOFT_HRTF, ALC_SOFT_loopback, ALC_SOFT_pause_device 
AL version: 1.1 ALSOFT 1.17.2 
AL renderer: OpenAL Soft 
AL vendor: OpenAL Community 
AL extensions: 
    AL_EXT_ALAW, AL_EXT_BFORMAT, AL_EXT_DOUBLE, 
    AL_EXT_EXPONENT_DISTANCE, AL_EXT_FLOAT32, AL_EXT_IMA4, 
    AL_EXT_LINEAR_DISTANCE, AL_EXT_MCFORMATS, AL_EXT_MULAW, 
    AL_EXT_MULAW_BFORMAT, AL_EXT_MULAW_MCFORMATS, AL_EXT_OFFSET, 
    AL_EXT_source_distance_model, AL_LOKI_quadriphonic, 
    AL_SOFT_block_alignment, AL_SOFT_buffer_samples, 
    AL_SOFT_buffer_sub_data, AL_SOFT_deferred_updates, 
    AL_SOFT_direct_channels, AL_SOFT_loop_points, AL_SOFT_MSADPCM, 
    AL_SOFT_source_latency, AL_SOFT_source_length 

ответ

4

Ну, оказывается, я разместил здесь слишком быстро. У меня не было проблем с моим кодом, а с моими настройками OpenAl. Добавляя

drivers=pulse,alsa 

в /etc/openal/alsoft.conf OpenAL работает. Это описано в https://wiki.archlinux.org/index.php/PulseAudio#OpenAL.