2013-01-15 9 views
11

Potrzebuję sposobu na uruchomienie/zatrzymanie pętli podczas odtwarzania dźwięku. Odkryłem, że najlepszym sposobem na zagrywanie wielu dźwięków jest użycie XNA. Stworzyłem więc obiekt SoundEffectInstance zaczynając od obiektu SoundEffect, który zawiera klip audio. Problem polega na tym, że mam przycisk, który powinien zmienić stan tego klipu z "zapętlonego" na "nie zapętlony" i viceversa.Pętla audio z funkcją XNA w systemie Windows Phone 8, gdy dźwięk nadal jest odtwarzany

Oto problem: wysyła zgłoszenie wyjątku, że pętla musi zostać ustawiona przed pierwszym odtworzeniem. Więc pomyślałem, że podczas przełączania z "non looping" na "looped", mogę po prostu czekać na zatrzymanie dźwięku, a następnie odtworzyć SoundEngineInstance, ustawienie IsLooped = true i zacząć od nowa. Ten działa, ale jest pewne opóźnienie i to powoduje utratę czasu, więc jest zupełnie bezużyteczne.

To, czego szukam, to sposób na ustawienie lub anulowanie pętli podczas odtwarzania dźwięku i bez żadnego opóźnienia.

EDIT:

Próbowałem za pomocą dwóch SoundEngineInstance, jeden zapętlone i nie, i po prostu przełączać się między nimi za pomocą głośność. Problem polega na tym, że pętla nie zapętlona zatrzymuje się po pierwszym odtworzeniu, więc jeśli ją zapętrę na dwa razy, a następnie ustawię ją w stan braku pętli, nie będzie odtwarzany żaden dźwięk, ponieważ nie zapętlony klip już się zakończył!

Sugestie?

+0

Odkąd chcesz, aby dźwięk był w pętli, czy powiedziałbyś, że jest bardziej jak piosenka, a nie "SoundEffect"? – ChiefTwoPencils

+0

Mam kilka krótkich próbek i chcę je zapętlić. Mówię o "SoundEffect", ponieważ jest to klasa XNA, której używam do odtwarzania. – StepTNT

Odpowiedz

2

Miałem ten sam proplem i użyłem dwóch instancji z tym samym klipem audio, aby go rozwiązać, jeden z zapętleniem i jeden bez niego. Zmieniłem między nimi. To może nie jest najlepsze rozwiązanie, ale zadziałało to dla mnie.

+0

To niezły pomysł, ale nie mogę go użyć! Potrzebuję pętli, aby rozpocząć/zakończyć za każdym razem, kiedy chcę. Oznacza to, że jeśli klip odtwarza pętlę i postanowię zatrzymać pętlę, klip musi się zakończyć, a nie tylko zatrzymać. Z twoim rozwiązaniem potrzebuję czegoś, aby zobaczyć, gdzie jestem w zapętlonym klipie, zatrzymać zapętlony klip i sprawić, by drugi zaczął, kiedy poprzedni był zatrzymany. (Przepraszam, że nie było tak jasne!) – StepTNT

0

Od http://msdn.microsoft.com/en-us/library/dd940203(v=xnagamestudio.31).aspx:

  1. Zadeklaruj SoundEffect stosując metodę pokazaną w JAK: odtwarzanie dźwięku.

  2. Należy zadeklarować wartość SoundEffectInstance i ustawić ją na wartość zwracaną przez SoundEffect.CreateInstance.

  3. Ustaw SoundEffectInstance.IsLooped na true.

  4. Zadzwoń SoundEffectInstance.Graj, aby odtworzyć dźwięk z pętli.

Prawdopodobnie możesz ustawić IsLooped na false, gdy nie chcesz, aby pętla była odtwarzana, ale tylko do końca.

+0

Pytanie nie dotyczy zapętlenia dźwięku, ale zmiany jego stanu, gdy wciąż jest odtwarzany. Oznacza to wykonanie pętli/odczepienia przed wywołaniem 'SoundClip.Stop()' lub przed końcem klipu. – StepTNT

Powiązane problemy