DirectShow



  • Ich seh ja auch keinen, aber das gibt einen zugriffsverletzungsfehler beim debuggen. 😣 Hier sind doch sicherlich welche mit mehr Hirn als ich, ist das denn so unmöglich? 😞



  • Hier sind leider recht wenige die DirectShow verwenden, vermutlich wissen die Spieleprogrammierer hier da mehr drüber. (Oder ist es schon zu lange aus dem DX-SDK verschwunden?) 😉

    Die meisten scheinen noch MCI zu nutzen.



  • Azrael, il Meraz schrieb:

    Denn eine integration von DirectShow in eine (von einer Sterblichen Hand) verwendbare Klasse wird nicht erläutert.

    Du musst Dir die Struktur der Klasse "MMMUSIC" besser überlegen.
    Ev. würde es schon reichen, wenn Du in der WinMain folgendes auskommentierst :

    // mmm->MediaWindow(hWnd);
    
    // mmm->MusicMsgDp();
    


  • Nachtrag :

    "besser überlegen" klingt blöde. Sorry.

    Das Problem ist wie folgt :

    "MMMUSIC *mmm = new MMMUSIC;" in der WinMain erzeugt eine Instanz der Klasse "MMMUSIC".

    Der Aufruf von "mmm->InitDirectShow();" initialisiert diese Instanz.

    Der Aufruf von "mmm->MediaWindow(hWnd);" erzeugt eine zweite Instanz, die nicht initialisiert wird und deshalb die Zugriffsverletzung auslöst.



  • Werd das morgen mal durchn Compiler jagen und mal sehen was der Sacht und dann deinen Code mal genauer angucken ... find längerer Code ist im Forum immer schlecht zu lesen (zumindest wenn er nicht kommentiert ist) und ich weiß nicht genau wo er warum raushaut usw...



  • merker schrieb:

    Nachtrag :

    "besser überlegen" klingt blöde. Sorry.

    Das Problem ist wie folgt :

    "MMMUSIC *mmm = new MMMUSIC;" in der WinMain erzeugt eine Instanz der Klasse "MMMUSIC".

    Der Aufruf von "mmm->InitDirectShow();" initialisiert diese Instanz.

    Der Aufruf von "mmm->MediaWindow(hWnd);" erzeugt eine zweite Instanz, die nicht initialisiert wird und deshalb die Zugriffsverletzung auslöst.

    😮 Hart, wieso erstellt MediaWindow eine zweite uninitialisierte instanz??? das macht doch nur ein Pseudo-Fenster für Messageverarbeitungen...

    (D)Evil schrieb:

    find längerer Code ist im Forum immer schlecht zu lesen (zumindest wenn er nicht kommentiert ist)

    *so rot werd* -> #FF0000 *schäm*

    geeky schrieb:

    Die meisten scheinen noch MCI zu nutzen.

    och nö, bitte nicht die MCI ^^"""

    merker schrieb:

    Azrael, il Meraz schrieb:

    Denn eine integration von DirectShow in eine (von einer Sterblichen Hand) verwendbare Klasse wird nicht erläutert.

    Du musst Dir die Struktur der Klasse "MMMUSIC" besser überlegen.
    Ev. würde es schon reichen, wenn Du in der WinMain folgendes auskommentierst :

    // mmm->MediaWindow(hWnd);
    
    // mmm->MusicMsgDp();
    

    das Programm verursacht keinen Fehler mehr, hört aber net auf, abzuspielen, nachdem man es beendet ^^", bzw. wird nachm schließen nicht mehr beendet xD. Irgendwas stimmt im WinAPI teil glaub ich nicht ganz ^^"". Oder irgendwelche DirectShow threads werden net beendet. oh man 🙄



  • Azrael, il Meraz schrieb:

    wieso erstellt MediaWindow eine zweite uninitialisierte instanz???

    Mit "zweiter Instanz" meinte ich, dass der Aufruf von "mmm->MediaWindow(hWnd)" ein zweites Fenster erzeugt hat. Das ist kein "Pseudo-Fenster" sondern ein "echtes".
    In der WndProc des zweiten Fensters wird "DispatchMessage(&msg)" aufgerufen -> FATAL.
    Innerhalb von "DispatchMessage(&msg)" ruft das Betriebssystem immer die WndProc auf -> solange bis der Stack überläuft.

    Azrael, il Meraz schrieb:

    Irgendwas stimmt im WinAPI teil glaub ich nicht ganz

    Teste erstmal, ob die "MMMUSIC" generell funktioniert, z.B. so :

    // in der WinMain nur folgendes :
     MMMUSIC *mmm = new MMMUSIC;
    
     mmm -> InitDirectShow ();
     mmm -> LoadFile       (TEXT("amr.mp3"));
     mmm -> play           ();
     Sleep (10000);
     mmm -> stop           ();
     mmm -> release        ();
     delete (mmm);
    
    // MMMUSIC::stop () ändern :
    void MMMUSIC::stop()
    {
      mMediaControl  -> Stop ();
      mMediaPosition -> put_CurrentPosition (0); // <- hinzufügen
    }
    


  • jap, klappt, brauche aber umbedingt messageverarbeitung^^""".

    Und ich glaube, ich habs nicht ganz verstanden, was jetzt so fatal ist Oo.
    das zweite Fenster wird doch legal erstellt und initialisiert Oo.

    der darf man nun nur einen DispatchMessage() pro programm haben?

    bzw. das PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE) nimmt sich doch nur die nachrichten, die für das zweite fenster bestimmt sind, also die manuelle WM_GRAPHEVENT...

    DispatchMessage() wird doch garnicht innerhalb eines WndProcs aufgerufen Oo. in der Messageschleife darfs auch net sein, oder wie?

    Ich glaub, ich kapier grad irgendwas nicht xDD



  • Azrael, il Meraz schrieb:

    DispatchMessage() wird doch garnicht innerhalb eines WndProcs aufgerufen

    Stimmt. Mein Fehler. Da habe ich irgendwas übersehen. Vielleicht schon ein bischen spät. 🙂

    Die "MMMUSIC" läuft also.
    Dann setz jetzt mal in der WinMain "mmm->MediaWindow(hWnd);" wieder ein (an der gleichen Stelle), aber änder mal folgendes in der MessageLoop der WinMain :

    mmm->InitDirectShow(); 
    mmm->MediaWindow(hWnd); 
    mmm->LoadFile(TEXT("amr.mp3")); 
    mmm->play(); 
    
    while(true) 
    { 
    
     if(PeekMessage(&msg,hWnd, 0,0, PM_REMOVE)) 
     { 
      if(msg.message == WM_QUIT) break; 
    //   mmm->MusicMsgDp(); // <- nicht hier aufrufen
                            // sonst kann das zweite Fenster immer nur dann seine
                            // Botschaften bearbeiten, wenn das erste Fenster eine kriegt
      TranslateMessage (&msg); 
      DispatchMessage  (&msg); 
     } 
    
     mmm->MusicMsgDp();     // <- sondern hier (ausserhalb)
    
    }
    


  • öhm. kann das sein, dass das erste fenster nachrichten an den WndProc vom 2ten schickt? Oo. Das wär für mich zwar unerklärlich, aber irgendwie scheint das so zu sein... obwohl das garnicht sein kann - es wird eine WM_GRAPHEVENT nachricht geschickt

    ich hab grad wieder debuggt - und etwas unmögliches gesehen. hier:

    if(!mmm)
    	{
    		return DefWindowProc(hwnd, uMsg, wParam, lParam);
    	}
    	else
    	{
    		return mmm->MusicProc(hwnd, uMsg, wParam, lParam);
    	}
    

    macht er beide returns.... ich glaub ich krieg alpträume...



  • "mmm" ist erst dann ein gültiger Zeiger wenn das Betriebssystem die Static_proc mit WM_CREATE aufgerufen hat. Vorher nicht.
    D.h. er geht 2,3,4 mal in die DefWindowProc(hwnd, uMsg, wParam, lParam) und dann nicht mehr.

    Funktioniert die "MMMUSIC" nun auch mit eigenem Fenster ? Falls ja, dann brauchst Du das Fenster aus der WinMain nicht mehr.



  • ist mir schon klar, dass zuerst noch paar andere nachrichten kommen^^ hab mir alles schön gemerkt 😛 . ich hab aber im einzelschrittmodus debuggt und da springt er nach dem if() zum return DefWindowProc() und danach geht er einfach in die else zeile und zu return mmm->MusicProc(). sowas ist meiner meinung nach recht krank.

    Müsste auch mit eigenem Fenster gehen. hab auch umprogrammiert, klappt aber trotzdem nicht >.<. noch komischer - hier ein schönes Bild:
    http://xcpp.de/ressources/cpp/hae.jpg

    Hab versucht, ein haltepunkt im MusicProc zu machen (der muss ja aufgerufen werden, damit OnGraphEvent ausgeführt wird) und naja, der Haltepunkt wird einfach ignoriert, und da steht dann sowas... Das megakranke dabei ist ja, dass OnGraphEvent aufgerufen wird, ohne dass der MusicProc erreicht wird.

    Also - das ist jetzt so ziemlich meine kränkste programmiererfahrung xD



  • Ups. sorry leute - ich hab hier den totalen schwachsinn gemacht. Eigentlich brauch ich garkein WndProc für die Messageverarbeitung von DirectShow. geht auch ganz einfach ohne. Das Buch, nach welchem ich lerne ist an allem schuld xD, das hat mich total verwirrt. so Wie s dort erklärt war, ist das unvermeidlich, aber ein netter Mensch hat mich grad darauf hingewiesen, dass das kompletter schwachsinn ist, was ich mache 😣 xD. Trotzdem vielen Dank für die hilfe^^


Anmelden zum Antworten