2010-01-31 8 views
4

Je dois modifier la fréquence d'échantillonnage de sortie de 44.1 à 32.0, mais elle renvoie toujours une erreur, Out: AudioUnitSetProperty-SF = \ 217 \ 325 \ 377 \ 377, -10865. Je ne sais pas pourquoi il me laissera le régler pour l'entrée, mais ne le réglera pas pour la sortie.CoreAudio AudioUnitSetProperty ne parvient toujours pas à définir le taux d'échantillonnage

Mon code est:

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

Répondre

3

Avec le DefaultOuput AudioUnit vous ne réglez le côté entrée du AudioUnit au format que vous souhaitez rendre. Le côté de sortie de l'unité correspondra à ce que vous spécifiez du côté de l'entrée, mais vous ne pouvez pas le définir vous-même.

Essayez cette fois que vous avez défini le format de flux d'entrée et vous verrez que vous êtes prêt à aller ...

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

Vous pouvez également regarder le Audio Unit Component Services Reference pour voir que le code d'erreur -10865 est kAudioUnitErr_PropertyNotWritable.

+0

Je vous ai ajouté du code, et il me donne cette nouvelle sortie: 2010-01-31 09: 33: 59.342 Joueur [86903: 80f] Taille: 66144 2010-01-31 09: 33: 59.345 Joueur [86903 : 80f] Taux d'échantillonnage: 32000 2010-01-31 09: 33: 59.645 Joueur [86903: 80f] deviceName = Sortie intégrée 2010-01-31 09: 33: 59.646 Joueur [86903: 80f] Sample Rate: 44100.000000 2010-01-31 09: 33: 59.647 Joueur [86903: 80f] isWritable vrai 2010-01-31 09: 33: 59.648 Joueur [86903: 80f] Set NominalSampleRate err 2010-01-31 09:34: 00.030 Lecteur [86903: 80f] La fréquence d'échantillonnage en sortie est maintenant à 44100.000000 Hz –

+0

a supprimé l'appel SetProperty pour la portée de sortie? – VoidPointer

1

La documentation indique que lorsque vous définissez la propriété Fréquence d'échantillonnage, vous demandez une valeur (que le système ne peut pas vous fournir).

Le système établira alors la meilleure approximation possible.

Vous devez ensuite effectuer un appel pour récupérer la fréquence d'échantillonnage définie. Si je comprends bien, il n'est pas possible de spécifier une fréquence d'échantillonnage arbitraire.

J'aimerais beaucoup me tromper !!!

Questions connexes