2017-05-30 8 views
1

私はユーザーの入力振幅を追跡する必要があるアプリケーションを構築しています。 AudioKitには、私のニーズに合った便利なオブジェクトがたくさんあります:AKAmplitudeTrackerなど。どのようにAudioKitを起動し、トラッキングを開始するのか、実行可能な情報が見つかりませんでした。AudioKitのライフサイクルを管理する正しい方法は何ですか?

今のところ、AudioKit初期化に関連するすべてのコードは、オーディオレコーダモジュールのmyVCのviewDidLoadメソッドにあります。ランダムなエラーが発生し、何が間違っているかを追跡することができないため、正しくありません。下のコードは、AudioKitの使用方法を示しています。

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を正しく管理する方法を理解してください。

答えて

0

アレクセイ、

AudioKitのライフサイクルを管理するための私の推薦は、シングルトンクラス内に収容することです。これは、Analog Synth XDrumsのような、レポに含まれるAudioKitのいくつかの例でセットアップされた方法です。つまり、特定のViewControllerのviewDidLoadにバインドされておらず、複数のViewControllerまたはAppDelegateからアクセスして、アプリケーションの状態を管理することができます。また、そのインスタンスを1つだけ作成することも保証します。

ここで(またなど、AudioManager呼ぶことができる)、AudioKitが呼び出さクラス内で初期化される例ですConductor:ここ

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 singletoneクラス内で発生だ振幅追跡データにアクセスする方法は次のViewController:

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

これが役立ちます。

うん、
マーク

2

私が見るところでは、動作するはずですが、コードのどこかで何かが起こっている可能性があります。基本をテストするためにデモを行いました。私はちょうど振幅をポーリングするためのタイマーを追加しました。

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) 
     } 
    } 
} 
+0

を注意してください、私のコードの作品。しかし時にはトラッカーが起動できないこともあります。さまざまな値ではなく、0.0066 ..などの一定値を出力します。または、AudioKit.start()のコンソールで致命的なエラーが発生すると、 'hwFormat'や他のCoreAudioの部分に何か問題があります。だから私は間違った方法でAudioKitを扱うと思う。 –

+0

奇妙なオーディオバグでは、それはOSバグかもしれません。デバイスを再起動してみてください。 – dave234

+0

間隔が0.1秒未満のタイマーが必要な場合はどうすればよいですか?私はaddPeriodicTimeObserverのようなものを考えていました... AudioKitに似た何か? – Ibdakine

関連する問題