TMediaPlayer を一つにして、音を出すタイミングでファイルを読み込む方法を試してみる。
タイムラグがとてもある!残念。やっぱり、TMediaPlayer を複数作ったほうが断然タイムラグが小さい。
でも、とりあえずこの方法で行くか。
たぶん、TMemoryStream なんかにデータを置いておく方法があるはず。
unit untSoundManager;
interface
uses
untFileUtil200,
untFileNameInfo,
untConfig,
FMX.Media,
SysUtils,
Classes,
Types;
type
TSoundType = (stSound, stMusic);
type
TSoundManager = class
private
FMediaPlayer: TMediaPlayer;
FNameArray: Array of String;
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;
var
SoundManager: TSoundManager;
implementation
constructor TSoundManager.Create(aPathFileName: String);
begin
FMediaPlayer := TMediaPlayer.Create(nil);
PathName := aPathFileName;
end;
destructor TSoundManager.Destroy;
var
i: Integer;
begin
Init();
Stop();
FMediaPlayer.Free;
inherited;
end;
procedure TSoundManager.Init;
begin
SetLength(FNameArray, 0);
end;
procedure TSoundManager.Stop();
begin
FMediaPlayer.Stop;
end;
procedure TSoundManager.Play(aItemName: String; SoundType: TSoundType);
var
i: Integer;
tmpPathFileName: String;
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
tmpPathFileName := SoundEffectRootDirectoryName() + FNameArray[i] + '.wav';
FMediaPlayer.FileName := tmpPathFileName;
FMediaPlayer.CurrentTime := 0;
FMediaPlayer.Play;
end;
end;
end;
procedure TSoundManager.setPathName(const Value: String);
var
tmpPathName: String;
tmpFileList: TStringList;
i: Integer;
tmpPathFileName: String;
begin
Init();
tmpPathName := Value;
tmpFileList := TStringList.Create();
fileListOfFolder(tmpPathName, tmpFileList);
SetLength(FNameArray, 0);
for i := 0 to tmpFileList.Count - 1 do
if ((ExtractFileExt(tmpFileList[i]) = '.wav') or
(ExtractFileExt(tmpFileList[i]) = '.WAV')) then
begin
SetLength(FNameArray, Length(FNameArray) + 1);
FNameArray[High(FNameArray)] := ChangeFileExt(ExtractFileName(tmpFileList[i]),'');
end;
tmpFileList.Free;
end;
end.
7日目 音を出してみた2
コメントをどうぞ