1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-04 17:49:45 +02:00
audacity/lib-src/twolame/frontend/audioin_sndfile.c
2010-01-24 09:19:39 +00:00

158 lines
4.1 KiB
C

/*
* TwoLAME: an optimized MPEG Audio Layer Two encoder
*
* Copyright (C) 2004-2007 The TwoLAME Project
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* $Id: audioin_sndfile.c,v 1.1 2008-02-01 19:44:26 richardash1981 Exp $
*
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sndfile.h>
#include "frontend.h"
/*
format_duration_string()
Create human readable duration string from libsndfile info
*/
static char* format_duration_string( SF_INFO *sfinfo )
{
float seconds;
int minutes;
char * string = malloc( MAX_NAME_SIZE );
if (sfinfo->frames==0 || sfinfo->samplerate==0) {
snprintf( string, MAX_NAME_SIZE, "Unknown" );
return string;
}
// Calculate the number of minutes and seconds
seconds = sfinfo->frames / sfinfo->samplerate;
minutes = (seconds / 60 );
seconds -= (minutes * 60);
// Create a string out of it
snprintf( string, MAX_NAME_SIZE, "%imin %1.1fsec", minutes, seconds);
return string;
}
/*
print_info_sndfile()
Display information about input file
*/
static void print_info_sndfile(struct audioin_s *audioin )
{
SNDFILE* file = audioin->file;
SF_FORMAT_INFO format_info;
SF_FORMAT_INFO subformat_info;
char sndlibver[128];
char *duration = NULL;
// Get the format
format_info.format = audioin->sfinfo->format & SF_FORMAT_TYPEMASK;
sf_command (file, SFC_GET_FORMAT_INFO, &format_info, sizeof(format_info)) ;
// Get the sub-format info
subformat_info.format = audioin->sfinfo->format & SF_FORMAT_SUBMASK;
sf_command (file, SFC_GET_FORMAT_INFO, &subformat_info, sizeof(subformat_info)) ;
// Get the version of libsndfile
sf_command (file, SFC_GET_LIB_VERSION, sndlibver, sizeof(sndlibver));
// Get human readable duration of the input file
duration = format_duration_string( audioin->sfinfo );
fprintf(stderr, "Input Format: %s, %s\n", format_info.name, subformat_info.name );
fprintf(stderr, "Input Duration: %s\n", duration );
fprintf(stderr, "Input Library: %s\n", sndlibver);
free( duration );
}
/* Read in some audio samples into buffer */
static int read_sndfile( audioin_t* audioin, short *buffer, int samples)
{
SNDFILE* file = audioin->file;
return sf_read_short( file, buffer, samples );
}
/* Return error string (or NULL) */
static const char* error_str_sndfile( audioin_t* audioin )
{
SNDFILE* file = audioin->file;
if (sf_error(file) == SF_ERR_NO_ERROR) {
// No error
return NULL;
} else {
// Return error string
return sf_strerror( file );
}
}
static int close_sndfile( audioin_t* audioin )
{
SNDFILE* file = audioin->file;
free( audioin );
return sf_close( file );
}
audioin_t* open_audioin_sndfile( char* filename, SF_INFO *sfinfo )
{
audioin_t* audioin = NULL;
// Allocate memory for structure
audioin = malloc( sizeof( audioin_t ) );
if (audioin==NULL) {
fprintf(stderr, "Failed to allocate memory for audioin_t structure.\n");
exit(ERR_MEM_ALLOC);
}
// Open the input file by filename
audioin->file = sf_open(filename, SFM_READ, sfinfo);
// Check for errors
if (audioin->file == NULL) {
fprintf(stderr, "Failed to open input file (%s):\n", filename);
fprintf(stderr, " %s\n", sf_strerror(NULL));
exit(ERR_OPENING_INPUT);
}
// Fill-in data structure
audioin->samplesize = 0;
audioin->sfinfo = sfinfo;
audioin->print_info = print_info_sndfile;
audioin->read = read_sndfile;
audioin->error_str = error_str_sndfile;
audioin->close = close_sndfile;
return audioin;
}