Dans l'exemple d'application aurioTouch, l'unité audio RemoteIO est configurée pour le LPCM non entrelacé à 2 canaux au format à 8,24 points fixes. C'est le format préféré sur la plate-forme iOS et je suppose que c'est ce que le matériel ADC émet. Ils ont même fait un commentaire à ce sujet (source):iOS LPCM Entrée audio non entrelacée avec 2 canaux: impossible?
// set our required format - Canonical AU format: LPCM non-interleaved 8.24 fixed point
outFormat.SetAUCanonical(2, false);
donc j'attendre à ce que lorsque l'application reçoit plus tard un tampon audio, il disposera des deux canaux emballés dans ses membres MDATA dans un certain ordre. Quelque chose comme ceci:
mData = [L1, L2, L3, L4, R1, R2, R3, R4];
Où L et R représentent les données des canaux gauche et droit d'un microphone stéréo. Seulement, il semble que ne peut pas être le cas parce que SetAUCannonical()
ne définit pas assez memmory pour maintenir le canal supplémentaire:
void SetAUCanonical(UInt32 nChannels, bool interleaved)
{
mFormatID = kAudioFormatLinearPCM;
#if CA_PREFER_FIXED_POINT
mFormatFlags = kAudioFormatFlagsCanonical | (kAudioUnitSampleFractionBits << kLinearPCMFormatFlagsSampleFractionShift);
#else
mFormatFlags = kAudioFormatFlagsCanonical;
#endif
mChannelsPerFrame = nChannels;
mFramesPerPacket = 1;
mBitsPerChannel = 8 * sizeof(AudioUnitSampleType);
if (interleaved)
mBytesPerPacket = mBytesPerFrame = nChannels * sizeof(AudioUnitSampleType);
else {
mBytesPerPacket = mBytesPerFrame = sizeof(AudioUnitSampleType);
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
}
}
Si « intercalées » est faux, il ne se multiplie pas le « mBytesPerPacket » et mBytesPerFrame » par le Nombre de canaux. Il n'y aura pas assez de bits dans le cadre pour stocker le canal supplémentaire.
L'exemple de code est-il légèrement trompeur lorsqu'il demande 2 canaux? Faut-il être juste demander 1 canal, puisque c'est ce que sa va revenir quand même:
outFormat.SetAUCanonical(1, false);
Puis-je « réparer » SetAUCannonical comme cela pour rendre les choses claires ?:
mChannelsPerFrame = nChannels;
if (!interleaved) {
mChannelsPerFrame = 1
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
}
mFramesPerPacket = 1;
mBitsPerChannel = 8 * sizeof(AudioUnitSampleType);
mBytesPerPacket = mBytesPerFrame = nChannels * sizeof(AudioUnitSampleType);
Ou est il y a une autre raison pour laquelle vous demanderiez 2 canaux? Je ne pense même pas que le micro est un micro stéréo.
Je vais étudier ce soir. –
C'était mon expérience. Je ne spécifiais rien pour l'état entrelacé. Par défaut, le simulateur voulait disposer d'un seul tampon entrelacé dans le rappel d'E/S, mais le périphérique affichait par défaut deux tampons de canal unique. –