Есть ли воспроизведение звука 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++ на паскаль, что позволяет вам вызывать собственные функции os-x.

К сожалению, этот модуль не является частью delphi, но, открыв модуль, вы можете скопировать объявление функции в delphi, и он должен работать.

Я ожидаю, что вы найдете то, что вам нужно, в QuickTime API, который является центральным центром мультимедиа на машинах Apple. Также зайдите на страницу для разработчиков Apple и ознакомьтесь с документацией.

person Jon Lennart Aasenden    schedule 13.02.2012
comment
Что не дает мне понять, что не так с NSSound-NSData в цитируемом коде. - person Kromster; 13.02.2012
comment
При написании кода на C# и моно для 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