2015-04-30 4 views
1

У меня возникли проблемы с настройкой kAudioUnitSubType_NBandEQ в Swift. Вот мой код для инициализации EQ:Core Audio Swift Equalizer настраивает все диапазоны одновременно?

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) 

, а затем применить изменения частоты GAINS мой код выглядит следующим образом:

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) для этого значения, но они, похоже, вообще не работают. Любая помощь приветствуется!

ответ

3

Комментарий добавляется как ответ, потому что комментариев недостаточно.

Следующий код находится в 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

+0

Спасибо за ваш ответ! Я принял ваш совет и создал цикл, который печатает текущий коэффициент усиления каждого диапазона в эквалайзе: println («Gain») для i в 0 ... noBands - 1 { var gain: AudioUnitParameterValue = 0 var parameterID = AudioUnitParameterID (kAUNBandEQParam_Gain + I) статус = AudioUnitGetParameter (self.MyAppUnit, parameterID, AudioUnitScope (kAudioUnitScope_Global), 0, & усиления) Println (усиление) } –

+0

это работает отлично и отображает значения, которые я установил, чтобы каждая полоса (от -24 до 24). Так что это не проблема. Любые другие идеи? –

+0

Следует отметить, что когда я использую свои оригинальные функции AudioUnitSetParameter(), чтобы установить коэффициент усиления и распечатать выигрыш группы, они не меняются вообще, но общий объем продолжает меняться. Возможно ли, что это совершенно другой эквалайзер? Или что я просто увеличиваю общий объем? –