2015-04-24 28 views
1

我正在拍一個使用球拍的幻燈片,並希望在幻燈片放映後的循環中播放一首短歌。我目前使用的是(play-sound),但是Racket在歌曲結尾崩潰時會出現segfault,總是在不同的幻燈片中。如果我在沒有聲音代碼的情況下運行節目,它不會出現段錯誤。如何在Racket/gui重複播放歌曲?

我認爲歌曲結局導致racket/gui崩潰,循環可能會阻止這種情況發生。在播放的節目主要功能的樂曲因此

(define (run) 
(play-sound "path" #t) 
(slide (...) 
(run)) 

使歌曲不斷切出,只打了前兩秒鐘左右之後重複。我現在有主要功能之外的播放聲音線,但它的確會碰到最後,有時甚至是最後一聲。我試過增加DrRacket的記憶,但它沒有幫助。任何建議表示讚賞。

+2

Segfault?如果你還沒有升級。如果您運行最新版本,請提交錯誤報告。 – soegaard

+0

什麼操作系統? (並且確實如@soegaard所說的那樣) –

+0

除非'(幻燈片...)'完全在聲音結束時結束,它會遞歸併開始一次又一次地在不同的起始點同時獲取相同的剪輯。也許你應該用「異步」做一個忙碌的循環? =>#f'在一個過程中,並啓動它作爲一個單獨的線程? – Sylwester

回答

1

您可能對RSound套餐感興趣(參考http://pkgs.racket-lang.org)。此套件與您目前的方法相比具有優點和缺點。最明顯的缺點是它需要將你的歌曲轉換成WAV。以下是一些代碼:

#lang racket 

(require rsound) 

(define ishmael (rs-read "/Users/clements/Desktop/call-me-ishmael.wav")) 

(define LEAD-TIME (* 1/10 44100)) 

(define (play-forever sound) 
    (define p (make-pstream)) 
    (define len (rs-frames sound)) 
    (let loop ([t 0]) 
    (pstream-queue p sound (+ t LEAD-TIME)) 
    (define next-t (+ t len)) 
    (sleep (* 1/44100 (- next-t (pstream-current-frame p)))) 
    (loop next-t))) 

(play-forever ishmael)