alsa and sox questions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi!

  I use followinc c code to check record level. It will take two optinal
parameters: positive integer is time in seconds and negative interger is
warning level in decibels when program will send bell character to
terminal in addition to normal output.

  Output is rms level and peak leven.

-- 
Mr. Ari Moisio, Niittykatu 7, 41160 Tikkakoski, +358-40-5055239
ari.moisio at iki.fi http://www.iki.fi/arimo PGP-keyID: 0x3FAF0F05


// Record level 'meter'
// Results: rms / peak in db.
// Compile gcc -lm vumeter.c -o vumeter
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <math.h>

int signo = 0;

void handler(int sno)
{
signo = sno;
}

int main(int argc, char **argv)
{
int t_val, max, secs = 5, retval = 0, c_rms = 0, warn = -1, tmp;
long s_cnt = 0, s_sum = 0;
float level = 0.0, rms=0.0, max_level=99.9, s_rms=0.0;
FILE *dsp_fd;

signal(SIGINT, handler);

for (tmp = 1; tmp < argc; tmp++)
	{
	t_val = atoi(argv[tmp]);
	if (t_val > 0) secs = t_val;
	if (t_val < 0) warn = -t_val;
	}
// endfor

dsp_fd = fopen("/dev/dsp","r");
max = 0;
s_sum = 0;
for (; secs > 0 && signo == 0; secs -= 1)
	{
	max = 0;
	s_sum = 0;
	s_cnt = 0;
	for (s_cnt = 1; s_cnt <= 8000; s_cnt++)
		{
		t_val = fgetc(dsp_fd) - 0x80;
		if (t_val < 0) t_val = -t_val;
		if (t_val > 127) t_val = 127;
		if (t_val > max) max = t_val;
		s_sum += t_val * t_val;
		}
	// endfor
	if (signo ==0)
		{
		level = (log10(127.0 / max)) * 20;
		rms = (log10(127.0 / sqrt(s_sum / s_cnt)) * 20);
		if (level < warn) printf("\a");
		printf("%4.1f / %4.1f\n", -rms, -level);
		if (level < max_level) max_level = level;
		s_rms += rms;
		c_rms++;
		}
	// endif signo eq 0
	}
// endfor secs
fclose(dsp_fd);

printf("============\n%4.1f / %4.1f\n", -s_rms / c_rms, -max_level);
retval = floor(max_level);

return retval;
}






[Index of Archives]     [Linux for the Blind]     [Fedora Discussioin]     [Linux Kernel]     [Yosemite News]     [Big List of Linux Books]
  Powered by Linux