118 lines · 4.3 KB · C
RawDownload
/* Simple example of using SoX libraries * * Copyright (c) 2008 robs@users.sourceforge.net * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifdef NDEBUG /* N.B. assert used with active statements so enable always. */#undef NDEBUG /* Must undef above assert.h or other that might include it. */#endif #include "sox.h"#include "util.h"#include <stdio.h>#include <math.h>#include <assert.h> /* * Reads input file and displays a few seconds of wave-form, starting from * a given time through the audio.   E.g. example2 song2.au 30.75 1 */int main(int argc, char * argv[]){  sox_format_t * in;  sox_sample_t * buf;  size_t blocks, block_size;  /* Period of audio over which we will measure its volume in order to   * display the wave-form: */  static const double block_period = 0.025; /* seconds */  double start_secs = 0, period = 2;  char dummy;  uint64_t seek;   /* All libSoX applications must start by initialising the SoX library */  assert(sox_init() == SOX_SUCCESS);   assert(argc > 1);  ++argv, --argc; /* Move to 1st parameter */   /* Open the input file (with default parameters) */  assert(in = sox_open_read(*argv, NULL, NULL, NULL));  ++argv, --argc; /* Move past this parameter */   if (argc) { /* If given, read the start time: */    assert(sscanf(*argv, "%lf%c", &start_secs, &dummy) == 1);    ++argv, --argc; /* Move past this parameter */  }   if (argc) { /* If given, read the period of time to display: */    assert(sscanf(*argv, "%lf%c", &period, &dummy) == 1);    ++argv, --argc; /* Move past this parameter */  }   /* Calculate the start position in number of samples: */  seek = start_secs * in->signal.rate * in->signal.channels + .5;  /* Make sure that this is at a `wide sample' boundary: */  seek -= seek % in->signal.channels;  /* Move the file pointer to the desired starting position */  assert(sox_seek(in, seek, SOX_SEEK_SET) == SOX_SUCCESS);   /* Convert block size (in seconds) to a number of samples: */  block_size = block_period * in->signal.rate * in->signal.channels + .5;  /* Make sure that this is at a `wide sample' boundary: */  block_size -= block_size % in->signal.channels;  /* Allocate a block of memory to store the block of audio samples: */  assert(buf = malloc(sizeof(sox_sample_t) * block_size));   /* This example program requires that the audio has precisely 2 channels: */  assert(in->signal.channels == 2);   /* Read and process blocks of audio for the selected period or until EOF: */  for (blocks = 0; sox_read(in, buf, block_size) == block_size && blocks * block_period < period; ++blocks) {    double left = 0, right = 0;    size_t i;    static const char line[] = "===================================";    int l, r;     for (i = 0; i < block_size; ++i) {      SOX_SAMPLE_LOCALS;      /* convert the sample from SoX's internal format to a `double' for       * processing in this application: */      double sample = SOX_SAMPLE_TO_FLOAT_64BIT(buf[i],);       /* The samples for each channel are interleaved; in this example       * we allow only stereo audio, so the left channel audio can be found in       * even-numbered samples, and the right channel audio in odd-numbered       * samples: */      if (i & 1)        right = max(right, fabs(sample)); /* Find the peak volume in the block */      else        left = max(left, fabs(sample)); /* Find the peak volume in the block */    }     /* Build up the wave form by displaying the left & right channel     * volume as a line length: */    l = (1 - left) * 35 + .5;    r = (1 - right) * 35 + .5;    printf("%8.3f%36s|%s\n", start_secs + blocks * block_period, line + l, line + r);  }   /* All done; tidy up: */  free(buf);  sox_close(in);  sox_quit();  return 0;}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t