source: roaraudio/roarclients/roarsin.c @ 5186:9667c5a66a36

Last change on this file since 5186:9667c5a66a36 was 5186:9667c5a66a36, checked in by phi, 12 years ago

added code to enable endless generation without accuracy errors

File size: 3.3 KB
Line 
1//roarsin.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008-2011
5 *
6 *  This file is part of roarclients a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  RoarAudio is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
23 *
24 */
25
26#include <roaraudio.h>  /* libroar */
27
28#ifdef ROAR_HAVE_LIBM
29
30#include <math.h>       /* sin() */
31#include <stdio.h>      /* *printf*() */
32
33double rect (double x) {
34 x /= 2*M_PI;
35 x -= (int)x;
36
37 if ( x < 0.5 )
38  return  1;
39 else
40  return -1;
41}
42
43double saw (double x) {
44 x /= 2*M_PI;
45 x -= (int)x;
46
47 return 2*x - 1;
48}
49
50double tri (double x) {
51 x /= 2*M_PI;
52 x -= (int)x;
53
54 if ( x < 0.5 )
55  return   4* x      - 1;
56 else
57  return  -4*(x-0.5) + 1;
58}
59
60double trap (double x) {
61 x /= 2*M_PI;
62 x -= (int)x;
63
64 if ( x < 0.125 || x > 0.875 ) {
65  return -1;
66 } else if ( x < 0.625 && x > 0.375 ) {
67  return  1;
68 } else if ( x < 0.5 ) {
69  return  8*(x-0.375) + 1;
70 } else {
71  return -8*(x-0.625) + 1;
72 }
73}
74
75int main (int argc, char * argv[]) {
76 int rate     = ROAR_RATE_DEFAULT;
77 int bits     = 16;
78 int channels = 1; /* mono */
79 int codec    = ROAR_CODEC_DEFAULT;
80 float freq   = 523.2;            /* middle C */
81 float t      = 0; /* current time */
82 float tcalc  = 0; /* current time for calculation */
83 float length = 5; /* 5 sec */
84 float step;       /* how much time per sample we have to encode ... */
85 roar_vs_t * vss;
86 int err;
87 int i;
88 int16_t out[1024];
89 double (*func)(double x) = sin;
90
91 for (i = 1; i < argc; i++) {
92  if ( !strcmp(argv[i], "--freq") ) {
93   freq   = atof(argv[++i]);
94  } else if ( !strcmp(argv[i], "--time") ) {
95   length = atof(argv[++i]);
96  } else if ( !strcmp(argv[i], "--sin") ) {
97   func   = sin;
98  } else if ( !strcmp(argv[i], "--rect") ) {
99   func   = rect;
100  } else if ( !strcmp(argv[i], "--saw") ) {
101   func   = saw;
102  } else if ( !strcmp(argv[i], "--tri") ) {
103   func   = tri;
104  } else if ( !strcmp(argv[i], "--trap") ) {
105   func   = trap;
106  } else {
107   return 2;
108  }
109 }
110
111 step   = M_PI*2*freq/rate;
112
113 if ( (vss = roar_vs_new_playback(NULL, "sine gen", rate, channels, codec, bits, &err)) == NULL ) {
114  fprintf(stderr, "Error: can not open playback: %s\n", roar_vs_strerr(err));
115  exit(1);
116 }
117
118 while (t < 2*M_PI*freq*length) {
119  for (i = 0; i < 1024; i++) {
120   out[i] = 32767*func(tcalc);
121   t     += step;
122   tcalc += step;
123  }
124  roar_vs_write(vss, out, 2048, NULL);
125
126  // this code enables us to generate the same signal for a long periode of time
127  // without loosing accuracy of the float type.
128  while (tcalc > 2*M_PI)
129   tcalc -= 2*M_PI;
130 }
131
132 roar_vs_close(vss, ROAR_VS_FALSE, NULL);
133
134 return 0;
135}
136
137#else
138int main (void) {
139 fprintf(stderr, "Error: No Math library support compiled in.\n");
140 return 1;
141}
142#endif
143
144//ll
Note: See TracBrowser for help on using the repository browser.