Утечки памяти с синтезом звука - PullRequest
1 голос
/ 23 августа 2011

Так что я чувствую, что это довольно сложный вопрос, чтобы правильно его задать, но вот мой лучший шанс.

Я пишу приложение для iPhone в obj-c, но оно включает синтез звука, и в учебнике по ядру звука я использовал синтез звука, запрограммированный в том, что я считаю C (или, возможно, C ++, я спросил кого-то, кого я знаю, кто использует C ++, и он не распознал его, но в руководстве было сказано, чтобы я изменил имена файлов на .mm для C ++). Проблема в том, что у меня огромные утечки памяти, скорее всего, потому что я не знаю, как правильно называть вещи.

Когда используется эта часть кода, я получаю массу ошибок, которые читаются так: 2011-08-23 10: 18: 08.769 myProgram [451: 5e03] * __NSAutoreleaseNoPool (): объект 0x171e90 класса _NSCallStackArray автоматически освобожден без пула - только утечка

Используя приборы, я обнаружил, где происходит утечка, и добавил комментарий, чтобы представить это.

Вот функция, при которой возникают все утечки:

static OSStatus renderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
// Get a reference to the object that was passed with the callback
// In this case, the AudioController passed itself so
// that you can access its data.
AudioController *THIS = (AudioController*)inRefCon;

// Get a pointer to the dataBuffer of the AudioBufferList
AudioSampleType *outA = (AudioSampleType *)ioData->mBuffers[0].mData;

// Calculations to produce a 600 Hz sinewave
// A constant frequency value, you can pass in a reference vary this.

float sinSignal;

for (UInt32 i = 0; i < inNumberFrames; ++i) {       
    outA[i] = 0;
}


THIS->theBall = [[THIS->navDelegate ballsG] objectAtIndex:0];


THIS->amtPlaying = [[THIS->theBall playingLines] count];

//NSLog(@"%i", THIS->amtPlaying);


for (int i = 0; i < THIS->amtPlaying; i++) 
{
    // Loop through the callback buffer, generating samples
    for (UInt32 i = 0; i < inNumberFrames; ++i) {       

        // calculate the next sample
        sinSignal = sin(  [[[THIS->theBall playingLines] objectAtIndex:i] theta]  ); //leak here

        sinSignal *= [[[THIS->theBall playingLines] objectAtIndex:i] volume] ;

        sinSignal /= THIS->amtPlaying;

        // Put the sample into the buffer
        // Scale the -1 to 1 values float to
        // -32767 to 32767 and then cast to an integer
        outA[i] += (SInt16)(sinSignal * 32767.0f);
        // calculate the phase for the next sample

        [[[THIS->theBall playingLines] objectAtIndex:i] increaseTheta:  [[[THIS->theBall playingLines] objectAtIndex:i] incrementer]];
    }

}

return noErr;
}

Если я могу предоставить больше информации, чтобы помочь вам понять мой вопрос, пожалуйста, сообщите мне об этом в комментарии. Спасибо!

1 Ответ

2 голосов
/ 30 августа 2011

Вы не должны использовать какой-либо код objc в потоке аудио рендеринга.Код objc может блокироваться и обычно требует некоторого выделения / освобождения памяти.Это также никогда не должно происходить в аудиопотоке, поскольку это высокоприоритетный поток.В списке рассылки core-audio-api есть большой дискуссионный ресурс.Вы можете попытаться заставить работать объект, но это кошмар.Использование c / c ++ также хорошо работает без этих проблем.

...