Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Programowanie playlisty dla WAV - jak zachować kolejność odtwarzania utworów ?

17 Paź 2015 11:58 747 18
  • Poziom 7  
    Witam serdecznie.

    Aktualnie zajmuję się pisaniem prostego odtwarzacza plików WAV. Napotkałem jednak problem przy programowaniu playlisty. Mianowicie pliki wczytują się, jednak odtwarza się jedynie ostatni na liście. Wiem, że jest to spowodowane prędkością pętli for- zanim odtworzy się pierwszy utwór pętla zdąży już przeskoczyć do kolejnego i tak dalej. Niestety nie mogę znaleźć żadnego sposobu/klasy aby ten proces opóźnić, aby utwory odtwarzały się jeden po drugim. Może ktoś ma jakiś pomysł, który mógłby mi pomóc? Tutaj kawałek kodu odpowiadającego za odtwarzanie:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Poziom 32  
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    Niestety przy takim podejściu będzie się "zamulać" główny wątek. Więc to wszystko trzeba przenieść do osobnego wątku. Po przeniesieniu trzeba będzie zmieniać tekst statusu poprzez Invoke oraz zrobić kopię listy ponieważ w trakcie odtwarzania użytkownik może znowu odpalić dialog.
  • Poziom 7  
    Jako że nie jestem wielkim fascynatem programowania, chciałbym poprosić o trochę jaśniejszą odpowiedź, ponieważ niewiele z tego zrozumiałem :)

    A i owszem przy skorzystaniu z PlaySync cały program po prostu się zamula i nie reaguje na jakiekolwiek przyciski, póki nie skończy odtwarzać.
  • Poziom 32  
    Możesz mi powiedzieć po kiego to robisz (ten odtwarzać)?
  • Poziom 7  
    Program na algorytmy multimedialne. Zrobiłem coś takiego i działa, nie zwiesza się jednak przycisk stopu nadal nie reaguje.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 32  
    Przycisk stop musi nie tylko zatrzymać player, zaś najpierw zatrzymać wątek:
    thr.Abort();
    Oczywiście musisz udostępnić ten thr.

    Nie rób tego if'a niech wszystko odtwarza się jednakowo. nawet ten jeden utwór niech odtwarza się w wątku.
  • Poziom 7  
    Ten if znajduje się tam, ponieważ w wytycznych mam zaznaczone, że można oddzielnym przyciskiem wczytywać jeden utwór, a oddzielnym całą playliste.

    Jak udostępnić ten thr, bo nic nie mogę znaleźć?
  • Pomocny post
    Poziom 32  
    sandman19 napisał:
    ... w wytycznych mam zaznaczone, że można oddzielnym przyciskiem wczytywać jeden utwór, a oddzielnym całą playliste.
    Jeden przycisk ustawia multiselect dla dialogu drugi zdejmuje multiselect zaś oba wywołują tą samą metodę odtwarzaj. Nie twórz niepotrzebnych bytów.

    sandman19 napisał:
    Jak udostępnić ten thr, bo nic nie mogę znaleźć?
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Poziom 7  
    Faktycznie ten if był niepotrzebny, stop nadal nie działa, pewnie trzeba napisać funkcję tak jak i dla odtwarzania.
  • Poziom 32  
    Niestety magiczna kula (która pozwala zgadywać w którym wierszu kodu masz błąd bez patrzenia na kod) jest teraz w remoncie.
    Jak tylko naprawią koniecznie ją użyje aby ci pomóć.
  • Poziom 7  
    Proszę bardzo chyba się naprawiła :)

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 32  
    Nic dziwnego bo masz trzy różne wątki o nazwie thr.
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Poziom 7  
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Poziom 32  
    Podałem ci kompleksową odpowiedź, nie da się zastosować jej częściowo.
  • Poziom 7  
    Faktycznie, przeoczyłem to. Stop działa, jednak zatrzymuje odtwarzanie dopiero po zakończeniu utworu. Mam rozumieć jednak, że przy tej konstrukcji nie da się tego zrobić by zatrzymywał w trakcie odtwarzania?
  • Poziom 32  
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Poziom 7  
    Dalej stop zatrzymuje odtwarzanie po zakończeniu utworu, dezaktywuje się jedynie przycisk stop/play.
  • Poziom 32  
    W takim razie wygląda na to że SoundStream nie da się zatrzymać jeżeli jest w trybie PlaySycnc().
    Możliwe rozwiązania:
    1. Sprawdź czy dostajesz to zdarzenie https://msdn.microsoft.com/pl-pl/library/syst...edia.soundplayer.streamchanged(v=vs.110).aspx po zakończeniu grania poprzez .Play() wtedy przerabiasz wszystko na tryb asynchroniczny, czyli ładujesz kolejny kiedy skończył się aktualny.
    2. Sprawdź czy da się najpierw wywołanie Play() jakiegoś utworu nie skończy natychmiast PlaySycnc(), jeżeli tak to ładujesz do resursów pusty utwór i używasz go do zatrzymania PlaySync() Tak sobie pomyślałem, że to zadziała na 100% ponieważ miałeś problem z tym że grał tylko ostatni utwór. Więc dla zatrzymania zagraj pusty.
    3. Zmienić klasę odtwarzającą. np użyć:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
  • Poziom 7  
    Dziękuję za pomoc :)