Einzelnen Beitrag anzeigen

Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 

MP3 mit DX abspielen / Beenden macht Fehler ...

  Alt 23. Sep 2009, 16:18
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.
Angehängte Dateien
Dateityp: zip dxmp3-test_-_binary_200.zip (351,5 KB, 29x aufgerufen)
Dateityp: zip dxmp3-test-source_212.zip (370,7 KB, 42x aufgerufen)
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat