CoreAudio AudioUnitSetProperty始终无法设置采样率

时间:2010-01-31 04:06:50

标签: c++ objective-c macos core-audio

我需要将输出采样率从44.1更改为32.0,但它总是会抛出错误,Out:AudioUnitSetProperty-SF = \ 217 \ 325 \ 377 \ 377,-10865。我不知道为什么它会让我把它设置为输入,但是不设置输出。

我的代码是:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

OSStatus MyRenderer(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp   *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData){
 NSLog(@"Running...");
 ioData->mBuffers[0].mDataByteSize = 2048;
 ioData->mBuffers[0].mData = lbuf;
 ioData->mBuffers[0].mNumberChannels = 1;

 return noErr;
}

void CreateDefaultAU(){
 OSStatus err = noErr;

 // Open the default output unit
 AudioComponentDescription desc;
 desc.componentType = kAudioUnitType_Output;
 desc.componentSubType = kAudioUnitSubType_DefaultOutput;
 desc.componentFlags = 0;
 desc.componentFlagsMask = 0;
 desc.componentManufacturer = 0;

 AudioComponent comp = AudioComponentFindNext(NULL, &desc);
 if (comp == NULL) { printf ("FindNextComponent\n"); return; }

 err = AudioComponentInstanceNew(comp, &gOutputUnit);
 if (comp == NULL) { printf ("OpenAComponent=%ld\n", err); return; }

 // Set up a callback function to generate output to the output unit
 AURenderCallbackStruct input;
 input.inputProc = MyRenderer;
 input.inputProcRefCon = NULL;

 err = AudioUnitSetProperty(gOutputUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &input, sizeof(input));

 if (err) { printf ("AudioUnitSetProperty-CB=%ld\n", err); return; }

 AudioStreamBasicDescription streamFormat;
 streamFormat.mSampleRate = 32000.00;        // the sample rate of the audio stream
 streamFormat.mFormatID = kAudioFormatLinearPCM;     // the specific encoding type of audio stream
 streamFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger;//kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsNonMixable;
 streamFormat.mFramesPerPacket = 1;
 streamFormat.mChannelsPerFrame = 1;
 streamFormat.mBitsPerChannel = 16;
 streamFormat.mBytesPerPacket = 2;
 streamFormat.mBytesPerFrame = 2;

 err = AudioUnitSetProperty(gOutputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &streamFormat, sizeof(streamFormat));
 if (err) { printf ("In:  AudioUnitSetProperty-SF=%4.4s, %ld\n", (char*)&err, err); return; }

 err = AudioUnitSetProperty(gOutputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &streamFormat, sizeof(streamFormat));
 if (err) { printf ("Out: AudioUnitSetProperty-SF=%4.4s, %ld\n", (char*)&err, err); return; }
}

void TestDefaultAU(){
 OSStatus err = noErr;

 // Initialize unit
 err = AudioUnitInitialize(gOutputUnit);
 if (err) { printf ("AudioUnitInitialize=%ld\n", err); return; }

 Float64 outSampleRate;
 UInt32 size = sizeof(Float64);
 err = AudioUnitGetProperty(gOutputUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, 0, &outSampleRate, &size);

 printf("Out srate %f\n",outSampleRate);
 if (err) { printf ("AudioUnitSetProperty-GF=%4.4s, %ld\n", (char*)&err, err); return; }
 AudioOutputUnitStart (gOutputUnit);
 if (err) { printf ("AudioOutputUnitStart=%ld\n", err); return; }
 AudioUnitReset (gOutputUnit, kAudioUnitScope_Input, 0);
}

2 个答案:

答案 0 :(得分:4)

使用DefaultOuput AudioUnit,您只需将AudioUnit的输入侧设置为您想要渲染的格式。设备的输出端将与您在输入端指定的内容相匹配,但您无法自行设置。

设置输入流格式后试试这个,你会发现你已经准备好了......

Float64 outSampleRate = 0.0;
UInt32 size = sizeof(Float64);
AudioUnitGetProperty (gOutputUnit,
                      kAudioUnitProperty_SampleRate,
                      kAudioUnitScope_Output,
                      0,
                      &outSampleRate,
                      &size);
NSLog(@"Output sample rate is now at %f Hz", outSampleRate);

您还可以查看Audio Unit Component Services Reference以查看错误代码-10865是kAudioUnitErr_PropertyNotWritable。

答案 1 :(得分:2)

文档说明当您设置Sample rate属性时,您实际上是在请求一个值(系统可能无法为您提供)。

系统将设置最佳近似值。

然后,您需要跟进调用以检索实际设置的采样率。

据我了解,无法指定任何任意采样率。

我很想错在这个!!!