我试图在复杂的iOS / Objective-C软件中调试MIDI问题。 它出现在这个电话上:
OSStatus s;
MIDIClientRef midi_client_ref;
s = MIDIClientCreate((CFStringRef)@"MIDIPlayerSetup MIDI Client", NULL, NULL,
&midi_client_ref);
大部分时间一切正常但有时返回的OSStatus是-50代码(错误参数)。
但是,正如您在网络上的MIDIClientCreate的许多示例中所看到的那样,显式参数确实不是问题所在。我甚至试图找到一个没有效果的唯一名称。
为了确定我的搜索方向,我需要更准确地了解底层客户端创建中可能引发此错误参数问题的内容。
欢迎任何猜测!
更新:有人遇到同样的问题here并解决了问题。他说"它是由一个未经宣传的变量引起的。"。
这是一个迹象,但还不足以引导我犯错误......
答案 0 :(得分:0)
我联系了Apple,这是一个内部的CoreMIDI错误(至少在iOS8.3之前),直到现在才知道。
MIDIClientCreate本身仅在两种情况下返回-50:
1)如果outClient本身为NULL,那么在上面你忘了取客户端的地址。
2)如果MIDI服务器在内部获取进程ID时出现问题
我确保我提供的客户端的地址是正常的,所以在我的情况下是2)。
然后我注意到在潜在错误之前我曾多次调用MIDIGetNumberOfSources();
,所以我在其委托中实现了一个示例应用程序:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"application:didFinishLaunchingWithOptions:");
for (int i = 0; i < 100000000; i++) {
MIDIGetNumberOfSources();
}
MIDIClientRef client;
OSStatus s = MIDIClientCreate(CFSTR("iMIDI Client"), NULL, NULL, &client);
NSLog(@"OSStatus : %d", (int)s);
return YES;
}
在iOS模拟器中使用iOS 8.3(12F69)在iPhone 5上运行应用程序,每次在我的计算机上有大约50%的机会重现该错误。