2016-12-28 50 views
1

Я программирую MIDI-инструмент на своем iPad, который подключается к синтезатору с помощью Bluetooth.Подключите iPad через BT MIDI как периферийный (CABTMidiLocalPeripheralViewController)

Первое, что я сделал, это использовать iPad в качестве центрального контроллера с CABTMidiCentralViewController. Если я подключусь к устройству Bluetooth, я сразу получаю уведомление о подключении нового MIDI-устройства, и все в порядке.

Теперь, чтобы поддержать другой Bluetooth-ключ, мне нужно настроить iPad как периферийное, для этого я использую CABTMidiLocalPeripheralViewController. С другой стороны BT (центрального устройства, которое НЕ является iPad), я вижу, что iPad рекламирует его сервис, и я могу подключиться к нему, однако я понятия не имею, как распознать это соединение на стороне iPad - я не получаю любое уведомление о новых устройствах. Наверное, я что-то пропустил?

Я использую CABTMidiLocalPeripheralViewController так же, как в примере документации для CABTMidiCentralViewController, так что код (это просто отображение ЖЕЛ во всяком случае, не так ли?):

- (void)configCABTMIDIPeripheral:(id)sender 
{ 
    CABTMIDILocalPeripheralViewController *viewController =[CABTMIDILocalPeripheralViewController new]; 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

    viewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemDone                       target: self                       action: @selector(didConfigCABTMIDIPeripheral:)]; 

    navController.modalPresentationStyle = UIModalPresentationPopover; 

    UIPopoverPresentationController *popC = navController.popoverPresentationController; 
    popC.permittedArrowDirections = UIPopoverArrowDirectionAny; 
    popC.sourceRect = [sender frame]; 

    UIButton *button = (UIButton *)sender; 
    popC.sourceView = button.superview; 

    [self.delegateBaseViewController presentViewController:navController animated:YES completion:nil]; 
} 

Что касается уведомлений зарегистрировать статический функция обратного вызова при создании клиента MIDI - мне кажется, что в качестве периферийного устройства это работает другой, может быть, кто-то здесь может мне точку в правильном направлении:

 OSStatus s = 0; 
     s = MIDIClientCreate((CFStringRef)@"MIDI Client", PGMIDINotifyProc, arc_cast<void>(self), &_client);    // Create MIDI Client 
     s = MIDIOutputPortCreate(_client, (CFStringRef)@"Output Port", &_outputPort);          // Create MIDI output port 
     s = MIDIInputPortCreate(_client, (CFStringRef)@"Input Port", PGMIDIReadProc, arc_cast<void>(self), &_inputPort); // Create MIDI input port 

... с PGMIDINotifyProc похожий ...

void PGMIDINotifyProc(const MIDINotification *message, void *refCon) 
{ 
    NSLog(@"PGMIDINotifyProc"); 
    PGMidi *self = arc_cast<PGMidi>(refCon); 
    [self midiNotify:message]; 
} 

(Кредиты PGMidi в https://github.com/petegoodliffe/PGMidi)

Итак ... как я могу видеть, если мой периферийный IPad был подключить к MIDI-устройству?


UPDATE

После долгого перерыва я решил дать ему еще одну попытку, на этот раз я сделал несколько тестов, реализовав CBPeripheralManager и CBCentralManager на двух устройствах (один периферический и один центральный), чтобы иметь более пристальный взгляд на то, что происходит за кулисами:

Не вдаваясь слишком много в подробности, вот некоторые наблюдения:

  • если р Эриферическое устройство не задействовано в CBPeripheralManager, никакие услуги Bluetooth не предлагаются. Имеет смысл.

  • Если периферийное устройство предлагает некоторое случайное обслуживание, центральное устройство обнаружит эту службу, с которой они соединяются, и может обмениваться данными. Отлично.

  • Если периферийное устройство по-прежнему предлагает некоторую случайную услугу, в то время как центральное устройство в основном ищет MIDI-сервис/характеристики, оно найдет сервис MIDI и подключится к нему. Я не получаю никаких уведомлений об этом на периферийной стороне, так как я всего лишь делегат периферийного устройства, предлагающий какую-то случайную услугу.

  • Если и периферийное устройство, и центральное предложение/сканирование для службы/характеристик MIDI, они ничего не обнаруживают.

Это похоже на то, что служба MIDI появляется сама по себе, если я предлагаю другую услугу, но не существует, если я не предлагаю никаких услуг. Более того, iPad, похоже, блокирует или улавливает MIDI-сервис/характеристику, если я сам попытаюсь предложить его.

Любые идеи здесь? Давайте :) :)

+0

дорогой Дэн, вы используете в качестве центрального устройства Mac (или macbook) и любое доступное коммерческое программное обеспечение для передачи сообщений midi? Я хотел бы воссоздать тестовую среду –

ответ

0

Предполагая, что вы используете CABTMIDILocalPeripheralViewController для подключения, попробуйте заменить arc_cast<void>(self) с (__bridge void*)self как текущая библиотека PGMidi делает, но если вы используете эту библиотеку, вы не должны писать этот клиент инициализации самостоятельно, он создается внутри [[PGMidi alloc] init] вызов. в любом случае вы можете видеть, что PGMIDINotifyProc был вызван?