const char * UsageLines [] = {
"swpeaks: Display positive and negative peaks of specified",
"signed 16-bit PCM sound files.",
"Usage: swpeaks (input files)",
"Uses standard input if no input files specified.",
"Reads each sample as two bytes, least significant byte first.",
"For the purposes of this program:",
" MS LS",
"01111111 11111111 = +32767",
" .",
" .",
"00000000 00000000 = +0",
"11111111 11111111 = -0",
" .",
" .",
"10000000 00000000 = -32767",
"Only displays + peak if there are + values. Only displays - peak if",
"there are - values. If only one peak is shown, or if the peaks",
"aren't reasonably symmetrical, check if input really is",
"PCM signed ls-first.",
"If no peaks are displayed then the input contains no samples.",
"May 16, 2011. Newest is at gopher -p users/julianbr sdf.org",
};
const int NumUsageLines = sizeof (UsageLines)/sizeof (UsageLines [0] );
#include <stdio.h>
void Peaks (void)
{
unsigned long int value, peak, PositivePeak, NegativePeak;
int positive, negative;
int ls, ms;
positive = 0;
negative = 0;
PositivePeak = 0;
NegativePeak = 0;
ms = EOF;
ls = getchar ();
if (ls != EOF)
ms = getchar ();
while (ms != EOF) {
value = 256*(ms ^ 128) + ls;
if (value < 32768) {
negative = 1;
peak = 32767 - value;
if (NegativePeak < peak)
NegativePeak = peak;
}
else {
positive = 1;
peak = value - 32768;
if (PositivePeak < peak)
PositivePeak = peak;
}
ms = EOF;
ls = getchar ();
if (ls != EOF)
ms = getchar ();
}
if (negative)
printf ("-%lu", NegativePeak);
if (positive)
printf (",+%lu", PositivePeak);
putchar ('\n');
}
int main (int argc, char * argv [] )
{
int i;
if (argc > 1) {
fprintf (stderr, "***swpeaks: Unrecognized");
fprintf (stderr, " \"%s\".\n", argv [1] );
for (i = 0; i < NumUsageLines; i++)
printf ("%s\n", UsageLines [i] );
}
else
Peaks ();
return 0;
}