2012-02-12 55 views
5

是否有任何教程或例子如何播放WAV文件在Mac上從Delphi XE2 FireMonkey構建的應用程序?Delphi XE2在Mac上播放WAV聲音嗎?

我這麼問是因爲這個代碼不工作:

var 
    //fWaves head and data is initialized and plays properly on Win through OpenAL 
    fWaves: array of record 
    Head: TWAVHeaderEx; 
    Data: array of byte; 
    end; 
    D: NSData; 
    N: NSSound; 
begin 
    D := TNSData.Wrap(TNSData.Create.initWithBytes(@fWaves[0].Head, SizeOf(fWaves[0].Head) + fWaves[0].Head.DataSize)); 
    ShowMessage(IntToStr(D.length)); //--Length is correct 
    N := TNSSound.Wrap(TNSSound.Create.initWithData(D)); 
    ShowMessage(FloatToStr(N.Duration)); //--Displays 0 
    if N.play then 
    ShowMessage('Yes') 
    else 
    ShowMessage('No'); //--Always returns NO 
end; 

我加載WAV文件頭和數據從內存和它起着罰款與OpenAL的。所以這個問題出現在我的NSSound使用中。任何人都可以提供一些在Mac上使用Delphi XE2聲音播放的例子嗎?

+0

我猜fwaves記錄的格式並不完全匹配實際的WAV文件的格式。嘗試使用文件中的原始字節。 – 2012-02-16 18:41:10

+0

試過了,以及嘗試initFromFile(path_to_aiff)..沒有什麼幫助。所以我終於切換到了OpenAL。 – Kromster 2012-02-16 18:59:41

回答

0

還不如將它張貼作爲一個答案,如果可以幫助任何人:

試過了,也試過initFromFile(path_to_aiff) ..沒有什麼幫助。所以我終於切換到了OpenAL。

也許在未來Embarcadero修復了訪問NSSound的具體方式,但現在OpenAL的效果最好。另外,OpenAL是跨平臺的,這意味着我可以在Win和Mac上使用相同的聲音代碼。

3

Freepascal/Lazarus有一個名爲「macosall.pas」的單元,它將os-x C++頭文件翻譯成pascal,允許您調用本地os-x函數。

不幸的是,這個單元不是delphi的一部分,但通過打開單元,您可以將函數聲明覆制到delphi,它應該可以工作。

我希望你能在quicktime API中找到你需要的東西,它是蘋果機器上媒體的中心樞紐。還請查看Apple developer並查看文檔。

+0

這不會給我一個關於引用代碼中NSSound-NSData錯誤的線索。 – Kromster 2012-02-13 17:58:55

+0

雖然使用C#和iOS編碼,但我經歷了許多相同的問題,但在不同的領域。如果TNSData與最初的Objective C類具有相同的方法,那麼可以將數據推送爲NSStream,NSBuffer或甚至文本。在上面的代碼中,您似乎使用普通的字節緩衝區,請嘗試從流中初始化。一個例子是郵件發送對話框,它根據蘋果文檔應該採取任何NSdata對象 - 但直到我使用它的工作流。 – 2012-02-14 21:18:25