0

This is the code from TestAVBoardM.nc file in nesC language:

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

The buffer gBuffer is used to store sound recording samples. Samples are 16-bit stereo samples packed into a 32-bit word. Left samples are in the low 16 bits. Right samples are in the high 16 bits.

What makes me confused is the number of samples gNumSamples. As I understand, gNumSamples should be BUFFERLEN since gBuffer[i] is 32-bit word (16 bits for left channel + 16 for right channel). Am I right? (I changed gNumSamples = BUFFERLEN and it didn't work).

Thanks for your help.

This is how gBuffer is used:

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

1 回答 1

0

我在寻找nesC时遇到了这个问题。只是为了它的价值而回答它。

如果您查看 audioRecord 函数,它们将 numSamples 乘以 4 以补偿之前的 4 (BUFFERLEN/4) 除法。如果没有完整的上下文,我无法说出他们为什么必须首先划分它。我的猜测是 gBuffer 分为 4 个部分,每个部分存储 numSamples,所以当生产者写入一个部分时,消费者可以从另一部分读取。

于 2010-12-29T05:01:12.740 回答