Playlist - Hilfe!



  • Hallo,

    bin jetzt mit meinem Latein am Ende deswegen frage ich euch: Habe ne Playlist erstellt, die ich mit dem TMediaPlayer abspielen lassen will. Wenn ich das Programm ausführe (im Debug Modus) klappt auch alles wunderbar...
    Wenn ich allerdings die fertige .exe Datei ausführe und die Playlist abspielen lassen will, wird immer nur das erste und letzte Lied abgespielt???!!
    Hier mein Code:

    int iItems = ListBox1->Items->Capacity;

    if(libPlaylist->ItemIndex < iItems - 1)
    {
    ListBox1->ItemIndex++;
    MediaPlayer1->FileName = ListBox1->Items->Strings[ListBox1-ItemIndex];
    libPlaylist->ItemIndex = ListBox1->ItemIndex;
    MediaPlayer1->Open(); // Media Player aktivieren
    MediaPlayer1->Notify = true;
    MediaPlayer1->Play();
    }

    if(MediaPlayer1->Mode == mpPlaying)
    MediaPlayer1->EnabledButtons = MediaPlayer1->EnabledButtons >> btPlay << btPause << btStop;

    Hoffe ihr könnt mir helfen!
    Gruß Pit



  • In deinem Codeausschnitt fehlt der Teil mit der Schleife, deshalb ist keine endgültige Aussage möglich.
    Auf jeden Fall sieh dir nochmal die Hilfe zu Capacity an; was du willst heisst Count.

    Und in Zukunft bitte die Code-Tags verwenden. Danke!



  • Hallo.

    Ich bin ein Schulkollege vom pit2 und wir arbeiten zusammen an dem Projekt. Ich hab mir jetzt 3 Stunden den Kopf zerbrochen über die Playlist aber hab absolut keine Ahnung warum das nicht funktioniert. Wie schon gesagt wenn ich das ganze mit dem Borland starte geht es. Wenn man die exe von Hand startet funktioniert das nicht. Mein Wissen reicht leider nicht aus zu verstehen warum das so ist.

    Das mit dem Count hab ich mir angekuckt. Wenn ich das einigermassen verstanden habe ist das sowas ähnliches wie for_each. Was mir das hier helfen soll weis ich aber nicht.

    Ich poste hier mal den ganzen Code. Die ListBox1 ist die Playlist für den Player. Die libPlaylist ist auch eine ListBox allerdings nur für die Anzeige da hier Titel, Interpret etc angezeigt werden.

    void __fastcall TForm1::MediaPlayer1Notify(TObject *Sender)
    {
        int iItems = ListBox1->Items->Capacity;
    
        if(MediaPlayer1->Mode == mpPlaying)
    	    MediaPlayer1->EnabledButtons = MediaPlayer1->EnabledButtons >> btPlay << btPause << btStop;
    
        else if(MediaPlayer1->Mode == mpStopped)       // Sobald Stoptaste gedrueckt wird, Player stoppen
            {
    	    MediaPlayer1->EnabledButtons = MediaPlayer1->EnabledButtons << btPlay >> btPause >> btStop;
            MediaPlayer1->Stop();
    
           ListBox1->ItemIndex = 0;
           libPlaylist->ItemIndex = 0;
       	MediaPlayer1->FileName = ListBox1->Items->Strings[ListBox1->ItemIndex];
       	MediaPlayer1->Open();                  // Media Player aktivieren
    
            }
    
        if(libPlaylist->ItemIndex + 1 == iItems && libPlaylist->ItemIndex != -1)       // Player anhalten, sobald das letzte Lied zu ende ist
        	{
            MediaPlayer1->EnabledButtons = MediaPlayer1->EnabledButtons << btPlay >> btPause >> btStop;
        	MediaPlayer1->Stop();
            ListBox1->ItemIndex = 0;
            libPlaylist->ItemIndex = 0;
            MediaPlayer1->FileName = ListBox1->Items->Strings[ListBox1->ItemIndex];
            MediaPlayer1->Open();                  // Media Player aktivieren
            MediaPlayer1->Notify = true;
           	}
    
        else
        {
        	if (iItems > 0)
        	{
           		ListBox1->ItemIndex++;
        		   MediaPlayer1->FileName = ListBox1->Items->Strings[ListBox1->ItemIndex];
           		libPlaylist->ItemIndex = ListBox1->ItemIndex;
           		MediaPlayer1->Open();              // Media Player aktivieren
                   MediaPlayer1->Notify = true;
                   MediaPlayer1->Play();
    
            }
         }
    }
    

    Währe fein wenn jemand sich das ankucken würde! Morgen ist nämlich Abgabe-Termin und bis auf die Playlist funktioniert eigentlich alles.

    Gruß ALex



  • Habs das ganze jetzt neu angefangen. Aber es ist immer noch das Problem das er vom ersten Lied direkt zum letzten springt. Hab langsam die Schnauze voll! Hier der Code:

    void __fastcall TForm1::MediaPlayer1Notify(TObject *Sender)
    {
      if(MediaPlayer1->Mode == mpPlaying)
            if ((ListBox1->ItemIndex) + 1 != ListBox1->Count)
            {
    
            ListBox1->ItemIndex++;
            libPlaylist->ItemIndex = ListBox1->ItemIndex;
    
            MediaPlayer1->EnabledButtons = MediaPlayer1->EnabledButtons >> btPlay << btPause << btStop;
            MediaPlayer1->FileName = ListBox1->Items->Strings[ListBox1->ItemIndex];
            MediaPlayer1->Open();                  
            MediaPlayer1->Notify = true;
            MediaPlayer1->Play();
            }
    
      if(MediaPlayer1->Mode == mpStopped)       
            {
            MediaPlayer1->EnabledButtons = MediaPlayer1->EnabledButtons << btPlay >> btPause >> btStop;
            MediaPlayer1->Stop();
            MediaPlayer1->Rewind();
            }
    }
    

    Wenn jemand weis war hier falsch läuft dann bitte melden.



  • Hallo

    if (ListBox1->ItemIndex < ListBox1->Count)
    

    halte ich für wesentlich eleganter

    Ansonsten kann ich euch nur empfehlen in eurer Programm mal Logging-Ausgaben zu machen. Also das eure Programm zur Laufzeit die Aufrufe von Methoden und die Werte wichtiger Variablen in eine Textdatei schreibt die ihr dann auswertet. Insbesondere ist die Abbruchbedingung interessant.

    Kompiliert ihr eurer Projekt im Debug- oder Releasemodus? Mit oder ohne Laufzeitpackages? Mit oder ohne dynamischen RTLs?

    bis bald
    akari



  • akari schrieb:

    Hallo

    if (ListBox1->ItemIndex < ListBox1->Count)
    

    halte ich für wesentlich eleganter

    Hab ich so gemacht. War nur schnell hinprogrammiert zum testen

    akari schrieb:

    Ansonsten kann ich euch nur empfehlen in eurer Programm mal Logging-Ausgaben zu machen. Also das eure Programm zur Laufzeit die Aufrufe von Methoden und die Werte wichtiger Variablen in eine Textdatei schreibt die ihr dann auswertet. Insbesondere ist die Abbruchbedingung interessant.

    Kompiliert ihr eurer Projekt im Debug- oder Releasemodus? Mit oder ohne Laufzeitpackages? Mit oder ohne dynamischen RTLs?

    Sowohl als auch. Hab alle durchprobiert. Immer dasselbe. Es macht keinen Unterschied ob mit RTLs oder ohne usw. Im Debug-Modus gehts, sonst nicht.

    Gruß Alex



  • Hab vergessen zu erwähnen das es im Debug-Modus auch mal nicht ging. Da war zu beobachten das direkt nach Aufruf des OnNotify-Ereignisses dieses wieder aufgerufen wurde, obwohl das Lied gerade mal angefangen hatte zu spielen. Als währe das ganze nur eine Schleife. Nach einem Neustart des Borlands ging es wieder.

    Ich vermute dieses Phänomen tritt auch auf wenn das ganze ohne Debugger läuft. Man sieht nämlich schön wie der ItemIndex in der Playlist nach unten rauscht und beim letzten Lied stehen bleibt. Bloss woran kann das liegen? Normalerweise wird doch das OnNotify-Ereignis nur aufgerufen wenn eine Methode zu Ende ist?

    Gruß Alex

    void __fastcall TForm1::MediaPlayer1Notify(TObject *Sender) 
    { 
          if(ListBox1->ItemIndex + 1 < ListBox1->Count)
           {
           ListBox1->ItemIndex++; 
           MediaPlayer1->FileName = ListBox1->Items->Strings[ListBox1->ItemIndex]; 
           MediaPlayer1->Open();                
           MediaPlayer1->Notify = true;
           MediaPlayer1->Play();
           } 
    }
    


  • Normalerweise wird doch das OnNotify-Ereignis nur aufgerufen wenn eine Methode zu Ende ist?

    Naja, Play() ist ja zuende, aber das Lied hat grade erst angefangen, denk ich mal. Wenn du Notify=true setzt, bevor du Play() aufrufst, muß ja OnNotify gleich wieder ausgelöst werden. Also entweder du setzt Notify=true nach Play() oder du fragst ab, was der Grund für OnNotify war. Wenn Mode==mpPlaying setzt du wieder Notify=true und brichst ab.



  • Hi Morris,

    soweit ich das verstanden habe muss Notify vor einer Methode, welche beim Beenden ein Notify-Ereignis auslösen soll, auf true gesetzt werden. Danach wirds automatisch auf false gesetzt d.h. es muss bei der nächsten Methode wieder auf true gesetzt werden wenn Notify gewünscht.

    So oder ähnlich stehts in der Hilfe.

    Aber das mit dem abfragen ob Mode == mpPlaying ist und dann nichts machen ist ne gute Idee. Die probier ich heut Abend gleich aus.

    Gruß Alex



  • Funktioniert auch nicht. Bei MediaPlayer1-> = mpStopped wurde der Player schon ganz beendet. Noch einer ne Idee?



  • Ich glaube, das liegt daran, daß du in der OnNotify-Methode selbst wieder 'Notify' modifizierst -> Rekursion.

    Ich habe mal ein ähnliches Projekt geschrieben (habe leider hier den Source nicht mehr), aber ich habe dafür einen Timer benutzt, der den aktuellen Zustand (Position) abgefragt hat und entsprechend darauf reagiert hat. (Bei Songs hintereinander abspielen, sollte eine Timer von z.B. 100-200ms reichen).


Anmelden zum Antworten