diff options
Diffstat (limited to 'src/lib/formats/wavfile.cpp')
-rw-r--r-- | src/lib/formats/wavfile.cpp | 76 |
1 files changed, 36 insertions, 40 deletions
diff --git a/src/lib/formats/wavfile.cpp b/src/lib/formats/wavfile.cpp index 072be6c92a2..6cce494f1c8 100644 --- a/src/lib/formats/wavfile.cpp +++ b/src/lib/formats/wavfile.cpp @@ -8,11 +8,13 @@ *********************************************************************/ -#include <stdio.h> -#include <assert.h> - #include "wavfile.h" -#include "cassimg.h" + +#include "osdcomm.h" // little_endianize_int16 + +#include <cassert> +#include <cstdio> +#include <cstring> static const char magic1[4] = { 'R', 'I', 'F', 'F' }; static const char magic2[4] = { 'W', 'A', 'V', 'E' }; @@ -57,7 +59,7 @@ static void put_leuint16(void *ptr, uint16_t value) -static cassette_image::error wavfile_process(cassette_image *cassette, struct CassetteOptions *opts, +static cassette_image::error wavfile_process(cassette_image *cassette, cassette_image::Options *opts, bool read_waveform) { uint8_t file_header[12]; @@ -76,7 +78,7 @@ static cassette_image::error wavfile_process(cassette_image *cassette, struct Ca int waveform_flags = 0; /* read header */ - cassette_image_read(cassette, file_header, 0, sizeof(file_header)); + cassette->image_read(file_header, 0, sizeof(file_header)); offset = sizeof(file_header); /* check magic numbers */ @@ -87,13 +89,13 @@ static cassette_image::error wavfile_process(cassette_image *cassette, struct Ca /* read and sanity check size */ stated_size = get_leuint32(&file_header[4]) + 8; - file_size = cassette_image_size(cassette); + file_size = cassette->image_size(); if (stated_size > file_size) stated_size = (uint32_t) file_size; while(offset < stated_size) { - cassette_image_read(cassette, tag_header, offset, sizeof(tag_header)); + cassette->image_read(tag_header, offset, sizeof(tag_header)); tag_size = get_leuint32(&tag_header[4]); offset += sizeof(tag_header); @@ -104,7 +106,7 @@ static cassette_image::error wavfile_process(cassette_image *cassette, struct Ca return cassette_image::error::INVALID_IMAGE; format_specified = true; - cassette_image_read(cassette, format_tag, offset, sizeof(format_tag)); + cassette->image_read(format_tag, offset, sizeof(format_tag)); format_type = get_leuint16(&format_tag[0]); opts->channels = get_leuint16(&format_tag[2]); @@ -121,13 +123,13 @@ static cassette_image::error wavfile_process(cassette_image *cassette, struct Ca switch(opts->bits_per_sample) { case 8: - waveform_flags = CASSETTE_WAVEFORM_8BIT | CASSETTE_WAVEFORM_UNSIGNED; // 8-bits wav are stored unsigned + waveform_flags = cassette_image::WAVEFORM_8BIT | cassette_image::WAVEFORM_UNSIGNED; // 8-bits wav are stored unsigned break; case 16: - waveform_flags = CASSETTE_WAVEFORM_16BITLE; + waveform_flags = cassette_image::WAVEFORM_16BITLE; break; case 32: - waveform_flags = CASSETTE_WAVEFORM_32BITLE; + waveform_flags = cassette_image::WAVEFORM_32BITLE; break; default: return cassette_image::error::INVALID_IMAGE; @@ -142,7 +144,7 @@ static cassette_image::error wavfile_process(cassette_image *cassette, struct Ca if (read_waveform) { tag_samples = tag_size / (opts->bits_per_sample / 8) / opts->channels; - cassette_read_samples(cassette, opts->channels, 0.0, tag_samples / ((double) opts->sample_frequency), + cassette->read_samples(opts->channels, 0.0, tag_samples / ((double) opts->sample_frequency), tag_samples, offset, waveform_flags); } } @@ -158,7 +160,7 @@ static cassette_image::error wavfile_process(cassette_image *cassette, struct Ca -static cassette_image::error wavfile_identify(cassette_image *cassette, struct CassetteOptions *opts) +static cassette_image::error wavfile_identify(cassette_image *cassette, cassette_image::Options *opts) { return wavfile_process(cassette, opts, false); } @@ -167,14 +169,13 @@ static cassette_image::error wavfile_identify(cassette_image *cassette, struct C static cassette_image::error wavfile_load(cassette_image *cassette) { - struct CassetteOptions opts; - memset(&opts, 0, sizeof(opts)); + cassette_image::Options opts; return wavfile_process(cassette, &opts, true); } -static cassette_image::error wavfile_save(cassette_image *cassette, const struct CassetteInfo *info) +static cassette_image::error wavfile_save(cassette_image *cassette, const cassette_image::Info *info) { cassette_image::error err; uint8_t consolidated_header[12 + 8 + 16 + 8]; @@ -187,7 +188,7 @@ static cassette_image::error wavfile_save(cassette_image *cassette, const struct uint16_t bits_per_sample; uint32_t data_size; size_t bytes_per_sample = 2; - int waveform_flags = CASSETTE_WAVEFORM_16BITLE; + int waveform_flags = cassette_image::WAVEFORM_16BITLE; uint16_t block_align; bits_per_sample = (uint16_t) (bytes_per_sample * 8); @@ -216,10 +217,10 @@ static cassette_image::error wavfile_save(cassette_image *cassette, const struct put_leuint32(&data_tag_header[4], data_size); /* write consolidated header */ - cassette_image_write(cassette, consolidated_header, 0, sizeof(consolidated_header)); + cassette->image_write(consolidated_header, 0, sizeof(consolidated_header)); /* write out the actual data */ - err = cassette_write_samples(cassette, info->channels, 0.0, info->sample_count + err = cassette->write_samples(info->channels, 0.0, info->sample_count / (double) info->sample_frequency, info->sample_count, sizeof(consolidated_header), waveform_flags); if (err != cassette_image::error::SUCCESS) @@ -230,7 +231,7 @@ static cassette_image::error wavfile_save(cassette_image *cassette, const struct -const struct CassetteFormat wavfile_format = +const cassette_image::Format cassette_image::wavfile_format = { "wav", wavfile_identify, @@ -250,41 +251,36 @@ const struct CassetteFormat wavfile_format = This code has already identified some rounding errors *********************************************************************/ -#ifdef UNUSED_FUNCTION -void wavfile_testload(const char *fname) +[[maybe_unused]] void wavfile_testload(const char *fname) { - cassette_image *cassette; - FILE *f; - long offset; - int freq, samples, i; - int32_t cassamp; - int16_t wavsamp; - - f = fopen(fname, "rb"); + FILE *f = fopen(fname, "rb"); if (!f) return; - if (cassette_open(f, &stdio_ioprocs, &wavfile_format, CASSETTE_FLAG_READONLY, &cassette)) + cassette_image::ptr cassette; + if (cassette_image::open(util::stdio_read_write_noclose(f, 0x00), &cassette_image::wavfile_format, cassette_image::FLAG_READONLY, cassette) != cassette_image::error::SUCCESS) { fclose(f); return; } - offset = 44; - freq = 44100; - samples = 5667062; + constexpr long offset = 44; + constexpr int freq = 44100; + constexpr int samples = 5667062; - for (i = 0; i < samples; i++) + for (int i = 0; i < samples; i++) { - cassette_get_sample(cassette, 0, i / (double) freq, 0.0, &cassamp); + int32_t cassamp; + cassette->get_sample(0, i / double(freq), 0.0, &cassamp); + int16_t wavsamp; fseek(f, offset + i * 2, SEEK_SET); fread(&wavsamp, 1, 2, f); - assert(cassamp == (((uint32_t) wavsamp) << 16)); + + assert(cassamp == (uint32_t(wavsamp) << 16)); } - cassette_close(cassette); + cassette.reset(); fclose(f); } -#endif |