2011-12-06 17 views
16

Stworzyłem prostą aplikację, która generuje prostokątną falę o zadanej częstotliwości i odtwarza ją za pomocą AudioTrack w trybie STREAM (STREAM_MUSIC). Wszystko wydaje się być w porządku pracy, a dźwięk odgrywa w porządku, jednak gdy strumień zakończeniu otrzymuję wiadomości w dzienniku:Restart AudioTrack nawet po jego zatrzymaniu

W/AudioTrack (7579): obtainBuffer() utwór 0x14c228 wyłączone, ponowne uruchomienie ...

Nawet po wywołaniu funkcji stop() nadal je otrzymuję. Uważam, że poprawnie ustawiłem rozmiar bufora AudioTrack na podstawie minimalnego rozmiaru wymaganego przez funkcję AudioTrack (w moim przypadku 6x1024). Karmię go mniejszymi buforami 1024 szortów.

Czy to dobrze, że dostaję te i powinienem zostawić to w ten sposób?

Odpowiedz

15

OK, myślę, że problem został rozwiązany. Błąd jest generowany, gdy bufor nie jest całkowicie wypełniony danymi w czasie (opróżnienie bufora). Nie mam pojęcia, co timeout ale jeśli wystąpi to upewnij się, że:

  1. Nie wywołać metodę odtwarzania aż masz jakieś dane w buforze.

  2. Możesz wygenerować dane wystarczająco szybko, aby pokonać limit czasu.

  3. Po zakończeniu podawania bufora danymi, przed wywołaniem metody stop() upewnij się, że "ostatni" bufor został całkowicie wypełniony danymi przed upływem limitu czasu.

Zajmowałem się ostatnim problemem, zawsze czekając trochę (do czasu), a następnie wysyłając 1 bufor pełen zer i ostatecznie wywołując funkcję stop().

Należy pamiętać, że zawsze należy wysyłać bufor w mniejszych porcjach, nawet jeśli masz dużą porcję gotową. Ciągle mi to przeszkadza, że ​​nie jestem w 100% pewny, czy to jest właściwa droga, ale błędy już minęły, więc myślę, że mogę z tym żyć :)

5

Odkryłem, że nawet gdy bufor jest technicznie wystarczająco długo i wypełnione bajtami, jeśli nie są poprawnie sformatowane (skróty audio konwertowane na tablicę bajtów), to nadal będą zgłaszać ten błąd.

4

Otrzymałem to ostrzeżenie, gdy zainicjowałem funkcję Audiotrack, o nazwie audioTrack.play() i nastąpiło nieznaczne opóźnienie między wywołaniem play() a audioTrack.write(). Jeśli zadzwonię pod numer play() tuż przed numerem write(), ostrzeżenie zniknęło.

+0

To jest punkt - wypełnienie bufora z danymi przed wywołaniem luz. Następnie upewnij się, że możesz generować dane na czas. Będziesz miał opóźnienie i zależy to od twojego telefonu (minimalny rozmiar bufora), częstotliwości próbkowania i dynamicznej rozdzielczości, której używasz. Im mój case (HTC Desire) 6kB. To około 3000 16-bitowych próbek mono. Możesz łatwo obliczyć wynikające opóźnienie biorąc pod uwagę częstotliwość próbkowania. Jeśli używasz natywnego interfejsu audio API, możesz uzyskać znacznie mniejsze opóźnienia, ale wciąż daleko od miniatur 5 ms iPhone'a ... –

0

mam rozwiązany tym

 if (mAudioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING) 
      mAudioTrack.play(); 
     mAudioTrack.write(b, 0, sz * 2); 
     mAudioTrack.stop(); 
     mAudioTrack.flush(); 
Powiązane problemy