From de3e5e7f6069535ad778e39bd815b0c5228faa9b Mon Sep 17 00:00:00 2001 From: balr0g Date: Thu, 8 Aug 2013 10:45:56 -0400 Subject: [PATCH] Use libsndfile for wav output as well --- dsd.h | 6 ++-- dsd_audio.c | 31 +++++++++++++++++++- dsd_file.c | 80 ++++++++++++---------------------------------------- dsd_main.c | 4 +-- dsd_mbe.c | 8 +++--- dsd_symbol.c | 2 +- 6 files changed, 58 insertions(+), 73 deletions(-) diff --git a/dsd.h b/dsd.h index 5515faa..f651cbb 100644 --- a/dsd.h +++ b/dsd.h @@ -75,8 +75,8 @@ typedef struct float audio_gain; int audio_out; char wav_out_file[1024]; - FILE *wav_out_f; - int wav_out_fd; + SNDFILE *wav_out_f; + //int wav_out_fd; int serial_baud; char serial_dev[1024]; int serial_fd; @@ -114,7 +114,7 @@ typedef struct float *audio_out_temp_buf_p; int audio_out_idx; int audio_out_idx2; - int wav_out_bytes; + //int wav_out_bytes; int center; int jitter; int synctype; diff --git a/dsd_audio.c b/dsd_audio.c index 3e0f2df..90150c9 100644 --- a/dsd_audio.c +++ b/dsd_audio.c @@ -153,6 +153,34 @@ processAudio (dsd_opts * opts, dsd_state * state) void writeSynthesizedVoice (dsd_opts * opts, dsd_state * state) { + int n; + short aout_buf[160]; + short *aout_buf_p; + +// for(n=0; n<160; n++) +// printf("%d ", ((short*)(state->audio_out_temp_buf))[n]); +// printf("\n"); + + aout_buf_p = aout_buf; + state->audio_out_temp_buf_p = state->audio_out_temp_buf; + + for (n = 0; n < 160; n++) + { + if (*state->audio_out_temp_buf_p > (float) 32767) + { + *state->audio_out_temp_buf_p = (float) 32767; + } + else if (*state->audio_out_temp_buf_p < (float) -32768) + { + *state->audio_out_temp_buf_p = (float) -32768; + } + *aout_buf_p = (short) *state->audio_out_temp_buf_p; + aout_buf_p++; + state->audio_out_temp_buf_p++; + } + + sf_write_short(opts->wav_out_f, aout_buf, 160); + /* int n; short aout_buf[160]; @@ -179,6 +207,7 @@ writeSynthesizedVoice (dsd_opts * opts, dsd_state * state) result = write (opts->wav_out_fd, aout_buf, 320); fflush (opts->wav_out_f); state->wav_out_bytes += 320; + */ } void @@ -215,7 +244,7 @@ openAudioOutDevice (dsd_opts * opts, int speed) 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_info->format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE; 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); diff --git a/dsd_file.c b/dsd_file.c index 28cef9f..3103a4b 100644 --- a/dsd_file.c +++ b/dsd_file.c @@ -272,75 +272,30 @@ void openWavOutFile (dsd_opts * opts, dsd_state * state) { - opts->wav_out_f = fopen (opts->wav_out_file, "w"); + // opts->wav_out_f = fopen (opts->wav_out_file, "w"); + + SF_INFO info; + info.samplerate = 8000; + info.channels = 1; + info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16 | SF_ENDIAN_LITTLE; + opts->wav_out_f = sf_open (opts->wav_out_file, SFM_WRITE, &info); + if (opts->wav_out_f == NULL) - { - printf ("Error - could not open wav output file %s\n", opts->wav_out_file); - return; - } - opts->wav_out_fd = fileno (opts->wav_out_f); - state->wav_out_bytes = 0; + { + printf ("Error - could not open wav output file %s\n", opts->wav_out_file); + return; + } - fprintf (opts->wav_out_f, "RIFF"); - // total length - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - fprintf (opts->wav_out_f, "WAVE"); - fprintf (opts->wav_out_f, "fmt "); - - // length of format chunk - fputc (16, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // always 0x1 - fputc (1, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // channels - fputc (1, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // sample rate - fputc (64, opts->wav_out_f); - fputc (31, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // bytes per second - fputc (176, opts->wav_out_f); - fputc (62, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // block align - fputc (2, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // bits/sample - fputc (16, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - // data chunk header - fprintf (opts->wav_out_f, "data"); - - // length of data - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - fputc (0, opts->wav_out_f); - - fflush (opts->wav_out_f); +// state->wav_out_bytes = 0; + } void closeWavOutFile (dsd_opts * opts, dsd_state * state) { + sf_close(opts->wav_out_f); +/* int length; if (opts->wav_out_f != NULL) @@ -350,7 +305,7 @@ closeWavOutFile (dsd_opts * opts, dsd_state * state) fprintf (opts->wav_out_f, "RIFF"); // total length - fputc (((36 + length) & 0xff), opts->wav_out_f); + fputc (((36 + length) & 0xff), opts->≈≈); fputc ((((36 + length) >> 8) & 0xff), opts->wav_out_f); fputc ((((36 + length) >> 16) & 0xff), opts->wav_out_f); fputc ((((36 + length) >> 24) & 0xff), opts->wav_out_f); @@ -403,4 +358,5 @@ closeWavOutFile (dsd_opts * opts, dsd_state * state) fflush (opts->wav_out_f); } + */ } diff --git a/dsd_main.c b/dsd_main.c index 9a12711..866fda5 100644 --- a/dsd_main.c +++ b/dsd_main.c @@ -106,7 +106,7 @@ initOpts (dsd_opts * opts) opts->audio_out = 1; opts->wav_out_file[0] = 0; opts->wav_out_f = NULL; - opts->wav_out_fd = -1; + //opts->wav_out_fd = -1; opts->serial_baud = 115200; sprintf (opts->serial_dev, "/dev/ttyUSB0"); opts->resume = 0; @@ -149,7 +149,7 @@ initState (dsd_state * state) state->audio_out_idx = 0; state->audio_out_idx2 = 0; state->audio_out_temp_buf_p = state->audio_out_temp_buf; - state->wav_out_bytes = 0; + //state->wav_out_bytes = 0; state->center = 0; state->jitter = -1; state->synctype = -1; diff --git a/dsd_mbe.c b/dsd_mbe.c index 43db40e..c061a28 100644 --- a/dsd_mbe.c +++ b/dsd_mbe.c @@ -38,12 +38,12 @@ playMbeFiles (dsd_opts * opts, dsd_state * state, int argc, char **argv) readImbe4400Data (opts, state, imbe_d); mbe_processImbe4400Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, imbe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); processAudio (opts, state); - if (opts->wav_out_fd != -1) + if (opts->wav_out_f != NULL) { writeSynthesizedVoice (opts, state); } - if (opts->audio_out == 1) + if (opts->audio_out != 1) { playSynthesizedVoice (opts, state); } @@ -53,7 +53,7 @@ playMbeFiles (dsd_opts * opts, dsd_state * state, int argc, char **argv) readAmbe2250Data (opts, state, ambe_d); mbe_processAmbe2250Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str, ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality); processAudio (opts, state); - if (opts->wav_out_fd != -1) + if (opts->wav_out_f != NULL) { writeSynthesizedVoice (opts, state); } @@ -114,7 +114,7 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a } processAudio (opts, state); - if (opts->wav_out_fd != -1) + if (opts->wav_out_f != NULL) { writeSynthesizedVoice (opts, state); } diff --git a/dsd_symbol.c b/dsd_symbol.c index 9c4fcb0..e8d3849 100644 --- a/dsd_symbol.c +++ b/dsd_symbol.c @@ -84,7 +84,7 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync) else { result = sf_read_short(opts->audio_in_file, &sample, 1); if(result == 0) { - exit(0); + cleanupAndExit (opts, state); } } // printf("res: %zd\n, offset: %lld", result, sf_seek(opts->audio_in_file, 0, SEEK_CUR));