Dzwięki w Delphi

Adam Boduch

Funkcja PlaySound

Odtwarzanie dźwięków w Delphi nie musi następować bezpośrednio z komponentu MediaPlayer. Do odgrywania plików .wav wystarczy funkcja PlaySound();

Dodaj najpierw do sekcji uses słowo MMSystem

Struktura funkcji

PlaySound(pszSound, PCHar; hmod: HMODULE; fdwSound: DWORD);

Oto wyjaśnienie jej parametrów:

  • pszSound - Oznacza nazwę pliku lub pozycji rejestru.
  • hmod - jeżeli plik nie jest ładowany z zasobu ta wartość powinna mieć wartość 0.
  • fdwSound - określa tzw. flagi. W tym miejscu możesz wstawić:
    • SND_ALIAS - pozycja jest odgrywana z rejestru.
    • SND_FILMENAME - plik odgrywany jest z dysku.
    • SND_RESOURCE - plik odgrywany jest z zasobu.
    • SND_PURGE - Polecenie to kończy odtwarzanie plików muzycznych.
    • SND_ASYNC - odtwarzanie odbywa się równocześnie z działaniem aplikcaji.
    • SND_LOOP - odtwarzanie następuje w sposób ciągły.

Odtwarzanie instniejącego pliku

Jeżeli chcesz odtworzyć teraz jakiś plik dźwiękowy z dysku to robisz tak:

PlaySound('C:\plik.wav', 0, SND_FILENAME);

I to wszystko! Jedna linia odtworzy plik C:\plik.wav.

Zatrzymywanie odtwarzania

Żeby wyciszyć wszytkie dźwięki tj. wyłączyć je musisz zrobić coś takiego:

PlaySound(nil, 0, SND_PURGE); 

Dźwięki systemowe

PlaySound('SystemStart', 0, SND_ALIAS);

Wszystkie dźwięki wraz z ich angielskimi odpowiednikami można znaleźć w rejestrze pod kluczem:

HKEY_CURRENT_USER\AppEvents\EventLabels

Może się jednak zdarzyć, że dźwięk nie uruchamiania systemu nie jest przypisany. Wtedy odtworzony zostanie standardowy dźwięk: ding.wav.
Aby temu zapobiedz musisz zastosować znacznik SND_NODEFAULT. Będzie to wyglądało tak:

PlaySound('SystemStart', 0, SND_ALIAS or SND_NODEFAULT);

Program MMPlayer

Na podstawie tego wszystkiego można napisać mały programik wczytujący z dysku plik .wav i odtwarzający go.
Daj na formę dwa BitButtony z ikonami stop i play. Ustaw ich właściwości Align na alRight.

Wstaw:
BitButton z Ikonką Play i Align na alRight
BitButton z Ikonką Stop i Align na alRight
OpenDialog z Filtrem do .wav

Ustaw:
Szerokość formy na 235
Wysokość formy na 47
*BorderStyle na bsToolWindow

Kod programu (z góry przepraszam za Form2 zamiast Form1)

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MMSystem, StdCtrls, Buttons;
 
type
  TForm2 = class(TForm)
    Label1: TLabel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    OpenDialog: TOpenDialog;
    procedure FormShow(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
  NazwaPliku : String;
 
implementation
 
{$R *.dfm}
 
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
if NazwaPliku <> '' then
begin
  PlaySound(PWideChar(NazwaPliku), 0, SND_FILENAME or SND_ASYNC)
end
else
begin
  if OpenDialog.Execute then
  begin
    NazwaPliku := OpenDialog.FileName;
    OpenDialog.FileName := '';
    Label1.Caption := ExtractFileName(NazwaPliku);
    PlaySound(PWideChar(NazwaPliku), 0, SND_FILENAME or SND_ASYNC);
  end;
end;
end;
 
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
PlaySound(nil, 0, SND_PURGE);
 
end;
 
procedure TForm2.FormShow(Sender: TObject);
begin
Form2.Width := 235;
Form2.Height := 47;
Form2.BorderStyle := bsToolWindow;
 
if ParamStr(1) = '' then
NazwaPliku := ''
else
begin
NazwaPliku := ParamSTR(1);
PlaySound(PWideChar(NazwaPliku), 0, SND_FILENAME or SND_ASYNC);
end;
 
end;
end.
392ddb294182.jpg

To by było na tyle jeśli chodzi o funkcję PlaySound.

Komponent MediaPlayer

Komponent MediaPlayer jest rozbudowanym komponentem do odtwarzania filmów, plików .mid ,.wav, *.avi. Na samym początku należy przypisać wartość FileName do pliku, który masz zamiar odtwarzać. Następnie należy go otworzyć no i odegrać:

with MediaPlayer do
begin
   FileName := 'muzyka.mid';
   Open; // Otwarcie...
   Play;  // Odtwarzanie...
end; 

Przy pomocy tego komponentu można także nagrywać dźwięki. Oto przykład:

with MediaPlayer do
begin
  FileName := 'test.wav'; // nadanie nazwy
  Open;
  StartRecording; // rozpoczęcie nagrywania
end; 

Aby to teraz zatrzymać:

with MediaPlayer do
begin
  Stop; // zatrzymanie nagrywania
  FileName := 'plik.wav'; // nadanie nowej nazwy pliku
  Save; // zapisanie...
  Close; // zamknięcie
end; 
Artykuł został umieszczony na liście Zalążków artykułów. Jeżeli możesz rozbuduj go!

8 komentarzy

Tu tylko odtwarzanie - a ja polecę mój artykuł na temat nagrywania dźwięku w Delphi:
http://lukashp.pl/Artykul/Programowanie/Delphi/delphi-nagrywanie_dzwieku

no ale to działa jak się chce odtworzyć jeden plik... a jeśli chce odtworzyć dwa pliki na raz to jak miałbym to zrobić? A tak konkretnie jak otworzyć port, odegrać dźwięk no i potem ten port zamknąć?

{---------------------------------------------}
i:=1;
repeat
if sciezka[i]<'\' then label1.caption:=label1.Caption+sciezka[i];
if sciezka[i]='\' then label1.caption:='';
i:=i+1;
until (sciezka[i]='')and(sciezka[i]<' ');
{-------------------------------------------------------}
jest to procedura wyciągająca ze ścieżki sama nazwę odtważanego obiektu czyli krutko mówiac tytuł, bo po co komu cała ścieżka z nazwą widoczna

Pozwoliłem sobie poprawić jedną literówkę w kodzie ;)

a jak zrobić żeby otwarzzało w pętli??

Wstawiasz komponent MediaPlayer (System),
dajesz Visible na False, potem 2 procedury:
MediaPlayer.FileName:='data\muza\cmentarz.mid';
MediaPlayer.Open;
MediaPlayer.Play;

Paszczak
Jak odgrywać dźwięki midi w programie??

Npiasz mi Adaś, czy to ty piszesz sobie te oceny, czy gdzieś da się dać swoją??