2014-08-28 77 views
1

AVMIDIPlayer有这个初始化:AVMIDIPlayer初始化与MusicSequence

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我是否正确获取数据?

回答

0

我收到了Tumbleweed徽章!

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

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

TL;博士

这样做:

midiPlayer.play(nil) 

,而不是这样的:

midiPlayer.play(completion)