MidiClientCreate "The operation couldn't be completed. (OSStatus error -50.)"

MidiClientCreate "The operation couldn't be completed. (OSStatus error -50.)"

我正在尝试调试复杂 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 并解决了。他说 "It was caused by an uninitalised variable.".

这是一个迹象,但还不足以让我犯错...

我联系了 Apple,这是一个内部 CoreMIDI 错误(至少在 iOS8.3 之前),直到现在才知道。

来自支持:

MIDIClientCreate itself will return -50 in only two scenarios:

1) If outClient itself is NULL so in the above you forget to take the address of client.

2) If the MIDI server has an issue getting a process ID back internally

我确保我提供的客户地址没问题,所以在我的情况下是 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;
}

运行 iPhone 5 in iOS Simulator with iOS 8.3 (12F69) 上的应用程序每次在我的机器上都有大约 50% 的机会重现错误.