diff --git a/CMakeLists.txt b/CMakeLists.txt index 8690a6c..afd43cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}" "${CMAKE_INSTALL_PREFIX}/include") LINK_DIRECTORIES("${CMAKE_INSTALL_PREFIX}/lib") ADD_EXECUTABLE(dsd ${SRCS}) -TARGET_LINK_LIBRARIES(dsd mbe) +TARGET_LINK_LIBRARIES(dsd mbe sndfile) install(TARGETS dsd DESTINATION bin) diff --git a/dsd.h b/dsd.h index 90160a9..5515faa 100644 --- a/dsd.h +++ b/dsd.h @@ -36,7 +36,7 @@ #endif #include #include - +#include /* * global variables */ @@ -59,8 +59,14 @@ typedef struct int scoperate; char audio_in_dev[1024]; 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]; 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 playoffset; char mbe_out_dir[1024]; diff --git a/dsd_audio.c b/dsd_audio.c index e558dfd..3e0f2df 100644 --- a/dsd_audio.c +++ b/dsd_audio.c @@ -207,157 +207,185 @@ playSynthesizedVoice (dsd_opts * opts, dsd_state * state) void 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 - sample_info_t aset, aget; - - opts->audio_out_fd = open (opts->audio_out_dev, O_WRONLY); - if (opts->audio_out_fd == -1) - { - printf ("Error, couldn't open %s\n", opts->audio_out_dev); - exit (1); - } - - // get current - ioctl (opts->audio_out_fd, AUDIO_GETINFO, &aset); - - aset.record.sample_rate = speed; - aset.play.sample_rate = speed; - aset.record.channels = 1; - aset.play.channels = 1; - aset.record.precision = 16; - aset.play.precision = 16; - aset.record.encoding = AUDIO_ENCODING_LINEAR; - aset.play.encoding = AUDIO_ENCODING_LINEAR; - - if (ioctl (opts->audio_out_fd, AUDIO_SETINFO, &aset) == -1) - { - printf ("Error setting sample device parameters\n"); - exit (1); - } + sample_info_t aset, aget; + + opts->audio_out_fd = open (opts->audio_out_dev, O_WRONLY); + if (opts->audio_out_fd == -1) + { + printf ("Error, couldn't open %s\n", opts->audio_out_dev); + exit (1); + } + + // get current + ioctl (opts->audio_out_fd, AUDIO_GETINFO, &aset); + + aset.record.sample_rate = speed; + aset.play.sample_rate = speed; + aset.record.channels = 1; + aset.play.channels = 1; + aset.record.precision = 16; + aset.play.precision = 16; + aset.record.encoding = AUDIO_ENCODING_LINEAR; + aset.play.encoding = AUDIO_ENCODING_LINEAR; + + if (ioctl (opts->audio_out_fd, AUDIO_SETINFO, &aset) == -1) + { + printf ("Error setting sample device parameters\n"); + exit (1); + } #endif #if defined(BSD) && !defined(__APPLE__) - - int fmt; - - opts->audio_out_fd = open (opts->audio_out_dev, O_WRONLY); - if (opts->audio_out_fd == -1) - { - printf ("Error, couldn't open %s\n", opts->audio_out_dev); - opts->audio_out = 0; - } - - fmt = 0; - if (ioctl (opts->audio_out_fd, SNDCTL_DSP_RESET) < 0) - { - printf ("ioctl reset error \n"); - } - fmt = speed; - if (ioctl (opts->audio_out_fd, SNDCTL_DSP_SPEED, &fmt) < 0) - { - printf ("ioctl speed error \n"); - } - fmt = 0; - if (ioctl (opts->audio_out_fd, SNDCTL_DSP_STEREO, &fmt) < 0) - { - printf ("ioctl stereo error \n"); - } - fmt = AFMT_S16_LE; - if (ioctl (opts->audio_out_fd, SNDCTL_DSP_SETFMT, &fmt) < 0) - { - printf ("ioctl setfmt error \n"); - } - + + int fmt; + + opts->audio_out_fd = open (opts->audio_out_dev, O_WRONLY); + if (opts->audio_out_fd == -1) + { + printf ("Error, couldn't open %s\n", opts->audio_out_dev); + opts->audio_out = 0; + } + + fmt = 0; + if (ioctl (opts->audio_out_fd, SNDCTL_DSP_RESET) < 0) + { + printf ("ioctl reset error \n"); + } + fmt = speed; + if (ioctl (opts->audio_out_fd, SNDCTL_DSP_SPEED, &fmt) < 0) + { + printf ("ioctl speed error \n"); + } + fmt = 0; + if (ioctl (opts->audio_out_fd, SNDCTL_DSP_STEREO, &fmt) < 0) + { + printf ("ioctl stereo error \n"); + } + fmt = AFMT_S16_LE; + if (ioctl (opts->audio_out_fd, SNDCTL_DSP_SETFMT, &fmt) < 0) + { + printf ("ioctl setfmt error \n"); + } + #endif - + } printf ("Audio Out Device: %s\n", opts->audio_out_dev); } void 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 - sample_info_t aset, aget; - int rgain; - - rgain = 64; - - if (opts->split == 1) - { - opts->audio_in_fd = open (opts->audio_in_dev, O_RDONLY); - } - else - { - opts->audio_in_fd = open (opts->audio_in_dev, O_RDWR); - } - if (opts->audio_in_fd == -1) - { - printf ("Error, couldn't open /dev/audio\n"); - } - - // get current - ioctl (opts->audio_in_fd, AUDIO_GETINFO, &aset); - - aset.record.sample_rate = 48000; - aset.play.sample_rate = 48000; - aset.record.channels = 1; - aset.play.channels = 1; - aset.record.precision = 16; - aset.play.precision = 16; - aset.record.encoding = AUDIO_ENCODING_LINEAR; - aset.play.encoding = AUDIO_ENCODING_LINEAR; - aset.record.port = AUDIO_LINE_IN; - aset.record.gain = rgain; - - if (ioctl (opts->audio_in_fd, AUDIO_SETINFO, &aset) == -1) - { - printf ("Error setting sample device parameters\n"); - exit (1); - } + sample_info_t aset, aget; + int rgain; + + rgain = 64; + + if (opts->split == 1) + { + opts->audio_in_fd = open (opts->audio_in_dev, O_RDONLY); + } + else + { + opts->audio_in_fd = open (opts->audio_in_dev, O_RDWR); + } + if (opts->audio_in_fd == -1) + { + printf ("Error, couldn't open /dev/audio\n"); + } + + // get current + ioctl (opts->audio_in_fd, AUDIO_GETINFO, &aset); + + aset.record.sample_rate = 48000; + aset.play.sample_rate = 48000; + aset.record.channels = 1; + aset.play.channels = 1; + aset.record.precision = 16; + aset.play.precision = 16; + aset.record.encoding = AUDIO_ENCODING_LINEAR; + aset.play.encoding = AUDIO_ENCODING_LINEAR; + aset.record.port = AUDIO_LINE_IN; + aset.record.gain = rgain; + + if (ioctl (opts->audio_in_fd, AUDIO_SETINFO, &aset) == -1) + { + printf ("Error setting sample device parameters\n"); + exit (1); + } #endif #if defined(BSD) && !defined(__APPLE__) - int fmt; - - if (opts->split == 1) - { - opts->audio_in_fd = open (opts->audio_in_dev, O_RDONLY); - } - else - { - opts->audio_in_fd = open (opts->audio_in_dev, O_RDWR); - } - - if (opts->audio_in_fd == -1) - { - printf ("Error, couldn't open %s\n", opts->audio_in_dev); - opts->audio_out = 0; - } - - fmt = 0; - if (ioctl (opts->audio_in_fd, SNDCTL_DSP_RESET) < 0) - { - printf ("ioctl reset error \n"); - } - fmt = 48000; - if (ioctl (opts->audio_in_fd, SNDCTL_DSP_SPEED, &fmt) < 0) - { - printf ("ioctl speed error \n"); - } - fmt = 0; - if (ioctl (opts->audio_in_fd, SNDCTL_DSP_STEREO, &fmt) < 0) - { - printf ("ioctl stereo error \n"); - } - fmt = AFMT_S16_LE; - if (ioctl (opts->audio_in_fd, SNDCTL_DSP_SETFMT, &fmt) < 0) - { - printf ("ioctl setfmt error \n"); - } + int fmt; + + if (opts->split == 1) + { + opts->audio_in_fd = open (opts->audio_in_dev, O_RDONLY); + } + else + { + opts->audio_in_fd = open (opts->audio_in_dev, O_RDWR); + } + + if (opts->audio_in_fd == -1) + { + printf ("Error, couldn't open %s\n", opts->audio_in_dev); + opts->audio_out = 0; + } + + fmt = 0; + if (ioctl (opts->audio_in_fd, SNDCTL_DSP_RESET) < 0) + { + printf ("ioctl reset error \n"); + } + fmt = 48000; + if (ioctl (opts->audio_in_fd, SNDCTL_DSP_SPEED, &fmt) < 0) + { + printf ("ioctl speed error \n"); + } + fmt = 0; + if (ioctl (opts->audio_in_fd, SNDCTL_DSP_STEREO, &fmt) < 0) + { + printf ("ioctl stereo error \n"); + } + fmt = AFMT_S16_LE; + if (ioctl (opts->audio_in_fd, SNDCTL_DSP_SETFMT, &fmt) < 0) + { + printf ("ioctl setfmt error \n"); + } #endif - + } if (opts->split == 1) { printf ("Audio In Device: %s\n", opts->audio_in_dev); diff --git a/dsd_symbol.c b/dsd_symbol.c index b8fd812..9c4fcb0 100644 --- a/dsd_symbol.c +++ b/dsd_symbol.c @@ -78,8 +78,16 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync) } state->jitter = -1; } - - result = read (opts->audio_in_fd, &sample, 2); + if(opts->audio_in_type == 0) { + 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 GAIN 7.423339364e+00