Subversion Repositories svnkaklik

Rev

Rev 518 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log

Rev 518 Rev 519
Line 1... Line 1...
1
	#include <stdio.h>
1
	#include <stdio.h>
2
	#include <stdlib.h>
2
	#include <stdlib.h>
-
 
3
	#include <errno.h>
-
 
4
	#include <poll.h>
3
	#include <alsa/asoundlib.h>
5
	#include <alsa/asoundlib.h>
4
 
6
 
5
	int rate = 44100;
-
 
6
	int exact_rate;
7
	int exact_rate;
-
 
8
	int rate = 44100;	      
-
 
9
	snd_pcm_t *playback_handle;
-
 
10
	short buf[4096];
7
	      
11
 
-
 
12
	FILE *random;
-
 
13
 
-
 
14
	
-
 
15
	int
8
	main (int argc, char *argv[])
16
	playback_callback (snd_pcm_sframes_t nframes)
9
	{
17
	{
10
		int i;
-
 
11
		int err;
18
		int err;
-
 
19
 
-
 
20
		printf ("playback callback called with %u frames\n", nframes);
-
 
21
 
-
 
22
		fread(buf,1,4096,random);
-
 
23
	
-
 
24
		/* ... fill buf with data ... */
-
 
25
	
-
 
26
		if ((err = snd_pcm_writei (playback_handle, buf, nframes)) < 0) {
-
 
27
			fprintf (stderr, "write failed (%s)\n", snd_strerror (err));
-
 
28
		}
-
 
29
	
12
		short buf[128];
30
		return err;
-
 
31
	}
-
 
32
	      
-
 
33
	main (int argc, char *argv[])
-
 
34
	{
-
 
35
	
13
		snd_pcm_t *capture_handle;
36
		random = fopen("/dev/urandom","r");
-
 
37
 
14
		snd_pcm_hw_params_t *hw_params;
38
		snd_pcm_hw_params_t *hw_params;
-
 
39
		snd_pcm_sw_params_t *sw_params;
-
 
40
		snd_pcm_sframes_t frames_to_deliver;
-
 
41
		int nfds;
-
 
42
		int err;
-
 
43
		struct pollfd *pfds;
15
	
44
	
16
		if ((err = snd_pcm_open (&capture_handle, argv[1], SND_PCM_STREAM_CAPTURE, 0)) < 0) {
45
		if ((err = snd_pcm_open (&playback_handle, argv[1], SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
17
			fprintf (stderr, "cannot open audio device %s (%s)\n", 
46
			fprintf (stderr, "cannot open audio device %s (%s)\n", 
18
				 argv[1],
47
				 argv[1],
19
				 snd_strerror (err));
48
				 snd_strerror (err));
20
			exit (1);
49
			exit (1);
21
		}
50
		}
Line 24... Line 53...
24
			fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n",
53
			fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n",
25
				 snd_strerror (err));
54
				 snd_strerror (err));
26
			exit (1);
55
			exit (1);
27
		}
56
		}
28
				 
57
				 
29
		if ((err = snd_pcm_hw_params_any (capture_handle, hw_params)) < 0) {
58
		if ((err = snd_pcm_hw_params_any (playback_handle, hw_params)) < 0) {
30
			fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n",
59
			fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n",
31
				 snd_strerror (err));
60
				 snd_strerror (err));
32
			exit (1);
61
			exit (1);
33
		}
62
		}
34
	
63
	
35
		if ((err = snd_pcm_hw_params_set_access (capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
64
		if ((err = snd_pcm_hw_params_set_access (playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
36
			fprintf (stderr, "cannot set access type (%s)\n",
65
			fprintf (stderr, "cannot set access type (%s)\n",
37
				 snd_strerror (err));
66
				 snd_strerror (err));
38
			exit (1);
67
			exit (1);
39
		}
68
		}
40
	
69
	
41
		if ((err = snd_pcm_hw_params_set_format (capture_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) {
70
		if ((err = snd_pcm_hw_params_set_format (playback_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) {
42
			fprintf (stderr, "cannot set sample format (%s)\n",
71
			fprintf (stderr, "cannot set sample format (%s)\n",
43
				 snd_strerror (err));
72
				 snd_strerror (err));
44
			exit (1);
73
			exit (1);
45
		}
74
		}
46
	
75
 
47
		exact_rate = rate;
76
		exact_rate = rate;
48
		if ((err = snd_pcm_hw_params_set_rate_near (capture_handle, hw_params, &exact_rate, 0)) < 0) {
77
		if ((err = snd_pcm_hw_params_set_rate_near (playback_handle, hw_params, &exact_rate, 0)) < 0) {
49
			fprintf (stderr, "cannot set sample rate (%s)\n",
78
			fprintf (stderr, "cannot set sample rate (%s)\n",
50
				 snd_strerror (err));
79
				 snd_strerror (err));
51
			exit (1);
80
			exit (1);
52
		}
81
		}
53
	
82
 
-
 
83
	
54
		if ((err = snd_pcm_hw_params_set_channels (capture_handle, hw_params, 2)) < 0) {
84
		if ((err = snd_pcm_hw_params_set_channels (playback_handle, hw_params, 2)) < 0) {
55
			fprintf (stderr, "cannot set channel count (%s)\n",
85
			fprintf (stderr, "cannot set channel count (%s)\n",
56
				 snd_strerror (err));
86
				 snd_strerror (err));
57
			exit (1);
87
			exit (1);
58
		}
88
		}
59
	
89
	
60
		if ((err = snd_pcm_hw_params (capture_handle, hw_params)) < 0) {
90
		if ((err = snd_pcm_hw_params (playback_handle, hw_params)) < 0) {
61
			fprintf (stderr, "cannot set parameters (%s)\n",
91
			fprintf (stderr, "cannot set parameters (%s)\n",
62
				 snd_strerror (err));
92
				 snd_strerror (err));
63
			exit (1);
93
			exit (1);
64
		}
94
		}
65
	
95
	
66
		snd_pcm_hw_params_free (hw_params);
96
		snd_pcm_hw_params_free (hw_params);
67
	
97
	
-
 
98
		/* tell ALSA to wake us up whenever 4096 or more frames
-
 
99
		   of playback data can be delivered. Also, tell
-
 
100
		   ALSA that we'll start the device ourselves.
-
 
101
		*/
-
 
102
	
68
		if ((err = snd_pcm_prepare (capture_handle)) < 0) {
103
		if ((err = snd_pcm_sw_params_malloc (&sw_params)) < 0) {
69
			fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
104
			fprintf (stderr, "cannot allocate software parameters structure (%s)\n",
70
				 snd_strerror (err));
105
				 snd_strerror (err));
71
			exit (1);
106
			exit (1);
72
		}
107
		}
73
	
-
 
74
		for (i = 0; i < 10; ++i) {
-
 
75
			if ((err = snd_pcm_readi (capture_handle, buf, 128)) != 128) {
108
		if ((err = snd_pcm_sw_params_current (playback_handle, sw_params)) < 0) {
76
				fprintf (stderr, "read from audio interface failed (%s)\n",
109
			fprintf (stderr, "cannot initialize software parameters structure (%s)\n",
77
					 snd_strerror (err));
110
				 snd_strerror (err));
78
				exit (1);
111
			exit (1);
79
			}
112
		}
80
			/*if ((err = snd_pcm_writei (capture_handle, buf, 128)) != 128) {
113
		if ((err = snd_pcm_sw_params_set_avail_min (playback_handle, sw_params, 4096)) < 0) {
81
				fprintf (stderr, "write to audio interface failed (%s)\n",
114
			fprintf (stderr, "cannot set minimum available count (%s)\n",
82
					 snd_strerror (err));
115
				 snd_strerror (err));
83
				exit (1);
116
			exit (1);
84
			}*/
-
 
85
		}
117
		}
-
 
118
		if ((err = snd_pcm_sw_params_set_start_threshold (playback_handle, sw_params, 0U)) < 0) {
-
 
119
			fprintf (stderr, "cannot set start mode (%s)\n",
-
 
120
				 snd_strerror (err));
-
 
121
			exit (1);
-
 
122
		}
-
 
123
		if ((err = snd_pcm_sw_params (playback_handle, sw_params)) < 0) {
-
 
124
			fprintf (stderr, "cannot set software parameters (%s)\n",
-
 
125
				 snd_strerror (err));
-
 
126
			exit (1);
-
 
127
		}
-
 
128
	
-
 
129
		/* the interface will interrupt the kernel every 4096 frames, and ALSA
-
 
130
		   will wake up this program very soon after that.
-
 
131
		*/
-
 
132
	
-
 
133
		if ((err = snd_pcm_prepare (playback_handle)) < 0) {
-
 
134
			fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
-
 
135
				 snd_strerror (err));
-
 
136
			exit (1);
-
 
137
		}
-
 
138
	
-
 
139
		while (1) {
86
 
140
	
-
 
141
			/* wait till the interface is ready for data, or 1 second
-
 
142
			   has elapsed.
-
 
143
			*/
87
	
144
	
-
 
145
			if ((err = snd_pcm_wait (playback_handle, 1000)) < 0) {
-
 
146
			        fprintf (stderr, "poll failed (%s)\n", strerror (errno));
-
 
147
			        break;
-
 
148
			}	           
-
 
149
	
-
 
150
			/* find out how much space is available for playback data */
-
 
151
	
-
 
152
			if ((frames_to_deliver = snd_pcm_avail_update (playback_handle)) < 0) {
-
 
153
				if (frames_to_deliver == -EPIPE) {
-
 
154
					fprintf (stderr, "an xrun occured\n");
-
 
155
					break;
-
 
156
				} else {
-
 
157
					fprintf (stderr, "unknown ALSA avail update return value (%d)\n", 
-
 
158
						 frames_to_deliver);
-
 
159
					break;
-
 
160
				}
-
 
161
			}
-
 
162
	
-
 
163
			frames_to_deliver = frames_to_deliver > 4096 ? 4096 : frames_to_deliver;
-
 
164
	
-
 
165
			/* deliver the data */
-
 
166
	
-
 
167
			if (playback_callback (frames_to_deliver) != frames_to_deliver) {
-
 
168
			        fprintf (stderr, "playback callback failed\n");
-
 
169
				break;
-
 
170
			}
-
 
171
		}
-
 
172
	
88
		snd_pcm_close (capture_handle);
173
		snd_pcm_close (playback_handle);
-
 
174
		fclose(random);
89
		exit (0);
175
		exit (0);
90
	}
176
	}
-
 
177