TMediaPlayer を効果音の数だけ作って音を出す方法
これでもかなりのタイムラグがある。
コンパイルに時間がかかる。
音は出るが、いい方法には思えない。
unit untSoundManager;
interface
uses
untFileUtil200,
untFileNameInfo,
untConfig,
FMX.Media,
SysUtils,
Classes,
Types;
type
TSoundType = (stSound, stMusic);
type
TSoundManager = class
private
FMediaPlayer: Array of TMediaPlayer;
FNameArray: Array of String;
FCurMediaIndex: Integer;
procedure setPathName(const Value: String);
procedure Stop;
public
constructor Create(aPathFileName: String);
destructor Destroy; override;
procedure Play(aItemName: String; SoundType: TSoundType);
procedure Init();
property PathName: String write setPathName;
end;
const
UNDEFINED_CURRENT_MEDIA_INDEX = -1;
var
SoundManager: TSoundManager;
implementation
constructor TSoundManager.Create(aPathFileName: String);
begin
PathName := aPathFileName;
FCurMediaIndex := UNDEFINED_CURRENT_MEDIA_INDEX;
end;
destructor TSoundManager.Destroy;
var
i: Integer;
begin
Stop();
Init();
inherited;
end;
procedure TSoundManager.Init;
var
i: Integer;
begin
for i := Low(FMediaPlayer) to High(FMediaPlayer) do
FMediaPlayer[i].Free;
end;
procedure TSoundManager.Stop();
begin
if FCurMediaIndex <> UNDEFINED_CURRENT_MEDIA_INDEX then
FMediaPlayer[FCurMediaIndex].Stop;
end;
procedure TSoundManager.Play(aItemName: String; SoundType: TSoundType);
var
i: Integer;
begin
if (((SoundType = stSound) and Config.IsSoundOn) or
((SoundType = stMusic) and Config.IsMusicOn)) then
begin
Stop();
for i := Low(FNameArray) to High(FNameArray) do
if FNameArray[i] = Trim(aItemName) then
begin
FCurMediaIndex := i;
FMediaPlayer[FCurMediaIndex].CurrentTime := 0;
FMediaPlayer[FCurMediaIndex].Play;
end;
end;
end;
procedure TSoundManager.setPathName(const Value: String);
var
tmpPathName: String;
tmpFileList: TStringList;
i: Integer;
tmpIndex: Integer;
tmpPathFileName: String;
begin
Init();
tmpPathName := Value;
tmpFileList := TStringList.Create();
fileListOfFolder(tmpPathName, tmpFileList);
SetLength(FMediaPlayer , 0);
SetLength(FNameArray, 0);
for i := 0 to tmpFileList.Count - 1 do
if ((ExtractFileExt(tmpFileList[i]) = '.wav') or
(ExtractFileExt(tmpFileList[i]) = '.WAV')) then
begin
SetLength(FMediaPlayer, Length(FMediaPlayer) + 1);
SetLength(FNameArray, Length(FNameArray) + 1);
tmpIndex := High(FMediaPlayer);
tmpPathFileName := SoundEffectRootDirectoryName() + tmpFileList[i];
FMediaPlayer[tmpIndex] := TMediaPlayer.Create(nil);
FMediaPlayer[tmpIndex].FileName := tmpPathFileName;
FNameArray[tmpIndex] := ChangeFileExt(ExtractFileName(tmpFileList[i]),'');
end;
tmpFileList.Free;
end;
end.