CoreAudio AudioUnitSetProperty всегда не может установить частоту дискретизации - PullRequest
5 голосов
/ 31 января 2010

Мне нужно изменить частоту дискретизации на выходе с 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 ]

4 голосов
/ 31 января 2010

С DefaultOuput AudioUnit вы устанавливаете только сторону input 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);

Вы также можете обратиться к Справочнику по службам компонентов аудиоблока , чтобы увидеть, что код ошибки -10865 равен kAudioUnitErr_PropertyNotWritable.

2 голосов
/ 12 ноября 2010

В документации говорится, что когда вы устанавливаете свойство Sample rate, вы фактически запрашиваете значение (которое система может вам не предоставить).

Затем система установит наилучшее приближение, какое только может.

Затем вам необходимо выполнить вызов, чтобы получить фактически установленную частоту дискретизации.

Как я понимаю, невозможно указать произвольную частоту дискретизации.

Мне бы очень хотелось ошибиться в этом !!!

...