Проигрывание звукового файла в Delphi.

Copyright © 2000 Ernesto De Spirito

В этой статье рассказывается, как проиграть wave-файлы из разных источников.

Если Вы хотите воспроизвести системные звуки, вызовите функцию MessageBeep с требуемыми параметрами. Вызовите MessageBeep(-1);, если Вы хотите воспроизвести звук из динамика.

Для воспроизведения WAV файлов Вы можете использовать объект TMediaPlayer, но если желаете, чтобы всё работало чуточку быстрее, наилучшим путём представляется вызов API-функции sndPlaySound (объявлена в модуле mmsystem). Например:



uses MMSystem;

procedure TForm1.Button1Click(Sender: TObject);

begin
  sndPlaySound('C:WindowsMediaTada.wav',
    SND_NODEFAULT Or SND_ASYNC Or SND_LOOP);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  sndPlaySound(nil, 0); // Останаливает воспроизведение
end;

Если Вы намереваетесь запускать звук более или менее часто, то тогда Вы, возможно, должны рассмотреть загрузку файла в память и его воспроизведение оттуда:


uses MMSystem;

var
  tada: string;


procedure TForm1.Button1Click(Sender: TObject);
begin
  sndPlaySound(Pointer(tada), SND_MEMORY
    Or SND_NODEFAULT Or SND_ASYNC);
end;

initialization
  tada := LoadFile('C:WindowsMediaTada.wav');
finalization
  tada := ''; // Освобождаем память, занятую строкой
end.

Вы также можете встроить один или несколько wave-файлов в исполняемый модуль Вашего приложения и воспроизодить его оттуда. Сначала, Вы должны создать файл ресурсов (.RES). Для этого создайте файл .RC, например с именем sounds.rc:


tada wave c:windowsmediatada.wav
chimes wave c:windowsmediachimes.wav

Затем ы должны скомпилировать его компилятором ресурсов (BRCC32.EXE в папке DelphiBin) и Вы получите файл с именем sounds.res, который Вы сможете ключить в свой проект с помощью директивы $R. Для проигрывания встроенного исполняемый модуль звука вызовите PlaySound (вместо sndPlaySound) с флагом SND_RESOURCE:


uses MMSystem;

{$R sounds.res}


procedure TForm1.Button1Click(Sender: TObject);
begin
  PlaySound('chimes', hInstance, SND_RESOURCE or SND_SYNC);
  PlaySound('tada', hInstance, SND_RESOURCE or SND_ASYNC);
end;

Опять же, если Вы собираетесь запускать звук более или менее часто, Вы должны рассмотреть загрузку ресурса в память и воспроизведение его оттуда:



uses Windows, MMSystem;

{$R sounds.res}

var
  tada: Pointer;

procedure TForm1.Button1Click(Sender: TObject);
begin
  sndPlaySound(tada, SND_MEMORY
    or SND_NODEFAULT or SND_ASYNC);

end;

initialization
  // Here we use some castings to avoid using another variable
  tada := Pointer(FindResource(hInstance, 'tada', 'wave'));
  if tada <> nil then begin
    tada := Pointer(LoadResource(hInstance, HRSRC(tada)));
    if tada <> nil then tada := LockResource(HGLOBAL(tada));
  end;

end.

Оригинал статьи http://www.latiumsoftware.com/en/delphi/00024.php

Перевод Ильдар Валеев


Google