1

私のこの質問に来る前に、あなたはこれを経験したに違いありません。コアオーディオの低音を制御するkAudioUnitType_EffectのkAudioUnitSubType_LowShelfFilterを使用するにはどうすればよいですか?ゆっくりと着実に音楽の低音コントロールのために物事を正しくします。しかし、まだ私の目的には成功していません。低音を変更するには、kAULowShelfParam_CutoffFrequencyを変更する必要があることがわかりました。

次のコードは、5〜7日前に使用していました。このコードは音楽を適切に再生しますが、低音を適切に変更しません。このコードスニペットを見てください:-

 - (void)awakeFromNib
{
printf("AUGraphController awakeFromNib\n");

mIsPlaying = false;

// clear the mSoundBuffer struct
memset(&mUserData.soundBuffer, 0, sizeof(mUserData.soundBuffer));

// create the URLs we'll use for source A and B
NSString *sourceA = [[NSBundle mainBundle] pathForResource:@"04 - Second Hand Jawaani - [rKmania.com]" ofType:@"mp3"];
NSString *sourceB = [[NSBundle mainBundle] pathForResource:@"Track2" ofType:@"mp4"];
sourceURL[0] = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)sourceA, kCFURLPOSIXPathStyle, false);
sourceURL[1] = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)sourceB, kCFURLPOSIXPathStyle, false);
[bassSlider addTarget:self action:@selector(selectEQPreset) forControlEvents:UIControlEventValueChanged];
}

// output unit
CAComponentDescription output_desc(kAudioUnitType_Output, kAudioUnitSubType_RemoteIO, kAudioUnitManufacturer_Apple);

// iPodEQ unit
CAComponentDescription eq_desc(kAudioUnitType_Effect, kAudioUnitSubType_AUiPodEQ, kAudioUnitManufacturer_Apple);

// multichannel mixer unit
CAComponentDescription mixer_desc(kAudioUnitType_Mixer, kAudioUnitSubType_MultiChannelMixer, kAudioUnitManufacturer_Apple);

printf("add nodes\n");

- (void)selectEQPreset;
{
AUPreset *aPreset = (AUPreset*)CFArrayGetValueAtIndex(mEQPresetsArray, value);
OSStatus result = AudioUnitSetProperty(mEQ, kAudioUnitProperty_PresentPreset, kAudioUnitScope_Global, 0, aPreset, sizeof(AUPreset));
if (result) { printf("AudioUnitSetProperty result %ld %08X %4.4s\n", result, (unsigned int)result, (char*)&result); return; };

printf("SET EQ PRESET %d ", value);
CFShow(aPreset->presetName);
}

このコードの後、低音を変更するには周波数を変更する必要があることがわかりました。次のコードスニペットを使用しますが、次のコードスニペットでは音楽が再生されず、excess_badも発生します。コードに加えた変更を書いているだけです。現在のコードスニペットを見てください:-

// iPodEQ unit
CAComponentDescription eq_desc(kAudioUnitType_Effect, kAudioUnitSubType_LowShelfFilter, kAudioUnitManufacturer_Apple);

- (void)selectEQPreset;
{
AudioUnit lowShelfAU;
assert(lowShelfAU);
float frequencyInHz = 120.0f;
frequencyInHz = bassSlider.value;
OSStatus result = AudioUnitSetParameter(lowShelfAU,kAULowShelfParam_CutoffFrequency,kAudioUnitScope_Global,0,frequencyInHz,0);
if (noErr != result) 
{
    assert(0 && "error!");
    return ;
}
}

このコードは現在使用していますが、これは頻度を変更していません。音楽の再生を停止し、このコード行にexcess_badエラーを表示することもできます。

 AudioUnitSetParameter(lowShelfAU,kAULowShelfParam_CutoffFrequency,kAudioUnitScope_Global,0,frequencyInHz,0);

スライダーを介して音楽の低音を調整できるように、kAULowShelfParam_CutoffFrequencyを変更する方法を教えてください。これに関するどんな助けも非常に高く評価されるでしょう。

ありがとう :)

4

3 に答える 3

0
`AudioUnit lowShelfAU;` <-- that is an uninitialized garbage value

実際にAUインスタンス(ローシェルフ)を作成し、それをAUGraphに追加する必要があります。

注:コンパイラー/アナライザーがこの問題を識別します。警告レベルを上げてから、すべての問題を作成、分析、削除することをお勧めします。きれいになるまで繰り返します。

于 2012-08-20T07:31:07.410 に答える
0

を使用する前に、AudioUnitそれを作成する必要があります。コードを使用している場合は、次のAUGraphようになります。

AudioComponentDescription filterDescription = { kAudioUnitType_Effect, kAudioUnitSubType_LowShelfFilter, kAudioUnitSubType_LowShelfFilter, 0, 0 };

AUNode filterNode = -1;
OSStatus result = AUGraphAddNode(mAUGraph, &filterDescription, &filterNode);
if(noErr != result) {
    // Handle error
}

AudioUnit filterUnit = nullptr;
result = AUGraphNodeInfo(mAUGraph, filterNode, nullptr, &filterUnit);
if(noErr != result) {
    // Handle error
}

// Set parameters on filterUnit

コードが失敗する理由は、その行が

AudioUnit lowShelfAU;

lowShelfAU未定の値で初期化します。AnAudioUnitはポインタ型であるため、初期化せずにメモリの不明な領域を指します。これらの種類のバグをキャッチするために、変数が宣言されたときに常に変数を初期化することがプログラミングのベストプラクティスだと思います。

AudioUnit lowShelfAU = nullptr;
于 2012-08-20T12:53:30.733 に答える
0

`ご存知のように、アップルは目的に応じて3つのオーディオユニットを作成します。remoteIO->入力と出力用;ミキサー->オーディオミキサー用;一部のオーディオエフェクトはeqとFilterであるため、オーディオ周波数をカットオフしたい場合は、フィルターユニットを作成して接続する必要があります。

于 2013-09-11T02:59:17.483 に答える