AVMIDIPlayer INIT与MusicSequence(AVMIDIPlayer init

2019-10-20 19:58发布

AVMIDIPlayer有这个初始化:

initWithData:soundBankURL:error:

这是除了一个初始化从标准MIDI文件读取。

这些数据是NSData的,我认为是一个标准的MIDI文件格式。 那么,如何获得这些数据? 那么,创建一个MIDI音序电流的方法是AudioToolbox MusicSequence。 (AVAudioEngine甚至有这种类型的一个成员)。

MusicSequence有这个转换器:

MusicSequenceFileCreateData (
        MusicSequence            inSequence,
        MusicSequenceFileTypeID  inFileType,
        MusicSequenceFileFlags   inFlags,
        SInt16                   inResolution,
        CFDataRef                *outData
    );

因此,让我们试试。

var status = OSStatus(noErr)
var data:Unmanaged<CFData>?
status = MusicSequenceFileCreateData (musicSequence,
        MusicSequenceFileTypeID(kMusicSequenceFile_MIDIType),
        MusicSequenceFileFlags(kMusicSequenceFileFlags_EraseFile),
        480, &data)

var ns:NSData = data!.takeRetainedValue()
var error:NSError?
self.mp = AVMIDIPlayer(data: ns, soundBankURL: soundbank, error: &error)

(我以前加载音库)。 好消息:那请问播放MIDI数据。 坏消息:在到达序列的末尾,它崩溃。

queue = 'CallbackQueue', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)

两种猜测。 有一个在平台代码中的错误,或者(更可能),我的代码。

文艺青年最爱的我收到的数据是否有误?

Answer 1:

我收到了Tumbleweed的徽章此!

总之,问题是AVMIDIPlayer的播放功能。 如果你给它一个零完成处理,这是幸福的,它不会崩溃。 如果你给它一个完成处理程序,然后blammo - 崩溃。 我都试过封闭和完成处理器花园多种功能。

var completion:AVMIDIPlayerCompletionHandler = {
     println("done")
 }

TL;博士

做这个:

midiPlayer.play(nil)

而不是这样的:

midiPlayer.play(completion)


文章来源: AVMIDIPlayer init with MusicSequence