2015-09-25 1 views
1

From this link:Comment annuler une action - [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; 
} 

Je suppose que bytesPerFrame a une valeur constante.

Donc void *inputBuffer est utilisé pour obtenir des données par morceaux et les "compiler" en objet NSMutableData. Comment annuler cette action pour convertir cet objet en tableau de blocs de données void * (y compris la gestion de la mémoire si nécessaire)?

Il y a des questions similaires mais:

1) ils convertissent juste NSMutableData en void *, pas un tableau void *;

2) ils ne prennent pas en compte la gestion de la mémoire.

+0

Vous ne pouvez pas convertir 'NSMutableData' un' vide * 'sans tenir compte de la gestion de la mémoire: soit vous faites une copie avec' malloc', ou vous comptez sur le stockage interne de votre NSMutableData, mais dans les deux cas, vous devez décider explicitement qui possède la mémoire. – dasblinkenlight

+0

ok, pourriez-vous écrire un exemple? –

+0

La réponse dépend de la façon dont vous voulez gérer la mémoire: si vous souhaitez laisser l'objet 'NSMutableData' se libérer et conserver votre tableau de pointeurs' void * ', il y a une solution; Si vous êtes d'accord pour utiliser votre tableau de pointeurs "void *" tant que l'objet "NSMutableData" reste, il existe une autre solution (beaucoup plus simple). – dasblinkenlight

Répondre

0

Si vous avez besoin de faire une copie de tout, et le tampon est divisé en morceaux égaux, vous pouvez le faire comme ceci:

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

À ce stade, vous pouvez laisser aller votre objet _data, parce que tout est copié dans void **data. Vous devez libérer ce tableau lorsque vous ne avez plus besoin:

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