Уменьшите задержку перед воспроизведением аудиофайла - PullRequest
0 голосов
/ 04 октября 2018

У меня есть Delphi VCL форма с тремя компонентами кнопки.После нажатия кнопки воспроизводится короткий 4-секундный аудиофайл .wav (в файле ресурсов), связанный с этой конкретной кнопкой.

При первом нажатии кнопки после открытия программы раздражающая задержка около 1/2 секунды происходит до начала воспроизведения.Такая задержка не возникает при нажатии кнопки в течение примерно 5 секунд после воспроизведения файла, хотя с более длительными интервалами задержка повторяется.Кроме того, задержка не возникает из-за прерывания воспроизведения нажатием кнопки до завершения воспроизведения текущего файла.

Как я могу избавиться от этих задержек или хотя бы существенно уменьшить их?Сами звуковые файлы не имеют тихих вводов.Вот код (выпуск сообщества Delphi):

unit Unit8;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm8 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
  public
  end;
var
  Form8: TForm8;

implementation
{$R *.dfm}

procedure TForm8.Button1Click(Sender: TObject);
begin
PlaySound('Resource_1', HInstance, SND_RESOURCE or SND_NODEFAULT or SND_ASYNC or SND_SENTRY);
end;

procedure TForm8.Button2Click(Sender: TObject);
begin
PlaySound('Resource_2', HInstance, SND_RESOURCE or SND_NODEFAULT or SND_ASYNC or SND_SENTRY);
end;

procedure TForm8.Button3Click(Sender: TObject);
begin
PlaySound('Resource_3', HInstance, SND_RESOURCE or SND_NODEFAULT or SND_ASYNC or SND_SENTRY);
end;
end.

1 Ответ

0 голосов
/ 04 октября 2018

Вы фактически просите Windows повторно загружать данные .WAV из файла .EXE каждый раз, когда вы проигрываете их.Это займет некоторое время, если только данные все еще не находятся в кеше (именно поэтому это займет больше времени, если вы будете ждать достаточно долго, чтобы данные были «выброшены» из кеша - Windows затем должна перезагрузить данные из)прочитайте ресурс в TBytes:

FUNCTION LoadResource(CONST ResourceName : STRING) : TBytes;
  VAR
    S   : TStream;
    SZ  : Int64;

  BEGIN
    S:=TResourceStream.Create(HInstance,ResourceName,RT_RCDATA);
    TRY
      SZ:=S.Size;
      SetLength(Result,SZ);
      S.Read(Result,0,SZ)
    FINALLY
      FreeAndNIL(S)
    END
  END;

Затем используйте эту функцию в качестве основы для воспроизведения звука:

FUNCTION PlayWAV(CONST Data : TBytes ; Flags : UINT = SND_ASYNC) : BOOLEAN;
  BEGIN
    Result:=sndPlaySound(PChar(Data),Flags OR SND_MEMORY)
  END;
...