Stworzenie listy piosenek odtwarzanych automatycznie za pomocą MediaPlayer

Odpowiedz Nowy wątek
2018-12-12 22:07
0

Witam. Potrzebuje w swoim programie zrobić listę piosenek, które by same się odtwarzały. W tym celu wykorzystuję MediaPlayer1 i wczytuję ścieżkę dźwiękową:

MediaPlayer1->FileName = "Muzyka/piosenka.wav";

Następnie odtwarzam piosenkę:

MediaPlayer1->Open();

Na końcu funkcja zamykania otwartego pliku:

MediaPlayer1->Close();

Wszystko działa tylko nie potrafię dodać tutaj więcej piosenek. Jak tworzę więcej linijek z FileName i przypisuje im ścieżki dźwiękowe to odtwarza się ostatnia piosenka. Jak dodać więcej piosenek? Jak sprawić, żeby automatycznie się odtwarzały jedna po drugiej? Jak ręcznie zmieniać odtwarzanie piosenki?

edytowany 1x, ostatnio: furious programming, 2018-12-12 22:14

Pozostało 580 znaków

2018-12-13 10:42
0

W zdarzeniu TMediaPlayer::OnNoitify, kiedy właściwość TMediaPlayer::NotifyValue będzie Stop dodaj następny utwór. I tak do końca listy.

Pozostało 580 znaków

2018-12-14 20:18
0

Rozwiązałem sam ten problem, ale w inny sposób. Z Twojej strony prosiłbym o bardziej szczegółowe podanie co mam wpisać w zdarzeniu TMediaPlayer::OnNoitify - podaj kod źródłowy.

Tworzę globalną zmienną i:

int i=1;

Na Form1 umieszczam Timer1, Timer2, MediaPlayer, ProgressBar1. Timery ustawiam na Enabled na false.
Na Form1 w zdarzeniu OnCreate uruchamiam timer2:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        Timer2->Enabled = true;
}

W timer2 wpisuje w instrukcjach if ścieżki piosenek, otwieranie odtwarzacza, odtwarzanie, włączanie timera1 i wyłączanie timera2.

void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
        if(i == 1)
        {
        MediaPlayer1->FileName = "Muzyka/piosenka1.wav";
        MediaPlayer1->Open();
        MediaPlayer1->Play();
        Timer1->Enabled = true;
        Timer2->Enabled = false;
        }
        if (i ==2)
        {
        MediaPlayer1->FileName = "Muzyka/piosenka2.wav";
        MediaPlayer1->Open();
        MediaPlayer1->Play();
        Timer1->Enabled = true;
        Timer2->Enabled = false;
        i=0;
        }
} 

Dla timer1 tworzę funkcję odtwarzania piosenki, czekania aż się wykona i powiększania pozycji piosenki o następną, a po wykonaniu tych czynności zamykam timer1 i otwieram timer2.

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
        ProgressBar1->Max = MediaPlayer1->Length;
        ProgressBar1->Position = MediaPlayer1->Position;

                if(ProgressBar1->Position == MediaPlayer1->Length)
                {
                MediaPlayer1->Close();
                Timer1->Enabled = false;
                Timer2->Enabled = true;
                i++;
                }
} 

Program tak jest zapętlony by po odtworzeniu 1 i 2 piosenki ponownie rozpoczął odtwarzanie od 1.
Na końcu funkcja zamykania MediaPlayer. Na Form1 w zdarzeniu OnClose zamykam MediaPlayer:

 void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
        MediaPlayer1->Close();
}

Wiem, że to nie jest super rozbudowany odtwarzacz, ale ja potrzebowałem jedynie na stałe wmontować do mojego programu piosenki, które by się odtwarzały automatycznie jedna po drugiej i by były one napisane za pomocą MediaPlayer, a nie funkcji sndPlaySound.

edytowany 2x, ostatnio: furious programming, 2018-12-14 20:22
Wrzucaj kod w znaczniki kolorujące składnię – ```cpp przed kodem, a po kodzie samo ``` - furious programming 2018-12-14 20:23

Pozostało 580 znaków

2018-12-15 12:29
0

Z Twojej strony prosiłbym o bardziej szczegółowe podanie co mam wpisać w zdarzeniu TMediaPlayer::OnNoitify - podaj kod źródłowy.

Nie podam Ci kodu, bo nie używam C++ Buildera. Napisałem Ci jedynie, co sam bym spróbował, gdybym miał taki problem. Jeśli rozwiązanie z timerem działa, to znaczy, że jest dobre i nie ma co drążyć tematu.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0