mirror of
https://github.com/overte-org/overte.git
synced 2025-04-26 10:16:19 +02:00
fix audio pool resizing
This commit is contained in:
parent
2c42bb0aa8
commit
78bc5cf502
2 changed files with 21 additions and 9 deletions
|
@ -56,7 +56,7 @@ AudioMixerSlavePool::~AudioMixerSlavePool() {
|
||||||
Lock lock(_mutex);
|
Lock lock(_mutex);
|
||||||
wait(lock);
|
wait(lock);
|
||||||
}
|
}
|
||||||
setNumThreads(0);
|
resize(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioMixerSlavePool::mix(ConstIter begin, ConstIter end, unsigned int frame) {
|
void AudioMixerSlavePool::mix(ConstIter begin, ConstIter end, unsigned int frame) {
|
||||||
|
@ -107,21 +107,30 @@ void AudioMixerSlavePool::wait(Lock& lock) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioMixerSlavePool::setNumThreads(int numThreads) {
|
void AudioMixerSlavePool::setNumThreads(int numThreads) {
|
||||||
Lock lock(_mutex);
|
|
||||||
|
|
||||||
// ensure slave are not running
|
|
||||||
assert(!_running);
|
|
||||||
|
|
||||||
// clamp to allowed size
|
// clamp to allowed size
|
||||||
{
|
{
|
||||||
// idealThreadCount returns -1 if cores cannot be detected - cast it to a large number
|
int maxThreads = QThread::idealThreadCount();
|
||||||
int maxThreads = (int)((unsigned int)QThread::idealThreadCount());
|
if (maxThreads == -1) {
|
||||||
|
// idealThreadCount returns -1 if cores cannot be detected
|
||||||
|
maxThreads = std::numeric_limits<int>::max();
|
||||||
|
}
|
||||||
|
|
||||||
int clampedThreads = std::min(std::max(1, numThreads), maxThreads);
|
int clampedThreads = std::min(std::max(1, numThreads), maxThreads);
|
||||||
if (clampedThreads != numThreads) {
|
if (clampedThreads != numThreads) {
|
||||||
qWarning("%s: clamped to %d (was %d)", __FUNCTION__, numThreads, clampedThreads);
|
qWarning("%s: clamped to %d (was %d)", __FUNCTION__, numThreads, clampedThreads);
|
||||||
numThreads = clampedThreads;
|
numThreads = clampedThreads;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resize(numThreads);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioMixerSlavePool::resize(int numThreads) {
|
||||||
|
Lock lock(_mutex);
|
||||||
|
|
||||||
|
// ensure slave are not running
|
||||||
|
assert(!_running);
|
||||||
|
|
||||||
qDebug("%s: set %d threads", __FUNCTION__, numThreads);
|
qDebug("%s: set %d threads", __FUNCTION__, numThreads);
|
||||||
|
|
||||||
if (numThreads > _numThreads) {
|
if (numThreads > _numThreads) {
|
||||||
|
@ -147,7 +156,8 @@ void AudioMixerSlavePool::setNumThreads(int numThreads) {
|
||||||
// ...wait for them to finish...
|
// ...wait for them to finish...
|
||||||
slave = extraBegin;
|
slave = extraBegin;
|
||||||
while (slave != _slaves.end()) {
|
while (slave != _slaves.end()) {
|
||||||
(*slave)->wait();
|
QThread* thread = reinterpret_cast<QThread*>(slave->get());
|
||||||
|
thread->wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ...and delete them
|
// ...and delete them
|
||||||
|
|
|
@ -75,6 +75,8 @@ private:
|
||||||
void start(Lock& lock, ConstIter begin = ConstIter(), ConstIter end = ConstIter(), unsigned int frame = 0);
|
void start(Lock& lock, ConstIter begin = ConstIter(), ConstIter end = ConstIter(), unsigned int frame = 0);
|
||||||
void wait(Lock& lock);
|
void wait(Lock& lock);
|
||||||
|
|
||||||
|
void resize(int numThreads);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<AudioMixerSlaveThread>> _slaves;
|
std::vector<std::unique_ptr<AudioMixerSlaveThread>> _slaves;
|
||||||
|
|
||||||
friend void AudioMixerSlaveThread::wait();
|
friend void AudioMixerSlaveThread::wait();
|
||||||
|
|
Loading…
Reference in a new issue