X-Git-Url: https://git.sesse.net/?p=c64tapwav;a=blobdiff_plain;f=audioreader.cpp;h=172bd31dd72bafe88e558d9cab605a4c8b124ed4;hp=b95dbf410c07df6b7786673df0c4875d13744d11;hb=f7a9befb5973e5c2f6f655272e762dedf1808d7f;hpb=bd548bb6f007d0b106a241480676bbc18196bdc8 diff --git a/audioreader.cpp b/audioreader.cpp index b95dbf4..172bd31 100644 --- a/audioreader.cpp +++ b/audioreader.cpp @@ -5,6 +5,7 @@ extern "C" { #include #include #include +#include } @@ -22,7 +23,8 @@ struct AVFormatCloserAndDeleter { struct AVCodecContextDeleter { void operator() (AVCodecContext *ctx) { - avcodec_free_context(&ctx); + avcodec_close(ctx); + av_freep(&ctx); } }; @@ -50,25 +52,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 +90,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 +143,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 +192,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; }