Próbuję uzyskać dźwięk w mojej aplikacji, aby odtwarzać dźwięk z górnego głośnika w iPhonie, tego, który przyciskasz do ucha podczas rozmowy telefonicznej. Wiem, że to możliwe, ponieważ grałem w grę z App Store ("The Heist" przez "tap tap tap"), która symuluje połączenia telefoniczne i robi dokładnie to.Odtwarzanie dźwięku przez górny głośnik (telefon)
Zrobiłem wiele badań w Internecie, ale mam zaskakująco ciężko znaleźć KAŻDEGO, który nawet omawiał tę możliwość. Zdecydowana większość postów dotyczy raczej zestawu głośnomówiącego niż podłączonych słuchawek (takich jak this i this i this), a nie górnego głośnika "połączenie telefoniczne" z głośnikiem zestawu głośnomówiącego. (Część tego problemu może nie mieć dobrego imienia: "głośnik telefonu" często oznacza głośnik zestawu głośnomówiącego na dole urządzenia itp., Więc trudno jest zrobić naprawdę dobrze ukierunkowane wyszukiwanie). Zajrzałem do Apple'a: Audio Session Category Route Overrides
, ale wydaje mi się, że znowu (popraw mnie, jeśli się mylę) zajmują się tylko głośnikiem zestawu głośnomówiącego na dole, a nie głośnikiem na górze telefonu.
Znalazłem ONE post, który wydaje się być o tym: link. Zapewnia nawet mnóstwo kodu, więc pomyślałem, że jestem w domu za darmo, ale teraz nie mogę sprawić, że kod zadziała. Dla uproszczenia właśnie skopiowałem metodę DisableSpeakerPhone
(która, jeśli dobrze rozumiem, powinna to być ta, która zmieni trasę dźwięku do wyższego głośnika) na mój viewDidLoad
, aby sprawdzić, czy zadziała, ale pierwsza linia "assert" zawiedzie, a dźwięk nadal odtwarza dno. (Zaimportowałem także framework AudioToolbox, zgodnie z sugestią w komentarzu, więc to nie jest problem).
Oto główny blok kodu, nad którym pracuję (to właśnie skopiowałem do mojego viewDidLoad
, aby przetestować), choć istnieje kilka metod więcej w artykule związane z:
void DisableSpeakerPhone() {
UInt32 dataSize = sizeof(CFStringRef);
CFStringRef currentRoute = NULL;
OSStatus result = noErr;
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &dataSize, ¤tRoute);
// Set the category to use the speakers and microphone.
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
result = AudioSessionSetProperty (
kAudioSessionProperty_AudioCategory,
sizeof (sessionCategory),
&sessionCategory
);
assert(result == kAudioSessionNoError);
Float64 sampleRate = 44100.0;
dataSize = sizeof(sampleRate);
result = AudioSessionSetProperty (
kAudioSessionProperty_PreferredHardwareSampleRate,
dataSize,
&sampleRate
);
assert(result == kAudioSessionNoError);
// Default to speakerphone if a headset isn't plugged in.
// Overriding the output audio route
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
dataSize = sizeof(audioRouteOverride);
AudioSessionSetProperty(
kAudioSessionProperty_OverrideAudioRoute,
dataSize,
&audioRouteOverride);
assert(result == kAudioSessionNoError);
AudioSessionSetActive(YES);
}
Więc moje pytanie brzmi: może ktoś albo A) mi pomóc dowiedzieć się, dlaczego ten kod nie działa, lub B) oferują lepszą sugestię, aby móc nacisnąć przycisk i skierować dźwięk do górnego głośnika?
PS Z coraz większą łatwością poznaję programowanie na iOS, ale jest to moja pierwsza wizyta w świecie AudioSessions i tym podobne, więc szczegóły i przykłady kodu są bardzo doceniane! Dziękuję za pomoc!
UPDATE:
Z sugestią "Był" (poniżej) Mam usunięty kod cytowany powyżej i zastąpił go:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive: YES error:nil];
na początku viewDidLoad
. Nadal nie działa (przez co mam na myśli, że dźwięk nadal wychodzi z głośnika na dole telefonu, zamiast odbiornika na górze). Wygląda na to, że domyślnym zachowaniem powinno być AVAudioSessionCategoryPlayAndRecord
wysyłanie dźwięku z odbiornika samodzielnie, więc coś jest nadal nie tak.
Dokładniej, co robię z tego kodu jest odtwarzanie dźwięku za pośrednictwem iPod Music Player (zainicjowany tuż po linie AVAudioSession powyżej w viewDidLoad
, na co warto):
_musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
i media dla że odtwarzacz muzyczny iPod jest wybierany przez MPMediaPickerController
:
- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection {
if (mediaItemCollection) {
[_musicPlayer setQueueWithItemCollection: mediaItemCollection];
[_musicPlayer play];
}
[self dismissViewControllerAnimated:YES completion:nil];
}
To wszystko wydaje się dość proste do mnie, mam żadnych błędów lub ostrzeżeń, i wiem, że media Picker i odtwarzacz muzyczny pracują prawidłowo becaus e poprawne utwory zaczynają się odtwarzać, po prostu z niewłaściwego głośnika. Czy może istnieć metoda "odtwarzania multimediów za pomocą tej metody AudioSession"? A może istnieje sposób sprawdzenia, która kategoria sesji audio jest obecnie aktywna, aby potwierdzić, że nic nie mogło jej wyłączyć? Czy istnieje sposób, aby zdecydowanie powiedzieć kodowi, aby KORZYSTAĆ z odbiornika, zamiast polegać na domyślnym, aby to zrobić? Czuję, że jestem na jednej linii jardów, po prostu trzeba przejść tę ostateczną trochę ...
EDIT: Pomyślałem teorii, przy czym jest to coś, o iPod Music Player, który nie robi” t chcesz grać z odbiornika. Moje rozumowanie: możliwe jest ustawienie utworu, aby rozpocząć grę za pośrednictwem oficjalnej aplikacji dla iPoda, a następnie płynnie ją dostosować (pauza, pominięcie itp.) Za pomocą aplikacji, którą rozwijam. Ciągłe odtwarzanie z jednej aplikacji do następnej sprawiło, że pomyślałem, że może iPod Music Player ma własne ustawienia trasy audio, a może nie zatrzymuje się, by sprawdzić ustawienia w nowej aplikacji? Czy ktoś, kto wie, o czym mówią, myśli, że to może być coś takiego?
Próbowałem tylko nuking twierdzi, i widząc, co się dzieje? – Undo
Skomentuj je wszystkie i wygląda na to, że w ogóle nie ma tam kodu: dźwięk przechodzi przez dolny głośnik. Wyobrażam sobie, że to z powodu tego samego problemu, który powoduje, że twierdzenia zawodzą, po prostu nie jestem wystarczająco doświadczony, aby wiedzieć, co to może być. – Nerrolken
Ja też nie ... Powodzenia! – Undo