Има ли възпроизвеждане на WAV звук на Mac от Delphi XE2?

Има ли уроци или примери как да възпроизвеждате WAV файлове на Mac от приложение, създадено от Delphi XE2 FireMonkey?

Питам, защото този код не работи:

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. Може ли някой да предостави някои работещи примери за възпроизвеждане на звук на Delphi XE2 на Mac?


person Kromster    schedule 12.02.2012    source източник
comment
Предполагам, че форматът на fwaves запис не съвпада точно с формата на действителен WAV файл. Опитайте да използвате необработените байтове от файла.   -  person Marcus Adams    schedule 16.02.2012
comment
Опитах това, както и опитах initFromFile(path_to_aiff).. Нищо не помогна. Така че най-накрая преминах към OpenAL.   -  person Kromster    schedule 16.02.2012


Отговори (2)


Freepascal/Lazarus има единица, наречена "macosall.pas", която е превод на заглавните файлове на os-x C++ в pascal, което ви позволява да извиквате собствени os-x функции.

За съжаление този модул не е част от delphi, но като отворите модула, можете да копирате декларацията на функцията в delphi и трябва да работи.

Очаквам, че ще намерите това, от което се нуждаете, в Quicktime API, който е централният център на медиите на машини на Apple. Вижте и Apple developer и разгледайте документите.

person Jon Lennart Aasenden    schedule 13.02.2012
comment
Което не ми дава представа какво не е наред с NSSound-NSData в цитирания код. - person Kromster; 13.02.2012
comment
Докато кодирах в C# и mono за iOS, изпитах почти същите проблеми, но в различни области. Ако TNSData има същите методи като оригиналния клас Objective C, тогава можете да избутате данните като NSStream, NSBuffer или дори текст. В кода по-горе използвате нормален байтов буфер, изглежда, опитайте да инициализирате от поток. Един пример е диалоговият прозорец за изпращане на имейл, който според документите на Apple трябва да приема почти всеки NSdata обект - но той проработи едва когато използвах поток. - person Jon Lennart Aasenden; 15.02.2012

Може и да го публикувате като отговор, в случай че това помогне на някого:

Опитах това, както и initFromFile(path_to_aiff).. Нищо не помогна. Така че най-накрая преминах към OpenAL.

Може би в бъдеще Embarcadero коригира този специфичен начин за достъп до NSSound, но засега OpenAL работи най-добре. Освен това OpenAL е междуплатформен, което означава, че мога да използвам един и същ звуков код на Win и Mac.

person Kromster    schedule 09.04.2012