找回密码
 注册
关于网站域名变更的通知
查看: 395|回复: 1
打印 上一主题 下一主题

分享linux下ALSA播放声音的源程序,可以交流讨论哦

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-9-18 11:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
  • //linux下ALSA播放声音的源程序
  • //@note 编译的时候,使用到了asound 的lib 所以要添加-lasoud库
  • #include <stdio.h>
  • /* Use the newer ALSA API */
  • #define ALSA_PCM_NEW_HW_PARAMS_API

  • * Q( A3 _9 |9 k
  • #include <alsa/asoundlib.h>
  • ! R' }& N" S% |, E1 f- v4 ]$ l
  • 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);
  •     }

  • ) e) \2 I- U' X* m+ L0 U4 J
  •     /* Allocate a hardware parameters object. */
  •     snd_pcm_hw_params_alloca(¶ms);

  • ( b1 [* `8 H) i2 q- _5 B
  •     /* Fill it in with default values. */
  •     snd_pcm_hw_params_any(handle, params);

  • 7 x9 |0 a% C& U, b% R' ^& M$ X7 T
  •     /* Set the desired hardware parameters. */
  • 0 Z# X2 D( {6 l. j' ~/ u, P& ^
  •     /* Interleaved mode */
  •     snd_pcm_hw_params_set_access(handle, params,
  •                       SND_PCM_ACCESS_RW_INTERLEAVED);
  • , G, J) ]0 `8 O% Q: L' p$ v
  •     /* Signed 16-bit little-endian format */
  •     snd_pcm_hw_params_set_format(handle, params,
  •                               SND_PCM_FORMAT_S16_LE);

  • . L& T# T& n( I9 p/ O4 r
  •     /* Two channels (stereo) */
  •     snd_pcm_hw_params_set_channels(handle, params, 1);

  • # n0 u% K, P8 k' U
  •     /* 44100 bits/second sampling rate (CD quality) */
  •     val = 8000;
  •     snd_pcm_hw_params_set_rate_near(handle, params,
  •                                   &val, &dir);

  • & b6 n9 W; T* s4 r  g% Z( |! e) s' _
  •     /* 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));
  •     }
  • : U4 N# y5 T, ?+ M) C7 H9 ~6 b
  •     /* 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)
  •         {
  •         }
  • % x1 L( d# A0 z0 J$ A
  •         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;
  • }& n% ]" s) {3 X# L- ?* t) T/ h

( a, p& b* `' P: e6 w3 U* F0 U9 I
3 E6 X. ]) H, A% t
4 I( T* \# ~+ [6 C& x0 ^: e

7 b0 G, j' H9 O' p2 ~- @9 R- K

该用户从未签到

2#
发表于 2019-9-18 17:32 | 只看该作者
linux下ALSA播放声音的源程序。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 00:54 , Processed in 0.171875 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表