]> git.mxchange.org Git - simgear.git/blob - example/example.cxx
Tweaked the example a bit.
[simgear.git] / example / example.cxx
1
2
3 #include "sl.h"
4 #include "sm.h"
5 #include <math.h>
6
7 /*
8   Construct a sound scheduler and a mixer.
9 */
10
11 slScheduler sched ( 8000 ) ;
12 smMixer mixer ;
13
14 int main ()
15 {
16   mixer . setMasterVolume ( 30 ) ;
17   sched . setSafetyMargin ( 0.128 ) ;
18
19   /* Just for fun, let's make a one second synthetic engine sample... */
20
21   Uchar buffer [ 8000 ] ;
22
23   for ( int i = 0 ; i < 8000 ; i++ )
24   {
25     /* Sum some sin waves and convert to range 0..1 */
26
27     float level = ( sin ( (double) i * 2.0 * M_PI / (8000.0/ 50.0) ) +
28                     sin ( (double) i * 2.0 * M_PI / (8000.0/149.0) ) +
29                     sin ( (double) i * 2.0 * M_PI / (8000.0/152.0) ) +
30                     sin ( (double) i * 2.0 * M_PI / (8000.0/192.0) )
31                   ) / 8.0f + 0.5f ;
32
33     /* Convert to unsigned byte */
34
35     buffer [ i ] = (Uchar) ( level * 255.0 ) ;
36   }
37
38   /* Set up four samples and a loop */
39
40   slSample  *s = new slSample ( buffer, 8000 ) ;
41   slSample *s1 = new slSample ( "scream.ub", & sched ) ;
42   slSample *s2 = new slSample ( "zzap.wav" , & sched ) ;
43   slSample *s3 = new slSample ( "cuckoo.au", & sched ) ;
44   slSample *s4 = new slSample ( "wheeee.ub", & sched ) ;
45
46   /* Mess about with some of the samples... */
47
48   s1 -> adjustVolume ( 2.2  ) ;
49   s2 -> adjustVolume ( 0.5  ) ;
50   s3 -> adjustVolume ( 0.2  ) ;
51
52   /* Play the engine sample continuously. */
53
54   sched . loopSample ( s ) ;
55
56   int tim = 0 ;  /* My periodic event timer. */
57
58   slEnvelope pitch_envelope ( 3, SL_SAMPLE_LOOP ) ;
59   slEnvelope p_envelope ( 1, SL_SAMPLE_ONE_SHOT ) ;
60   slEnvelope volume_envelope ( 3, SL_SAMPLE_LOOP ) ;
61
62   while ( SL_TRUE )
63   {
64
65    tim++ ;  /* Time passes */
66
67     if ( tim % 200 == 0 ) sched.playSample ( s1 ) ;
68     if ( tim % 180 == 0 ) sched.playSample ( s2 ) ;
69     if ( tim % 150 == 0 ) sched.playSample ( s3 ) ;
70     if ( tim % 120 == 0 ) sched.playSample ( s4 ) ;
71
72     if ( tim == 60 ) {
73         // introduce an envelope for our engine noise after 10 seconds
74
75         pitch_envelope.setStep ( 0,  0.0, 1.0 ) ;
76         pitch_envelope.setStep ( 1,  5.0, 2.0 ) ;
77         pitch_envelope.setStep ( 2, 10.0, 1.0 ) ;
78
79         p_envelope.setStep ( 0,  5.0, 2.0 ) ;
80
81         volume_envelope.setStep ( 0,  0.0, 1.0 ) ;
82         volume_envelope.setStep ( 1,  5.0, 2.0 ) ;
83         volume_envelope.setStep ( 2, 10.0, 1.0 ) ;
84
85         // scheduler -> playSample ( my_sample ) ;
86         sched.addSampleEnvelope( s, 0, 0, &p_envelope, SL_PITCH_ENVELOPE );
87         sched.addSampleEnvelope( s, 0, 1, &volume_envelope, SL_VOLUME_ENVELOPE);
88     }
89
90
91     /*
92       For the sake of realism, I'll delay for 1/30th second to
93       simulate a graphics update process.
94     */
95
96 #ifdef WIN32
97     Sleep ( 1000 / 30 ) ;      /* 30Hz */
98 #elif defined(sgi)
99     sginap( 3 );               /* ARG */
100 #else
101     usleep ( 1000000 / 30 ) ;  /* 30Hz */
102 #endif
103
104     /*
105       This would normally be called just before the graphics buffer swap
106       - but it could be anywhere where it's guaranteed to get called
107       fairly often.
108     */
109
110     sched . update () ;
111   }
112 }
113