使用MusicSequence的AVMIDIPlayer init

时间:2014-08-28 13:55:45

标签: swift core-audio avaudioplayer core

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)

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

tl; dr我是否错误地获取了数据?

1 个答案:

答案 0 :(得分:0)

我收到了Tumbleweed徽章!

无论如何,问题是AVMIDIPlayer的播放功能。如果你给它一个零完成处理程序,它很高兴它不会崩溃。如果你给它一个完成处理程序,那么blammo - 崩溃。我已经为完成处理程序尝试了闭包和花园多样化函数。

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

<强> TL;博士

这样做:

midiPlayer.play(nil)

而不是这个:

midiPlayer.play(completion)