iOS6中的CoreMIDI/PGMidi虚拟midi错误

use*_*202 10 midi virtual coremidi

面对两个错误.

此代码适用于iOS 4和5,但在更新到6后,它无法正常工作(

我找到了以下内容,但不知道如何在代码中修复它.

从iOS 6开始,应用程序需要在其UIBackgroundModes中包含音频密钥才能使用CoreMIDI的MIDISourceCreate和MIDIDestinationCreate函数.如果没有密钥集,这些函数将返回kMIDINotPermitted(-10844).

2012-09-23 03:40:04.773 MidiStudio [1017:907]错误(创建MIDI虚拟源): - 10844:错误域= NSMachErrorDomain代码= -10844"操作无法完成.(马赫错误-10844. )"

2012-09-23 03:40:04.777 MidiStudio [1017:907]错误(创建MIDI虚拟目标): - 10844:错误域= NSMachErrorDomain代码= -10844"操作无法完成.(马赫错误-10844. )"

这是'source'的代码:

-(void)setVirtualSourceEnabled:(BOOL)virtualSourceEnabled {
    if ( virtualSourceEnabled == self.virtualSourceEnabled ) return;

    if ( virtualSourceEnabled ) {
        NSString *name = virtualEndpointName ? virtualEndpointName : [[[NSBundle mainBundle] infoDictionary] valueForKey:(NSString*)kCFBundleNameKey];

        OSStatus s = MIDISourceCreate(client, (CFStringRef)name, &virtualSourceEndpoint);
        NSLogError(s, @"Create MIDI virtual source");
        if ( s != noErr ) return;

        virtualSourceDestination = [[PGMidiVirtualSourceDestination alloc] initWithMidi:self endpoint:virtualSourceEndpoint];

        [delegate midi:self destinationAdded:virtualSourceDestination];
        [[NSNotificationCenter defaultCenter] postNotificationName:PGMidiDestinationAddedNotification
                                                            object:self 
                                                          userInfo:[NSDictionary dictionaryWithObject:virtualSourceDestination
                                                                                               forKey:PGMidiEndpointKey]];

    } else {
        [delegate midi:self destinationRemoved:virtualSourceDestination];

        [[NSNotificationCenter defaultCenter] postNotificationName:PGMidiDestinationRemovedNotification
                                                            object:self 
                                                          userInfo:[NSDictionary dictionaryWithObject:virtualSourceDestination
                                                                                               forKey:PGMidiEndpointKey]];

        [virtualSourceDestination release]; virtualSourceDestination = nil;
        OSStatus s = MIDIEndpointDispose(virtualSourceEndpoint);
        NSLogError(s, @"Dispose MIDI virtual source");
        virtualSourceEndpoint = NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ark 14

[把我的笔记放在Kurt的优秀答案上.]

首先,在"iOS 6.0发行说明"文档中都提到了这一点.那条线说:

从iOS 6开始,应用程序需要在其UIBackgroundModes中包含音频密钥才能使用CoreMIDI的MIDISourceCreate和MIDIDestinationCreate函数.如果没有密钥集,这些函数将返回kMIDINotPermitted(-10844).

因此,你需要做的唯一事情(再次,只是指定Kurt回答的内容)在每个目标的plist都是这样的:

<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>
Run Code Online (Sandbox Code Playgroud)


Kur*_*vis 7

您无需更改任何代码.再次阅读该消息:

从iOS 6开始,应用程序需要在其UIBackgroundModes中包含音频密钥

UIBackgroundModes应用程序Info.plist中的关键.因此,使用Xcode编辑应用程序的Info.plist,并使该键的值为包含该字符串的数组audio.