gpt4 book ai didi

swift - MIDIThruConnectionCreate 总是通过连接创建持久的 MIDI?

转载 作者:可可西里 更新时间:2023-11-01 02:16:11 24 4
gpt4 key购买 nike

Xcode 8 beta 2/Swift 3:

根据 Apple's CoreMIDI API documentation , MIDI 直通连接可以建立为持久性(永远保持在原位,即使在您的应用程序退出和系统重新启动后)或非持久性/暂时性(由您的应用程序拥有并在应用程序退出时自动销毁)。

我遇到的问题是我似乎无法创建非持久连接,即使我遵循了 Apple 的指导方针也是如此。

归结为 this API :

func MIDIThruConnectionCreate(_ inPersistentOwnerID: CFString?, 
_ inConnectionParams: CFData,
_ outConnection: UnsafeMutablePointer<MIDIThruConnectionRef>) -> OSStatus

如果您将 null (nil) 传递给 Swift 可选的 inPersistentOwnerID,则连接应该被创建为临时连接。然而,无论我传递的是 nil 还是 String,连接总是被创建为持久的。 (我可以通过检查 CoreMIDI 的持久直通连接来验证这一点。)

我的代码总结:

public class OTMIDIConnectedThru {
var connectionRef = MIDIThruConnectionRef()

init?(sourceEndpoints: [MIDIEndpointRef], destinationEndpoints: [MIDIEndpointRef], persistentOwnerID: String? = nil) {
var params = MIDIThruConnectionParams()
MIDIThruConnectionParamsInitialize(&params) // fill with defaults

// (... snip: code to prepare parameters here ...)

let paramsData = withUnsafePointer(&params) { p in
NSData(bytes: p, length: MIDIThruConnectionParamsSize(&params))
}

result = MIDIThruConnectionCreate(persistentOwnerID, paramsData, &connectionRef)
guard result == noErr else { return nil }
}
}

知道我做错了什么吗?这不可能是 API 中的错误?

最佳答案

我遇到了同样的问题,是的,我认为它总是会创建持久连接。 NULL 的 ID 可能与空字符串相同,因为带有空字符串的 MIDIThruConnectionFind 返回所有这些持久连接。所以,API 或文档中的错误!

我建议使用真正的 persistentID,并在初始化 MIDI 内容时删除所有现有/过时的连接:

CFDataRef data;
MIDIThruConnectionFind(CFSTR("com.yourcompany.yourapp"), &data);
unsigned long n = CFDataGetLength(data) / sizeof(MIDIThruConnectionRef);
MIDIThruConnectionRef * con = (MIDIThruConnectionRef*)CFDataGetBytePtr(data);
for(int i=0;i<n;i++) {
MIDIThruConnectionDispose(*con);
con++;
}

关于swift - MIDIThruConnectionCreate 总是通过连接创建持久的 MIDI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38385124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com