nesC (C-like) вопрос
Это код из файла TestAVBoardM.nc на языке nesC:
#define BUFFERLEN 32768
uint32_t gBuffer[BUFFERLEN] __attribute__((aligned(32)));
uint32_t gNumSamples = BUFFERLEN/4;
event void Audio.ready(result_t success)
{
call Audio.audioRecord(gBuffer,gNumSamples));
return;
}
Буфер gBuffer используется для хранения сэмплов звукозаписи. Сэмплы - это 16-битные стерео сэмплы, упакованные в 32-битное слово. Левые сэмплы находятся в младших 16 битах. Правильные сэмплы находятся в старших 16 битах.
Что меня смущает, так это количество сэмплов gNumSamples. Как я понимаю, gNumSamples должен быть BUFFERLEN, поскольку gBuffer[i] является 32-битным словом (16 бит для левого канала + 16 для правого канала). Я прав? (Я изменился gNumSamples = BUFFERLEN
и это не сработало).
Спасибо за вашу помощь.
Вот как используется gBuffer:
command result_t Audio.audioRecord(uint32_t *buffer, uint32_t numSamples){
uint32_t *pBuf;
uint32_t bufpos;
bool initPlay;
atomic{
initPlay = gInitPlay;
}
if(initPlay == TRUE){
//gate the acceptance of a record command until we signal audio.ready();
return FAIL;
}
atomic{
pBuf = gRxBuffer;
bufpos = gRxBufferPos;
}
if( (bufpos != 0) || (pBuf != NULL)){
//gate acceptance due to ongoing record command
return FAIL;
}
atomic{
gRxBuffer = buffer;
gRxBufferPos = 0;
gRxNumBytes = numSamples * 4;
}
call BulkTxRx.BulkReceive((uint8_t *)buffer, ((numSamples*4) > 8188)? 8188: (numSamples*4));
return SUCCESS;
}
1 ответ
Я только сталкивался с этим вопросом, когда искал nesC. Просто отвечаю на все, чего бы это ни стоило.
Если вы посмотрите на функцию audioRecord, они умножают numSamples на 4, чтобы компенсировать деление на 4 (BUFFERLEN/4) ранее. Без полного контекста я не могу сказать, почему они должны делить это в первую очередь. Я думаю, что gBuffer разделен на 4 части, каждая из которых хранит numSamples, поэтому, когда производитель пишет в одну часть, потребитель может читать из другой части.