好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

linux下ALSA播放声音的源程序.docx

4页
  • 卖家[上传人]:re****.1
  • 文档编号:515692185
  • 上传时间:2022-10-06
  • 文档格式:DOCX
  • 文档大小:11.58KB
  • / 4 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 文档供参考,可复制、编制,期待您的好评与关注! linux下ALSA播放声音的源程序#include /* Use the newer ALSA API */#define ALSA_PCM_NEW_HW_PARAMS_API#include int main() {    long loops;    int rc;    int size;    snd_pcm_t *handle;    snd_pcm_hw_params_t *params;    unsigned int val;    int dir;    snd_pcm_uframes_t frames;    snd_pcm_uframes_t periodsize;    char *buffer;    FILE *fp = fopen("play.wav", "rb");    if(fp == NULL)    return 0;    fseek(fp, 100, SEEK_SET);    /* Open PCM device for playback. */    rc = snd_pcm_open(&handle, "default",                    SND_PCM_STREAM_PLAYBACK, 0);//SND_PCM_NONBLOCK);    if (rc < 0) {    fprintf(stderr,            "unable to open pcm device: %s\n",            snd_strerror(rc));    exit(1);    }    /* Allocate a hardware parameters object. */    snd_pcm_hw_params_alloca(¶ms);    /* Fill it in with default values. */    snd_pcm_hw_params_any(handle, params);    /* Set the desired hardware parameters. */    /* Interleaved mode */    snd_pcm_hw_params_set_access(handle, params,                      SND_PCM_ACCESS_RW_INTERLEAVED);    /* Signed 16-bit little-endian format */    snd_pcm_hw_params_set_format(handle, params,                              SND_PCM_FORMAT_S16_LE);    /* Two channels (stereo) */    snd_pcm_hw_params_set_channels(handle, params, 1);    /* 44100 bits/second sampling rate (CD quality) */    val = 8000;    snd_pcm_hw_params_set_rate_near(handle, params,                                  &val, &dir);    /* Set period size to 32 frames. */    frames = 32;    periodsize = frames * 2;    rc = snd_pcm_hw_params_set_buffer_size_near(handle, params, &periodsize);    if (rc < 0)     {         printf("Unable to set buffer size %li : %s\n", frames * 2, snd_strerror(rc));             }          periodsize /= 2;    rc = snd_pcm_hw_params_set_period_size_near(handle, params, &periodsize, 0);    if (rc < 0)     {        printf("Unable to set period size %li : %s\n", periodsize,  snd_strerror(rc));    }        /* Write the parameters to the driver */    rc = snd_pcm_hw_params(handle, params);    if (rc < 0) {    fprintf(stderr,            "unable to set hw parameters: %s\n",            snd_strerror(rc));    }    /* Use a buffer large enough to hold one period */    snd_pcm_hw_params_get_period_size(params, &frames, &dir);                                    size = frames * 2; /* 2 bytes/sample, 2 channels */    buffer = (char *) malloc(size);    fprintf(stderr,            "size = %d\n",            size);    /* We want to loop for 5 seconds */    //snd_pcm_hw_params_get_period_time(params,    //                                &val, &dir);    //snd_pcm_start(handle);    while (1)     {        rc = fread(buffer, 1, size, fp);        if(rc == 0)         {              fprintf(stderr, "end of file on input\n");              break;        }         else if (rc != size)         {        }        while(rc = snd_pcm_writei(handle, buffer, frames)<0)        {            usleep(2000);            if (rc == -EPIPE)            {                  /* EPIPE means underrun */                  fprintf(stderr, "underrun occurred\n");                  snd_pcm_prepare(handle);            }             else if (rc < 0)             {                  fprintf(stderr,                      "error from writei: %s\n",                      snd_strerror(rc));            }          }        //snd_pcm_drain(handle);        //usleep(7000);        //printf("#\n");    }    snd_pcm_drain(handle);    snd_pcm_close(handle);    free(buffer);    fclose(fp);    return 0;} / 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.