LMMS
Loading...
Searching...
No Matches
AudioEngineWorkerThread.h
Go to the documentation of this file.
1/*
2 * AudioEngineWorkerThread.h - declaration of class AudioEngineWorkerThread
3 *
4 * Copyright (c) 2009-2014 Tobias Doerffel <tobydox/at/users.sourceforge.net>
5 *
6 * This file is part of LMMS - https://lmms.io
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program (see COPYING); if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301 USA.
22 *
23 */
24
25#ifndef LMMS_AUDIO_ENGINE_WORKER_THREAD_H
26#define LMMS_AUDIO_ENGINE_WORKER_THREAD_H
27
28#include <QThread>
29
30#include <atomic>
31
32class QWaitCondition;
33
34namespace lmms
35{
36
37class AudioEngine;
38class ThreadableJob;
39
40class AudioEngineWorkerThread : public QThread
41{
42 Q_OBJECT
43public:
44 // internal representation of the job queue - all functions are thread-safe
46 {
47 public:
48 enum class OperationMode
49 {
50 Static, // no jobs added while processing queue
51 Dynamic // jobs can be added while processing queue
52 } ;
53
54 static constexpr size_t JOB_QUEUE_SIZE = 8192;
55
57 m_items(),
58 m_writeIndex( 0 ),
59 m_itemsDone( 0 ),
61 {
62 std::fill(m_items, m_items + JOB_QUEUE_SIZE, nullptr);
63 }
64
65 void reset( OperationMode _opMode );
66
67 void addJob( ThreadableJob * _job );
68
69 void run();
70 void wait();
71
72 private:
73 std::atomic<ThreadableJob*> m_items[JOB_QUEUE_SIZE];
74 std::atomic_size_t m_writeIndex;
75 std::atomic_size_t m_itemsDone;
77 } ;
78
79
81 ~AudioEngineWorkerThread() override;
82
83 virtual void quit();
84
87 {
88 globalJobQueue.reset( _opMode );
89 }
90
91 static void addJob( ThreadableJob * _job )
92 {
93 globalJobQueue.addJob( _job );
94 }
95
96 // a convenient helper function allowing to pass a container with pointers
97 // to ThreadableJob objects
98 template<typename T>
99 static void fillJobQueue( const T & _vec,
101 {
102 resetJobQueue( _opMode );
103 for (const auto& job : _vec)
104 {
105 addJob(job);
106 }
107 }
108
109 static void startAndWaitForJobs();
110
111
112private:
113 void run() override;
114
116 static QWaitCondition * queueReadyWaitCond;
117 static QList<AudioEngineWorkerThread *> workerThreads;
118
119 volatile bool m_quit;
120} ;
121
122} // namespace lmms
123
124#endif // LMMS_AUDIO_ENGINE_WORKER_THREAD_H
Definition AudioEngine.h:66
Definition AudioEngineWorkerThread.h:46
static constexpr size_t JOB_QUEUE_SIZE
Definition AudioEngineWorkerThread.h:54
void addJob(ThreadableJob *_job)
Definition AudioEngineWorkerThread.cpp:57
std::atomic< ThreadableJob * > m_items[JOB_QUEUE_SIZE]
Definition AudioEngineWorkerThread.h:73
OperationMode m_opMode
Definition AudioEngineWorkerThread.h:76
void wait()
Definition AudioEngineWorkerThread.cpp:100
void run()
Definition AudioEngineWorkerThread.cpp:76
JobQueue()
Definition AudioEngineWorkerThread.h:56
void reset(OperationMode _opMode)
Definition AudioEngineWorkerThread.cpp:47
std::atomic_size_t m_writeIndex
Definition AudioEngineWorkerThread.h:74
OperationMode
Definition AudioEngineWorkerThread.h:49
@ Static
Definition AudioEngineWorkerThread.h:50
@ Dynamic
Definition AudioEngineWorkerThread.h:51
std::atomic_size_t m_itemsDone
Definition AudioEngineWorkerThread.h:75
AudioEngineWorkerThread(AudioEngine *audioEngine)
Definition AudioEngineWorkerThread.cpp:116
static void resetJobQueue(JobQueue::OperationMode _opMode=JobQueue::OperationMode::Static)
Definition AudioEngineWorkerThread.h:85
static JobQueue globalJobQueue
Definition AudioEngineWorkerThread.h:115
static void fillJobQueue(const T &_vec, JobQueue::OperationMode _opMode=JobQueue::OperationMode::Static)
Definition AudioEngineWorkerThread.h:99
void run() override
Definition AudioEngineWorkerThread.cpp:167
static QWaitCondition * queueReadyWaitCond
Definition AudioEngineWorkerThread.h:116
static void startAndWaitForJobs()
Definition AudioEngineWorkerThread.cpp:154
static void addJob(ThreadableJob *_job)
Definition AudioEngineWorkerThread.h:91
volatile bool m_quit
Definition AudioEngineWorkerThread.h:119
~AudioEngineWorkerThread() override
Definition AudioEngineWorkerThread.cpp:137
virtual void quit()
Definition AudioEngineWorkerThread.cpp:145
static QList< AudioEngineWorkerThread * > workerThreads
Definition AudioEngineWorkerThread.h:117
Definition ThreadableJob.h:36
Definition AudioAlsa.cpp:35