nesC (C-подобный) вопрос

Это код из 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;
  }

person user397232    schedule 22.06.2010    source источник
comment
Как используется gNumSamples? может быть, приложение считает «Образец» 4 словами данных?   -  person luke    schedule 22.06.2010


Ответы (1)


Я только что наткнулся на этот вопрос, когда искал nesC. Просто отвечая на него, чего бы это ни стоило.

Если вы посмотрите на функцию audioRecord, они умножают numSamples на 4, чтобы компенсировать деление на 4 (BUFFERLEN/4) ранее. Без полного контекста я не могу сказать, почему они должны разделять его в первую очередь. Я предполагаю, что gBuffer разделен на 4 части, каждая из которых хранит numSamples, поэтому, когда производитель записывает в одну часть, потребитель может читать из другой части.

person user330167    schedule 29.12.2010