Changeset 1cf031a


Ignore:
Timestamp:
Nov 26, 2018, 11:34:45 AM (7 months ago)
Author:
Paul Brossier <piem@piem.org>
Branches:
feature/autosink, feature/constantq, feature/pitchshift, feature/pydocstrings, feature/timestretch, master
Children:
ce323e4
Parents:
bcc5387 (diff), ef0a430 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'fix/bufoverflow_tempo' (thanks to @niugx)

Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • src/tempo/tempo.c

    rbcc5387 r1cf031a  
    129129
    130130uint_t aubio_tempo_set_delay_ms(aubio_tempo_t * o, smpl_t delay) {
    131   o->delay = 1000. * delay * o->samplerate;
    132   return AUBIO_OK;
     131  return aubio_tempo_set_delay_s(o, delay / 1000.);
    133132}
    134133
     
    142141
    143142smpl_t aubio_tempo_get_delay_ms(aubio_tempo_t * o) {
    144   return o->delay / (smpl_t)(o->samplerate) / 1000.;
     143  return aubio_tempo_get_delay_s(o) * 1000.;
    145144}
    146145
     
    169168{
    170169  aubio_tempo_t * o = AUBIO_NEW(aubio_tempo_t);
    171   char_t specdesc_func[20];
     170  char_t specdesc_func[PATH_MAX];
    172171  o->samplerate = samplerate;
    173172  // check parameters are valid
     
    204203  aubio_peakpicker_set_threshold (o->pp, o->threshold);
    205204  if ( strcmp(tempo_mode, "default") == 0 ) {
    206     strcpy(specdesc_func, "specflux");
     205    strncpy(specdesc_func, "specflux", PATH_MAX - 1);
    207206  } else {
    208     strcpy(specdesc_func, tempo_mode);
     207    strncpy(specdesc_func, tempo_mode, PATH_MAX - 1);
     208    specdesc_func[PATH_MAX - 1] = '\0';
    209209  }
    210210  o->od       = new_aubio_specdesc(specdesc_func,buf_size);
     
    216216    onset2 = new_fvec(1);
    217217  }*/
     218  if (!o->dfframe || !o->fftgrain || !o->out || !o->pv ||
     219      !o->pp || !o->od || !o->of || !o->bt || !o->onset) {
     220    AUBIO_ERR("tempo: failed creating tempo object\n");
     221    goto beach;
     222  }
    218223  o->last_tatum = 0;
    219224  o->tatum_signature = 4;
     
    221226
    222227beach:
    223   AUBIO_FREE(o);
     228  del_aubio_tempo(o);
    224229  return NULL;
    225230}
     
    278283void del_aubio_tempo (aubio_tempo_t *o)
    279284{
    280   del_aubio_specdesc(o->od);
    281   del_aubio_beattracking(o->bt);
    282   del_aubio_peakpicker(o->pp);
    283   del_aubio_pvoc(o->pv);
    284   del_fvec(o->out);
    285   del_fvec(o->of);
    286   del_cvec(o->fftgrain);
    287   del_fvec(o->dfframe);
    288   del_fvec(o->onset);
     285  if (o->od)
     286    del_aubio_specdesc(o->od);
     287  if (o->bt)
     288    del_aubio_beattracking(o->bt);
     289  if (o->pp)
     290    del_aubio_peakpicker(o->pp);
     291  if (o->pv)
     292    del_aubio_pvoc(o->pv);
     293  if (o->out)
     294    del_fvec(o->out);
     295  if (o->of)
     296    del_fvec(o->of);
     297  if (o->fftgrain)
     298    del_cvec(o->fftgrain);
     299  if (o->dfframe)
     300    del_fvec(o->dfframe);
     301  if (o->onset)
     302    del_fvec(o->onset);
    289303  AUBIO_FREE(o);
    290   return;
    291 }
     304}
  • tests/src/tempo/test-tempo.c

    rbcc5387 r1cf031a  
    11#include <aubio.h>
    22#include "utils_tests.h"
     3
     4int test_wrong_params(void);
    35
    46int main (int argc, char **argv)
     
    79  if (argc < 2) {
    810    err = 2;
    9     PRINT_ERR("not enough arguments\n");
    10     PRINT_MSG("read a wave file as a mono vector\n");
    11     PRINT_MSG("usage: %s <source_path> [samplerate] [win_size] [hop_size]\n", argv[0]);
     11    PRINT_WRN("no arguments, running tests\n");
     12    if (test_wrong_params() != 0) {
     13      PRINT_ERR("tests failed!\n");
     14      err = 1;
     15    } else {
     16      err = 0;
     17    }
     18    PRINT_MSG("usage: %s <source_path> [samplerate] [win_size] [hop_size]\n",
     19        argv[0]);
    1220    return err;
    1321  }
     
    2129
    2230  char_t *source_path = argv[1];
    23   aubio_source_t * source = new_aubio_source(source_path, samplerate, hop_size);
     31  aubio_source_t * source = new_aubio_source(source_path, samplerate,
     32      hop_size);
    2433  if (!source) { err = 1; goto beach; }
    2534
     
    3140
    3241  // create tempo object
    33   aubio_tempo_t * o = new_aubio_tempo("default", win_size, hop_size, samplerate);
     42  aubio_tempo_t * o = new_aubio_tempo("default", win_size, hop_size,
     43      samplerate);
     44
     45  if (!o) { err = 1; goto beach_tempo; }
    3446
    3547  do {
     
    4052    // do something with the beats
    4153    if (out->data[0] != 0) {
    42       PRINT_MSG("beat at %.3fms, %.3fs, frame %d, %.2fbpm with confidence %.2f\n",
     54      PRINT_MSG("beat at %.3fms, %.3fs, frame %d, %.2f bpm "
     55          "with confidence %.2f\n",
    4356          aubio_tempo_get_last_ms(o), aubio_tempo_get_last_s(o),
    44           aubio_tempo_get_last(o), aubio_tempo_get_bpm(o), aubio_tempo_get_confidence(o));
     57          aubio_tempo_get_last(o), aubio_tempo_get_bpm(o),
     58          aubio_tempo_get_confidence(o));
    4559    }
    4660    n_frames += read;
     
    5468  // clean up memory
    5569  del_aubio_tempo(o);
     70beach_tempo:
    5671  del_fvec(in);
    5772  del_fvec(out);
     
    6277  return err;
    6378}
     79
     80int test_wrong_params(void)
     81{
     82  uint_t win_size = 1024;
     83  uint_t hop_size = 256;
     84  uint_t samplerate = 44100;
     85  aubio_tempo_t *t;
     86  fvec_t* in, *out;
     87  uint_t i;
     88
     89  // test wrong method fails
     90  if (new_aubio_tempo("unexisting_method", win_size, hop_size, samplerate))
     91    return 1;
     92
     93  // test hop > win fails
     94  if (new_aubio_tempo("default", hop_size, win_size, samplerate))
     95    return 1;
     96
     97  // test null hop_size fails
     98  if (new_aubio_tempo("default", win_size, 0, samplerate))
     99    return 1;
     100
     101  // test 1 buf_size fails
     102  if (new_aubio_tempo("default", 1, 1, samplerate))
     103    return 1;
     104
     105  // test null samplerate fails
     106  if (new_aubio_tempo("default", win_size, hop_size, 0))
     107    return 1;
     108
     109  // test short sizes workaround
     110  t = new_aubio_tempo("default", 2048, 2048, 500);
     111  if (!t)
     112    return 1;
     113
     114  del_aubio_tempo(t);
     115
     116  t = new_aubio_tempo("default", win_size, hop_size, samplerate);
     117  if (!t)
     118    return 1;
     119
     120  in = new_fvec(hop_size);
     121  out = new_fvec(1);
     122
     123  // up to step = (next_power_of_two(5.8 * samplerate / hop_size ) / 4 )
     124  for (i = 0; i < 256 + 1; i++)
     125  {
     126    aubio_tempo_do(t,in,out);
     127    PRINT_MSG("beat at %.3fms, %.3fs, frame %d, %.2f bpm "
     128        "with confidence %.2f, was tatum %d\n",
     129        aubio_tempo_get_last_ms(t), aubio_tempo_get_last_s(t),
     130        aubio_tempo_get_last(t), aubio_tempo_get_bpm(t),
     131        aubio_tempo_get_confidence(t), aubio_tempo_was_tatum(t));
     132  }
     133
     134  del_aubio_tempo(t);
     135  del_fvec(in);
     136  del_fvec(out);
     137
     138  return 0;
     139}
Note: See TracChangeset for help on using the changeset viewer.