Denis Salem | Blog

CATEGORIES

ARCHIVES

 1 /* exemple d'oscillateur numerique avec jack */
 2 /* Le code est dégueulasse mais montre comment générer un signal et l'envoyer à la carte son de façon très simple*/
 3 /* Ce code est totalement libre. Vous pouvez faire un doner kebab avec si vous voulez. */
 4 
 5 #include 	<stdio>
 6 #include 	<string>
 7 #include 	<stdlib>
 8 #include 	<jack/jack>
 9 #include 	<math>
10 
11 #define PI 3.1415926
12 
13 jack_client_t * client;
14 jack_port_t * output_port;
15 
16 
17 /*
18 Danc cet exemple l'idée est de générer la forme de l'onde une et une seule fois et de le stocker dans un tableau
19 de la taille approprié qui soit un multiple du nombre d'échantillons sortant. On procède ainsi pour gagner en temps CPU
20 et éviter de recalculer à la volé chaque échantillons.
21 
22 À chaque appelle de process() on incremente le curseur sinusPointer pour accéder à la portion de l'onde à envoyer stocké
23 dans sinBuffer.
24 */
25 
26 int sinusPointer = 0;
27 jack_default_audio_sample_t sinBuffer[8192] = {0};
28 
29 int process(jack_nframes_t nframes, void *arg) {
30         jack_default_audio_sample_t * out; // type float. Correspond au format de l'échantillons
31         out = jack_port_get_buffer(output_port, nframes);       // on récupère l'addresse de la mémoire tampons pour les échantillons
32                                                                 // out est un tableau de 1024 entrée.
33         int i = 0;
34         memcpy(out, &sinBuffer[sinusPointer*1024], 1024 * sizeof(jack_default_audio_sample_t));
35         sinusPointer++;
36         if (sinusPointer == 8)
37                 sinusPointer = 0;
38         return 0;
39 }
40 
41 /* S'appuie en partie sur le code donnée en exemple dans simple_client.c que vous pouvez consulter ici:
42 http://jackit.sourceforge.net/cgi-bin/lxr/http/source/example-clients/simple_client.c*/
43 void jack_shutdown(void *arg) {
44         exit(1);
45 }
46 
47 int initOscillator(char * client_name, jack_options_t options, jack_status_t * status, char *server_name) {
48         client = jack_client_open(client_name, options, status, server_name);
49     
50         if (client == NULL)
51                 return -1; 
52         jack_set_process_callback(client, process, 0); 
53         jack_on_shutdown(client, jack_shutdown,0);
54 
55         output_port = jack_port_register(client, "Main Signal", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); 
56     
57         if (output_port == NULL)
58                 return -2; 
59 
60         if (jack_activate(client))
61                 return -3; 
62 
63         return 0;
64 }
65 
66 int main(int argc, char** argv) {
67         jack_status_t status;
68         char * server_name = NULL;
69         int i=0;
70         for(i=0; i<8192;i++) {
71                 sinBuffer[i] = sinf(2 * PI/512 * i ) * 0.1;
72         }
73         int err = initOscillator("Oscillator",JackNullOption, &status, server_name);
74 
75         if (err == -1){
76                 printf("jack_client_open() failed.\n");
77                 if (status & JackServerFailed) {
78                         printf ("Unable to connect to JACK server.\n");
79                 }
80                 exit(-1);
81         }
82         else if (err == -2) {
83                 printf("Main output signal port cannot be create.\n");
84                 exit(-2);
85         }
86         else if (err == -3) {
87                 printf("Cannot activate Oscillator.\n");
88                 exit(-3);
89         }
90 
91 
92         sleep(-1);
93         jack_client_close(client);
94         exit(0);
95 }