From 770eb0f0ef8790ae6d8839a2287c48c1c63cbc49 Mon Sep 17 00:00:00 2001 From: Almamu Date: Fri, 12 Jul 2024 19:36:04 +0200 Subject: [PATCH] fix: av fifo usage should fix build on arch now --- src/WallpaperEngine/Audio/CAudioStream.cpp | 50 ++++++++++++++-------- src/WallpaperEngine/Audio/CAudioStream.h | 4 +- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/WallpaperEngine/Audio/CAudioStream.cpp b/src/WallpaperEngine/Audio/CAudioStream.cpp index 5405883..d21610e 100644 --- a/src/WallpaperEngine/Audio/CAudioStream.cpp +++ b/src/WallpaperEngine/Audio/CAudioStream.cpp @@ -2,7 +2,7 @@ #include "common.h" #include #include -#include +#include // maximum size of the queue to prevent reading too much data #define MAX_QUEUE_SIZE (5 * 1024 * 1024) @@ -183,13 +183,14 @@ void CAudioStream::loadCustomContent (const char* filename) { } void CAudioStream::initialize () { +// allocate the FIFO buffer #if FF_API_FIFO_OLD_API - // allocate the FIFO buffer - this->m_queue->packetList = av_fifo_alloc2 (1, sizeof (MyAVPacketList), AV_FIFO_FLAG_AUTO_GROW); -#else this->m_queue->packetList = av_fifo_alloc (sizeof (MyAVPacketList)); +#else + this->m_queue->packetList = av_fifo_alloc2 (1, sizeof (MyAVPacketList), AV_FIFO_FLAG_AUTO_GROW); #endif +#if FF_API_OLD_CHANNEL_LAYOUT int64_t out_channel_layout; // set output audio channels based on the input audio channels @@ -199,18 +200,29 @@ void CAudioStream::initialize () { default: out_channel_layout = AV_CH_LAYOUT_SURROUND; break; } -#if FF_API_OLD_CHANNEL_LAYOUT - av_channel_layout_from_mask (&this->m_out_channel_layout, out_channel_layout); - - swr_alloc_set_opts2 (&this->m_swrctx, &this->m_out_channel_layout, this->m_audioContext.getFormat (), - this->m_audioContext.getSampleRate (), &this->m_context->ch_layout, - this->m_context->sample_fmt, this->m_context->sample_rate, 0, nullptr); -#else // initialize swrctx this->m_swrctx = swr_alloc_set_opts (nullptr, out_channel_layout, this->m_audioContext.getFormat (), this->m_audioContext.getSampleRate (), this->getContext ()->channel_layout, this->getContext ()->sample_fmt, this->getContext ()->sample_rate, 0, nullptr); +#else + AVChannelLayout out_channel_layout; + int64_t out_channel_mask; + + // set output audio channels based on the input audio channels + switch (this->m_audioContext.getChannels ()) { + case 1: out_channel_mask = AV_CH_LAYOUT_MONO; break; + case 2: out_channel_mask = AV_CH_LAYOUT_STEREO; break; + default: out_channel_mask = AV_CH_LAYOUT_SURROUND; break; + } + + if (av_channel_layout_from_mask (&out_channel_layout, out_channel_mask) != 0) + sLog.exception ("Cannot get channel layout from mask"); + + swr_alloc_set_opts2 (&this->m_swrctx, &out_channel_layout, this->m_audioContext.getFormat (), + this->m_audioContext.getSampleRate (), &this->m_context->ch_layout, + this->m_context->sample_fmt, this->m_context->sample_rate, 0, nullptr); #endif + if (this->m_swrctx == nullptr) sLog.exception ("Cannot initialize swrctx for audio resampling"); @@ -249,15 +261,15 @@ bool CAudioStream::doQueue (AVPacket* pkt) { MyAVPacketList entry {pkt}; #if FF_API_FIFO_OLD_API - // write the entry if possible - if (av_fifo_write (this->m_queue->packetList, &entry, 1) < 0) - return false; -#else if (av_fifo_space (this->m_queue->packetList) < sizeof (entry)) if (av_fifo_grow (this->m_queue->packetList, sizeof (entry)) < 0) return false; av_fifo_generic_write (this->m_queue->packetList, &entry, sizeof (entry), nullptr); +#else + // write the entry if possible + if (av_fifo_write (this->m_queue->packetList, &entry, 1) < 0) + return false; #endif this->m_queue->nb_packets++; @@ -277,12 +289,12 @@ void CAudioStream::dequeuePacket (AVPacket* output) { while (this->m_audioContext.getApplicationContext ().state.general.keepRunning) { #if FF_API_FIFO_OLD_API - int ret = av_fifo_read (this->m_queue->packetList, &entry, 1); -#else int ret = -1; if (av_fifo_size (this->m_queue->packetList) >= sizeof (entry)) ret = av_fifo_generic_read (this->m_queue->packetList, &entry, sizeof (entry), nullptr); +#else + int ret = av_fifo_read (this->m_queue->packetList, &entry, 1); #endif // enough data available, read it @@ -406,8 +418,6 @@ int CAudioStream::resampleAudio (const AVFrame* decoded_audio_frame, uint8_t* ou // get number of output audio channels #if FF_API_OLD_CHANNEL_LAYOUT - out_nb_channels = this->getContext ()->ch_layout.nb_channels; -#else int64_t out_channel_layout; // set output audio channels based on the input audio channels @@ -418,6 +428,8 @@ int CAudioStream::resampleAudio (const AVFrame* decoded_audio_frame, uint8_t* ou } out_nb_channels = av_get_channel_layout_nb_channels (out_channel_layout); +#else + out_nb_channels = this->getContext ()->ch_layout.nb_channels; #endif ret = av_samples_alloc_array_and_samples (&resampled_data, &out_linesize, out_nb_channels, out_nb_samples, this->m_audioContext.getFormat (), 0); diff --git a/src/WallpaperEngine/Audio/CAudioStream.h b/src/WallpaperEngine/Audio/CAudioStream.h index 5fde04f..81067ed 100644 --- a/src/WallpaperEngine/Audio/CAudioStream.h +++ b/src/WallpaperEngine/Audio/CAudioStream.h @@ -192,9 +192,9 @@ class CAudioStream { */ struct PacketQueue { #if FF_API_FIFO_OLD_API - AVFifo* packetList; -#else AVFifoBuffer* packetList; +#else + AVFifo* packetList; #endif int nb_packets; int size;