Проигрывание звукового файла в 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
Перевод Ильдар Валеев