⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stat.c

📁 linux下录音程序
💻 C
字号:
/* * July 5, 1991 * Copyright 1991 Lance Norskog And Sundry Contributors * This source code is freely redistributable and may be used for * any purpose.  This copyright notice must be maintained.  * Lance Norskog And Sundry Contributors are not responsible for  * the consequences of using this software. *//* * Sound Tools statistics "effect" file. * * Build various statistics on file and print them. * No output. */#include "st.h"/* Private data for STAT effect */typedef struct statstuff {	LONG	min, max, mean;		/* amplitudes */	LONG	dmin, dmax, dmean;	/* deltas */	LONG	last;			/* previous sample */	int	first;	int	total;	int	volume;        ULONG   bin[4];} *stat_t;#define	abs(val)	(((val) < 0) ? -(val) : (val))/* * Process options */void stat_getopts(effp, n, argv) eff_t effp;int n;char **argv;{	stat_t stat = (stat_t) effp->priv;	stat->volume = 0;	if (n)	{		if (!(strcmp(argv[0], "-v")))			stat->volume = 1;		else if (!(strcmp(argv[0], "debug")))			stat->volume = 2;		else			fail("Summary effect only allows debug or -v as options.");	}}/* * Prepare processing. */void stat_start(effp)eff_t effp;{	stat_t stat = (stat_t) effp->priv;        int i;	stat->min = stat->dmin = 0x7fffffffL;	stat->max = stat->dmax = 0x80000000L;	stat->first = 1;	for (i = 0; i < 4; i++)		stat->bin[i] = 0;}/* * Processed signed long samples from ibuf to obuf. * Return number of samples processed. */void stat_flow(effp, ibuf, obuf, isamp, osamp)eff_t effp;LONG *ibuf, *obuf;int *isamp, *osamp;{	stat_t stat = (stat_t) effp->priv;	int len, done;	LONG samp, delta;	short count;	count = 0;	len = ((*isamp > *osamp) ? *osamp : *isamp);	for(done = 0; done < len; done++) {		/* work in absolute levels for both sample and delta */		samp = *ibuf++;	        *obuf++ = samp;		if (stat->volume == 2)		{#ifdef __alpha__		    fprintf(stderr,"%8x ",samp);#else		    fprintf(stderr,"%8lx ",samp);#endif		    if (count++ == 5)		    {		        fprintf(stderr,"\n");			count = 0;		    }		}                stat->bin[RIGHT(samp,30)+2]++;		samp = abs(samp);		if (samp < stat->min)			stat->min = samp;		if (samp > stat->max)			stat->max = samp;		if (stat->first) {			stat->first = 0;			stat->mean = samp;			stat->dmean = 0;		} else  {			/* overflow avoidance */			if ((stat->mean > 0x20000000L) || (samp > 0x20000000L))				stat->mean = stat->mean/2 + samp/2;			else				stat->mean = (stat->mean + samp)/2;			delta = abs(samp - stat->last);			if (delta < stat->dmin)				stat->dmin = delta;			if (delta > stat->dmax)				stat->dmax = delta;			/* overflow avoidance */			if ((delta > 0x20000000L) || (stat->dmean > 0x20000000L))				stat->dmean = stat->dmean/2 + delta/2;			else				stat->dmean = (stat->dmean + delta)/2;		}		stat->last = samp;	}	/* Process all samples */}/* * Do anything required when you stop reading samples.   * Don't close input file!  */voidstat_stop(effp)eff_t effp;{	stat_t stat = (stat_t) effp->priv;	double amp, range;        float x;	stat->min   = RIGHT(stat->min, 16);	stat->max   = RIGHT(stat->max, 16);	stat->mean  = RIGHT(stat->mean, 16);	stat->dmin  = RIGHT(stat->dmin, 16);	stat->dmax  = RIGHT(stat->dmax, 16);	stat->dmean = RIGHT(stat->dmean, 16);	range = 32767.0;	amp = - stat->min;	if (amp < stat->max)		amp = stat->max;	/* Just print the volume adjustment */	if (stat->volume == 1) {		fprintf(stderr, "%.3f\n", 32767.0/amp);		return;	}	else if (stat->volume == 2) {		fprintf(stderr, "\n");	}	/* print them out */	fprintf(stderr, "Maximum amplitude: %.3f\n", stat->max/range);	fprintf(stderr, "Minimum amplitude: %.3f\n", stat->min/range);	fprintf(stderr, "Mean    amplitude: %.3f\n", stat->mean/range);	fprintf(stderr, "Maximum delta:     %.3f\n", stat->dmax/range);	fprintf(stderr, "Minimum delta:     %.3f\n", stat->dmin/range);	fprintf(stderr, "Mean    delta:     %.3f\n", stat->dmean/range);	fprintf(stderr, "Volume adjustment: %.3f\n", 32767.0/amp);        if (stat->bin[2] == 0 && stat->bin[3] == 0)                fprintf(stderr, "\nProbably text, not sound\n");        else {                x = (float)(stat->bin[0] + stat->bin[3]) / (float)(stat->bin[1] + stat->bin[2]);                if (x >= 3.0)                        /* use opposite style */                        if (effp->ininfo.style == UNSIGNED)                                printf ("\nTry: -t raw -b -s \n");                        else                                printf ("\nTry: -t raw -b -u \n");                else if (x <= 1.0/3.0);              /* correctly decoded */                else if (x >= 0.5 && x <= 2.0)       /* use ULAW */                        if (effp->ininfo.style == ULAW)                                printf ("\nTry: -t raw -b -u \n");                        else                                printf ("\nTry: -t raw -b -U \n");                else                            fprintf (stderr, "\nCan't guess the type\n");        }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -