CallKit проблема с динамиком, автоматически включается после получения вызова - PullRequest
0 голосов
/ 02 мая 2018

Я использую CallKit с TokBox и кое-как, как он работает с одной ошибкой, т.е. после приема вызова динамик становится активным и не может быть отключен нажатием на него. Вызов начинается с активного говорящего, что, по-моему, является ошибкой, но WhatsApp и FBMassenger использовали то же самое со своим пользовательским экраном вызова, но их говорящий становится неактивным после получения вызова, который я искал, и никакого соответствующего ответа я не нашел, поэтому далеко.

В TokBox они предоставили OTDefaultAudioDevice.h и OTDefaultAudioDevice.m файл, из которого они сконфигурировали все об аудио с CallKitSpeakerBox. Где я нашел следующую конфигурацию:

#define AUDIO_DEVICE_HEADSET     @"AudioSessionManagerDevice_Headset"
#define AUDIO_DEVICE_BLUETOOTH   @"AudioSessionManagerDevice_Bluetooth"
#define AUDIO_DEVICE_SPEAKER     @"AudioSessionManagerDevice_Speaker"

Который использовался следующим образом:

- (BOOL)configureAudioSessionWithDesiredAudioRoute:(NSString*)desiredAudioRoute
{
    OT_AUDIO_DEBUG(@"configureAudioSessionWithDesiredAudioRoute %@",desiredAudioRoute);

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *err;

    //ios 8.0 complains about Deactivating an audio session that has running
    // I/O. All I/O should be stopped or paused prior to deactivating the audio
    // session. Looks like we can get away by not using the setActive call
    if (SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"7.0")) {
        // close down our current session...
        [audioSession setActive:NO error:nil];
    }

    if ([AUDIO_DEVICE_BLUETOOTH isEqualToString:desiredAudioRoute]) {
        [self setBluetoothAsPrefferedInputDevice];
    }

    if (SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"7.0")) {
        // Set our session to active...
        if (![audioSession setActive:YES error:&err]) {
            NSLog(@"unable to set audio session active: %@", err);
            return NO;
        }
    }

    if ([AUDIO_DEVICE_SPEAKER isEqualToString:desiredAudioRoute]) {
        // replace AudiosessionSetProperty (deprecated from iOS7) with
        // AVAudioSession overrideOutputAudioPort
#if !(TARGET_OS_TV)
        [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
                                        error:&err];
#endif
    } else
    {
        [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone
                                        error:&err];
    }

    return YES;
}

Где AVAudioSessionPortOverrideSpeaker используется для всех устройств, что, как я считаю, является основной причиной включения динамиков, хотя я точно не знаю. * т.е. 1016 *

if ([AUDIO_DEVICE_SPEAKER isEqualToString:desiredAudioRoute]) {
            // replace AudiosessionSetProperty (deprecated from iOS7) with
            // AVAudioSession overrideOutputAudioPort
    #if !(TARGET_OS_TV)
            [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
                                            error:&err];
    #endif
        } else
        {
            [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone
                                            error:&err];
        }
}

Есть ли у кого-нибудь какие-либо предложения или кто-нибудь здесь, кто исправил это состояние до сих пор?

Я также считаю, что многие, как я, проходят через эту проблему.

Любая помощь будет ощутима.

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Наконец-то мне удалось решить проблему. Решение было смесью @AbhishekMitra и чего-то, что я нашел себе

Сначала я заменил класс Objective C OTDefaultAudioDevice на DefaultAudioDevice.swift, найденный здесь: https://github.com/opentok/opentok-ios-sdk-samples-swift/blob/master/Custom-Audio-Driver/Custom-Audio-Driver/DefaultAudioDevice.swift

, что эквивалентно objc, закомментируйте строку, предложенную Абхишеком, и добавьте еще одну строку в той же функции, а именно:

configureAudioSessionWithDesiredAudioRoute(desiredAudioRoute: DefaultAudioDevice.kAudioDeviceHeadset)

Вот вся функция

fileprivate func setupAudioSession() {
        let session = AVAudioSession.sharedInstance()
        
        previousAVAudioSessionCategory = session.category
        avAudioSessionMode = session.mode
        avAudioSessionPreffSampleRate = session.preferredSampleRate
        avAudioSessionChannels = session.inputNumberOfChannels
        do {
            try session.setPreferredSampleRate(Double(DefaultAudioDevice.kSampleRate))
            try session.setPreferredIOBufferDuration(0.01)
            let audioOptions = AVAudioSessionCategoryOptions.mixWithOthers.rawValue |
                AVAudioSessionCategoryOptions.allowBluetooth.rawValue
                //|
                //AVAudioSessionCategoryOptions.defaultToSpeaker.rawValue
            try session.setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeVideoChat, options: AVAudioSessionCategoryOptions(rawValue: audioOptions))
            setupListenerBlocks()
            //set the audio to headset
            configureAudioSessionWithDesiredAudioRoute(desiredAudioRoute: DefaultAudioDevice.kAudioDeviceHeadset)
            
            try session.setActive(true)
        } catch let err as NSError {
            print("Error setting up audio session \(err)")
        } catch {
            print("Error setting up audio session")
        }
    }

Это, наконец, решило мою проблему, и устройства не были подключены к громкоговорителю при активном вызове. Дайте мне знать, если у вас есть какие-либо вопросы.

Целевая версия этой строки:

[self configureAudioSessionWithDesiredAudioRoute:
                 AUDIO_DEVICE_HEADSET];
0 голосов
/ 22 мая 2018

Я прошел через службу поддержки opentok, и они серьезно подошли к этой проблеме, и, поскольку сервис был создан только для видеочата, по этой причине они включили этот динамик в интерфейсе CallKit. Чтобы отключить его или использовать только для аудиовызовов, используя их класс Objective C, а именно OTDefaultAudioDevice.h и OTDefaultAudioDevice.m, мы должны прокомментировать следующую строку в файле .m.

audioOptions |= AVAudioSessionCategoryOptionDefaultToSpeaker;

Надеюсь, это спасет день многих.

Спасибо.

...