Hi,
ich habe ein kleines Demo gebastelt. Das funktioniert soweit gut.
Nur beim beenden gibts Probleme. (Man muss es ohne Delphi
IDE im Taskmanager "killen")
Leider hilft mir der Laufzeitfehler nicht wirklich weiter.
Oder gibt es noch eine andere Möglichkeit eine mp3 über
DirectX abzuspielen ?
Delphi-Quellcode:
program Project1;
uses
Windows, ...;
type
TMP3 = class
private
pBaseFilter: IBaseFilter;
pGraphBuilder:IGraphBuilder ;
pMediaCtrl: IMediaControl;
pMediaEvent: IMediaEventEx;
ready: bool;
public
constructor Create;
destructor Destroy; override;
function Load(filename: string): BOOL;
procedure Cleanup();
procedure Play();
procedure Pause();
procedure Stop();
end;
var
MP3: TMP3;
hWindow: HWND = 0;
constructor TMP3.Create;
begin
pBaseFilter := nil;
pGraphBuilder := nil;
pMediaCtrl := nil;
pMediaEvent := nil;
ready := false;
CoInitialize(nil);
end;
destructor TMP3.Destroy;
begin
Cleanup;
end;
function TMP3.Load(filename: string): BOOL;
begin
// ...
end;
procedure TMP3.Cleanup();
begin
if pMediaCtrl <> nil then
begin
pMediaCtrl.Stop();
pMediaCtrl._Release();
pMediaCtrl := nil;
end;
if pBaseFilter <> nil then
begin
pBaseFilter._Release;
pBaseFilter := nil;
end;
if pMediaEvent <> nil then
begin
pMediaEvent._Release();
pMediaEvent := nil; // <--<< Boing #1
end;
if pGraphBuilder <> nil then
begin
pGraphBuilder._Release(); // <--<< Boing #2
pGraphBuilder := nil;
end;
CoUninitialize();
end;
procedure TMP3.Play();
...
procedure TMP3.Stop();
begin
if ready then pMediaCtrl.Stop();
end;
// --- Main ------------------------------------------------------------------
begin
MP3:= TMP3.Create;
try
if MP3.Load('Nuppsy-SoulEye 128kbps.mp3') then
begin
MP3.Play;
// MB_USERICON for a non BeepBox ;-)
MessageBox(hWindow, 'Playing...', '!', MB_OK or MB_USERICON);
// MP3.Stop; // "Autostop" im Destructor
end;
finally
MP3.Free;
end;
end.