0

これは、 nesC 言語のTestAVBoardM.ncファイルのコードです。

#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 は、録音サンプルを格納するために使用されます。サンプルは、32 ビット ワードにパックされた 16 ビット ステレオ サンプルです。左のサンプルは下位 16 ビットにあります。右のサンプルは上位 16 ビットにあります。

私を混乱させているのは、サンプル数 gNumSamples です。私が理解しているように、gBuffer[i] は 32 ビット ワード (左チャネルの 16 ビット + 右チャネルの 16 ビット) であるため、gNumSamples は BUFFERLEN である必要があります。私は正しいですか?(私は変更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;
  }
4

1 に答える 1

0

nesCを探しているときに、この質問に出くわしました。価値のあるものは何でも答えるだけです。

audioRecord 関数を見ると、numSamples に 4 を掛けて、以前の 4 による除算 (BUFFERLEN/4) を補っています。完全な文脈がなければ、そもそもなぜ彼らがそれを分割しなければならないのかわかりません. 私の推測では、gBuffer は 4 つの部分に分割され、各部分に numSamples が格納されているため、プロデューサーが 1 つの部分に書き込んでいるときに、消費者は別の部分から読み取ることができます。

于 2010-12-29T05:01:12.740 に答える