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的许多示例中看到的那样,显式参数并不是真正的问题。我甚至试图用一个唯一的名字,但没有效果。

为了确定我的搜索方向,我需要更准确地了解底层客户端创建中发生了什么,这可能会引发这个糟糕的参数问题。

欢迎任何猜测!

更新:有人在这里遇到了同样的问题并解决了它。他说"这是由一个未初始化的变量引起的。".

这是一个暗示,但不足以让我犯错误。。。

我联系了苹果,这是一个内部CoreMDI错误(至少在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 8.3(12F69)的iOS模拟器中在iPhone 5上运行该应用程序,每次在我的机器上重现错误的几率约为50%。

最新更新