2016-04-05 10 views
-1

Ich bekomme eine knacken am Anfang und Ende einer Kern-Audio-Ausgangswarteschlange. Der Code sollte einfach einen Ton erzeugen.Core Audio Queues Cracking

Edit: erstellt ein Beispielprojekt https://github.com/MrMatthias/CoreAudioCrackle

Hier ist das Setup:

-(void) startOutputQueue { 
    if(userData.outputQueue != NULL) { 
     if(!checkError(AudioQueuePrime(userData.outputQueue, 0, NULL), "AudioQueuePrime")) { 
      NSLog(@"Error priming QutputQueue"); 
     } 

     if(!checkError(AudioQueueStart(userData.outputQueue, NULL), "AudioQueueStart Output")) { 
      NSLog(@"Error starting OutputQueue"); 
     } 
    } 
} 

-(void) setupOutputQueue { 
    memset(&userData.outputDesc, 0, sizeof(userData.outputDesc)); 
    userData.outputDesc.mFormatID = kAudioFormatLinearPCM; 
    userData.outputDesc.mFramesPerPacket = 1; 
    userData.outputDesc.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
    userData.outputDesc.mChannelsPerFrame = 1; 
    userData.outputDesc.mSampleRate = 44100; 
    userData.outputDesc.mBitsPerChannel = 16; 
    userData.outputDesc.mBytesPerFrame = userData.outputDesc.mBytesPerPacket = 2; 
    userData.outputSamplePosition = 0; 
    if (userData.outputQueue == NULL) { 
     if(!checkError(AudioQueueNewOutput(&userData.outputDesc, outputCallback, &userData, NULL, NULL, 0, &userData.outputQueue), "AudioQueueNewOutput")) { 
      return; 
     } 
     UInt32 bufferSize = userData.outputDesc.mBytesPerFrame * userData.outputDesc.mSampleRate * DURATION; 
     for (int i=0; i<3; ++i) { 

      if(!checkError(AudioQueueAllocateBuffer(userData.outputQueue, bufferSize, &userData.outputBuffers[i]), "AudioQueueAllocateBuffer")) { 
       return; 
      } 
      outputCallback(&userData, userData.outputQueue, userData.outputBuffers[i]); 
     } 
    } 
} 

Im Ausgang Rückruf ich einen Block aufrufen, die die Puffer füllt:

userData->outputBlock(userData, inAQ, inBuffer); 

      AudioQueueEnqueueBuffer(userData->outputQueue, inBuffer, 0, NULL); 

Das Füllen des Puffers sieht folgendermaßen aus:

UInt32 sampleCount = DURATION * userData->outputDesc.mSampleRate; 
double f1 = userData->outputDesc.mSampleRate/10000.0f; 
for (int i=0; i<sampleCount; ++i) { 
    SInt16 sample = CFSwapInt16HostToBig(SHRT_MAX * (sin((userData->outputSamplePosition + i) * 2 * M_PI/f1))); 
    ((SInt16*)inBuffer->mAudioData)[i] = sample; 
    } 
    userData->outputSamplePosition += sampleCount; 
    inBuffer->mAudioDataByteSize = sampleCount * 2; 

Die Aufnahme sieht wie folgt aus:

cracking

+1

Welche Sprache ist in dem Code? Wir brauchen ein Stück Code, der ein Problem hat? Ein Bild wäre gut als Unterstützung, kann aber nicht alleine stehen. –

Antwort

0

Versuchen Zugabe (sint16) kurz vor SHRT_MAX (sin ((userdata -> ... , so dass Ihre gesamte Codeblock wie folgt aussieht SInt16 Beispiel = CFSwapInt16HostToBig ((SInt16) SHRT_MAX * (sin ((Benutzerdaten-> AusgabeSamplePosition + i) * 2 * M_PI/f1)));

+0

Entschuldigung, hätte kommentiert, aber noch nicht die Rep-Punkte:/... Beachten Sie jedoch, dass die Audio-Hardware in der Regel schneller geht als sagen wir Ihre Hardware und damit Ihre Audio-Hardware keine Daten mehr und das könnte der Grund sein, warum es diese Geräusche erzeugt ... Versuchen Sie, einen Speicherpuffer zu erstellen, und legen Sie die Datei oder die Datei durch diese Datei. Dies sollte helfen, sicherzustellen, dass die Daten mit der Audio-Hardware Schritt halten können, außerdem muss dieses Konzept möglicherweise auch beim Schreiben der Datei angewendet werden, so dass es nicht so viele Funktionsaufrufe geben wird. –

Verwandte Themen