Я создаю приложение на основе примера приложения Speak Here . Я хочу, чтобы звук воспроизводился через наушники, если они подключены или по умолчанию подключены к динамикам.
Я использовал нижний бит кода, чтобы это произошло, и он работает нормально, если наушники не отключены во время воспроизведения. На этом воспроизведение заканчивается, что нормально. Проблема в том, что когда я снова нажимаю кнопку воспроизведения, воспроизведение получается странным, и кнопка остановки перестает работать. Он также начинает воспроизведение с того места, где остановился, а не сбрасывает его с начала, как обычно, когда вы нажимаете кнопку остановки.
Аналогично, если наушники подключены до открытия приложения, это также приводит к странному поведению.
Может быть, мне нужно захватить событие «наушники отключены» и заставить его «нажать кнопку остановки»? Потому что то, как это происходит сейчас, неверно.
Чтобы сформулировать мой вопрос в простой форме: Как правильно настроить основной звук на iPhone для воспроизведения через динамики и наушники.
Любые фрагменты кода, которые могут решить эту проблему, будут очень полезны . Спасибо!
OSStatus error = AudioSessionInitialize(NULL, NULL, NULL, NULL);
if (error) printf("ERROR INITIALIZING AUDIO SESSION! %d\n", error);
else
{
UInt32 category = kAudioSessionCategory_PlayAndRecord;
// UInt32 category = kAudioSessionCategory_MediaPlayback;
error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
if (error) printf("couldn't set audio category!");
// It is bugs when I unplug the headphones!
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute);
error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, self);
if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", error);
UInt32 inputAvailable = 0;
UInt32 size = sizeof(inputAvailable);
// we do not want to allow recording if input is not available
error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable);
if (error) printf("ERROR GETTING INPUT AVAILABILITY! %d\n", error);
btn_record.enabled = (inputAvailable) ? YES : NO;
// we also need to listen to see if input availability changes
error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, self);
if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", error);
error = AudioSessionSetActive(true);
if (error) printf("AudioSessionSetActive (true) failed");