AudioKit 4.9.5 Микрофон не работает, все 0 показаний - PullRequest
0 голосов
/ 08 апреля 2020

Я пытался использовать microhpone с AudioKit.

Код компилируется и запускается, он также запрашивает разрешение на доступ к микрофону, но все значения частоты и амплитуды равны 0.

Вот класс, который я написал для отправки показаний микрофонов как событий.

Я видел другие вопросы, которые могли быть относящимися к делу, и пробовал их все так же, как пытался изменить ввод, но не повезло.

Мне кажется, я либо неправильно понимаю жизненный цикл AudioKit, либо теги @ obj c меняют поведение.

Этот код раньше работал на старых ios версиях, но на 13.3 выглядит так есть изменения. (причина @ obj c в том, что мне нужно использовать это с реагировать на собственный мост)

Я думал, что это может быть связано с info.plist, но я настроил info.plist для конфиденциальности микрофона со строкой но все же не повезло.

Я что-то упустил?

Спасибо, пожалуйста, проверьте код здесь:

import Foundation
import AudioKit


@objc(AudioKitWrapper)
class AudioKitWrapper: NSObject {

  @objc  var mic: AKMicrophone!
  @objc  var timer: Timer!
  @objc  var tracker: AKFrequencyTracker!

  override init(){

    super.init()

    do {
        try AKSettings.setSession(category: .playAndRecord)
    } catch {
        AKLog("Could not set session category.")
    }

    AKSettings.defaultToSpeaker = true
    if let inputs = AudioKit.inputDevices {
      do {
        print(inputs)
        try AudioKit.setInputDevice(inputs[0])
        AKSettings.audioInputEnabled = true
        mic = AKMicrophone()
        try mic?.setDevice(inputs[0])
      }
      catch {
        print("microphone not supported")
      }
    }

    try? AudioKit.start()
    mic?.stop()

    self.tracker = AKFrequencyTracker.init(mic, hopSize: 4_096, peakCount: 20)
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.loop), userInfo: nil, repeats: true)

  }


  @objc func start()  {
    if (mic?.isStarted == true) {
      print("stop")
      mic?.stop()
      try! AudioKit.stop()
    }
    else {
      print("start")
      mic?.start()
//      try! AudioKit.start()
       var silence = AKBooster(tracker, gain: 0)
      AudioKit.output = silence

    }

  }

  @objc static func requiresMainQueueSetup() -> Bool {
      return false
  }

  @objc func loop() {
    if (mic?.isStarted == true){
      print(self.tracker.amplitude, self.tracker.frequency)
      EventEmitter.sharedInstance.dispatch(name: "onChange",
                                           body: ["amplitude": tracker.amplitude, "frequency":tracker.frequency])

    }


  }



}

1 Ответ

0 голосов
/ 12 апреля 2020

Я смотрел видео до go от песочницы до производства и изменил несколько вещей.

Я понял, что основной проблемой с моим кодом было не использование AKBooster. измените объявления переменных на то, что упоминалось в видео, и оно начало работать.

Вот быстрый код, который работает:

import Foundation
import AudioKit


@objc(AudioKitWrapper)
class AudioKitWrapper: NSObject {

  @objc  var mic: AKMicrophone!
  @objc  var timer: Timer!
  @objc  var tracker: AKFrequencyTracker!
  @objc  var silence: AKBooster!
  @objc  var micCopy1: AKBooster!


  @objc override init(){
    super.init()
    mic = AKMicrophone()
    micCopy1 = AKBooster(mic)
       do {
           try AKSettings.setSession(category: .playAndRecord)
           AKSettings.defaultToSpeaker = true
       } catch {
           print("Could not set session category.")
         return
       }
    if let inputs = AudioKit.inputDevices {
      do {
        try AudioKit.setInputDevice(inputs[0])
        try mic.setDevice(inputs[0])
      }
      catch {
        print("microphone not supported")
        return
      }
    }
    do {
      tracker = AKFrequencyTracker.init(micCopy1, hopSize: 4_096, peakCount: 20)
      silence = AKBooster(tracker, gain: 0)
      AudioKit.output = silence
      try AudioKit.start()
      mic.stop()
    }
    catch {
      print("AudioKit did not start")
    }
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(loop), userInfo: nil, repeats: true)
  }

  @objc func start()  {

    print("started?", mic?.isStarted == true)
    if (mic?.isStarted == true) {
      print("stop")
      mic?.stop()
    }
    else {
      print("start")
      mic.start()
    }

  }

  @objc static func requiresMainQueueSetup() -> Bool {
      return true
  }

  @objc func loop() {
    if (mic.isStarted == true){
      print("dispatch", tracker.frequency, tracker.amplitude)
      EventEmitter.sharedInstance.dispatch(name: "onChange",
                                           body: ["amplitude": self.tracker.amplitude, "frequency": self.tracker.frequency])
    }
  }



}

Также для тех, кто заинтересован, чтобы AudioKit работал над React Native, здесь являются объективными C код:

AudioKitBridge.m

#import <Foundation/Foundation.h>
#import "React/RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(AudioKitWrapper, NSObject)

    RCT_EXTERN_METHOD(start)
@end

AudioKitBridge.h

#ifndef AudioKitBridge_h
#define AudioKitBridge_h

#import <React/RCTBridgeModule.h>

@interface AudioKitBridge: NSObject

@end
...