Я программирую 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-сервис/характеристику, если я сам попытаюсь предложить его.
Любые идеи здесь? Давайте :) :)
дорогой Дэн, вы используете в качестве центрального устройства Mac (или macbook) и любое доступное коммерческое программное обеспечение для передачи сообщений midi? Я хотел бы воссоздать тестовую среду –