首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理AudioKit生命周期的正确方法是什么?

管理AudioKit生命周期的正确方法是什么?
EN

Stack Overflow用户
提问于 2017-05-30 09:52:01
回答 2查看 1.5K关注 0票数 5

我正在建立一个应用程序,必须跟踪用户麦克风的输入幅度。AudioKit有很多方便的对象满足我的需要: AKAmplitudeTracker等等。我还没有找到任何可行的信息,它应该如何启动AudioKit,开始跟踪等。

目前,所有与AudioKit初始化相关的代码都是在我的音频记录模块的根VC的viewDidLoad方法中实现的。这是不正确的,因为随机错误会发生,而我无法跟踪错误的地方。下面的代码显示了我现在是如何使用AudioKit的。

代码语言:javascript
复制
var silence: AKBooster!
  var tracker: AKAmplitudeTracker!
    var mic: AKMicrophone!

      ...

      override func viewDidLoad() {
        super.viewDidLoad()

        switch AVAudioSession.sharedInstance().recordPermission() {

            case AVAudioSessionRecordPermission.granted:

              self.mic = AKMicrophone()
              self.tracker = AKAmplitudeTracker(self.mic)
              AKSettings.audioInputEnabled = true
              AudioKit.output = self.tracker
              AudioKit.start()
              self.mic.start()
              self.tracker.start()

              break

            case AVAudioSessionRecordPermission.undetermined:

              AVAudioSession.sharedInstance().requestRecordPermission {
                (granted) in

                if granted {

                  self.mic = AKMicrophone()
                  self.tracker = AKAmplitudeTracker(self.mic)
                  AKSettings.audioInputEnabled = true
                  AudioKit.output = self.tracker
                  AudioKit.start()
                  self.mic.start()
                  self.tracker.start()

                }

              }
            case AVAudioSessionRecordPermission.denied:

              AVAudioSession.sharedInstance().requestRecordPermission {
                (granted) in

                if granted {

                  self.mic = AKMicrophone()
                  self.tracker = AKAmplitudeTracker(self.mic)
                  AKSettings.audioInputEnabled = true
                  AudioKit.output = self.tracker
                  AudioKit.start()
                  self.mic.start()
                  self.tracker.start()

                }

              }


            default:
              print("")
          }

          ...

      }

请帮我弄清楚如何正确管理AudioKit。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-04 21:13:49

亚历克西

我管理AudioKit生命周期的建议是将它放在一个单例类中。这是在回购中包含的一些AudioKit示例中如何设置的,比如模拟合成器X鼓声。这样,它就不会绑定到特定的ViewController的viewDidLoad上,并且可以从多个ViewControllers或管理应用程序状态的AppDelegate中访问。它还确保您只创建一个实例。

下面是一个示例,其中AudioKit是在一个名为Conductor的类中初始化的(也可以称为AudioManager等等):

代码语言:javascript
复制
import AudioKit
import AudioKitUI

// Treat the conductor like a manager for the audio engine.
class Conductor {

    // Singleton of the Conductor class to avoid multiple instances of the audio engine
    static let sharedInstance = Conductor()

    // Create instance variables
    var mic: AKMicrophone!
    var tracker: AKAmplitudeTracker!

    // Add effects
    var delay: AKDelay!
    var reverb: AKCostelloReverb!

    // Balance between the delay and reverb mix.
    var reverbAmountMixer = AKDryWetMixer()

    init() {

        // Allow audio to play while the iOS device is muted.
        AKSettings.playbackWhileMuted = true

        AKSettings.defaultToSpeaker = true

        // Capture mic input
        mic = AKMicrophone()

        // Pull mic output into the tracker node.
        tracker = AKAmplitudeTracker(mic)

        // Pull the tracker output into the delay effect node.
        delay = AKDelay(tracker)
        delay.time = 2.0
        delay.feedback = 0.1
        delay.dryWetMix = 0.5

        // Pull the delay output into the reverb effect node.
        reverb = AKCostelloReverb(delay)
        reverb.presetShortTailCostelloReverb()

        // Mix the amount of reverb to the delay output node.
        reverbAmountMixer = AKDryWetMixer(delay, reverb, balance: 0.8)

        // Assign the reverbAmountMixer output to be the final audio output
        AudioKit.output = reverbAmountMixer

        // Start the AudioKit engine
        // This is in its own method so that the audio engine will start and stop via the AppDelegate's current state.
        startAudioEngine()

    }

    internal func startAudioEngine() {
        AudioKit.start()
        print("Audio engine started")
    }

    internal func stopAudioEngine() {
        AudioKit.stop()
        print("Audio engine stopped")
    }
}

下面是如何从Conductor单机类访问ViewController中出现的振幅跟踪数据:

代码语言:javascript
复制
import UIKit

class ViewController: UIViewController {

    var conductor = Conductor.sharedInstance

    override func viewDidLoad() {
        super.viewDidLoad()

        Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { [unowned self] (timer) in
            print(self.conductor.tracker.amplitude)
        }

    }
}

您可以从这里下载此GitHub回购文件:

https://github.com/markjeschke/AudioKit-Amplitude-Tracker

我希望这能帮到你。

保重,

标记

票数 3
EN

Stack Overflow用户

发布于 2017-05-30 16:05:13

据我所见,它看起来应该是工作的,在代码的其他地方可能发生了一些事情。我做了一个简化的演示来测试基础,而且它很有效。我刚加了个计时器来轮询振幅。

代码语言:javascript
复制
import UIKit
import AudioKit

class ViewController: UIViewController {

    var mic: AKMicrophone!
    var tracker: AKAmplitudeTracker!

    override func viewDidLoad() {
        super.viewDidLoad()

        mic = AKMicrophone()
        tracker = AKAmplitudeTracker(mic)
        AudioKit.output = tracker
        AudioKit.start()

        Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in
            print(self.tracker.amplitude)
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44258954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档