mirror of https://github.com/lwvmobile/dsd-fme.git
Use libsndfile for wav file input
This commit is contained in:
parent
260ec82ea1
commit
e3bafe96e9
|
|
@ -7,7 +7,7 @@ INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}" "${CMAKE_INSTALL_PREFIX}/include")
|
||||||
LINK_DIRECTORIES("${CMAKE_INSTALL_PREFIX}/lib")
|
LINK_DIRECTORIES("${CMAKE_INSTALL_PREFIX}/lib")
|
||||||
|
|
||||||
ADD_EXECUTABLE(dsd ${SRCS})
|
ADD_EXECUTABLE(dsd ${SRCS})
|
||||||
TARGET_LINK_LIBRARIES(dsd mbe)
|
TARGET_LINK_LIBRARIES(dsd mbe sndfile)
|
||||||
|
|
||||||
install(TARGETS dsd DESTINATION bin)
|
install(TARGETS dsd DESTINATION bin)
|
||||||
|
|
||||||
|
|
|
||||||
8
dsd.h
8
dsd.h
|
|
@ -36,7 +36,7 @@
|
||||||
#endif
|
#endif
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <mbelib.h>
|
#include <mbelib.h>
|
||||||
|
#include <sndfile.h>
|
||||||
/*
|
/*
|
||||||
* global variables
|
* global variables
|
||||||
*/
|
*/
|
||||||
|
|
@ -59,8 +59,14 @@ typedef struct
|
||||||
int scoperate;
|
int scoperate;
|
||||||
char audio_in_dev[1024];
|
char audio_in_dev[1024];
|
||||||
int audio_in_fd;
|
int audio_in_fd;
|
||||||
|
SNDFILE *audio_in_file;
|
||||||
|
SF_INFO *audio_in_file_info;
|
||||||
|
int audio_in_type; // 0 for device, 1 for file
|
||||||
char audio_out_dev[1024];
|
char audio_out_dev[1024];
|
||||||
int audio_out_fd;
|
int audio_out_fd;
|
||||||
|
SNDFILE *audio_out_file;
|
||||||
|
SF_INFO *audio_out_file_info;
|
||||||
|
int audio_out_type; // 0 for device, 1 for file
|
||||||
int split;
|
int split;
|
||||||
int playoffset;
|
int playoffset;
|
||||||
char mbe_out_dir[1024];
|
char mbe_out_dir[1024];
|
||||||
|
|
|
||||||
264
dsd_audio.c
264
dsd_audio.c
|
|
@ -207,157 +207,185 @@ playSynthesizedVoice (dsd_opts * opts, dsd_state * state)
|
||||||
void
|
void
|
||||||
openAudioOutDevice (dsd_opts * opts, int speed)
|
openAudioOutDevice (dsd_opts * opts, int speed)
|
||||||
{
|
{
|
||||||
|
// get info of device/file
|
||||||
|
struct stat stat_buf;
|
||||||
|
stat(opts->audio_out_dev, &stat_buf);
|
||||||
|
if(S_ISREG(stat_buf.st_mode)) { // is this a regular file? then process with libsndfile.
|
||||||
|
opts->audio_out_type = 1;
|
||||||
|
opts->audio_out_file_info = calloc(1, sizeof(SF_INFO));
|
||||||
|
opts->audio_out_file_info->samplerate = 48000;
|
||||||
|
opts->audio_out_file_info->channels = 1;
|
||||||
|
opts->audio_out_file_info->format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
|
||||||
|
opts->audio_out_file = sf_open(opts->audio_out_dev, SFM_READ, opts->audio_out_file_info);
|
||||||
|
if(opts->audio_out_file == NULL) {
|
||||||
|
printf ("Error, couldn't open file %s\n", opts->audio_in_dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // this is a device, use old handling
|
||||||
|
|
||||||
#ifdef SOLARIS
|
#ifdef SOLARIS
|
||||||
sample_info_t aset, aget;
|
sample_info_t aset, aget;
|
||||||
|
|
||||||
opts->audio_out_fd = open (opts->audio_out_dev, O_WRONLY);
|
opts->audio_out_fd = open (opts->audio_out_dev, O_WRONLY);
|
||||||
if (opts->audio_out_fd == -1)
|
if (opts->audio_out_fd == -1)
|
||||||
{
|
{
|
||||||
printf ("Error, couldn't open %s\n", opts->audio_out_dev);
|
printf ("Error, couldn't open %s\n", opts->audio_out_dev);
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get current
|
// get current
|
||||||
ioctl (opts->audio_out_fd, AUDIO_GETINFO, &aset);
|
ioctl (opts->audio_out_fd, AUDIO_GETINFO, &aset);
|
||||||
|
|
||||||
aset.record.sample_rate = speed;
|
aset.record.sample_rate = speed;
|
||||||
aset.play.sample_rate = speed;
|
aset.play.sample_rate = speed;
|
||||||
aset.record.channels = 1;
|
aset.record.channels = 1;
|
||||||
aset.play.channels = 1;
|
aset.play.channels = 1;
|
||||||
aset.record.precision = 16;
|
aset.record.precision = 16;
|
||||||
aset.play.precision = 16;
|
aset.play.precision = 16;
|
||||||
aset.record.encoding = AUDIO_ENCODING_LINEAR;
|
aset.record.encoding = AUDIO_ENCODING_LINEAR;
|
||||||
aset.play.encoding = AUDIO_ENCODING_LINEAR;
|
aset.play.encoding = AUDIO_ENCODING_LINEAR;
|
||||||
|
|
||||||
if (ioctl (opts->audio_out_fd, AUDIO_SETINFO, &aset) == -1)
|
if (ioctl (opts->audio_out_fd, AUDIO_SETINFO, &aset) == -1)
|
||||||
{
|
{
|
||||||
printf ("Error setting sample device parameters\n");
|
printf ("Error setting sample device parameters\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(BSD) && !defined(__APPLE__)
|
#if defined(BSD) && !defined(__APPLE__)
|
||||||
|
|
||||||
int fmt;
|
int fmt;
|
||||||
|
|
||||||
opts->audio_out_fd = open (opts->audio_out_dev, O_WRONLY);
|
opts->audio_out_fd = open (opts->audio_out_dev, O_WRONLY);
|
||||||
if (opts->audio_out_fd == -1)
|
if (opts->audio_out_fd == -1)
|
||||||
{
|
{
|
||||||
printf ("Error, couldn't open %s\n", opts->audio_out_dev);
|
printf ("Error, couldn't open %s\n", opts->audio_out_dev);
|
||||||
opts->audio_out = 0;
|
opts->audio_out = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt = 0;
|
fmt = 0;
|
||||||
if (ioctl (opts->audio_out_fd, SNDCTL_DSP_RESET) < 0)
|
if (ioctl (opts->audio_out_fd, SNDCTL_DSP_RESET) < 0)
|
||||||
{
|
{
|
||||||
printf ("ioctl reset error \n");
|
printf ("ioctl reset error \n");
|
||||||
}
|
}
|
||||||
fmt = speed;
|
fmt = speed;
|
||||||
if (ioctl (opts->audio_out_fd, SNDCTL_DSP_SPEED, &fmt) < 0)
|
if (ioctl (opts->audio_out_fd, SNDCTL_DSP_SPEED, &fmt) < 0)
|
||||||
{
|
{
|
||||||
printf ("ioctl speed error \n");
|
printf ("ioctl speed error \n");
|
||||||
}
|
}
|
||||||
fmt = 0;
|
fmt = 0;
|
||||||
if (ioctl (opts->audio_out_fd, SNDCTL_DSP_STEREO, &fmt) < 0)
|
if (ioctl (opts->audio_out_fd, SNDCTL_DSP_STEREO, &fmt) < 0)
|
||||||
{
|
{
|
||||||
printf ("ioctl stereo error \n");
|
printf ("ioctl stereo error \n");
|
||||||
}
|
}
|
||||||
fmt = AFMT_S16_LE;
|
fmt = AFMT_S16_LE;
|
||||||
if (ioctl (opts->audio_out_fd, SNDCTL_DSP_SETFMT, &fmt) < 0)
|
if (ioctl (opts->audio_out_fd, SNDCTL_DSP_SETFMT, &fmt) < 0)
|
||||||
{
|
{
|
||||||
printf ("ioctl setfmt error \n");
|
printf ("ioctl setfmt error \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
printf ("Audio Out Device: %s\n", opts->audio_out_dev);
|
printf ("Audio Out Device: %s\n", opts->audio_out_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
openAudioInDevice (dsd_opts * opts)
|
openAudioInDevice (dsd_opts * opts)
|
||||||
{
|
{
|
||||||
|
// get info of device/file
|
||||||
|
struct stat stat_buf;
|
||||||
|
stat(opts->audio_in_dev, &stat_buf);
|
||||||
|
if(S_ISREG(stat_buf.st_mode)) { // is this a regular file? then process with libsndfile.
|
||||||
|
opts->audio_in_type = 1;
|
||||||
|
opts->audio_in_file_info = calloc(1, sizeof(SF_INFO));
|
||||||
|
opts->audio_in_file_info->channels = 1;
|
||||||
|
opts->audio_in_file = sf_open(opts->audio_in_dev, SFM_READ, opts->audio_in_file_info);
|
||||||
|
if(opts->audio_in_file == NULL) {
|
||||||
|
printf ("Error, couldn't open file %s\n", opts->audio_in_dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // this is a device, use old handling
|
||||||
|
opts->audio_in_type = 0;
|
||||||
#ifdef SOLARIS
|
#ifdef SOLARIS
|
||||||
sample_info_t aset, aget;
|
sample_info_t aset, aget;
|
||||||
int rgain;
|
int rgain;
|
||||||
|
|
||||||
rgain = 64;
|
rgain = 64;
|
||||||
|
|
||||||
if (opts->split == 1)
|
if (opts->split == 1)
|
||||||
{
|
{
|
||||||
opts->audio_in_fd = open (opts->audio_in_dev, O_RDONLY);
|
opts->audio_in_fd = open (opts->audio_in_dev, O_RDONLY);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
opts->audio_in_fd = open (opts->audio_in_dev, O_RDWR);
|
opts->audio_in_fd = open (opts->audio_in_dev, O_RDWR);
|
||||||
}
|
}
|
||||||
if (opts->audio_in_fd == -1)
|
if (opts->audio_in_fd == -1)
|
||||||
{
|
{
|
||||||
printf ("Error, couldn't open /dev/audio\n");
|
printf ("Error, couldn't open /dev/audio\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// get current
|
// get current
|
||||||
ioctl (opts->audio_in_fd, AUDIO_GETINFO, &aset);
|
ioctl (opts->audio_in_fd, AUDIO_GETINFO, &aset);
|
||||||
|
|
||||||
aset.record.sample_rate = 48000;
|
aset.record.sample_rate = 48000;
|
||||||
aset.play.sample_rate = 48000;
|
aset.play.sample_rate = 48000;
|
||||||
aset.record.channels = 1;
|
aset.record.channels = 1;
|
||||||
aset.play.channels = 1;
|
aset.play.channels = 1;
|
||||||
aset.record.precision = 16;
|
aset.record.precision = 16;
|
||||||
aset.play.precision = 16;
|
aset.play.precision = 16;
|
||||||
aset.record.encoding = AUDIO_ENCODING_LINEAR;
|
aset.record.encoding = AUDIO_ENCODING_LINEAR;
|
||||||
aset.play.encoding = AUDIO_ENCODING_LINEAR;
|
aset.play.encoding = AUDIO_ENCODING_LINEAR;
|
||||||
aset.record.port = AUDIO_LINE_IN;
|
aset.record.port = AUDIO_LINE_IN;
|
||||||
aset.record.gain = rgain;
|
aset.record.gain = rgain;
|
||||||
|
|
||||||
if (ioctl (opts->audio_in_fd, AUDIO_SETINFO, &aset) == -1)
|
if (ioctl (opts->audio_in_fd, AUDIO_SETINFO, &aset) == -1)
|
||||||
{
|
{
|
||||||
printf ("Error setting sample device parameters\n");
|
printf ("Error setting sample device parameters\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(BSD) && !defined(__APPLE__)
|
#if defined(BSD) && !defined(__APPLE__)
|
||||||
int fmt;
|
int fmt;
|
||||||
|
|
||||||
if (opts->split == 1)
|
if (opts->split == 1)
|
||||||
{
|
{
|
||||||
opts->audio_in_fd = open (opts->audio_in_dev, O_RDONLY);
|
opts->audio_in_fd = open (opts->audio_in_dev, O_RDONLY);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
opts->audio_in_fd = open (opts->audio_in_dev, O_RDWR);
|
opts->audio_in_fd = open (opts->audio_in_dev, O_RDWR);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opts->audio_in_fd == -1)
|
if (opts->audio_in_fd == -1)
|
||||||
{
|
{
|
||||||
printf ("Error, couldn't open %s\n", opts->audio_in_dev);
|
printf ("Error, couldn't open %s\n", opts->audio_in_dev);
|
||||||
opts->audio_out = 0;
|
opts->audio_out = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt = 0;
|
fmt = 0;
|
||||||
if (ioctl (opts->audio_in_fd, SNDCTL_DSP_RESET) < 0)
|
if (ioctl (opts->audio_in_fd, SNDCTL_DSP_RESET) < 0)
|
||||||
{
|
{
|
||||||
printf ("ioctl reset error \n");
|
printf ("ioctl reset error \n");
|
||||||
}
|
}
|
||||||
fmt = 48000;
|
fmt = 48000;
|
||||||
if (ioctl (opts->audio_in_fd, SNDCTL_DSP_SPEED, &fmt) < 0)
|
if (ioctl (opts->audio_in_fd, SNDCTL_DSP_SPEED, &fmt) < 0)
|
||||||
{
|
{
|
||||||
printf ("ioctl speed error \n");
|
printf ("ioctl speed error \n");
|
||||||
}
|
}
|
||||||
fmt = 0;
|
fmt = 0;
|
||||||
if (ioctl (opts->audio_in_fd, SNDCTL_DSP_STEREO, &fmt) < 0)
|
if (ioctl (opts->audio_in_fd, SNDCTL_DSP_STEREO, &fmt) < 0)
|
||||||
{
|
{
|
||||||
printf ("ioctl stereo error \n");
|
printf ("ioctl stereo error \n");
|
||||||
}
|
}
|
||||||
fmt = AFMT_S16_LE;
|
fmt = AFMT_S16_LE;
|
||||||
if (ioctl (opts->audio_in_fd, SNDCTL_DSP_SETFMT, &fmt) < 0)
|
if (ioctl (opts->audio_in_fd, SNDCTL_DSP_SETFMT, &fmt) < 0)
|
||||||
{
|
{
|
||||||
printf ("ioctl setfmt error \n");
|
printf ("ioctl setfmt error \n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
if (opts->split == 1)
|
if (opts->split == 1)
|
||||||
{
|
{
|
||||||
printf ("Audio In Device: %s\n", opts->audio_in_dev);
|
printf ("Audio In Device: %s\n", opts->audio_in_dev);
|
||||||
|
|
|
||||||
12
dsd_symbol.c
12
dsd_symbol.c
|
|
@ -78,8 +78,16 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync)
|
||||||
}
|
}
|
||||||
state->jitter = -1;
|
state->jitter = -1;
|
||||||
}
|
}
|
||||||
|
if(opts->audio_in_type == 0) {
|
||||||
result = read (opts->audio_in_fd, &sample, 2);
|
result = read (opts->audio_in_fd, &sample, 2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result = sf_read_short(opts->audio_in_file, &sample, 1);
|
||||||
|
if(result == 0) {
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// printf("res: %zd\n, offset: %lld", result, sf_seek(opts->audio_in_file, 0, SEEK_CUR));
|
||||||
{
|
{
|
||||||
#define NZEROS 60
|
#define NZEROS 60
|
||||||
#define GAIN 7.423339364e+00
|
#define GAIN 7.423339364e+00
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue