mirror of
https://github.com/Almamu/linux-wallpaperengine.git
synced 2025-09-14 13:56:48 +08:00
~ fix audio thread not stopping when a signal for stopping is received
should fix #107 Signed-off-by: Alexis Maiquez <almamu@almamu.com>
This commit is contained in:
parent
e5ef7bd53e
commit
ec6164c4cf
15
main.cpp
15
main.cpp
@ -409,14 +409,21 @@ int main (int argc, char* argv[])
|
||||
usleep ((minimumTime - (endTime - startTime)) * CLOCKS_PER_SEC);
|
||||
}
|
||||
|
||||
// free context
|
||||
delete context;
|
||||
// ensure this is updated as sometimes it might not come from a signal
|
||||
g_KeepRunning = false;
|
||||
|
||||
std::cout << "Stop requested" << std::endl;
|
||||
|
||||
// terminate gl
|
||||
glfwTerminate ();
|
||||
// terminate SDL
|
||||
SDL_Quit ();
|
||||
// terminate free image
|
||||
FreeImage_DeInitialise ();
|
||||
// terminate SDL
|
||||
SDL_QuitSubSystem(SDL_INIT_AUDIO);
|
||||
SDL_Quit ();
|
||||
|
||||
// free context
|
||||
delete context;
|
||||
|
||||
return 0;
|
||||
}
|
@ -4,6 +4,7 @@
|
||||
#include <math.h>
|
||||
|
||||
extern int g_AudioVolume;
|
||||
extern bool g_KeepRunning;
|
||||
|
||||
using namespace WallpaperEngine::Audio;
|
||||
|
||||
@ -17,7 +18,7 @@ void audio_callback (void* userdata, uint8_t* stream, int length)
|
||||
static unsigned int audio_buf_size = 0;
|
||||
static unsigned int audio_buf_index = 0;
|
||||
|
||||
while (length > 0)
|
||||
while (length > 0 && g_KeepRunning)
|
||||
{
|
||||
if (audio_buf_index >= audio_buf_size)
|
||||
{
|
||||
@ -61,7 +62,7 @@ int audio_read_thread (void* arg)
|
||||
AVPacket* packet = av_packet_alloc ();
|
||||
int ret = 0;
|
||||
|
||||
while (ret >= 0)
|
||||
while (ret >= 0 && g_KeepRunning == true)
|
||||
{
|
||||
ret = av_read_frame (stream->getFormatContext (), packet);
|
||||
|
||||
@ -83,6 +84,9 @@ int audio_read_thread (void* arg)
|
||||
break;
|
||||
}
|
||||
|
||||
// stop the audio too just in case
|
||||
stream->stop ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -306,7 +310,7 @@ void CAudioStream::dequeuePacket (AVPacket* output)
|
||||
|
||||
SDL_LockMutex (this->m_queue->mutex);
|
||||
|
||||
while (true)
|
||||
while (g_KeepRunning)
|
||||
{
|
||||
// enough data available, read it
|
||||
if (av_fifo_size (this->m_queue->packetList) >= sizeof (entry))
|
||||
@ -323,7 +327,7 @@ void CAudioStream::dequeuePacket (AVPacket* output)
|
||||
}
|
||||
|
||||
// make the thread wait if nothing was available
|
||||
SDL_CondWait (this->m_queue->cond, this->m_queue->mutex);
|
||||
SDL_CondWaitTimeout (this->m_queue->cond, this->m_queue->mutex, 1000);
|
||||
}
|
||||
|
||||
SDL_UnlockMutex (this->m_queue->mutex);
|
||||
@ -664,7 +668,7 @@ int CAudioStream::decodeFrame (uint8_t* audioBuffer, int bufferSize)
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
for (; g_KeepRunning;) {
|
||||
while (audio_pkt_size > 0) {
|
||||
int got_frame = 0;
|
||||
int ret = avcodec_receive_frame(this->getContext (), avFrame);
|
||||
@ -731,4 +735,6 @@ int CAudioStream::decodeFrame (uint8_t* audioBuffer, int bufferSize)
|
||||
audio_pkt_data = pkt->data;
|
||||
audio_pkt_size = pkt->size;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user