iOS6中的CoreMIDI / PGMidi虚拟midi错误

时间:2012-09-23 00:46:18

标签: virtual midi 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“操作无法完成。(Mach错误) -10844)。“

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

以下是“来源”的代码:

-(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;
    }
}

2 个答案:

答案 0 :(得分:14)

[只是把我的笔记放在Kurt的优秀答案上。]

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

  

从iOS 6开始,应用需要拥有音频键   UIBackgroundModes为了使用CoreMIDI的MIDISourceCreate和   MIDIDestinationCreate函数。没有密钥集,这些功能   将返回kMIDINotPermitted(-10844)。

所以你需要做的唯一事情(再次,只是指明Kurt回答的内容)就是这样的每个目标的plist

<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>

答案 1 :(得分:1)

我的应用使用MIDIDestinationCreate播放midi文件,应用审核小组确实在创建一个臭味。他们坚持认为应用必须在后台播放一些音频。他们引用“2.16:多任务应用程序只能将后台服务用于其预期目的:VoIP,音频播放,位置,任务完成,本地通知等。”

我已经将它们引用到这里提到的iOS6发行说明中,他们只是不断回来说它必须在后台播放音频。

我已向Apple Developer Technical Support提交了一份请求。希望他们会改变他们团队遵循的应用审核指南。