Changeset 3025:e0985044be84 in roaraudio


Ignore:
Timestamp:
11/01/09 10:49:24 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

wrote a bad working beat detection

File:
1 edited

Legend:

Unmodified
Added
Removed
  • roarclients/roarvumeter.c

    r3024 r3025  
    3232#define BUFSIZE 1024 
    3333 
    34 #define MODE_PC    1 
    35 #define MODE_DB    2 
     34#define MODE_PC    0x01 
     35#define MODE_DB    0x02 
     36#define MODE_BEAT  0x04 
    3637 
    3738void usage (void) { 
     
    5152 
    5253int vumeter16bit2ch (struct roar_vio_calls * vio, int samples, int16_t * buf, int mode, struct roardsp_filterchain * fc) { 
     54 struct roar_stream    beat_stream[1]; 
     55 struct roardsp_filter beat_lp[1]; 
     56 float                 beat_lpfreq = 1; 
    5357 int i; 
    5458 int samples_half = samples/2; 
    5559 int64_t suml, sumr; 
    5660 double  rmsl, rmsr; 
    57  int run_filters = roardsp_fchain_num(fc); 
     61 int run_filters    = roardsp_fchain_num(fc); 
     62 int beat_detection = mode & MODE_BEAT; 
     63 char * beat[2]     = {"     ", "Beat!"}; 
     64 char * dbeat       = beat[0]; 
     65 int16_t beat_val, beat_old; 
     66 
     67 if ( beat_detection ) { 
     68  mode -= MODE_BEAT; 
     69 
     70  roar_stream_new(beat_stream, 10, 1, 16, ROAR_CODEC_PCM); 
     71  roardsp_filter_init(beat_lp, beat_stream, ROARDSP_FILTER_LOWP); 
     72  roardsp_filter_ctl(beat_lp, ROARDSP_FCTL_FREQ, &beat_lpfreq); 
     73 } 
    5874 
    5975 printf("\e[s"); 
     
    7591  rmsr = sqrt((double)sumr/(double)samples_half); 
    7692 
     93  if ( beat_detection ) { 
     94   beat_old = beat_val = (rmsl + rmsr) / 2; 
     95   roardsp_filter_calc(beat_lp, &beat_val, 2); 
     96   if ( (float)beat_old > (float)beat_val*1.15f ) { 
     97    dbeat = beat[1]; 
     98   } else { 
     99    dbeat = beat[0]; 
     100   } 
     101  } 
     102 
    77103  switch (mode) { 
    78104   case MODE_PC: 
    79      printf("L: %3i%% R: %3i%%          \e[u", (int)(rmsl/327.68), (int)(rmsr/327.68)); 
     105     printf("L: %3i%% R: %3i%% %s          \e[u", (int)(rmsl/327.68), (int)(rmsr/327.68), dbeat); 
    80106    break; 
    81107   case MODE_DB: 
    82      printf("L: %6.2fdB R: %6.2fdB          \e[u", 20*log10(rmsl/32768.), 20*log10(rmsr/32768.)); 
     108     printf("L: %6.2fdB R: %6.2fdB %s          \e[u", 20*log10(rmsl/32768.), 20*log10(rmsr/32768.), dbeat); 
    83109    break; 
    84110  } 
     
    86112  fflush(stdout); 
    87113 } 
     114 
     115 roardsp_filter_uninit(beat_lp); 
     116 
    88117 return 0; 
    89118} 
     
    125154 struct roar_vio_calls stream, re; 
    126155 int    i; 
    127  int    mode = MODE_PC; 
     156 int    mode = 0; 
    128157 
    129158 for (i = 1; i < argc; i++) { 
     
    141170   samples = atoi(argv[++i]); 
    142171  } else if ( strcmp(k, "--db") == 0 ) { 
    143    mode = MODE_DB; 
     172   mode |= MODE_DB; 
     173  } else if ( strcmp(k, "--beat") == 0 ) { 
     174   mode |= MODE_BEAT; 
    144175  } else if ( strcmp(k, "--lowpass") == 0 ) { 
    145176   lowpass_freq = atof(argv[++i]); 
     
    154185 } 
    155186 
     187 if ( !mode ) 
     188  mode = MODE_PC; 
     189 
    156190 if ( samples == -1 ) 
    157191  samples = rate/10; 
Note: See TracChangeset for help on using the changeset viewer.