alsa没有播放完整的文件

时间:2018-03-06 12:13:35

标签: audio alsa pcm pulseaudio

我正在尝试读取波形文件并在主板上的一张声卡上播放。下面是代码。我在使用此代码时遇到了一些问题。

  1. 我正在尝试播放各种采样率的文件。对于采样率为8KHz的文件,即使文件转储显示文件的全部内容,文件也无法完全播放。
  2. 如果我播放11025 Hz的文件,我只会听到噪音
  3. 对于立体声数据,我的音频会出现乱码。
  4. PS:

    1. 我正在设置从波形标题
    2. 获得的比率
    3. 周期大小设置为10毫秒。即16KHz - 160; 11025 - 110

      ret = snd_pcm_open(&handlePCMHD, "hw:0,0",
          SND_PCM_STREAM_PLAYBACK, 0);
      if (ret < 0) {
          snd_pcm_close(handlePCMHD);
          return -1;
      }
      
      fd = open(fileName, O_RDONLY);
      /* file dump */
      fd2 = open("test.raw", O_WRONLY | O_CREAT);
      if(fd < 0)
      {
          return -1;
      }
      
      /* Wave file header is 44 bytes */
      if(read(fd, buf, 44)){
          sampleRate = buf[12] | ((unsigned int)buf[13] << 16);
      
          channels = buf[11];
      }else{
          //read failed
      }
      
      set_pcmhd_hw_param(handlePCMHD, sampleRate);
      
      /* Buffer size = SampleRate * Number of Bytes per frame * No of Periods / For 10 ms */
      readBytes = (sampleRate * 2 * 2)/100;
      
      while((channels == 1) ? (x = read(fd, buf, readBytes)) : (x = read(fd, stereobuf, readBytes * 2)))
      {
          if(channels == 2){
              StereoToMono_samples(buf ,stereobuf, readBytes/2);
          }
          write(fd2, buf, readBytes);
          /* Number of frames = read bytes / 2 for 16 bit PCM */
          x = readBytes / 2;
          if ((ret = snd_pcm_writei(handlePCMHD, buf, (snd_pcm_uframes_t)x) == -EPIPE)) {
              snd_pcm_prepare(handlePCMHD);
          } else if (ret < 0) {
              //error handling
          } else{
              count++;
          }
      }
      close(fd);
      close(fd2);
      snd_pcm_close(handlePCMHD);
      

0 个答案:

没有答案