Включить Bluetooth для голосового вызова pjsip в ios

Я делаю приложение VOIP, и теперь нам нужно соединить голосовые вызовы с Bluetooth. Мы пытались соединить вызов с помощью Bluetooth, но ничего не слышно.

введите здесь описание изображения

   /* Initialize audio session category and mode */
{
    AVAudioSession *sess = [AVAudioSession sharedInstance];
    pj_bool_t err;



if ([sess respondsToSelector:@selector(setCategory:withOptions:error:)])
{
    err = [sess setCategory:AVAudioSessionCategoryPlayAndRecord
            withOptions:AVAudioSessionCategoryOptionAllowBluetooth
            error:nil] != YES;
    } else {
        err = [sess setCategory:AVAudioSessionCategoryPlayAndRecord
            error:nil] != YES;
    }
if (err) {
        PJ_LOG(3, (THIS_FILE,
               "Warning: failed settting audio session category"));
}

if ([sess respondsToSelector:@selector(setMode:error:)] &&
    [sess setMode:AVAudioSessionModeVoiceChat error:nil] != YES)
{
    PJ_LOG(3, (THIS_FILE, "Warning: failed settting audio mode"));
}
}

Код выше добавлен в файл pjmedia-audiodev->coreaudio_dev.m.

Также попробовал код ниже: -

+(void)EnableBluethooth
  {
    AVAudioSession* audioSession = [AVAudioSession sharedInstance];
   [audioSession setCategory: AVAudioSessionCategoryPlayAndRecord 
  error: 
   nil];
  [audioSession setActive: YES error: nil];
  UInt32 allowBluetoothInput = 1;
  OSStatus ostatus = AudioSessionSetProperty (

   kAudioSessionProperty_OverrideCategoryEnableBluetoothInput,


   sizeof(allowBluetoothInput), &allowBluetoothInput);

      pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_BLUETOOTH;
  pj_status_t status = 
   pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE, &route, 
   PJ_TRUE);
   NSLog(@"statuys is--->%d",status);


     NSLog(@"status = %x", ostatus);



    }
   +(void)DisableBluethooth
  {
      AVAudioSession* audioSession = [AVAudioSession sharedInstance];
      [audioSession setCategory: AVAudioSessionCategoryPlayAndRecord 
       error: nil];
       [audioSession setActive: NO error: nil];
     pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_BLUETOOTH;
       pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE, &route, 
     PJ_FALSE);


   }

Код выполняется, но голос не слышен через Bluetooth. Если у кого-нибудь есть идея включить Bluetooth для pjsip, сообщите мне.

Спасибо.


person shraddha k vaishanani    schedule 18.07.2018    source источник
comment
Пожалуйста, отредактируйте свой вопрос, чтобы включить соответствующий код в виде текста, а не изображения.   -  person Paulw11    schedule 18.07.2018
comment
Здравствуйте, Paulw, отредактированный ответ. Пожалуйста, проверьте и дайте решение.   -  person shraddha k vaishanani    schedule 18.07.2018


Ответы (1)


После установки AVAudioSessionCategory и port установите предпочтительный вход как порт Bluetooth, чтобы Bluetooth был активирован. Пожалуйста, следуйте приведенному ниже коду и вызовите метод switchBluetooth.

- (AVAudioSessionPortDescription*)builtinAudioDevice
{
    NSArray* builtinRoutes = @[AVAudioSessionPortBuiltInMic];
    return [self audioDeviceFromTypes:builtinRoutes];
}        
- (AVAudioSessionPortDescription*)bluetoothAudioDevice
    {
        NSArray* bluetoothRoutes = @[AVAudioSessionPortBluetoothA2DP, AVAudioSessionPortBluetoothLE, AVAudioSessionPortBluetoothHFP];
        return [self audioDeviceFromTypes:bluetoothRoutes];
    }

    - (AVAudioSessionPortDescription*)audioDeviceFromTypes:(NSArray*)types
    {
        NSArray* routes = [[AVAudioSession sharedInstance] availableInputs];
        for (AVAudioSessionPortDescription* route in routes)
        {
            if ([types containsObject:route.portType])
            {
                return route;
            }
        }
        return nil;
    }

    - (BOOL)switchBluetooth:(BOOL)onOrOff
    {
        NSError* audioError = nil;
        BOOL changeResult = NO;
        if (onOrOff == YES)
        {
            AVAudioSessionPortDescription *bluetoothPort = [self bluetoothAudioDevice];
            if (bluetoothPort) {
                changeResult = [[AVAudioSession sharedInstance] setPreferredInput:bluetoothPort
                                                                            error:&audioError];
            }
        }
        else
        {
            AVAudioSessionPortDescription* builtinPort = [self builtinAudioDevice];
            if (builtinPort) {
                changeResult = [[AVAudioSession sharedInstance] setPreferredInput:builtinPort
                                                                            error:&audioError];
            }
        }
        if (audioError) {
            NSLog(@"BluetoothActiveError: %@ suggestion : %@",audioError.localizedDescription,audioError.localizedRecoverySuggestion);
        }
        return changeResult;
    }
person RJV Kumar    schedule 18.07.2018
comment
спасибо за ответ, но ваше решение не работает с pjsip. - person shraddha k vaishanani; 18.07.2018
comment
Вы активировали сеанс после этих изменений. ? [сеанс setActive: ДА ошибка: & ошибка]; - person RJV Kumar; 18.07.2018
comment
Здравствуйте, RJV Kumar, вышеприведенное решение работает, но голос не передается с помощью микрофона Bluetooth, что означает, что работает одна сторона голоса. Воспроизведение видео, затем прослушивание голоса на устройстве Bluetooth, но вызов с использованием Bluetooth, а затем не передача моего голоса с другого устройства. поэтому, если у вас есть какое-либо решение, пожалуйста, помогите мне. - person shraddha k vaishanani; 19.07.2018
comment
Есть ли какое-либо решение для того же? - person Jiten Parmar; 02.06.2019