X-Git-Url: https://git.sesse.net/?p=c64tapwav;a=blobdiff_plain;f=audioreader.cpp;h=e133afce9a24c704ec47e56d8cd2072bbe0f0ff4;hp=b95dbf410c07df6b7786673df0c4875d13744d11;hb=381952d4a27b064e7a64e55a739d4e08668525c2;hpb=bd548bb6f007d0b106a241480676bbc18196bdc8 diff --git a/audioreader.cpp b/audioreader.cpp index b95dbf4..e133afc 100644 --- a/audioreader.cpp +++ b/audioreader.cpp @@ -50,25 +50,25 @@ struct AVSampleDeleter { } }; -void convert_samples(SwrContext *swr, int sample_rate, const uint8_t **data, int nb_samples, std::vector *samples) +void convert_samples(SwrContext *swr, int sample_rate, const uint8_t **data, int nb_samples, std::vector *samples) { int max_out_samples = nb_samples + swr_get_delay(swr, sample_rate); if (max_out_samples == 0) { return; } uint8_t *output; - av_samples_alloc(&output, nullptr, 1, max_out_samples, AV_SAMPLE_FMT_S16, 0); + av_samples_alloc(&output, nullptr, 1, max_out_samples, AV_SAMPLE_FMT_FLT, 0); std::unique_ptr output_deleter(output); int out_samples = swr_convert(swr, &output, max_out_samples, data, nb_samples); if (out_samples > 0) { - const int16_t* start = reinterpret_cast(output); - const int16_t* end = start + out_samples; + const float* start = reinterpret_cast(output); + const float* end = start + out_samples; samples->insert(samples->end(), start, end); } } -int decode_packet(const char *filename, AVCodecContext *codec_ctx, SwrContext *swr, AVFrame *audio_frame, AVPacket *packet, int *got_frame, std::vector *samples) +int decode_packet(const char *filename, AVCodecContext *codec_ctx, SwrContext *swr, AVFrame *audio_frame, AVPacket *packet, int *got_frame, std::vector *samples) { *got_frame = 0; int len1 = avcodec_decode_audio4(codec_ctx, audio_frame, got_frame, packet); @@ -88,7 +88,7 @@ int decode_packet(const char *filename, AVCodecContext *codec_ctx, SwrContext *s } // namespace -bool read_audio_file(const char *filename, std::vector *samples) +bool read_audio_file(const char *filename, std::vector *samples, int *sample_rate) { av_register_all(); @@ -141,7 +141,7 @@ bool read_audio_file(const char *filename, std::vector *samples) } SwrContext *swr = swr_alloc_set_opts( nullptr, - AV_CH_LAYOUT_MONO, AV_SAMPLE_FMT_S16, codec_ctx->sample_rate, + AV_CH_LAYOUT_MONO, AV_SAMPLE_FMT_FLT, codec_ctx->sample_rate, codec_ctx->channel_layout, codec_ctx->sample_fmt, codec_ctx->sample_rate, 0, nullptr); std::unique_ptr swr_deleter(swr); @@ -190,5 +190,7 @@ bool read_audio_file(const char *filename, std::vector *samples) // Convert any leftover samples from the converter. convert_samples(swr, codec_ctx->sample_rate, nullptr, 0, samples); + *sample_rate = codec_ctx->sample_rate; + return true; }