TMediaPlayer可以替代多平台快速音效吗?

时间:2018-04-09 13:19:33

标签: delphi firemonkey

我正在寻找一种在多平台游戏(Android和Windows)中以低开销播放多种快速音效(WAV格式)的方法。

我尝试使用TMediaPlayer组件,但创建多个实例会增加启动和关闭时间的开销。

我研究并发现这个代码提供了一种低开销的方法。可悲的是,代码与Android下的Delphi 10.2(东京)不兼容(windows工作正常)。在Android下,永远不会触发onLoadComplete,导致GLoaded标志保持为false并且应用程序将冻结。 http://www.fmxexpress.com/free-game-audio-manager-wrapper-class-in-delphi-xe6-firemonkey-for-android-ios-windows-and-osx/

有没有人知道替代解决方案或者能够理解为什么GameAudioManager回调函数无法触发?

2 个答案:

答案 0 :(得分:0)

编辑:我的初步测试是在柏林完成的,而OP正在使用东京。以下结果适用于柏林。请进一步了解东京。

我很好奇为什么你提供的FMXExpress链接中的代码不起作用,因为我在我的多平台音频类中使用了非常相似的代码。所以我决定下载代码并尝试一下。

演示应用程序查找3个特定文件ding1.wav,ding2.wav和ding3.wav;在Windows上它查找文档文件夹中的文件,在Android上它需要assets \ internal

中的文件

对于Windows,我必须将一些音频文件复制到文档文件夹并相应地重命名。你报告的应用程序运行正常。 (Windows 10版本1709)。

对于Android,我首先看一下项目的部署设置。列出了3x音频文件,但本地路径为空。我只是取消选中现有条目并从我的文档文件夹中重新添加它们,并将每个条目的远程路径设置为 assets \ internal 。直接在我连接的设备上编译应用程序,它运行正常。 Android SDK 24.3.3 32位,运行Android 7.0的LG-V522 G-Pad III

编辑 - 东京问题说明:

OP是正确的;使用Tokyo 10.2.3

编译时,链接的示例代码不起作用

简单的调试表明永远不会调用回调TOnSpoolLoadCallBack.onLoadComplete,这是将全局GLoaded设置为True所必需的。结果是应用程序在以下代码中无限循环:

<强> TGameAudioManager.AddSound

while not GLoaded do
begin
  Sleep(10);
  Application.ProcessMessages;
end;

为了使代码工作,(这是一个hack)添加一个限制循环运行时间的计数器。像这样......

procedure TGameAudioManager.AddSound(...)
const
  MaxWaitLoop = 10;
var
  ...
  loopCount : integer;
Begin
  ...
  loopCount := 0;
  while not GLoaded AND (loopCount < MaxWaitLoop) do
  begin
    inc(loopCount);
    Sleep(10);
    Application.ProcessMessages;
  end;
  ...

通过一些防止无限循环的逻辑,应用程序现在可以工作,并且可以在Android设备上听到音频。

备注:

  • 您现在需要弄清楚为什么回调在东京不起作用。经过快速检查并与柏林比较后,对我来说并不明显。
  • 您不应在生产中使用此代码。 Application.ProcessMessages几乎总是指向坏人 实现。相反,回调应该冒泡到您的主应用程序,例如,您可以启用UI元素

答案 1 :(得分:0)

似乎有一个更新版本的'GameAudioManager'单元(现在被称为“AudioManager”)与Delphi Tokyo上的Android兼容。我查看了代码,似乎只是删除了“onload”回调和'loaded'check-loop。

这是更新的代码: https://github.com/Embarcadero/DelphiArcadeGames/blob/master/Full/AlienInvasion/AudioManager.pas