2015-09-25 4 views
1

From this link:Как вернуть действие - [NSMutableData appendBytes: length:]?

- (void)process { 
    _isProcessing = YES; 
    int amountInBuffer = 0; 
    int framesRead = 0; 

    do { 
     if (_data.length >= BUFFER_SIZE) { 
      framesRead = 1; 
      break; 
     } 

     if (_shouldSeek) { 
      [_decoder seek:seekFrame]; 
      _shouldSeek = NO; 
     } 
     int framesToRead = CHUNK_SIZE/bytesPerFrame; 
     framesRead = [_decoder readAudio:inputBuffer frames:framesToRead]; 
     amountInBuffer = (framesRead * bytesPerFrame); 

     dispatch_sync([ORGMQueues lock_queue], ^{ 
      [_data appendBytes:inputBuffer length:amountInBuffer]; 
     }); 
    } while (framesRead > 0); 

    if (framesRead <= 0) { 
     [self setEndOfInput:YES]; 
    } 

    _isProcessing = NO; 
} 

Я полагаю, что bytesPerFrame имеет постоянное значение.

So void *inputBuffer используется, чтобы получить данные по кускам и «скомпилировать» их в объект NSMutableData. Как вернуть это действие для преобразования этого объекта в массив из void * блоков данных (включая управление памятью, если это необходимо)?

Есть некоторые подобные вопросы, но:

1) они просто конвертировать NSMutableData в void *, не void * массива;

2) они не учитывают управление памятью.

+0

Вы не можете преобразовать 'NSMutableData' к' аннулируются * 'без учета для управления памятью: либо сделать копию с' malloc', или вы полагаетесь на внутреннем хранилище вашей 'NSMutableData', но в обоих случаях вы должны явно решить, кто« владеет »памятью. – dasblinkenlight

+0

хорошо, не могли бы вы привести пример? –

+0

Ответ зависит от того, как вы хотите управлять памятью: если вы хотите, чтобы объект 'NSMutableData' был освобожден и сохранил ваш массив указателей' void * ', есть одно решение; если вы в порядке с использованием вашего массива указателей 'void * ', пока объект' NSMutableData' остается, есть другое (гораздо более простое) решение. – dasblinkenlight

ответ

0

Если вам нужно сделать копию всего, и буфер делится на равные куски, вы могли бы сделать это следующим образом:

size_t nChunks = ... // How many frames 
size_t frameSize = ... // Bytes per frame 
void **data = malloc(sizeof(void*)*nChunks); 
const char *raw = (const char*)_data.bytes; 
for (size_t i = 0 ; i != nChunks ; i++) { 
    data[i] = malloc(frameSize); 
    memcpy(data[i], raw + i*frameSize, frameSize); 
} 

На данный момент вы можете отпустить вашего _data объекта, потому что все копируется в void **data. Вам нужно, чтобы освободить этот массив, когда вы больше не нужно:

for (size_t i = 0 ; i != nChunks ; i++) { 
    free(data[i]); 
} 
free(data);