Я пытаюсь получить аудио в своем приложении, чтобы играть через верхний громкоговоритель на iPhone, который вы нажимаете на ухо во время телефонного звонка. Я знаю, что это возможно, потому что я играл в игру из App Store («The Heist» с помощью «tap tap tap»), который имитирует телефонные звонки и делает именно это.Воспроизведение звука через верхний (телефонный звонок) динамик
Я провел много исследований в Интернете, но мне неожиданно трудно найти ЛЮБОГО, кто даже обсудил эту возможность. Подавляющее большинство сообщений, по-видимому, касается громкоговорителей и подключенных наушников (например, this и this и this), а не верхнего динамика «телефонный звонок» и громкоговорителя. (Часть этой проблемы, возможно, не имеет хорошего имени для нее: «громкоговоритель телефона» часто означает громкоговоритель в нижней части устройства и т. Д., Поэтому трудно провести целенаправленный поиск). Я посмотрел на Apple Audio Session Category Route Overrides
, но они снова кажутся (исправьте меня, если я ошибаюсь) касаются только громкоговорителя внизу, а не громкоговорителя в верхней части телефона.
Я нашел ОДИН пост, который, кажется, об этом: link. Он даже предоставляет кучу кода, поэтому я думал, что дома свободен, но теперь я не могу заставить код работать. Для простоты я просто скопировал метод DisableSpeakerPhone
(который, если я правильно его понял, должен был переадресовать звук в верхний громкоговоритель) в мой viewDidLoad
, чтобы увидеть, будет ли это работать, но первая строка «assert» не работает, а звук продолжает воспроизводить дно. (Я также импортировал AudioToolbox Framework, как это было предложено в комментарии, так что это не проблема.)
Вот основной блок кода, с которым я работаю (это то, что я скопировал в свой viewDidLoad
для тестирования), хотя есть несколько методов в этой статье я связан с:
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);
}
Так что мой вопрос заключается в следующем: может кто-либо А) помочь мне выяснить, почему этот код не работает, или B) предлагают лучшее предложение о возможности нажатия кнопки и маршрутизации аудио до верхнего громкоговорителя?
PS Я все больше и больше знаком с программированием на iOS, но это мой первый набег на мир AudioSessions и тому подобное, поэтому детали и образцы кода очень ценятся! Спасибо за помощь!
UPDATE:
С предложением "Он был" (ниже) я удалил код цитируемый выше, и заменил его:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive: YES error:nil];
в начале viewDidLoad
. Тем не менее, он все еще не работает (я имею в виду, что звук все еще выходит из динамика внизу телефона вместо приемника наверху). По-видимому, поведение по умолчанию должно быть для AVAudioSessionCategoryPlayAndRecord
, чтобы отправить аудио из ресивера самостоятельно, поэтому что-то по-прежнему не так.
Более конкретно, что я делаю с этим кодом играет звук через IPod Music Player (инициализируется сразу после строки AVAudioSession выше в viewDidLoad
, для чего это стоит):
_musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
и средства массовой информации для что IPod Music Player выбран через MPMediaPickerController
:
- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection {
if (mediaItemCollection) {
[_musicPlayer setQueueWithItemCollection: mediaItemCollection];
[_musicPlayer play];
}
[self dismissViewControllerAnimated:YES completion:nil];
}
все это кажется довольно простым для меня, у меня нет никаких ошибок или предупреждений, и я знаю, что СМИ Picker и музыкальный плеер правильно работает becaus e правильные песни начинают играть, это просто из неправильного динамика. Может ли быть «игровой носитель, использующий этот метод AudioSession» или что-то еще? Или есть способ проверить, какая категория аудиосеансов активна в настоящий момент, чтобы подтвердить, что ничто не могло ее перевернуть или что-то еще? Есть ли способ решительно сказать, что код ИСПОЛЬЗУЕТ приемник, а не полагаться на значение по умолчанию? Я чувствую, что я на линии одного двора, мне просто нужно пересечь этот последний бит ...
EDIT: Я просто подумал о теории, в которой это что-то об iPod Music Player, t хотите воспроизвести из приемника. Мое рассуждение: можно настроить песню, чтобы начать играть через официальное приложение iPod, а затем легко настроить его (пауза, пропустить и т. Д.) Через приложение, которое я разрабатываю. Непрерывное воспроизведение из одного приложения в другое заставило меня подумать, что, возможно, iPod Music Player имеет собственные настройки маршрута аудио, или, может быть, он не останавливается, чтобы проверить настройки в новом приложении? Кто-нибудь, кто знает, что они говорят, думает, что это может быть что-то вроде этого?
Пробовал просто утверждает, удаление содержимого диска и посмотреть, что происходит? – Undo
Прокомментируйте все это, и это похоже на отсутствие кода там: звук проходит через нижний динамик. Я предполагаю, что из-за той же проблемы, из-за которой утверждения терпят неудачу, я просто недостаточно опытен, чтобы знать, что это может быть. – Nerrolken
Я тоже не ... Удачи! – Undo