2009-11-02 11 views
7

Mamy grę, która jest bardzo bliska wydania, ale mamy jeden bardzo irytujący problem. Jeden z naszych telefonów testujących Beta, nie słyszy żadnych efektów dźwiękowych w grze. Może jednak słyszeć muzykę w tle i muzykę z ekranu tytułowego.Czy można mieszać AudioServicesPlaySystemSound i AVAudioPlayer?

Muzyka tła i tytułów są odtwarzane za pomocą AVAudioPlayer (są dłuższe, potrzebna jest regulacja pętli i głośności itp.). Efekty dźwiękowe są po prostu odtwarzane za pomocą AudioServicesPlaySystemSound (są bardzo krótkie, nie potrzebujemy precyzyjnej kontroli ani nie wiemy, kiedy się kończą itp.). Działa to na większości iPhone'ów, ale nie na tym. Wszystko to jest odtwarzane za pomocą sesji audio AVAudioSessionCategorySoloAmbient.

Mam więc dwa pytania: - Po pierwsze, czy jest to dopuszczalne wdrożenie? np. czy jest coś, co przeoczyłem, co oznacza, że ​​nie można łączyć tych dwóch frameworków, czy też powód, dla którego jest to zły pomysł na ich połączenie? - Po drugie, czy ktoś wcześniej widział coś takiego? Jeśli tak, czy znalazłeś sposób na obejście tego?

Dodatkowa uwaga w tle: mogę całkiem jednoznacznie stwierdzić, że na jego telefonie jest mieszanie dwóch frameworków. Był w stanie usłyszeć dźwięki do mniej więcej tej samej wersji, w której dodaliśmy muzykę z ekranu tytułowego. Ponadto, jeśli zmienię jeden z dźwięków, aby działał przez odtwarzacz AVAudioPlayer, jest on w stanie go usłyszeć. Niestety, nie mogę po prostu przenieść dźwięków do AVAudioPlayers, ponieważ w ogóle nie działa dobrze i potrzebuję lepszej synchronizacji.

Odpowiedz

8

Mam dwie aplikacje w sklepie z aplikacjami, które łączą te dwie struktury. AVAudioPlayer dla dźwięków, które wymagają uruchamiania i zatrzymywania i regulacji głośności oraz przybornika AudioServices dla krótkich, niewielkich dźwięków i kliknięć. Wydaje mi się, że jedyne, co mogę myśleć, to, że głośność AVAudioPlayer wydaje się być kontrolowana oddzielnie od dźwięków AudioServices. Sprawdź więc, czy tester nie ma wyłączonych dźwięków (za pomocą przełącznika trybu wibracji) lub głośności skierowanej w dół.

Jeśli to nie pomoże, powiedz mi więcej o swoich dźwiękach/kodzie i mogę dodać kod do mojej aplikacji, aby sprawdzić, czy mogę uzyskać takie samo zachowanie. Oczywiście brzmi to tak, jak większość twoich testerów nie ma tego problemu i pewnie też tego nie zobaczę.

+0

Zamierzam oznaczyć twoją odpowiedź jako zaakceptowaną, ponieważ odpowiedziałeś na moje główne pytanie (czy możesz je zmieszać). Myślę, że telefon tego testera może być fiosem, ponieważ widziałem, jak działa na kilku innych. – Bdebeez

9

EDYTOWANIE 2:
Ustaliłem przyczynę błędu. Dwie różne struktury audio są odtwarzane na dwóch różnych ustawieniach głośności. Jest główny tom (który pojawia się, gdy jesteś w aplikacji i nie ma na nim tytułu) i głośność dzwonka (to pokazuje się, gdy jesteś na ekranie głównym bez załadowanej aplikacji). AVAudioPlayer wywołuje grę z głównym ustawieniem głośności. Ponieważ ustawiłem kategorię na AVAudioSessionCategorySoloAmbient (patrz poniższy kod), jest to regulacja głośności, która będzie regulowana, jeśli używasz klawisza głośności wewnątrz aplikacji. SystemSounds są jednak odtwarzane w głośności dzwonka. To NIE pojawi się w aplikacji, a jako takie nie pozwala użytkownikowi dostosować swoich ustawień podczas gry.

Łatwo zauważyć możliwego zamieszania dla użytkownika: Powiedzmy, że ich dzwonek jest ustawiony na niski, a nawet wyłączony. Zaczynają grać w tę grę. Słuchają muzyki z ekranu tytułów (AVAudioPlayer) i mogą zwiększać lub zmniejszać głośność i reagują normalnie. Następnie rozpoczynają grę i odtwarzanie efektów dźwiękowych (SystemSounds) i nic nie słyszą, ponieważ głośność dzwonka jest niska/wyłączona. Aby usłyszeć efekty dźwiękowe, podnoszą głośność, a muzyka w tle reaguje odpowiednio. Z tego punktu widzenia wygląda na to, że efekty dźwiękowe nie grają.

Jeśli masz podobną sytuację, niech Twój użytkownik upewni się, że głośność dzwonka jest zwiększona przed rozpoczęciem gry, a ich przełącznik wyciszenia jest włączony (tzn. Nie wyciszony).Możesz to również sprawdzić, wykonując test samodzielnie - zmniejsz głośność dzwonka i zwiększ głośność w aplikacji. Twój SystemSounds powinien wypadać z miksu.

Oryginalna odpowiedź: Podczas ponownego kopania przez wszystkie dokumenty, znalazłem odpowiedź. Nie aktywowałem poprawnie sesji audio. Wcześniej miałem tylko ten kod, aby ustawić kategorię:

NSError *setCategoryError = nil; 
BOOL categoryWasSet = [[AVAudioSession sharedInstance] 
           setCategory: AVAudioSessionCategorySoloAmbient 
           error: &setCategoryError]; 

Ale musiałem też dodać następujący kod jawnie aktywować sesję audio:

NSError *activationError = nil; 
BOOL activationSuccess = [[AVAudioSession sharedInstance] 
           setActive: YES 
           error: &activationError]; 

ja ponownie przetestowany z tym użytkownikiem , i całkowicie naprawił problem. Mam nadzieję, że pomaga każdemu, kto może mieć podobny problem.

EDIT: To chyba nie rozwiązało problemu. Dostałem fałszywego pozytywu od mojego testera, a po dokładniejszym zbadaniu wydaje się, że nie słyszał on dźwięków generowanych przez SystemSound.

+0

Zastanawiam się, czy warto wysłać temu użytkownikowi prostą aplikację testową, która odtwarza dwa dźwięki, a także wiele dzienników NSLog na takie rzeczy jak ustawienia AVAudioSession i woluminy itp. – mahboudz

+0

Tak, to świetny pomysł i myślałem o tym samym. Odpowiem, jeśli znajdę coś interesującego. – Bdebeez

+0

Co dziwne, udało mi się odtworzyć to na symulatorze - i widzę komunikat, że wystąpił błąd podczas ustawiania kategorii. Nie jestem do końca pewien, jak na to odpowiedzieć. Być może nie mógłbym odtworzyć tytułu MP3 (ponieważ bez kategorii nie miałbym dostępu do dekoderów HW). Naprawdę ironiczne jest to, że kiedy miałem tego użytkownika testu wyciąga logi z jego telefonu, pierwszy test uruchomić, aby logi rzeczywiście działały i grał wszystkie dźwięki :) Tak więc myślę, że jest dość przekonujące, że to głównie fuks, i jest prawdopodobnie związane z prawidłowym ustawieniem kategorii. – Bdebeez