CoreAudio AudioUnitSetProperty始终无法设置采样率 [英] CoreAudio AudioUnitSetProperty always fails to set Sample Rate

查看:2052
本文介绍了CoreAudio AudioUnitSetProperty始终无法设置采样率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将输出采样率从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;

//打开默认输出单元
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\\\
);返回; }

err = AudioComponentInstanceNew(comp,& gOutputUnit);
if(comp == NULL){printf(OpenAComponent =%ld \\\
,err);返回; }

//设置一个回调函数来生成输出到输出单元
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 \\\
,err);返回; }

AudioStreamBasicDescription streamFormat;
streamFormat.mSampleRate = 32000.00; //音频流的采样率
streamFormat.mFormatID = kAudioFormatLinearPCM; //音频流的特定编码类型
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 \\\
,(char *)& err,err);返回; }

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

void TestDefaultAU(){
OSStatus err = noErr;

//初始化单位
err = AudioUnitInitialize(gOutputUnit);
if(err){printf(AudioUnitInitialize =%ld \\\
,err);返回; }

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

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


解决方案

使用DefaultOuput AudioUnit将AudioUnit的输入侧设置为您要呈现的格式。



在设置了输入流格式之后,请尝试这样做,

  Float64 outSampleRate = 0.0; 
UInt32 size = sizeof(Float64);
AudioUnitGetProperty(gOutputUnit,
kAudioUnitProperty_SampleRate,
kAudioUnitScope_Output,
0,
& outSampleRate,
& size);
NSLog(@输出采样率现在为%f Hz,outSampleRate);

您还可以查看音频单元组件服务参考错误代码-10865是kAudioUnitErr_PropertyNotWritable。


I need to change the output sample rate from 44.1 to 32.0, but it always throws an error, Out: AudioUnitSetProperty-SF=\217\325\377\377, -10865. I don't know why it will let me set it for input, but then not set it for output.

My code is:

- (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);
}

解决方案

With the DefaultOuput AudioUnit you only set the input side of the AudioUnit to the format you wish to render. The output side of the unit will match what you specify on the input side but you cannot set it yourself.

Try this after you have set the input stream format and you'll see that you are all set to go...

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);

You can also look at the Audio Unit Component Services Reference to see that error code -10865 is kAudioUnitErr_PropertyNotWritable.

这篇关于CoreAudio AudioUnitSetProperty始终无法设置采样率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆