linux获取⾳频及播放代码实例代码功能:采集441帧然后播放出来
详细功能参考代码:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <alsa/asoundlib.h>
4
5
6 int main(void){
7        /*Name of the PCM device ,like "default"*/
8        char    *dev_name;
9        int    rate = 44100;/*Sample rate*/
10        int    exact_rate;/*Sample rate returned by*/
11        int    dir;/*(1)exact_rate == rate --> dir=0,(2)exact_rate < rate --> dir=-1,(3)exact_rate > rate*/
12        int    periods = 3;/*Number of periods*/
13        int    err;
14        int    size;
15        int    pcmreturn;
16 //      snd_pcm_uframes_t      periodsize = 8192;
17        snd_pcm_uframes_t      periodsize = 441;
18        snd_pcm_t      *play_handle;
19        snd_pcm_t      *capture_handle;
20        snd_pcm_stream_t        play_stream = SND_PCM_STREAM_PLAYBACK;
21        snd_pcm_stream_t        capture_stream = SND_PCM_STREAM_CAPTURE;
22        /*This structure contains information about */
23        /*the hardware and can be used to specify the */
24        /*configuration to be used for the PCM stream*/
25        snd_pcm_hw_params_t    *hwparams;
26        snd_pcm_hw_params_t    *c_hwparams;
27        /*Init dev_name, Of course, later you will make this configure*/
28        dev_name = strdup("default");
29        /*Allocate the snd_pcm_hw_params_t structure on the stack*/
30        snd_pcm_hw_params_alloca(&hwparams);
31        snd_pcm_hw_params_alloca(&c_hwparams);
32        /* Open PCM. The last parameter of this function is the mode. */
33        /* If this is set to 0, the standard mode is used. Possible  */
34        /* other values are SND_PCM_NONBLOCK and SND_PCM_ASYNC.      */
35        /* If SND_PCM_NONBLOCK is used, read / write access to the    */
36        /* PCM device will return immediately. If SND_PCM_ASYNC is    */
37        /* specified, SIGIO will be emitted whenever a period has    */
38        /* been completely processed by the soundcard.                */
39        if (snd_pcm_open(&play_handle, dev_name, play_stream, 0) < 0) {
40                fprintf(stderr, "Error opening PCM device %s\n", dev_name);
41                return(-1);
42        }
43        if (snd_pcm_open(&capture_handle, dev_name, capture_stream, 0) < 0) {
44                fprintf(stderr, "Error opening PCM device %s\n", dev_name);
45                return(-1);
46        }
47        /* Init hwparams with full configuration space */
48        if (snd_pcm_hw_params_any(play_handle, hwparams) < 0) {
49                fprintf(stderr, "Can not configure this PCM device.\n");
50                return(-1);
51        }
52        if (snd_pcm_hw_params_any(capture_handle, c_hwparams) < 0) {
53                fprintf(stderr, "Can not configure this PCM device.\n");
54                return(-1);
55        }
56        /* Set access type. This can be either    */
57        /* SND_PCM_ACCESS_RW_INTERLEAVED or      */
58        /* SND_PCM_ACCESS_RW_NONINTERLEAVED.      */
59        /* There are also access types for MMAPed */
60        /* access, but this is beyond the scope  */
61        /* of this introduction.                  */
62        if (snd_pcm_hw_params_set_access(play_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) {
fprintf作用63                fprintf(stderr, "Error setting access.\n");
64                return(-1);
65        }
66        if (snd_pcm_hw_params_set_access(capture_handle, c_hwparams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) {
67                fprintf(stderr, "Error setting access.\n");
68                return(-1);
69        }
70        /* Set sample format */
71        if (snd_pcm_hw_params_set_format(play_handle, hwparams, SND_PCM_FORMAT_S16_LE) < 0) {
72                fprintf(stderr, "Error setting format.\n");
73                return(-1);
74        }
75        if (snd_pcm_hw_params_set_format(capture_handle, c_hwparams, SND_PCM_FORMAT_S16_LE) < 0) {
76                fprintf(stderr, "Error setting format.\n");
77                return(-1);
78        }
79        exact_rate = rate;
80        if (snd_pcm_hw_params_set_rate_near(play_handle, hwparams, &exact_rate, 0) < 0) {
81                fprintf(stderr, "Error setting rate.\n");
82                return(-1);
83        }
84        if (rate != exact_rate) {
85                fprintf(stderr, "The rate %d Hz is not supported by your hardware.\
86                        ==> Using %d Hz instead.\n", rate, exact_rate);
87        }
88        exact_rate = rate;
89        if (snd_pcm_hw_params_set_rate_near(capture_handle, c_hwparams, &exact_rate, 0) < 0) {
90                fprintf(stderr, "Error setting rate.\n");
91                return(-1);
92        }
93        if (rate != exact_rate) {
94                fprintf(stderr, "The rate %d Hz is not supported by your hardware.\
95                        ==> Using %d Hz instead.\n", rate, exact_rate);
96        }
97
98        /* Set number of channels */
99        if (snd_pcm_hw_params_set_channels(play_handle, hwparams, 2) < 0) {
100                fprintf(stderr, "Error setting channels.\n");
101                return(-1);
102        }
103        if (snd_pcm_hw_params_set_channels(capture_handle, c_hwparams, 2) < 0) {
104                fprintf(stderr, "Error setting channels.\n");
105                return(-1);
106        }
107
108        /* Set number of periods. Periods used to be called fragments. */
109        if (snd_pcm_hw_params_set_periods(play_handle, hwparams, periods, 0) < 0) {
110                fprintf(stderr, "Error setting periods.\n");
111                return(-1);
112        }
113        if (snd_pcm_hw_params_set_periods(capture_handle, c_hwparams, periods, 0) < 0) {
114                fprintf(stderr, "Error setting periods.\n");
115                return(-1);
116        }
117        /* Set buffer size (in frames). The resulting latency is given by */
118        /* latency = periodsize * periods / (rate * bytes_per_frame)    */
119 //      if(snd_pcm_hw_params_get_buffer_size_max(hwparams,&periodsize) < 0)
120 //      {
121 //              fprintf(stderr,"Error get buffer size\n");
122 //      }
123 //      printf("periodsize=%lu\n",periodsize);
125        if (snd_pcm_hw_params_set_buffer_size(play_handle, hwparams, (periodsize * periods)) < 0) {
126                fprintf(stderr, "Error setting buffersize.\n");
127                return(-1);
128        }
129        if (snd_pcm_hw_params_set_buffer_size(capture_handle, c_hwparams, (periodsize * periods)) < 0) { 130                fprintf(stderr, "Error setting buffersize.\n");
131                return(-1);
132        }
133        /* Apply HW parameter settings to */
134        /* PCM device and prepare device  */
135        if (snd_pcm_hw_params(play_handle, hwparams) < 0) {
136                fprintf(stderr, "Error setting HW params.\n");
137                return(-1);
138        }
139        if (snd_pcm_hw_params(capture_handle, c_hwparams) < 0) {
140                fprintf(stderr, "Error setting HW params.\n");
141                return(-1);
142        }
143 //      snd_pcm_hw_params_free(hwparams);
144 //      snd_pcm_hw_params_free(c_hwparams);
145        if ((err = snd_pcm_prepare (play_handle)) < 0) {
146                fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
147                                  snd_strerror (err));
148                exit (1);
149        }
150        if ((err = snd_pcm_prepare (capture_handle)) < 0) {
151                fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
152                                  snd_strerror (err));
153                exit (1);
154        }
155        snd_pcm_hw_params_get_period_size(c_hwparams, &periods,0);
156        printf("periods=%d\n",periods);
157        char *data_buf = (char*)malloc(periods*4);
158        if(!data_buf){
159                fprintf(stderr, "Cannot malloc buffer for data\n");
160        }
161        while(1)
162
163        {
164                pcmreturn = snd_pcm_readi( capture_handle, data_buf, periodsize);
165                if( pcmreturn == -EPIPE )
166                {
167                        snd_pcm_prepare( capture_handle );
168                        fprintf (stderr, "<<<<<<<<<<<<<<<<<<< Buffer Overrun >>>>>>>>>>>>>>>>>\n");
169                        continue;
170                }else if( pcmreturn == -EBADFD ){
171                        fprintf(stderr, "<<<<<<<<<<<<<<<<<<<< readi error -EBADFD >>>>>>>>>>>>>\n");
172                        continue;
173                }else if( pcmreturn == -ESTRPIPE ){
174                        fprintf(stderr, "<<<<<<<<<<<<<<<<<<<< readi error -ESTRPIPE >>>>>>>>>>>>>\n");
175                }else{
176                        pcmreturn = snd_pcm_writei(play_handle, data_buf, pcmreturn);
177                        if( pcmreturn == -EPIPE ){
178                                fprintf(stderr, "<<<<<<<<<<<< Buffer Underrun >>>>>>>>>>>>>>\n");
179                                snd_pcm_prepare( play_handle );
180                //              continue;
181                        }else if( pcmreturn == -ESTRPIPE ){
182                                fprintf(stderr, "<<<<<<<<<<<< writei error -ESTRPIPE >>>>>>>>>>>\n");
183                        }else if( pcmreturn == -EBADFD ){
184                                fprintf(stderr, "<<<<<<<<<<<< writei error -EABDFD >>>>>>>>>>>>\n");
185                        }
186                }
187                printf("pcmreturn = %d\n",pcmreturn);
188
190        } 191
192
193 }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。