source: roaraudio/roarclients/roardtmf.c

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

updated copyright headers

File size: 4.1 KB
RevLine 
[3343]1//roardtmf.c:
2
3/*
[6052]4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008-2015
[3343]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.
[3343]23 *
24 */
25
26#include <roaraudio.h>
[5546]27#include <libroardsp/libroardsp.h>
[3344]28
29#ifdef ROAR_HAVE_LIBM
[3343]30#include <math.h>
31
32// in ms:
[5546]33#if 0
[3343]34#define ON_TIME  (180)
35#define OFF_TIME ( 80)
[5546]36#else
37#define ON_TIME  (180)
38#define OFF_TIME ( 80)
39#endif
[3343]40#define SUM_TIME (ON_TIME+OFF_TIME)
41
42void usage (void) {
[3508]43 printf("roardtmf [OPTIONS]... PHONE NUMBER\n");
[3343]44
45 printf("\nOptions:\n\n");
46
47 printf("  --server SERVER    - Set server hostname\n"
[5533]48        "  --rate  -R RATE    - Set sample rate\n"
[3343]49        "  --help             - Show this help\n"
[5547]50        "  --mode-dtmf        - Use standard DTMF (default)\n"
51        "  --mode-roar        - Use RoarAudio extended DTMF\n"
[3343]52       );
53
54}
55
56int main (int argc, char * argv[]) {
[5547]57 enum {
58  MODE_DTMF,
59  MODE_ROAR
60 } mode = MODE_DTMF;
[3343]61 int    rate     = ROAR_RATE_DEFAULT;
[5534]62 const char * server   = NULL;
63 const char * k;
[3343]64 int    i;
[5534]65 const char * name = "roardtmf";
[4929]66 roar_vs_t * vss = NULL;
[5534]67 const char * tones = NULL;
[3343]68 void * buf;
[5546]69 size_t len_break;
70 size_t len_tone;
[3343]71 size_t samples;
72 size_t len;
[5547]73 uint16_t c;
[5249]74 int err;
[3343]75
76 for (i = 1; i < argc; i++) {
77  k = argv[i];
78
79  if ( !strcmp(k, "--server") || !strcmp(k, "-s") ) {
[5945]80   ROAR_CKHAVEARGS(1);
[3343]81   server = argv[++i];
[5533]82  } else if ( !strcmp(k, "--rate") || !strcmp(k, "-r") || !strcmp(k, "-R") ) {
[5945]83   ROAR_CKHAVEARGS(1);
[4883]84   rate = roar_str2rate(argv[++i]);
[5547]85  } else if ( !strcmp(k, "--mode-dtmf") ) {
86   mode = MODE_DTMF;
87  } else if ( !strcmp(k, "--mode-roar") ) {
88   mode = MODE_ROAR;
[3343]89  } else if ( !strcmp(k, "--help") ) {
90   usage();
91   return 0;
92  } else if ( tones == NULL ) {
93   tones = argv[i++];
94  } else {
95   fprintf(stderr, "Error: unknown argument: %s\n", k);
96   usage();
97   return 1;
98  }
99 }
100
101 if ( tones == NULL ) {
102  return 1;
103 }
104
[5546]105 len_break = roar_dtmf_mus2samples(OFF_TIME * 1000, rate);
106 len_tone  = roar_dtmf_mus2samples(ON_TIME  * 1000, rate);
107 samples = len_break + len_tone;
[3343]108
[5547]109/*
[5546]110 printf("samples=%llu\n", (long long unsigned int)samples);
[3343]111 return 0;
112*/
113
[4929]114 if ( (buf = roar_mm_malloc((len = 16*samples/8))) == NULL )
[3343]115  return 4;
116
[5249]117 if ( (vss = roar_vs_new_playback(server, name, rate, 1, ROAR_CODEC_DEFAULT, 16, &err)) == NULL ) {
118  fprintf(stderr, "Error: can not start playback: %s\n", roar_vs_strerr(err));
[4014]119  roar_mm_free(buf);
[3343]120  return 1;
121 }
122
[3346]123 while ( (c = *tones) != 0 ) {
124  tones++;
125
[5547]126  if ( mode == MODE_DTMF ) {
127   if ( c == '+' || c == '.' || c == '_' )
128    continue;
129  } else if ( mode == MODE_ROAR ) {
130   c = ROAR_DTMF_CHAR_ROAR(c);
131  }
[3346]132
[5547]133  if ( mode == MODE_DTMF && c == ' ' ) {
[5546]134   roar_dtmf_break(buf, len_tone, rate, ROAR_DTMF_OPTIONS_NONE);
[5249]135  } else {
[5546]136   if ( roar_dtmf_tone(buf, len_tone, rate, ROAR_DTMF_OPTIONS_NONE, c) == -1 ) {
[5249]137    roar_mm_free(buf);
138    return 5;
139   }
140  }
[5553]141  roar_dtmf_tone(buf+len_tone*sizeof(int16_t), len_break, rate, ROAR_DTMF_OPTIONS_NONE,
142                 mode == MODE_DTMF ? ROAR_DTMF_CHAR_BREAK : ROAR_DTMF_CHAR_NOOP);
[5249]143  if ( roar_vs_write(vss, buf, len, &err) != (ssize_t)len ) {
144   fprintf(stderr, "Error: can not write data: %s\n", roar_vs_strerr(err));
[4014]145   roar_mm_free(buf);
[3343]146   return 5;
[4014]147  }
[3343]148 }
149
[4929]150 roar_vs_sync(vss, ROAR_VS_WAIT, NULL);
151
152 roar_vs_close(vss, ROAR_VS_FALSE, 0);
[3343]153
[4014]154 roar_mm_free(buf);
155
[3343]156 return 0;
157}
158
[3344]159#else
160int main (void) {
161 fprintf(stderr, "Error: No Math library support compiled in.\n");
162 return 1;
163}
164#endif
165
[3343]166//ll
Note: See TracBrowser for help on using the repository browser.