From bc0ce5e439abc95d33727e8dc15c3d9db7c64801 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Mon, 10 Oct 2022 09:20:14 +0200 Subject: [PATCH] audio testcard: WAV reading to separate func refactorization only + revert a condition (use positive branch first) --- src/audio/capture/testcard.cpp | 134 ++++++++++++++++++--------------- 1 file changed, 73 insertions(+), 61 deletions(-) diff --git a/src/audio/capture/testcard.cpp b/src/audio/capture/testcard.cpp index 89005d990..5644faee4 100644 --- a/src/audio/capture/testcard.cpp +++ b/src/audio/capture/testcard.cpp @@ -173,6 +173,68 @@ static char *get_ebu_signal(int sample_rate, int bps, int channels, int frequenc return ret; } +static bool audio_testcard_read_wav(const char *wav_filename, struct audio_frame *audio_frame, + char **audio_samples, unsigned int *total_samples, + unsigned long long int *chunk_size) { + FILE *wav = fopen(wav_filename, "r"); + if(!wav) { + LOG(LOG_LEVEL_ERROR) << MOD_NAME << "Unable to open WAV file: " << wav_filename << ".\n"; + return false; + } + struct wav_metadata metadata; + int ret = read_wav_header(wav, &metadata); + if(ret != WAV_HDR_PARSE_OK) { + log_msg(LOG_LEVEL_ERROR, "%s\n", get_wav_error(ret)); + fclose(wav); + return false; + } + audio_frame->bps = audio_capture_bps ? audio_capture_bps : metadata.bits_per_sample / 8; + audio_frame->ch_count = metadata.ch_count; + audio_frame->sample_rate = metadata.sample_rate; + if (*chunk_size == 0) { + *chunk_size = audio_frame->sample_rate / CHUNKS_PER_SEC; + } + + *total_samples = metadata.data_size * 8ULL / metadata.ch_count / metadata.bits_per_sample; + LOG(LOG_LEVEL_VERBOSE) << MOD_NAME << *total_samples << " samples read from file " << wav_filename << "\n"; + + const int headroom = (*chunk_size - 1) * audio_frame->ch_count * audio_frame->bps; + const int samples_data_size = *total_samples * audio_frame->ch_count * audio_frame->bps; + + const int audio_samples_size = samples_data_size + headroom; + *audio_samples = (char *) calloc(1, audio_samples_size); + + char *read_to; + char *tmp = NULL; + if ((unsigned) audio_frame->bps == metadata.bits_per_sample / 8) { + read_to = *audio_samples; + } else { + tmp = (char *) calloc(1, metadata.data_size); + read_to = tmp; + } + unsigned int samples = wav_read(read_to, *total_samples, wav, &metadata); + int bytes = samples * (metadata.bits_per_sample / 8) * metadata.ch_count; + if (samples != *total_samples) { + LOG(samples > 0 ? LOG_LEVEL_WARNING : LOG_LEVEL_ERROR) << MOD_NAME << "Warning: premature end of WAV file (" << bytes << " read, " << metadata.data_size << " expected)!\n"; + if (samples == 0) { + fclose(wav); + return false; + } + *total_samples = samples; + } + fclose(wav); + + if ((unsigned) audio_frame->bps != metadata.bits_per_sample / 8){ + change_bps(*audio_samples, audio_frame->bps, tmp, metadata.bits_per_sample / 8, bytes); + free(tmp); + } + + memcpy(*audio_samples + samples_data_size, *audio_samples, headroom); + + return true; +} + + static void * audio_cap_testcard_init(struct module *parent, const char *cfg) { UNUSED(parent); @@ -181,7 +243,6 @@ static void * audio_cap_testcard_init(struct module *parent, const char *cfg) double volume = DEFAULT_VOLUME; int frequency = DEFAULT_FREQUENCY; - int chunk_size = 0; enum { SINE, EBU, @@ -224,7 +285,7 @@ static void * audio_cap_testcard_init(struct module *parent, const char *cfg) wav_file = item + strlen("file="); pattern = WAV; } else if(strncasecmp(item, "frames=", strlen("frames=")) == 0) { - chunk_size = atoi(item + strlen("frames=")); + s->chunk_size = atoi(item + strlen("frames=")); } else if (strncasecmp(item, "frequency=", strlen("frequency=")) == 0) { frequency = atoi(item + strlen("frequency=")); } else if(strstr(item, "crescendo") == item) { @@ -255,12 +316,20 @@ static void * audio_cap_testcard_init(struct module *parent, const char *cfg) return nullptr; } - if (pattern != WAV) { + if (pattern == WAV) { + if (!audio_testcard_read_wav(wav_file.c_str(), &s->audio, + &s->audio_samples, &s->total_samples, &s->chunk_size)) { + delete s; + return NULL; + } + } else { s->audio.ch_count = audio_capture_channels > 0 ? audio_capture_channels : DEFAULT_AUDIO_CAPTURE_CHANNELS; s->audio.sample_rate = audio_capture_sample_rate ? audio_capture_sample_rate : DEFAULT_AUDIO_SAMPLE_RATE; s->audio.bps = audio_capture_bps ? audio_capture_bps : DEFAULT_AUDIO_BPS; - s->chunk_size = chunk_size ? chunk_size : s->audio.sample_rate / CHUNKS_PER_SEC; + if (s->chunk_size == 0) { + s->chunk_size = s->audio.sample_rate / CHUNKS_PER_SEC; + } assert(s->chunk_size > 0); switch (pattern) { case CRESCENDO: @@ -291,63 +360,6 @@ static void * audio_cap_testcard_init(struct module *parent, const char *cfg) s->audio.ch_count * s->audio.bps) + s->chunk_size - 1); memcpy(s->audio_samples + s->total_samples * s->audio.bps * s->audio.ch_count, s->audio_samples, s->chunk_size - 1); - } else { - FILE *wav = fopen(wav_file.c_str(), "r"); - if(!wav) { - LOG(LOG_LEVEL_ERROR) << MOD_NAME << "Unable to open WAV file: " << wav_file << ".\n"; - delete s; - return NULL; - } - struct wav_metadata metadata; - int ret = read_wav_header(wav, &metadata); - if(ret != WAV_HDR_PARSE_OK) { - log_msg(LOG_LEVEL_ERROR, "%s\n", get_wav_error(ret)); - fclose(wav); - delete s; - return NULL; - } - s->audio.bps = audio_capture_bps ? audio_capture_bps : metadata.bits_per_sample / 8; - s->audio.ch_count = metadata.ch_count; - s->audio.sample_rate = metadata.sample_rate; - s->chunk_size = chunk_size ? chunk_size : s->audio.sample_rate / CHUNKS_PER_SEC; - - s->total_samples = metadata.data_size * 8ULL / metadata.ch_count / metadata.bits_per_sample; - LOG(LOG_LEVEL_VERBOSE) << MOD_NAME << s->total_samples << " samples read from file " << wav_file << "\n"; - - const int headroom = (s->chunk_size - 1) * s->audio.ch_count * s->audio.bps; - const int samples_data_size = s->total_samples * s->audio.ch_count * s->audio.bps; - - const int audio_samples_size = samples_data_size + headroom; - s->audio_samples = (char *) calloc(1, audio_samples_size); - - char *read_to; - char *tmp = NULL; - if ((unsigned) s->audio.bps == metadata.bits_per_sample / 8) { - read_to = s->audio_samples; - } else { - tmp = (char *) calloc(1, metadata.data_size); - read_to = tmp; - } - unsigned int samples = wav_read(read_to, s->total_samples, wav, &metadata); - int bytes = samples * (metadata.bits_per_sample / 8) * metadata.ch_count; - if (samples != s->total_samples) { - LOG(samples > 0 ? LOG_LEVEL_WARNING : LOG_LEVEL_ERROR) << MOD_NAME << "Warning: premature end of WAV file (" << bytes << " read, " << metadata.data_size << " expected)!\n"; - if (samples == 0) { - fclose(wav); - delete s; - return NULL; - } - s->total_samples = samples; - } - fclose(wav); - - if ((unsigned) s->audio.bps != metadata.bits_per_sample / 8){ - change_bps(s->audio_samples, s->audio.bps, tmp, metadata.bits_per_sample / 8, bytes); - free(tmp); - } - - - memcpy(s->audio_samples + samples_data_size, s->audio_samples, headroom); } s->audio.data_len = s->chunk_size * s->audio.bps * s->audio.ch_count;