2016-08-05 4 views
0

を返すsnd_pcm_avail。私のプロジェクトでは、ノンブロッキングをしたいと思っていますが、私のコーデックで利用可能なバイト数を読むたびに0と表示されます。のAlsaはいつも、私は私のコーデックからデータを読み取るしようとしています0

アルゴリズムは非常に単純です:読み取り、その後、サンプルを読み込むためのコーデックで利用可能な160+サンプルがあるかどうかを確認後、1msのを待ちます。しかし、私が読んでいるたびに、サンプル数はゼロであると言います。

誰かが、なぜ私が理解するのに役立ちます "RC = snd_pcm_avail(inputCodecHandle);"常にゼロを返していますか?ここで

は、その中にコードのあるスレッドです。

void CRadioStack::rcvThread() { 
    ChannelBuffer_t *buffer_p = NULL; 
    int8_t *inputBuf_p; 
    int rc; 
    int16_t *inputBuf16_p; 
    int samplesToRead; 
    const int rxFrameSize = 160; 
    snd_pcm_sframes_t delay; 

    snd_pcm_nonblock(inputCodecHandle, 1); 
    snd_pcm_prepare(inputCodecHandle); 

    while (true) { 
     TWTime::msleep(1); 

     // get the number of samples available 
     snd_pcm_delay(inputCodecHandle, &delay); 
     rc = snd_pcm_avail(inputCodecHandle); 
     if (rc < 0) { 
      myLog->warn("Error in getting sample count: %s", snd_strerror(rc)); 
      snd_pcm_prepare(outputCodecHandle); 
      continue; 
     } 
     samplesToRead = rc; 

     // if number of samples > 160 then get 160 samples 
     if (samplesToRead <= rxFrameSize) { 
      continue; 
     } 

     // read the from the codec into the Channel Buffer. 
     rc = snd_pcm_readi(inputCodecHandle, inputBuf_p, rxFrameSize); 
     if (rc < 0) { 
      myLog->warn("Error reading Codec: %s", snd_strerror(rc)); 
      continue; 
     } else if (rc != rxFrameSize) { // nothing to get 
      myLog->warn("Input samples on codec not 160"); 
     } 

     pushToInputQueue(inputBuf_p); 
    } 
} 

コーデックを開くコードは次のとおりです。

bool CRadioStack::openInputCodec() 
{ 
    unsigned int val; 
    int dir; 
    const int NUM_OF_CHAN = 1; 
    codecRunning = false; 
    snd_pcm_uframes_t frames; 

    int rc; 
    snd_pcm_t *handle; 
    snd_pcm_hw_params_t *params; 

    inputCodecHandle = nullptr; 

    // Open pcm device for output 
    rc = snd_pcm_open(&handle, "hw:0,0", SND_PCM_STREAM_CAPTURE, 0); 
    if (rc < 0) { 
     myLog->error("Unable to open input codec: %s", snd_strerror(rc)); 
     return false; 
    } 

    // allocate a hardware parameters object 
    snd_pcm_hw_params_alloca(&params); 

    // fill with default values 
    snd_pcm_hw_params_any(handle, params); 

    // now setup the hardware paramters 
    snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED); // interleaved 
    snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);   // 16bin linear little-endian 
    snd_pcm_hw_params_set_channels(handle, params, NUM_OF_CHAN);     // one channel 
    val = 0; 
    snd_pcm_hw_params_set_channels_near(handle, params, &val);      // one channel 
    val = 8000; 
    dir = 0; 
    snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir);     // 8k sample rate. 
    frames = 160; 
    snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir);   // period size = 160 frames 

    // save the hardware parameters 
    rc = snd_pcm_hw_params(handle, params); 
    if (rc < 0) { 
     myLog->error("Unable to save hardware parameters to output codec."); 
     return false; 
    } 

    // ready to write to output codec. 
    // so save the handle so that it can be used elsewhere. 
    inputCodecHandle = handle; 
    return true; 
} 

ありがとうございます!

答えて

2

デバイスが起動されることはなかったです。 これは最初のsnd_pcm_read*()コールで自動的に行われますが、またsnd_pcm_start()で明示的に行うことができます。

+0

ありがとうございます!それはそれだった。 – user846566

関連する問題