2013-04-25 60 views
0

我正在使用OpenGL的Xcode的C++中的一個小應用程序。 我試圖找到一種方法來添加簡單的聲音到我的應用程序。我沒有使用OpenAL取得太大成功(Alut在Mac中不可用),並且無法使sfml和SDL在我的系統上運行。所以我決定嘗試蘋果的PlayFile例如:使用PlayFile蘋果示例與OpenGL凍結OpenGL,直到播放聲音結束

http://developer.apple.com/library/mac/#samplecode/PlayFile/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008651

我可以用這個例子播放聲音。但是,當聲音開始播放時,OpenGL凍結,即所有動畫停止,直到聲音播放完畢。

我檢查了文件PlayFile.cpp,發現這一行:

usleep ((int)(fileDuration * 1000. * 1000.)); 

我認爲這是負責凍結的OpenGL。在這一行之前,我們開始播放聲音。在這一行之後,我們清理緩衝區。有沒有什麼方法可以改變代碼,讓聲音開始播放,OpenGL繼續執行任務,一旦聲音播放完畢,我們清理緩衝區?我嘗試使用其他解決方案(如指針)在開始播放後清理,但現在我無法從應用程序中發出任何聲音。

有什麼建議嗎?

回答

1

好的,經過幾天的研究,我找到了解決這個問題的方法。我用pthread創建了多個線程,每個線程都有一個線程。我剛剛添加了

#include <pthread.h> 

到任何定義線程的文件。我定義了我的聲音和線程的列表:

pthread_t threads[3]; 
string sounds[3] = {"back.wav", "Arrow1.wav", "Arrow2.wav"}; 

,並使用了簡單的功能:

void * playSound(void *threadid) 
{ 
long tid; 
tid = (long)threadid; 
player(sounds[tid], 1); 
pthread_exit(NULL); 
} 

當我創建一個線程,播放聲音:

pthread_create(&threads[2], NULL, playSound, (void *)2); 

這樣我動畫可以輕鬆與聲音相結合。

+1

+1:我覺得你很高興能回來你找到的答案,並分享它=) – Kahler 2014-04-09 22:34:27

+0

這是合理的,如果你使用簡單的聲音播放簡單。然而,「PlayFile」是一個完整的命令行應用程序(現在它的鏈接已經死了)放在了CoreAudio上,它有一個非常強大的_non-blocking_實時線程,並且其實時回調不應該干擾OpenGL。所以,阻止你的OpenGL繪圖與CoreAudio無關,它與「PlayFile」的製作方式有關。 – user3078414 2016-05-31 10:24:50