audacia/lib-src/libscorealign/audiofilereader-snd.cpp

84 lines
2.5 KiB
C++

/* audiofilereader.cpp -- implements a class to read samples
*
* 14-Jun-08 RBD
*/
#include "assert.h"
#include "stdio.h"
#include "string.h"
#include "snd.h"
#include "audioreader.h"
#include "audiofilereader.h"
double Audio_file_reader::get_sample_rate()
{
return snd.format.srate;
}
long Audio_file_reader::get_frames()
{
return (snd.u.file.end_offset - snd.u.file.byte_offset) /
snd_bytes_per_frame(&snd);
}
long Audio_file_reader::read(float *data, long n)
{
// note that "samples_per_frame" is really "frames_per_window" in this
// context, so we're computing bytes per window
char *input_data = (char *) alloca(bytes_per_frame * samples_per_frame);
assert(input_data != NULL) ;
// read into the end of data
long frames_read = snd_read(&snd, input_data, n);
// now convert and move to beginning of data
snd_node float_sound;
float_sound.format = snd.format;
float_sound.format.channels = 1; // make sure we convert to mono
float_sound.format.mode = SND_MODE_FLOAT; // and convert to float
float_sound.format.bits = 32;
// note: snd_convert takes a frame count; divide samples by channels
int converted = snd_convert(&float_sound, data, &snd, input_data, n);
if (frames_read == n) assert(converted == n);
return frames_read;
}
bool Audio_file_reader::open(char *filename, Scorealign &sa, bool verbose)
{
bytes_per_frame = 0; // initialize now in case an error occurs
snd.device = SND_DEVICE_FILE;
snd.write_flag = SND_READ;
strcpy(snd.u.file.filename, filename);
long flags;
int infile = snd_open(&snd, &flags);
if (infile == SND_SUCCESS) {
bytes_per_frame = snd_bytes_per_frame(&snd);
calculate_parameters(sa, verbose);
return true;
}
return false;
}
void Audio_file_reader::close()
{
snd_close(&snd);
}
void Audio_file_reader::print_info()
{
printf(" file name = %s\n", snd.u.file.filename);
double sample_rate = snd.format.srate;
printf(" sample rate = %g\n", sample_rate);
printf(" channels = %d\n", snd.format.channels);
/*=============================================================*/
long frames =(snd.u.file.end_offset - snd.u.file.byte_offset) /
snd_bytes_per_frame(&snd);
printf(" total frames number is = %d\n", frames);
printf(" bits per sample is %d\n", snd.format.bits);
printf(" audio duration = %g seconds\n", (frames) / sample_rate);
/*=============================================================*/
}