source: examples/utils.c @ 9430dfd

feature/autosinkfeature/cnnfeature/cnn_orgfeature/constantqfeature/crepefeature/crepe_orgfeature/pitchshiftfeature/pydocstringsfeature/timestretchfix/ffmpeg5pitchshiftsamplertimestretchyinfft+
Last change on this file since 9430dfd was 9430dfd, checked in by Paul Brossier <piem@piem.org>, 12 years ago

examples/utils.c: dummy functions if no sndfile

  • Property mode set to 100644
File size: 11.5 KB
Line 
1/*
2  Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
3
4  This file is part of aubio.
5
6  aubio is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10
11  aubio is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU General Public License for more details.
15
16  You should have received a copy of the GNU General Public License
17  along with aubio.  If not, see <http://www.gnu.org/licenses/>.
18
19*/
20
21/**
22
23  This file includes some tools common to all examples. Code specific to the
24  algorithm performed by each program should go in the source file of that
25  program instead.
26
27*/
28
29#include "utils.h"
30
31#ifdef HAVE_LASH
32#include <lash/lash.h>
33#include <pthread.h>
34lash_client_t *aubio_lash_client;
35lash_args_t *lash_args;
36void *lash_thread_main (void *data);
37int lash_main (void);
38void save_data (void);
39void restore_data (lash_config_t * lash_config);
40pthread_t lash_thread;
41#endif /* HAVE_LASH */
42
43/* settings */
44const char *output_filename = NULL;
45const char *input_filename = NULL;
46const char *onset_filename =
47    AUBIO_PREFIX "/share/sounds/" PACKAGE "/woodblock.aiff";
48int frames = 0;
49int verbose = 0;
50int usejack = 0;
51int frames_delay = 0;
52
53
54char_t * pitch_unit = "default";
55char_t * pitch_mode = "default";
56
57/* energy,specdiff,hfc,complexdomain,phase */
58char_t * onset_mode = "default";
59smpl_t threshold = 0.0;         // leave unset, only set as asked
60smpl_t silence = -90.;
61uint_t buffer_size = 512;       //1024;
62uint_t overlap_size = 256;      //512;
63uint_t samplerate = 44100;
64
65
66#ifdef HAVE_SNDFILE
67aubio_sndfile_t *file = NULL;
68aubio_sndfile_t *fileout = NULL;
69#else
70void *file = NULL;
71void *fileout = NULL;
72#endif
73
74fvec_t *ibuf;
75fvec_t *obuf;
76fvec_t *woodblock;
77
78/* badly redeclare some things */
79smpl_t threshold;
80smpl_t averaging;
81const char *prog_name;
82
83void flush_process (aubio_process_func_t process_func,
84    aubio_print_func_t print);
85
86void
87usage (FILE * stream, int exit_code)
88{
89  fprintf (stream, "usage: %s [ options ] \n", prog_name);
90  fprintf (stream,
91      "       -h      --help          Display this message.\n"
92      "       -v      --verbose       Be verbose.\n"
93      "       -j      --jack          Use Jack.\n"
94      "       -o      --output        Output type.\n"
95      "       -i      --input         Input type.\n"
96      "       -O      --onset         Select onset detection algorithm.\n"
97      "       -t      --threshold     Set onset detection threshold.\n"
98      "       -s      --silence       Select silence threshold.\n"
99      "       -p      --pitch         Select pitch detection algorithm.\n"
100      "       -B      --bufsize       Set buffer size.\n"
101      "       -H      --hopsize       Set hopsize.\n"
102      "       -a      --averaging     Use averaging.\n");
103  exit (exit_code);
104}
105
106int
107parse_args (int argc, char **argv)
108{
109  const char *options = "hvjo:i:O:t:s:p:B:H:a";
110  int next_option;
111  struct option long_options[] = {
112    {"help", 0, NULL, 'h'},
113    {"verbose", 0, NULL, 'v'},
114    {"jack", 0, NULL, 'j'},
115    {"output", 1, NULL, 'o'},
116    {"input", 1, NULL, 'i'},
117    {"onset", 1, NULL, 'O'},
118    {"threshold", 1, NULL, 't'},
119    {"silence", 1, NULL, 's'},
120    {"pitch", 1, NULL, 'p'},
121    {"averaging", 0, NULL, 'a'},
122    {"bufsize", 1, NULL, 'B'},
123    {"hopsize", 1, NULL, 'H'},
124    {NULL, 0, NULL, 0}
125  };
126#ifdef HAVE_LASH
127  lash_args = lash_extract_args (&argc, &argv);
128#endif /* HAVE_LASH */
129  prog_name = argv[0];
130  if (argc < 1) {
131    usage (stderr, 1);
132    return -1;
133  }
134  do {
135    next_option = getopt_long (argc, argv, options, long_options, NULL);
136    switch (next_option) {
137      case 'o':
138        output_filename = optarg;
139        break;
140      case 'i':
141        input_filename = optarg;
142        break;
143      case 'h':                /* help */
144        usage (stdout, 0);
145        return -1;
146      case 'v':                /* verbose */
147        verbose = 1;
148        break;
149      case 'j':
150        usejack = 1;
151        break;
152      case 'O':                /*onset type */
153        onset_mode = optarg;
154        break;
155      case 's':                /* silence value for onset */
156        silence = (smpl_t) atof (optarg);
157        break;
158      case 't':                /* threshold value for onset */
159        threshold = (smpl_t) atof (optarg);
160        break;
161      case 'p':
162        pitch_mode = optarg;
163        break;
164      case 'a':
165        averaging = 1;
166        break;
167      case 'B':
168        buffer_size = atoi (optarg);
169        break;
170      case 'H':
171        overlap_size = atoi (optarg);
172        break;
173      case '?':                /* unknown options */
174        usage (stderr, 1);
175        break;
176      case -1:                 /* done with options */
177        break;
178      default:                 /*something else unexpected */
179        fprintf (stderr, "Error parsing option '%c'\n", next_option);
180        abort ();
181    }
182  }
183  while (next_option != -1);
184
185  if (input_filename != NULL) {
186    debug ("Input file : %s\n", input_filename);
187  } else if (input_filename != NULL && output_filename != NULL) {
188    debug ("Input file : %s\n", input_filename);
189    debug ("Output file : %s\n", output_filename);
190  } else {
191#if HAVE_JACK
192    debug ("Jack input output\n");
193    usejack = 1;
194#else
195    debug
196        ("Error: Could not switch to jack mode\n   aubio was compiled without jack support\n");
197    exit (1);
198#endif
199  }
200
201  return 0;
202}
203
204#ifdef HAVE_SNDFILE
205
206void
207examples_common_init (int argc, char **argv)
208{
209
210  uint_t found_wood = 0;
211
212  aubio_sndfile_t *onsetfile = NULL;
213  /* parse command line arguments */
214  parse_args (argc, argv);
215
216  if (!usejack) {
217    debug ("Opening files ...\n");
218    file = new_aubio_sndfile_ro (input_filename);
219    if (file == NULL) {
220      outmsg ("Could not open input file %s.\n", input_filename);
221      exit (1);
222    }
223    if (verbose)
224      aubio_sndfile_info (file);
225    samplerate = aubio_sndfile_samplerate (file);
226    if (output_filename != NULL)
227      fileout = new_aubio_sndfile_wo (file, output_filename);
228  }
229#ifdef HAVE_LASH
230  else {
231    aubio_lash_client = lash_init (lash_args, argv[0],
232        LASH_Config_Data_Set | LASH_Terminal, LASH_PROTOCOL (2, 0));
233    if (!aubio_lash_client) {
234      fprintf (stderr, "%s: could not initialise lash\n", __FUNCTION__);
235    }
236    /* tell the lash server our client id */
237    if (lash_enabled (aubio_lash_client)) {
238      lash_event_t *event =
239          (lash_event_t *) lash_event_new_with_type (LASH_Client_Name);
240      lash_event_set_string (event, "aubio");
241      lash_send_event (aubio_lash_client, event);
242      pthread_create (&lash_thread, NULL, lash_thread_main, NULL);
243    }
244  }
245#endif /* HAVE_LASH */
246
247  woodblock = new_fvec (overlap_size);
248  if (output_filename || usejack) {
249    /* dummy assignement to keep egcs happy */
250    found_wood = (onsetfile = new_aubio_sndfile_ro (onset_filename)) ||
251        (onsetfile = new_aubio_sndfile_ro ("sounds/woodblock.aiff")) ||
252        (onsetfile = new_aubio_sndfile_ro ("../sounds/woodblock.aiff"));
253    if (onsetfile == NULL) {
254      outmsg ("Could not find woodblock.aiff\n");
255      exit (1);
256    }
257  }
258  if (onsetfile) {
259    /* read the output sound once */
260    aubio_sndfile_read_mono (onsetfile, overlap_size, woodblock);
261  }
262
263  ibuf = new_fvec (overlap_size);
264  obuf = new_fvec (overlap_size);
265
266}
267
268#else /* HAVE_SNDFILE */
269
270void
271examples_common_init (int argc, char **argv)
272{
273  outmsg ("Error, compiled without sndfile, nothing to do for now!\n");
274}
275
276
277#endif /* HAVE_SNDFILE */
278
279
280void
281examples_common_del (void)
282{
283  uint_t i;
284  del_fvec (ibuf);
285  del_fvec (obuf);
286  del_fvec (woodblock);
287  aubio_cleanup ();
288}
289
290#if HAVE_JACK
291aubio_jack_t *jack_setup;
292#endif
293
294#if HAVE_SNDFILE
295
296void
297examples_common_process (aubio_process_func_t process_func,
298    aubio_print_func_t print)
299{
300  if (usejack) {
301
302#if HAVE_JACK
303    debug ("Jack init ...\n");
304    jack_setup = new_aubio_jack (1, 1,
305        0, 1, (aubio_process_func_t) process_func);
306    debug ("Jack activation ...\n");
307    aubio_jack_activate (jack_setup);
308    debug ("Processing (Ctrl+C to quit) ...\n");
309    pause ();
310    aubio_jack_close (jack_setup);
311#else
312    usage (stderr, 1);
313    outmsg ("Compiled without jack output, exiting.\n");
314#endif
315
316  } else {
317    /* phasevoc */
318    debug ("Processing ...\n");
319
320    frames = 0;
321
322    while ((signed) overlap_size ==
323        aubio_sndfile_read_mono (file, overlap_size, ibuf)) {
324      process_func (&ibuf->data, &obuf->data, overlap_size);
325      print ();
326      if (output_filename != NULL) {
327        aubio_sndfile_write (fileout, overlap_size, &obuf);
328      }
329      frames++;
330    }
331
332    debug ("Processed %d frames of %d samples.\n", frames, buffer_size);
333
334    flush_process (process_func, print);
335    del_aubio_sndfile (file);
336
337    if (output_filename != NULL)
338      del_aubio_sndfile (fileout);
339
340  }
341}
342
343#else /* HAVE_SNDFILE */
344
345void
346examples_common_process (aubio_process_func_t process_func,
347    aubio_print_func_t print)
348{
349}
350
351#endif /* HAVE_SNDFILE */
352
353void
354flush_process (aubio_process_func_t process_func, aubio_print_func_t print)
355{
356  uint_t i;
357  fvec_zeros(obuf);
358  for (i = 0; (signed) i < frames_delay; i++) {
359    process_func (&ibuf->data, &obuf->data, overlap_size);
360    print ();
361  }
362}
363
364void
365send_noteon (int pitch, int velo)
366{
367  smpl_t mpitch = floor (aubio_freqtomidi (pitch) + .5);
368#if HAVE_JACK
369  jack_midi_event_t ev;
370  ev.size = 3;
371  ev.buffer = malloc (3 * sizeof (jack_midi_data_t)); // FIXME
372  ev.time = 0;
373  if (usejack) {
374    ev.buffer[2] = velo;
375    ev.buffer[1] = mpitch;
376    if (velo == 0) {
377      ev.buffer[0] = 0x80;      /* note off */
378    } else {
379      ev.buffer[0] = 0x90;      /* note on */
380    }
381    aubio_jack_midi_event_write (jack_setup, (jack_midi_event_t *) & ev);
382  } else
383#endif
384  if (!verbose) {
385    if (velo == 0) {
386      outmsg ("%f\n", frames * overlap_size / (float) samplerate);
387    } else {
388      outmsg ("%f\t%f\t", mpitch, frames * overlap_size / (float) samplerate);
389    }
390  }
391}
392
393
394#if HAVE_LASH
395
396void *
397lash_thread_main (void *data __attribute__ ((unused)))
398{
399  printf ("LASH thread running\n");
400
401  while (!lash_main ())
402    usleep (1000);
403
404  printf ("LASH thread finished\n");
405  return NULL;
406}
407
408int
409lash_main (void)
410{
411  lash_event_t *lash_event;
412  lash_config_t *lash_config;
413
414  while ((lash_event = lash_get_event (aubio_lash_client))) {
415    switch (lash_event_get_type (lash_event)) {
416      case LASH_Quit:
417        lash_event_destroy (lash_event);
418        exit (1);
419        return 1;
420      case LASH_Restore_Data_Set:
421        lash_send_event (aubio_lash_client, lash_event);
422        break;
423      case LASH_Save_Data_Set:
424        save_data ();
425        lash_send_event (aubio_lash_client, lash_event);
426        break;
427      case LASH_Server_Lost:
428        return 1;
429      default:
430        printf ("%s: received unknown LASH event of type %d",
431            __FUNCTION__, lash_event_get_type (lash_event));
432        lash_event_destroy (lash_event);
433        break;
434    }
435  }
436
437  while ((lash_config = lash_get_config (aubio_lash_client))) {
438    restore_data (lash_config);
439    lash_config_destroy (lash_config);
440  }
441
442  return 0;
443}
444
445void
446save_data ()
447{
448  lash_config_t *lash_config;
449
450  lash_config = lash_config_new_with_key ("threshold");
451  lash_config_set_value_double (lash_config, threshold);
452  lash_send_config (aubio_lash_client, lash_config);
453
454}
455
456void
457restore_data (lash_config_t * lash_config)
458{
459  const char *lash_key;
460
461  lash_key = lash_config_get_key (lash_config);
462
463  if (strcmp (lash_key, "threshold") == 0) {
464    threshold = lash_config_get_value_double (lash_config);
465    return;
466  }
467
468}
469
470#endif /* HAVE_LASH */
Note: See TracBrowser for help on using the repository browser.