518 |
kaklik |
1 |
//ALSA Audio playback testing program
|
|
|
2 |
//
|
|
|
3 |
|
|
|
4 |
#include <stdio.h>
|
|
|
5 |
#include <stdlib.h>
|
526 |
kaklik |
6 |
|
518 |
kaklik |
7 |
#include <alsa/asoundlib.h>
|
|
|
8 |
|
|
|
9 |
int exact_rate=44100;
|
526 |
kaklik |
10 |
|
|
|
11 |
|
|
|
12 |
int linear_chirp(int *pole, int delka_pole, int spozdeni){ // vygeneruje linearni chirp a vzorky ulozi do pole
|
|
|
13 |
|
|
|
14 |
static const double pi = 3.141592653589793238462643383279502884197; // Archimedes constant pi
|
|
|
15 |
static const float f0 = 0.01;
|
|
|
16 |
static const float k = 0.0001;
|
|
|
17 |
|
|
|
18 |
int t;
|
|
|
19 |
float ble;
|
|
|
20 |
if((spozdeni+delka_pulsu) < delka_pole)
|
|
|
21 |
for(t=0;t < delka_pulsu;t++) pole[spozdeni+t] = round ( 100*sin(2*pi*t*(f0+(k/2)*t)) );
|
|
|
22 |
else return 0;
|
|
|
23 |
|
|
|
24 |
}
|
|
|
25 |
|
|
|
26 |
static void async_callback(snd_async_handler_t *ahandler)
|
|
|
27 |
{
|
|
|
28 |
snd_pcm_t *handle = snd_async_handler_get_pcm(ahandler);
|
|
|
29 |
struct async_private_data *data = snd_async_handler_get_callback_private(ahandler);
|
|
|
30 |
signed short *samples = data->samples;
|
|
|
31 |
snd_pcm_channel_area_t *areas = data->areas;
|
|
|
32 |
snd_pcm_sframes_t avail;
|
|
|
33 |
int err;
|
|
|
34 |
|
|
|
35 |
avail = snd_pcm_avail_update(handle);
|
|
|
36 |
while (avail >= period_size) {
|
|
|
37 |
generate_sine(areas, 0, period_size, &data->phase);
|
|
|
38 |
|
|
|
39 |
err = snd_pcm_writei(handle, samples, period_size);
|
|
|
40 |
if (err < 0) {
|
|
|
41 |
printf("Write error: %s\n", snd_strerror(err));
|
|
|
42 |
exit(EXIT_FAILURE);
|
|
|
43 |
}
|
|
|
44 |
if (err != period_size) {
|
|
|
45 |
printf("Write error: written %i expected %li\n", err, period_size);
|
|
|
46 |
exit(EXIT_FAILURE);
|
|
|
47 |
}
|
|
|
48 |
avail = snd_pcm_avail_update(handle);
|
|
|
49 |
}
|
|
|
50 |
}
|
|
|
51 |
|
|
|
52 |
static int async_loop(snd_pcm_t *handle,
|
|
|
53 |
signed short *samples,
|
|
|
54 |
snd_pcm_channel_area_t *areas)
|
|
|
55 |
{
|
|
|
56 |
struct async_private_data data;
|
|
|
57 |
snd_async_handler_t *ahandler;
|
|
|
58 |
int err, count;
|
|
|
59 |
unsigned int i;
|
|
|
60 |
|
|
|
61 |
data.samples = samples;
|
|
|
62 |
data.areas = areas;
|
|
|
63 |
data.phase = 0;
|
|
|
64 |
err = snd_async_add_pcm_handler(&ahandler, handle, async_callback, &data);
|
|
|
65 |
if (err < 0) {
|
|
|
66 |
printf("Unable to register async handler\n");
|
|
|
67 |
exit(EXIT_FAILURE);
|
|
|
68 |
}
|
|
|
69 |
for (count = 0; count < 2; count++) {
|
|
|
70 |
generate_sine(areas, 0, period_size, &data.phase);
|
|
|
71 |
err = snd_pcm_writei(handle, samples, period_size);
|
|
|
72 |
if (err < 0) {
|
|
|
73 |
printf("Initial write error: %s\n", snd_strerror(err));
|
|
|
74 |
exit(EXIT_FAILURE);
|
|
|
75 |
}
|
|
|
76 |
if (err != period_size) {
|
|
|
77 |
printf("Initial write error: written %i expected %li\n", err, period_size);
|
|
|
78 |
exit(EXIT_FAILURE);
|
|
|
79 |
}
|
|
|
80 |
}
|
|
|
81 |
if (snd_pcm_state(handle) == SND_PCM_STATE_PREPARED) {
|
|
|
82 |
err = snd_pcm_start(handle);
|
|
|
83 |
if (err < 0) {
|
|
|
84 |
printf("Start error: %s\n", snd_strerror(err));
|
|
|
85 |
exit(EXIT_FAILURE);
|
|
|
86 |
}
|
|
|
87 |
}
|
|
|
88 |
|
|
|
89 |
/* because all other work is done in the signal handler,
|
|
|
90 |
suspend the process */
|
|
|
91 |
for(i=0; i<=10;i++) {
|
|
|
92 |
sleep(1);
|
|
|
93 |
}
|
|
|
94 |
}
|
518 |
kaklik |
95 |
|
|
|
96 |
main (int argc, char *argv[])
|
|
|
97 |
{
|
|
|
98 |
int i;
|
|
|
99 |
int err;
|
|
|
100 |
short buf[128];
|
|
|
101 |
snd_pcm_t *playback_handle;
|
|
|
102 |
snd_pcm_hw_params_t *hw_params;
|
526 |
kaklik |
103 |
snd_pcm_channel_area_t *areas;
|
518 |
kaklik |
104 |
|
|
|
105 |
if ((err = snd_pcm_open (&playback_handle, argv[1], SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
|
|
|
106 |
fprintf (stderr, "cannot open audio device %s (%s)\n",
|
|
|
107 |
argv[1],
|
|
|
108 |
snd_strerror (err));
|
|
|
109 |
exit (1);
|
|
|
110 |
}
|
|
|
111 |
|
526 |
kaklik |
112 |
if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) {
|
518 |
kaklik |
113 |
fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n",
|
|
|
114 |
snd_strerror (err));
|
|
|
115 |
exit (1);
|
|
|
116 |
}
|
|
|
117 |
|
|
|
118 |
if ((err = snd_pcm_hw_params_any (playback_handle, hw_params)) < 0) {
|
|
|
119 |
fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n",
|
|
|
120 |
snd_strerror (err));
|
|
|
121 |
exit (1);
|
|
|
122 |
}
|
|
|
123 |
|
|
|
124 |
if ((err = snd_pcm_hw_params_set_access (playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
|
|
|
125 |
fprintf (stderr, "cannot set access type (%s)\n",
|
|
|
126 |
snd_strerror (err));
|
|
|
127 |
exit (1);
|
|
|
128 |
}
|
|
|
129 |
|
|
|
130 |
if ((err = snd_pcm_hw_params_set_format (playback_handle, hw_params, SND_PCM_FORMAT_S16_LE)) < 0) {
|
|
|
131 |
fprintf (stderr, "cannot set sample format (%s)\n",
|
|
|
132 |
snd_strerror (err));
|
|
|
133 |
exit (1);
|
|
|
134 |
}
|
|
|
135 |
|
|
|
136 |
if ((err = snd_pcm_hw_params_set_rate_near (playback_handle, hw_params, &exact_rate, 0)) < 0) {
|
|
|
137 |
fprintf (stderr, "cannot set sample rate (%s)\n",
|
|
|
138 |
snd_strerror (err));
|
|
|
139 |
exit (1);
|
|
|
140 |
}
|
|
|
141 |
|
|
|
142 |
if ((err = snd_pcm_hw_params_set_channels (playback_handle, hw_params, 2)) < 0) {
|
|
|
143 |
fprintf (stderr, "cannot set channel count (%s)\n",
|
|
|
144 |
snd_strerror (err));
|
|
|
145 |
exit (1);
|
|
|
146 |
}
|
|
|
147 |
|
|
|
148 |
if ((err = snd_pcm_hw_params (playback_handle, hw_params)) < 0) {
|
|
|
149 |
fprintf (stderr, "cannot set parameters (%s)\n",
|
|
|
150 |
snd_strerror (err));
|
|
|
151 |
exit (1);
|
|
|
152 |
}
|
|
|
153 |
|
|
|
154 |
if ((err = snd_pcm_prepare (playback_handle)) < 0) {
|
|
|
155 |
fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
|
|
|
156 |
snd_strerror (err));
|
|
|
157 |
exit (1);
|
|
|
158 |
}
|
|
|
159 |
|
526 |
kaklik |
160 |
async_loop(playback_handle, samples, areas);
|
|
|
161 |
|
|
|
162 |
/* for (i = 0; i < 100; ++i) {
|
518 |
kaklik |
163 |
if ((err = snd_pcm_writei (playback_handle, buf, 128)) != 128) {
|
|
|
164 |
fprintf (stderr, "write to audio interface failed (%s)\n",
|
|
|
165 |
snd_strerror (err));
|
|
|
166 |
exit (1);
|
|
|
167 |
}
|
526 |
kaklik |
168 |
}*/
|
518 |
kaklik |
169 |
|
|
|
170 |
snd_pcm_close (playback_handle);
|
|
|
171 |
exit (0);
|
|
|
172 |
}
|
|
|
173 |
|