MIDIGetNumberOfSources не отвечает последовательно - PullRequest
0 голосов
/ 09 мая 2019

У меня есть небольшое приложение для подключения 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

...