У меня есть небольшое приложение для подключения MIDI-сервера к моему IOS через BLE.Работает хорошо, но приложение MIDIGetNumberOfSources не возвращает все источники, а только источник по умолчанию, а не реальный канал с миди-данными.Мне нужно снова вызвать MIDIGetNumberOfSources, чтобы получить его ..
... let count: Int = MIDIGetNumberOfSources () ...
, даже если устройство ios связано с сервером midi и всемsetup (midiuuid, сервисная характеристика найдена и т. д.)
Есть идеи о том, как отслеживать, когда вызывать MIDIGetNumberOfSources?
edit.настроить канал
// connection to BT services through BTCentralManager
let serviceMIDICharacteristic_UUID = CBUUID(string: "7772E5DB-3868-4112-A1A9-F2669D106BF3")
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
if let characteristic = service.characteristics?.first(where: { $0.uuid == serviceMIDICharacteristic_UUID })
{
// list up MIDI channels
let count:Int = MIDIGetNumberOfSources()
for i in 0..<count {
let endpoint:MIDIEndpointRef = MIDIGetSource(i);
...
// usually we get 2 channels, the default "Network session 1" (i=0) and
// the "real" channel "iPhone... " (i=1) that have the server name etc..
// but I have to call MIDIGetNumberOfSources() few times to see it
//
}
// once MIDI service is connected from Bluetooth
let src = endpoint (i=1)
MIDIReceivePacket.init()
class MIDIReceivePacket {
...
// ======================== INITIALIZE MIDI - CREATE INPORT ===================================
init() {
if midiClient == 0 {
let result = MIDIClientCreateWithBlock(clientName, &midiClient, myNotifyCallback) }
...
err = MIDIInputPortCreate( midiClient, "MIDI_InPort" as CFString, MyMIDIReadProc, nil, &inPort)
...
err = MIDIPortConnectSource(inPort, src, &src)
...
}
func myNotifyCallback(message:UnsafePointer<MIDINotification>) -> Void {
let messageID = message.pointee.messageID
switch (messageID) {
case MIDINotificationMessageID.msgSetupChanged:
NSLog("MIDI setup changed")
break
...
}
func MyMIDIReadProc (pktList: UnsafePointer<MIDIPacketList>,
readProcRefCon: UnsafeMutableRawPointer?, srcConnRefCon: UnsafeMutableRawPointer?) -> Void
{
let packetList:MIDIPacketList = pktList.pointee
var packet:MIDIPacket = packetList.packet
...
// data read here
for _ in 1...packetList.numPackets
{
let bytes = Mirror(reflecting: packet.data).children
...
// long code here to read the buffer (found somewhere on SO)
}
Все вызовы выше не будут отображать ошибок, и, когда MIDIGetNumberOfSources возвращает правильное количество источников, яможет подключаться и получать MIDI-данные без каких-либо проблем.
Примечание;сервер MacOS и приложение iOS