2017-05-01 7 views
2

AudioKit을 사용하여 지정된 임계 값 이하의 주파수를 필터링하려고합니다. 이 작업을 수행하기 위해 AKHighPassFilter을 사용하고 있습니다.AudioKit의 AKHighPassFilter를 사용하여 주파수 필터링

func playSound(duration: Int, frequencyRange: Range<Double>) { 

    generator = AKOperationGenerator() { parameters in 

     let volume = AKOperation.sineWave(frequency: parameters[0]).scale(minimum: 0, maximum: 0.1) 
     let jitter = AKOperation.jitter(amplitude: parameters[1], minimumFrequency: lowerFrequency, maximumFrequency: upperFrequency) 

     return AKOperation.sineWave(frequency: jitter, amplitude: volume) 
    } 

    generator!.parameters = [baseFrequency, amplitude] 

    // Exception thrown at this line after method called 1 time 
    var highPassFilter = AKHighPassFilter(generator) 
    highPassFilter.cutoffFrequency = frequencyRange.lowerBound 
    highPassFilter.resonance = 0 

    AudioKit.output = highPassFilter 
    AudioKit.start() 

    generator?.play() 
} 

처음으로 playSound(duration:, frequencyRange:)으로 전화를 걸 때 잘 동작합니다.

다음
var highPassFilter = AKHighPassFilter(generator) 

이 충돌에서 콘솔 출력입니다 : 내가 AudioKit를 중지하고 소리를 두 번째로 재생하려고하면 예외가이 줄을 던져

2017-05-01 14:32:01.169 MyApp[18123:3459824] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: [_nodes containsObject: node]' 
*** First throw call stack: 
(
    0 CoreFoundation      0x0000000109ea7b0b __exceptionPreprocess + 171 
    1 libobjc.A.dylib      0x000000010990c141 objc_exception_throw + 48 
    2 CoreFoundation      0x0000000109eabcf2 +[NSException raise:format:arguments:] + 98 
    3 AVFAudio       0x000000010cdc3a9e _Z19AVAE_RaiseExceptionP8NSStringz + 158 
    4 AVFAudio       0x000000010cdc9cbb _ZN17AVAudioEngineImpl10DetachNodeEP11AVAudioNodeb + 421 
    5 AVFAudio       0x000000010cdc9ad0 -[AVAudioEngine detachNode:] + 67 
    6 AudioKit       0x0000000108d3bee4 _TToFC8AudioKit6AKNodeD + 84 
    7 libobjc.A.dylib      0x0000000109920b8e _ZN11objc_object17sidetable_releaseEb + 202 
    8 AudioKit       0x0000000108d39a99 _TToFC8AudioKit16AKHighPassFilterE + 25 
    9 libobjc.A.dylib      0x000000010990a9bc _ZL27object_cxxDestructFromClassP11objc_objectP10objc_class + 127 
    10 libobjc.A.dylib      0x0000000109916d34 objc_destructInstance + 129 
    11 libobjc.A.dylib      0x0000000109916d66 object_dispose + 22 
    12 AudioKit       0x0000000108d3bf1b _TToFC8AudioKit6AKNodeD + 139 
    13 libobjc.A.dylib      0x0000000109920b8e _ZN11objc_object17sidetable_releaseEb + 202 
    14 MyApp        0x00000001087301ec _TFC7MyApp11SoundPlayerClass9playSoundfT8durationSi14frequencyRangeGVs5RangeSd__T_ + 988 
    15 MyApp        0x000000010873a1a4 _TFC7MyApp18MainViewController13playFrequencyfCS_12FrostyButtonT_ + 2276 
    16 MyApp        0x000000010873a4fa _TToFC7MyApp18MainViewController13playFrequencyfCS_12FrostyButtonT_ + 58 
    17 UIKit        0x000000010ab63d22 -[UIApplication sendAction:to:from:forEvent:] + 83 
    18 UIKit        0x000000010ace825c -[UIControl sendAction:to:forEvent:] + 67 
    19 UIKit        0x000000010ace8577 -[UIControl _sendActionsForEvents:withEvent:] + 450 
    20 UIKit        0x000000010ace74b2 -[UIControl touchesEnded:withEvent:] + 618 
    21 UIKit        0x000000010abd149a -[UIWindow _sendTouchesForEvent:] + 2707 
    22 UIKit        0x000000010abd2bb0 -[UIWindow sendEvent:] + 4114 
    23 UIKit        0x000000010ab7f7b0 -[UIApplication sendEvent:] + 352 
    24 UIKit        0x000000011e3c075c -[UIApplicationAccessibility sendEvent:] + 85 
    25 UIKit        0x000000010b362adc __dispatchPreprocessedEventFromEventQueue + 2926 
    26 UIKit        0x000000010b35aa3a __handleEventQueue + 1122 
    27 UIKit        0x000000010b35bd08 __handleEventQueue + 5936 
    28 CoreFoundation      0x0000000109e4dc01 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 
    29 CoreFoundation      0x0000000109e330cf __CFRunLoopDoSources0 + 527 
    30 CoreFoundation      0x0000000109e325ff __CFRunLoopRun + 911 
    31 CoreFoundation      0x0000000109e32016 CFRunLoopRunSpecific + 406 
    32 GraphicsServices     0x000000010ecd4a24 GSEventRunModal + 62 
    33 UIKit        0x000000010ab620d4 UIApplicationMain + 159 
    34 MyApp        0x000000010872cb77 main + 55 
    35 libdyld.dylib      0x000000010fbaf65d start + 1 
    36 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

이전 AKHighPassFilter을 추가하는, 메서드가 잘 작동했습니다. 제안을 다시 환영합니다.이 충돌을 해결하는 방법. 읽어 주셔서 감사합니다.

+0

이 타사 라이브러리입니다. 이 질문은 해당 도서관 개발자에게 가장 좋은 것이 아닐까요? – matt

+0

@matt 나는 거기에도 물었다. 응답을 기다리고 있습니다. SO에 AudioKit 태그가 있습니다. – Adrian

+0

물론, AudioKit에서 버그를 발견했는지 궁금합니다. 나는 그것에 대해 아무것도 모르고 있지만, AVAudioEngine에 대해 알고 있습니다. AVAudioEngine은 분명히 후드 아래에서 사용하고 있으며, 충돌 로그를 읽을 수 있습니다. 그들은 (AudioKit 사람들) 명확하게 그들이하지 말아야 할 일을하고 있습니다 (즉, 붙어 있지 않은 노드를 분리하려고 시도하는). 그러나 _your_ 코드에는 아무 것도 없습니다. 사용자가 답장을 기다리는 동안 코드를 읽으면 문제가있는 곳을 확인할 수 있습니다. – matt

답변

1

여기에서 주된 문제는 모든 playSound 호출에서 모든 객체를 재생성하고 호출 될 때마다 재생 메소드에서 AudioKit.output을 설정한다는 것입니다. 당신이하고 싶은 것은 초기화 루틴에서 객체 체인을 생성 한 다음 필요에 따라 매개 변수를 변경하는 것입니다. 모든 연결은 한 번만 설정하면됩니다. 한 가지 방법은 입력 또는 출력으로 AKMixer를 사용하여 노드를 추가 및 제거하는 것입니다. 예를 들어 하이 패스 필터는 AK 믹서의 출력을 필터링 할 수 있습니다. 이 믹서에는 임의의 수의 노드가 접속 될 수 있습니다. AVAudioEngine은 실행 중 제거되거나 추가 된 노드에 다소 민감 할 수 있습니다.