Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem mit PlaySound-Befehl (https://www.delphipraxis.net/67717-problem-mit-playsound-befehl.html)

Christian.Ossi 18. Apr 2006 23:52


Problem mit PlaySound-Befehl
 
Der PlaySound - Befehl vom MMSystem ruft in meinem Programm aus einer Ressourcen-DLL einen Sound auf.
Das Abspielen des Sounds funktioniert zwar, jedoch wird das ganze Programm für die Dauer des Abspielens angehalten bzw. eben lahm gelegt. Kann man das verhindern bzw. umgehen.
Ich hab diesen PlaySound in einen eigenen Timer gelegt, doch das bringt nichts.
Das ganze Programm reagiert nicht mehr. Der Sound ist 20 Sek. lang und solange kann man nichts mehr machen.

Gibt's dafür ne Lösung? z.B. einen Ersatz für PlaySound oder eine andere Einstellung?

DGL-luke 19. Apr 2006 00:22

Re: Problem mit PlaySound-Befehl
 
Wieso fragen das jetzt auf einmal alle?

Hier im Forum suchenplaysound asynchron, erstes ergebnis... gute nacht...

Christian.Ossi 19. Apr 2006 12:21

Re: Problem mit PlaySound-Befehl
 
Wenn ich ASYNC nehme, dann spielt er gar nichts mehr ab.
Liegt das daran, dass die WAVE ja in der DLL als Ressource liegt?

Delphi-Quellcode:
DLLHandle:=LoadLibraryEX(SoundsDLL,0,LOAD_LIBRARY_AS_DATAFILE);
PlaySound('Intro',DLLHandle,SND_ASYNC Or SND_RESOURCE);

Christian.Ossi 20. Apr 2006 17:57

Re: Problem mit PlaySound-Befehl
 
Delphi-Quellcode:
Var DLLHandle: THandle;

PlaySound(Nil,0,0);
DLLHandle:=LoadLibraryEX(SoundsDLL,0,LOAD_LIBRARY_AS_DATAFILE);
Try
Application.ProcessMessages;
PlaySound(PChar('Intro'),DLLHandle,SND_ASYNC Or SND_MEMORY Or SND_RESOURCE);
Finally
FreeLibrary(DLLHandle);
End;

(SoundsDLL ist eine Konstante mit dem Namen)

Was ist daran falsch?
Es kommt kein Sound? - Er kommt nur wenn ich SND_SYNC nehme - aber das will ich ja nicht.

turboPASCAL 20. Apr 2006 18:56

Re: Problem mit PlaySound-Befehl
 
Jane, ist klar. ;) Du musst das laden der Resource global machen. Windows läd zur Wiedergabe nur einen Teil der Resource.
In deinem Fall heisst dass das wenn der Sound wiedergegeben wird nicht die Resource nachgeladen werden kann und somit hängt das Programm...

So wird es richtiger:

Delphi-Quellcode:
//...

const
  SoundsDLL = 'MediaRes.dll';

var
  DLLHandle: THandle;

procedure TForm.ButtonClick...
begin
  PlaySound(Nil, 0, 0);

  if DLLHandle > 0 then
  begin
    if not PlaySound(PChar('SNDOK'), DLLHandle, SND_ASYNC Or SND_MEMORY Or SND_RESOURCE) then
      MessageBox(Handle, 'Sound konnte nicht abgespielt werden', 'Information', MB_OK);
  end else
  begin
    MessageBox(Handle, 'DLL-Ladefehler', 'Information', MB_OK);
  end;
end;

procedure TForm.FormCreate...
begin
  DLLHandle := LoadLibraryEx(SoundsDLL, 0, LOAD_LIBRARY_AS_DATAFILE);
end;

procedure TForm.FormDestroy...;
begin
  FreeLibrary(DLLHandle);
end;
//...
(ungetested)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz