【问题标题】:Core Audio Swift Equalizer adjusts all bands at once?Core Audio Swift Equalizer 一次调整所有频段?
【发布时间】:2015-04-30 14:18:03
【问题描述】:

我在 Swift 中设置 kAudioUnitSubType_NBandEQ 时遇到问题。这是我初始化 EQ 的代码:

  var cd:AudioComponentDescription = AudioComponentDescription(componentType: OSType(kAudioUnitType_Effect),componentSubType: OSType(kAudioUnitSubType_NBandEQ),componentManufacturer: OSType(kAudioUnitManufacturer_Apple),componentFlags: 0,componentFlagsMask: 0)

    // Add the node to the graph
    status = AUGraphAddNode(graph, &cd, &MyAppNode)
    println(status)

     // Once the graph has been opened get an instance of the equalizer
    status = AUGraphNodeInfo(graph, self.MyAppNode, nil, &MyAppUnit)
    println(status)

    var eqFrequencies: [UInt32] = [ 32, 250, 500, 1000, 2000, 16000 ]

    status = AudioUnitSetProperty(
        self.MyAppUnit,
        AudioUnitPropertyID(kAUNBandEQProperty_NumberOfBands),
        AudioUnitScope(kAudioUnitScope_Global),
        0,
        eqFrequencies,
        UInt32(eqFrequencies.count*sizeof(UInt32))
    )
    println(status)

    status = AudioUnitInitialize(self.MyAppUnit)
    println(status)

    var ioUnitOutputElement:AudioUnitElement = 0
    var samplerOutputElement:AudioUnitElement = 0

    AUGraphConnectNodeInput(graph, sourceNode, sourceOutputBusNumber, self.MyAppNode, 0)

    AUGraphConnectNodeInput(graph, self.MyAppNode, 0, destinationNode, destinationInputBusNumber)

然后应用频率增益的变化我的代码如下:

if (MyAppUnit == nil) {return}
    else{

        var bandValue0 :Float32 = tenBands.objectAtIndex(0) as! Float32
        var bandValue1 :Float32 = tenBands.objectAtIndex(1) as! Float32
        var bandValue2 :Float32 = tenBands.objectAtIndex(2) as! Float32
        var bandValue3 :Float32 = tenBands.objectAtIndex(3) as! Float32
        var bandValue4 :Float32 = tenBands.objectAtIndex(4) as! Float32
        var bandValue5 :Float32 = tenBands.objectAtIndex(5) as! Float32

        AudioUnitSetParameter(self.MyAppUnit, 0, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue0, 0);
        AudioUnitSetParameter(self.MyAppUnit, 1, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue1, 0);
        AudioUnitSetParameter(self.MyAppUnit, 2, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue2, 0);
        AudioUnitSetParameter(self.MyAppUnit, 3, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue3, 0);
        AudioUnitSetParameter(self.MyAppUnit, 4, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue4, 0);
        AudioUnitSetParameter(self.MyAppUnit, 5, AudioUnitScope(kAudioUnitScope_Global), 0, bandValue5, 0);
}

谁能指出我在这里做错了什么?我认为它与 AudioUnitSetParameter 中的第二个变量有关。我已经为此值尝试了 AudioUnitParameterID(0) 和 AudioUnitParameterID(kAUNBandEQParam_Gain + 1),但这些似乎根本不起作用。任何帮助表示赞赏!

【问题讨论】:

    标签: ios swift core-audio audiounit equalizer


    【解决方案1】:

    评论添加为答案,因为 cmets 不足。

    以下代码在 Objective-c 中,但它应该有助于识别您的问题。

    有很多地方可能会失败。首先,您应该检查 AudioUnitSetParameter 的状态,实际上是所有 AudioUnit 调用,因为这会让您更清楚地了解代码失败的位置。

    我已经在 Objective-C 中成功完成了这项工作,并且如果您需要,我可以提供一个测试应用程序,它显示了完整的图表设置并通过移动滑块来设置波段和增益...回到您的具体问题。以下对我来说很好,这可能会帮助您排除特定部分。

    您可以尝试获取当前的“增益”,这将表明您的频段设置是否正确。

      - (AudioUnitParameterValue)gainForBandAtPosition:(uint)bandPosition
      {
          AudioUnitParameterValue gain;
          AudioUnitParameterID parameterID = kAUNBandEQParam_Gain + bandPosition;
          OSStatus status = AudioUnitGetParameter(equalizerUnit,
                                                 parameterID,
                                      kAudioUnitScope_Global,
                                                           0,
                                                     &gain);
    
        if (status != noErr) {
        @throw [NSException exceptionWithName:@"gettingParamGainErrorException"
                                       reason:[NSString stringWithFormat:@"OSStatus Error on getting EQ Gain! Status returned %d).", (int)status]
                                     userInfo:nil];
        }
    
        return gain;
      }
    

    然后可以通过以下方式设置增益;

      - (void)setGain:(AudioUnitParameterValue)gain forBandAtPosition:(uint)bandPosition
      {
          AudioUnitParameterID parameterID = kAUNBandEQParam_Gain + bandPosition;
          OSStatus status = AudioUnitSetParameter(equalizerUnit,
                                                    parameterID,
                                         kAudioUnitScope_Global,
                                                              0,
                                                           gain,
                                                            0);
    
        if (status != noErr) {
        @throw [NSException exceptionWithName:@"settingParamGainAudioErrorException"
                                       reason:[NSString stringWithFormat:@"OSStatus Error on setting EQ gain! Status returned %d).", (int)status]
                                     userInfo:nil];
        }
    
      }
    

    最后,你要设置什么值,有效范围(如果我没记错的话)是 -125.0 到 25.0

    【讨论】:

    • 感谢您的回复!我听取了您的建议并创建了一个循环,用于打印 EQ 中每个频段的当前设置增益: println("Gain") for i in 0...noBands - 1 { var gain: AudioUnitParameterValue = 0 var parameterID = AudioUnitParameterID(kAUNBandEQParam_Gain + i) 状态 = AudioUnitGetParameter(self.MyAppUnit, parameterID, AudioUnitScope(kAudioUnitScope_Global), 0, &gain) println(gain) }
    • 这可以正常工作并显示我为每个波段设置的值(-24 到 24)。所以这不是问题。还有其他想法吗?
    • 需要注意的一点是,当我使用我原来的 AudioUnitSetParameter() 函数来设置增益并打印出乐队的增益时,它们根本不会改变,但整体音量会继续改变。这可能是一个完全不同的均衡器吗?或者我只是在增加整体音量?
    • 当然,这是我正在使用的课程的链接:pastebin.com/Cyt45LPB。我应该注意到这是通过 Spotify SDK 实现的。
    • 不客气......很高兴我能帮上忙,我想我也为此苦苦挣扎,它的文档记录太差了。
    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2011-04-30
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多