source: roaraudio/roarclients/roarsin.c

tip
Last change on this file was 6052:d48765b2475e, checked in by phi, 9 years ago

updated copyright headers

File size: 4.8 KB
RevLine 
[154]1//roarsin.c:
2
[669]3/*
[6052]4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008-2015
[669]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
[3517]21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
[669]23 *
24 */
25
[1103]26#include <roaraudio.h>  /* libroar */
27
28#ifdef ROAR_HAVE_LIBM
29
[154]30#include <math.h>       /* sin() */
31#include <stdio.h>      /* *printf*() */
32
[887]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
[888]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
[5533]75static void usage(const char * progname) {
76 fprintf(stderr, "Usage: %s [OPTIONS] [FUNCTION]\n", progname);
77
78 fprintf(stderr, "\nOptions:\n\n");
79 fprintf(stderr,
80         "  --help                  - Show this help\n"
81         "  --server SERVER         - Set server address\n"
82         "  --rate   -R  RATE       - Set sample rate to use\n"
83         "  --freq FREQ             - Set frequency (in Hz)\n"
84         "  --time TIME             - Set time (in sec)\n"
[5550]85         "  --volume VOL            - Set volume\n"
[5533]86        );
87
88 fprintf(stderr, "\nFunctions:\n\n");
89 fprintf(stderr,
90         "  --sin                   - Use Sinus\n"
91         "  --rect                  - Use Rectangle\n"
92         "  --saw                   - Use Saw\n"
93         "  --tri                   - Use Triangle\n"
94         "  --trap                  - Use Trap\n"
95        );
96}
97
[887]98int main (int argc, char * argv[]) {
[5950]99 const char * k;
[5533]100 const char * server = NULL;
[154]101 int rate     = ROAR_RATE_DEFAULT;
102 float freq   = 523.2;            /* middle C */
103 float t      = 0; /* current time */
[5186]104 float tcalc  = 0; /* current time for calculation */
[154]105 float length = 5; /* 5 sec */
[887]106 float step;       /* how much time per sample we have to encode ... */
[4885]107 roar_vs_t * vss;
108 int err;
[154]109 int i;
[887]110 int16_t out[1024];
111 double (*func)(double x) = sin;
[5550]112 double volume = 1;
[887]113
114 for (i = 1; i < argc; i++) {
[5950]115  k = argv[i];
116  if ( !strcmp(k, "--freq") ) {
117   ROAR_CKHAVEARGS(1);
[887]118   freq   = atof(argv[++i]);
[5950]119  } else if ( !strcmp(k, "--time") ) {
120   ROAR_CKHAVEARGS(1);
[887]121   length = atof(argv[++i]);
[5950]122  } else if ( !strcmp(k, "--server") ) {
123   ROAR_CKHAVEARGS(1);
[5533]124   server = argv[++i];
[5950]125  } else if ( !strcmp(k, "--rate") || !strcmp(k, "-R") ) {
126   ROAR_CKHAVEARGS(1);
[5533]127   rate = roar_str2rate(argv[++i]);
[5950]128  } else if ( !strcmp(k, "--volume") ) {
129   ROAR_CKHAVEARGS(1);
[5550]130   volume = atof(argv[++i]);
[5950]131  } else if ( !strcmp(k, "--sin") ) {
[887]132   func   = sin;
[5950]133  } else if ( !strcmp(k, "--rect") ) {
[888]134   func   = rect;
[5950]135  } else if ( !strcmp(k, "--saw") ) {
[887]136   func   = saw;
[5950]137  } else if ( !strcmp(k, "--tri") ) {
[887]138   func   = tri;
[5950]139  } else if ( !strcmp(k, "--trap") ) {
[888]140   func   = trap;
[5950]141  } else if ( !strcmp(k, "--help") ) {
[5533]142   usage(argv[0]);
143   return 0;
[887]144  } else {
[5533]145   usage(argv[0]);
[887]146   return 2;
147  }
148 }
149
150 step   = M_PI*2*freq/rate;
[154]151
[5549]152 if ( (vss = roar_vs_new_playback(server, "sine gen", rate, 1, ROAR_CODEC_DEFAULT, 16, &err)) == NULL ) {
[4885]153  fprintf(stderr, "Error: can not open playback: %s\n", roar_vs_strerr(err));
[154]154  exit(1);
155 }
156
[5550]157 if ( roar_vs_volume_mono(vss, volume, NULL) == 0 ) {
158  // If setting server volume successed set local volume to one.
159  volume = 1;
160 }
161
[154]162 while (t < 2*M_PI*freq*length) {
163  for (i = 0; i < 1024; i++) {
[5550]164   out[i] = 32767.*volume*func(tcalc);
[5186]165   t     += step;
166   tcalc += step;
[154]167  }
[5249]168  if ( roar_vs_write(vss, out, 2048, &err) != (ssize_t)2048 ) {
169   fprintf(stderr, "Error: can not write data: %s\n", roar_vs_strerr(err));
170   break;
171  }
[5186]172
173  // this code enables us to generate the same signal for a long periode of time
174  // without loosing accuracy of the float type.
175  while (tcalc > 2*M_PI)
176   tcalc -= 2*M_PI;
[154]177 }
178
[4885]179 roar_vs_close(vss, ROAR_VS_FALSE, NULL);
[154]180
181 return 0;
182}
183
[1103]184#else
185int main (void) {
186 fprintf(stderr, "Error: No Math library support compiled in.\n");
187 return 1;
188}
189#endif
190
[154]191//ll
Note: See TracBrowser for help on using the repository browser.