98 lines · 3.7 KB · C
RawDownload
/* Simple example of using SoX libraries * * Copyright (c) 2009 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. */ #include "sox.h"#include <stdio.h> /* Concatenate audio files.  Note that the files must have the same number * of channels and the same sample rate. * * Usage: example4 input-1 input-2 [... input-n] output */ #define check(x) do if (!(x)) { \  fprintf(stderr, "check failed: %s\n", #x); goto error; } while (0) int main(int argc, char * argv[]){  sox_format_t * output = NULL;  int i;   check(argc >= 1 + 2 + 1); /* Need at least 2 input files + 1 output file. */  check(sox_init() == SOX_SUCCESS);   /* Defer openning the output file as we want to set its characteristics   * based on those of the input files. */   for (i = 1; i < argc - 1; ++i) { /* For each input file... */    sox_format_t * input;    static sox_signalinfo_t signal; /* static quashes `uninitialised' warning.*/     /* The (maximum) number of samples that we shall read/write at a time;     * chosen as a rough match to typical operating system I/O buffer size: */    #define MAX_SAMPLES (size_t)2048    sox_sample_t samples[MAX_SAMPLES]; /* Temporary store whilst copying. */    size_t number_read;     /* Open this input file: */    check(input = sox_open_read(argv[i], NULL, NULL, NULL));     if (i == 1) { /* If this is the first input file... */       /* Open the output file using the same signal and encoding character-       * istics as the first input file.  Note that here, input->signal.length       * will not be equal to the output file length so we are relying on       * libSoX to set the output length correctly (i.e. non-seekable output       * is not catered for); an alternative would be to first calculate the       * output length by summing the lengths of the input files and modifying       * the second parameter to sox_open_write accordingly. */      check(output = sox_open_write(argv[argc - 1],            &input->signal, &input->encoding, NULL, NULL, NULL));            /* Also, we'll store the signal characteristics of the first file       * so that we can check that these match those of the other inputs: */      signal = input->signal;    }    else { /* Second or subsequent input file... */       /* Check that this input file's signal matches that of the first file: */      check(input->signal.channels == signal.channels);      check(input->signal.rate == signal.rate);    }     /* Copy all of the audio from this input file to the output file: */    while ((number_read = sox_read(input, samples, MAX_SAMPLES)))      check(sox_write(output, samples, number_read) == number_read);     check(sox_close(input) == SOX_SUCCESS); /* Finished with this input file.*/  }   check(sox_close(output) == SOX_SUCCESS); /* Finished with the output file. */  output = NULL;  check(sox_quit() == SOX_SUCCESS);  return 0; error: /* Truncate output file on error: */  if (output) {    FILE * f;    sox_close(output);    if ((f = fopen(argv[argc - 1], "w"))) fclose(f);  }  return 1;}

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