Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek 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 ?

sandman19 17 Paź 2015 11:58 552 18
  • #1 17 Paź 2015 11:58
    sandman19
    Poziom 5  

    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

    0 18
  • #2 17 Paź 2015 12:12
    -psiak-
    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.

    0
  • #3 17 Paź 2015 12:16
    sandman19
    Poziom 5  

    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ć.

    0
  • #4 17 Paź 2015 12:40
    -psiak-
    Poziom 32  

    Możesz mi powiedzieć po kiego to robisz (ten odtwarzać)?

    0
  • #5 17 Paź 2015 12:45
    sandman19
    Poziom 5  

    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

    0
  • Pomocny post
    #6 17 Paź 2015 13:04
    -psiak-
    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.

    0
  • #7 17 Paź 2015 13:15
    sandman19
    Poziom 5  

    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źć?

    0
  • Pomocny post
    #8 17 Paź 2015 13:20
    -psiak-
    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

    0
  • #9 17 Paź 2015 13:50
    sandman19
    Poziom 5  

    Faktycznie ten if był niepotrzebny, stop nadal nie działa, pewnie trzeba napisać funkcję tak jak i dla odtwarzania.

    0
  • #10 17 Paź 2015 13:54
    -psiak-
    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óć.

    0
  • #11 17 Paź 2015 13:56
    sandman19
    Poziom 5  

    Proszę bardzo chyba się naprawiła :)

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #12 17 Paź 2015 14:00
    -psiak-
    Poziom 32  

    Nic dziwnego bo masz trzy różne wątki o nazwie thr.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #13 17 Paź 2015 14:05
    sandman19
    Poziom 5  

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #14 17 Paź 2015 14:12
    -psiak-
    Poziom 32  

    Podałem ci kompleksową odpowiedź, nie da się zastosować jej częściowo.

    0
  • #15 17 Paź 2015 14:16
    sandman19
    Poziom 5  

    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?

    0
  • #16 17 Paź 2015 14:52
    -psiak-
    Poziom 32  

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #17 17 Paź 2015 15:19
    sandman19
    Poziom 5  

    Dalej stop zatrzymuje odtwarzanie po zakończeniu utworu, dezaktywuje się jedynie przycisk stop/play.

    0
  • #18 17 Paź 2015 15:35
    -psiak-
    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

    0
  • #19 17 Paź 2015 16:10
    sandman19
    Poziom 5  

    Dziękuję za pomoc :)

    0
  Szukaj w 5mln produktów