```//
// Programmer:    Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Thu Feb 14 07:20:44 PST 2002
// Last Modified: Thu Aug 26 17:41:01 PDT 2004 (changed sqrt(2) to sqrt(2.0))
// Last Modified: Sun Aug 29 03:33:21 PDT 2004 (updated for compiling in GCC3)
// Filename:      ...soundfile/examples/sndpower.cpp
// Syntax:        C++
//
// Description:   Calculate the average signal power for given durations
//

#include "soundfile.h"
#include <stdlib.h>
#include <math.h>

#ifndef OLDCPP
#include <iostream>
using namespace std;
#else
#include <iostream.h>
#endif

#ifndef OLDCPP
#include <iostream>
#include <iomanip>
using namespace std;
#else
#include <iostream.h>
#include <iomanip.h>
#endif

int start, int chunk);

int main(int argc, char** argv) {
Options options;
options.define("a|average=i:10000", "Number of samples to average over");
options.define("s|start=i:0",       "Starting sample");
options.define("n|count=i:-1",      "Number of analyses to make");
options.define("all=b",       "calculate the energy of the entire file");
options.define("q|quiet=b",   "suppress printing of header info");

options.process(argc, argv);
if (options.getArgCount() == 0) {
cout << "Usage: " << options.getCommand()
<< " filename"
<< endl;
exit(1);
}

int chunk = options.getInteger("average");
int start = options.getInteger("start");
int totalframes = options.getInteger("count");
if (totalframes <= 0) {
totalframes = (soundfile.getSamples() - start)/chunk + 1;
}

if (!options.getBoolean("quiet")) {
cout << "; Filename        = " << options.getArg(1) << "\n";
cout << "; Samples         = " << soundfile.getSamples() << "\n";
if (start != 0) {
cout << "; Starting sample = " << start << "\n";
}
cout << "; Averaging size  = " << chunk << " samples" << "\n";
cout << "; Total frames    = " << totalframes << "\n";
cout << "; start-sample	dB	RMS		peak\n";
}

if (options.getBoolean("all")) {
printLongSummary(soundfile, 1, 0, soundfile.getSamples());
} else {
printLongSummary(soundfile, totalframes, start, chunk);
}

return 0;
}

//////////////////////////////
//
// printLongSummary --
//

void printLongSummary(SoundFileRead& soundfile, int totalframes, int start, int chunk) {
double sum, value, db, rms, peak;
int i, j, channel;
for (i=0; i<totalframes; i++) {
sum = 0.0;
cout << i * chunk << ":\t";
for (j=0; j<chunk; j++) {
for (channel=0; channel < soundfile.getChannels(); channel++) {
value = soundfile.getCurrentSampleDouble(channel);
sum += value * value;
}
soundfile.incrementSample();
}
if (sum == 0.0) {
db = -1000;
} else {
db = 10.0 * log10(sum/chunk/soundfile.getChannels());
}
rms = sqrt(sum/chunk/soundfile.getChannels());
peak = sqrt(2.0) * rms;
cout << db << '\t' << rms << '\t' << peak << "\n";
}
}

// md5sum: 5a53e4c5bd02e63d794c066cf9642a72 sndpower.cpp [20050403]
```