7日目 音を出してみた2

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.

コメントを残す

メールアドレスが公開されることはありません。


5 × = 四十

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>