2010-11-23 36 views
1

Je travaille sur une application iOS liée au DSP. Une partie du travail consiste à copier les données audio de outBuffer -> mAudioData vers un tableau spécifié par l'utilisateur pour le traitement des données. La méthode de lecture est la suivante:AudioQueue: Impossible de lire les données brutes dans AudioFileReadPackets

OSStatus result = AudioFileReadPackets(myInfo->mAudioFile,  // The audio file from which packets of audio data are to be read. 
             false,     // Set to true to cache the data. Otherwise, set to false. 
             &numBytes,    // On output, a pointer to the number of bytes actually returned. 
             myInfo->mPacketDescs, // A pointer to an array of packet descriptions that have been allocated. 
             myInfo->mCurrentPacket, // The packet index of the first packet you want to be returned. 
             &nPackets,    // On input, a pointer to the number of packets to read. On output, the number of packets actually read.           
             outBuffer->mAudioData); // A pointer to user-allocated memory. 

Ce processus est réussi. Mais quand je suis en train de lire les données de outBuffer-> mAudioData, il y a toujours une erreur indiquant que la conversion non valide du « vide * const » à 'SINT16 *:

outBuffer->mAudioDataByteSize = numBytes;  
SInt16 *testBuffer = outBuffer->mAudioData; //Read data from buffer... Error! 

for (int i=0; i<numBytes; i++) 
{ 
    UInt16 currentData = testBuffer[i]; 
    printf("Current data in testbuffer is %d", currentData); 
} 

Je suis passé par plusieurs questions connexes comme THIS et THIS, semble leur fonctionnent ... J'ai également essayé de remplacer outBuffer-> mAudioData à testBuffer dans AudioFileReadPackets(), mais le testBuffer se révèle être un tableau vide.

Alors, est-ce la bonne approche? Existe-t-il un autre moyen de lire les données brutes dans un tableau int/float?

Ou plus généralement, comment accéder à un pointeur de constante vide et effectuer une opération de lecture/écriture? (Ouais mon C++ est pas forte ...)

Toute aide sera appréciée :-)

Cheers, Manca

Répondre

2

Je viens de mettre un plâtre à l'avant et il a semblé fonctionner:

SInt16* frames = (SInt16*)inBuffer->mAudioData;