Use libsndfile for wav output as well

This commit is contained in:
balr0g 2013-08-08 10:45:56 -04:00
parent e3bafe96e9
commit de3e5e7f60
6 changed files with 58 additions and 73 deletions

6
dsd.h
View File

@ -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;

View File

@ -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);

View File

@ -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);
}
*/
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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));