Denis Salem | Blog

CATEGORIES

ARCHIVES

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/* exemple d'oscillateur numerique avec jack */
/* 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*/
/* Ce code est totalement libre. Vous pouvez faire un doner kebab avec si vous voulez. */

#include 	<stdio>
#include 	<string>
#include 	<stdlib>
#include 	<jack/jack>
#include 	<math>

#define PI 3.1415926

jack_client_t * client;
jack_port_t * output_port;


/*
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
de la taille approprié qui soit un multiple du nombre d'échantillons sortant. On procède ainsi pour gagner en temps CPU
et éviter de recalculer à la volé chaque échantillons.

À chaque appelle de process() on incremente le curseur sinusPointer pour accéder à la portion de l'onde à envoyer stocké
dans sinBuffer.
*/

int sinusPointer = 0;
jack_default_audio_sample_t sinBuffer[8192] = {0};

int process(jack_nframes_t nframes, void *arg) {
        jack_default_audio_sample_t * out; // type float. Correspond au format de l'échantillons
        out = jack_port_get_buffer(output_port, nframes);       // on récupère l'addresse de la mémoire tampons pour les échantillons
                                                                // out est un tableau de 1024 entrée.
        int i = 0;
        memcpy(out, &sinBuffer[sinusPointer*1024], 1024 * sizeof(jack_default_audio_sample_t));
        sinusPointer++;
        if (sinusPointer == 8)
                sinusPointer = 0;
        return 0;
}

/* S'appuie en partie sur le code donnée en exemple dans simple_client.c que vous pouvez consulter ici:
http://jackit.sourceforge.net/cgi-bin/lxr/http/source/example-clients/simple_client.c*/
void jack_shutdown(void *arg) {
        exit(1);
}

int initOscillator(char * client_name, jack_options_t options, jack_status_t * status, char *server_name) {
        client = jack_client_open(client_name, options, status, server_name);
    
        if (client == NULL)
                return -1; 
        jack_set_process_callback(client, process, 0); 
        jack_on_shutdown(client, jack_shutdown,0);

        output_port = jack_port_register(client, "Main Signal", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); 
    
        if (output_port == NULL)
                return -2; 

        if (jack_activate(client))
                return -3; 

        return 0;
}

int main(int argc, char** argv) {
        jack_status_t status;
        char * server_name = NULL;
        int i=0;
        for(i=0; i<8192;i++) {
                sinBuffer[i] = sinf(2 * PI/512 * i ) * 0.1;
        }
        int err = initOscillator("Oscillator",JackNullOption, &status, server_name);

        if (err == -1){
                printf("jack_client_open() failed.\n");
                if (status & JackServerFailed) {
                        printf ("Unable to connect to JACK server.\n");
                }
                exit(-1);
        }
        else if (err == -2) {
                printf("Main output signal port cannot be create.\n");
                exit(-2);
        }
        else if (err == -3) {
                printf("Cannot activate Oscillator.\n");
                exit(-3);
        }


        sleep(-1);
        jack_client_close(client);
        exit(0);
}