iOS AKMIDISampler没有音频输出

时间:2018-03-29 06:43:52

标签: ios avfoundation audiokit

我在iOS(11.3)上使用带声音的AKMIDISampler,但我无法获得音频输出。 目前,设置很少:

    midiSampler = AKMIDISampler()
    samplerVolume = AKBooster(midiSampler)
    mixer.connect(input: samplerVolume)

    let bundlePath = Bundle.main.bundlePath
    let soundPath = ("\(bundlePath)/Sounds/GigaPiano")
    do { _ = try self.midiSampler.loadSoundFont(soundPath, preset: 0, bank: 0) }
    catch { print("Error loading soundfont") }

    mixer.start()
    AudioKit.output = mixer
    do {
        _ = try AudioKit.engine.start()
    } catch {
        print("AudioKit wouldn't start!")
    }
    midiSampler.enableMIDI()

在AKMIDISampler.handleMIDI()中设置断点表示MIDI数据已到达那里,因此它似乎必定是音频问题。没有错误加载声音。此外,我添加了AKBooster绝望,只是因为它出现在一个示例应用程序;没有它就一样。

有关如何调试此内容的任何提示?

更新

正如评论中所述,我确实有音频,但非常安静,扭曲,通过主iPhone扬声器 - 只有耳机。我目前的最小代码(在声音加载方面有一些防御性)是:

    midiSampler = AKMIDISampler()
    mixer = AKMixer(midiSampler)
    let bundlePath = Bundle.main.bundlePath
    let soundPath = ("\(bundlePath)/Sounds/KorgTritonPiano")
    do { _ = try self.midiSampler.loadSoundFont(soundPath, preset: 0, bank: 0) }
    catch {
        print("Failed in loadSoundFont. Try loadMelodicSoundFont...")
        do { _ = try self.midiSampler.loadMelodicSoundFont(soundPath, preset: 0) }
        catch { print("Error loading soundfont") }
    }
    AudioKit.output = mixer
    do { try AKSettings.setSession(category: .playAndRecord, with: .mixWithOthers) }
    catch { print("Can't update session info...") }
    do {
        _ = try AudioKit.start()
    } catch {
        print("AudioKit wouldn't start!")
    }
    midiSampler.enableMIDI()

正如评论中所提到的,最小的AKOscillator,AKEnvelope直接连接到AudioKit.output,确实会从扬声器产生声音。所以它与AKMIDISampler或AKSampler(?)有关。我注意到这个问题在过去已经出现并且已经关闭,但是iOS 11.3可能会重新打破这个问题?

由于GitHub页面要求我们在这里确认问题,我真的希望AudioKit的某些人能够回复(所以我可以避免发布到GitHub)。我一直在上课和下课,试图弄清楚它可能会失败的地方,但我什么都没有。

如果它有帮助,我使用的是iOS 11.3(测试版15E5201e),Xcode 9.3 beta 4,macOS 10.13.4 beta 4.由于11.3和10.13.4现在似乎已经发布,我今晚会更新。如果iOS或Xcode版本是一个已知问题,我认为会出现在GitHub上,但没有记录。

更新2 :将Xcode,iOS,macOS更新为最新版本,无需更改。

更新3 :在 AVAudioSession.sharedInstance().currentRoute.outputs内的中使用AKMIDIPlayer.handleMIDI()记录设备,表示已选择扬声器。我完全难过了。这可能是Apple的错误吗?

更新4:故意将输出设置为PlayAndRecord(即<Device: Receiver (Built-In Receiver)>)输出任何内容,并将其设置为扬声器输出到接收器。也许我的开发电话中风... SubUpdate:没有,在另一部iPhone上验证了相同的行为。我受够了。将看看我是否可以从我的项目中取出AK并从直接的AVFoundation构建采样器。与我所看到的没什么不同。至少那时我肯定知道AK是否参与其中。

更新5:基于AVAudioUnitSampler对完全非AudioKit版本进行编码。同样的问题。同样奇怪的是session.currentRoute报告它正在向演讲者播放(事实并非如此)。是否有可能Xcode项目中的某些内容可能导致此问题?如果有人有任何想法或想法,任何和所有的帮助仍然会非常感激。

1 个答案:

答案 0 :(得分:0)

AudioKit 4.2中的新AKSampler解决了我的问题!也许不完全是一个“答案”,但绝对是一个解决方案,绝对是一个“采样器”,绝对是在AudioKit。希望对其他人有所帮助。