|
|
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 I3 E6 X. ]) H, A% t
4 I( T* \# ~+ [6 C& x0 ^: e
7 b0 G, j' H9 O' p2 ~- @9 R- K |
|