2016-04-05 7 views
-1

Я получаю трещину в начале и конце очереди вывода звука ядра. Код должен просто генерировать тон.Очереди Core Audio Cracking

Edit: создал образец проекта https://github.com/MrMatthias/CoreAudioCrackle

Вот установка:

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

В выходной обратный вызов я называю блок, который заполняет буферы:

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

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

Заполнение буфера выглядит следующим образом:

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; 

Запись выглядит следующим образом:

cracking

+1

На каком языке вы находитесь? Нам нужен кусок кода, у которого проблема ?, Картина будет хорошей, как поддержка, но не может стоять сама по себе. –

ответ

0

Попробуйте добавить (SInt16) непосредственно перед SHRT_MAX (грех ((USERDATA -> ... таким образом, что весь ваш код блока выглядит следующим образом SInt16 sample = CFSwapInt16HostToBig ((SInt16) SHRT_MAX * (sinData-> outputSamplePosition + i) * 2 * M_PI/f1)));

+0

извините, прокомментировал бы, но пока не имеет репутационных баллов:/... однако, также имейте в виду, что аудио аппаратное обеспечение обычно движется быстрее, чем, скажем, ваше оборудование io, и, следовательно, ваше аудиооборудование может и из-за этого они генерируют эти шумы ... Попробуйте создать буфер памяти и поместив файл или перемещая файл туда. Это должно помочь убедиться, что данные могут идти в ногу со звуковым оборудованием, кроме того, эту концепцию также можно применять при записи файла, так что не будет столько вызовов функций. –

Смежные вопросы