Наушники, отключенные во время воспроизведения, вызывают ошибку в приложении iPhone - PullRequest
2 голосов
/ 12 марта 2011

Я создаю приложение на основе примера приложения 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");

Ответы [ 2 ]

1 голос
/ 19 марта 2011

После дальнейшего изучения я теперь понимаю, что по сути я задал здесь два вопроса.Я решил один до сих пор.

Иногда, когда воспроизведение прерывается, оно «приостанавливается», а не «останавливается».Я просто удалил все элементы кода, которые делали эту «паузу», и заменил ее вызовами, чтобы «остановить» звук и свернуть его очередь.

Что касается звука, выходящего из динамиков вместо наушниковЯ все еще изучаю это.

0 голосов
/ 18 марта 2011

Вы пытались реализовать протокол AVAudioSessionDelegate, который должен запускать методы делегирования прерываний, когда такие вещи, как наушники отключены. Документация здесь.

...