mirror of
https://github.com/overte-org/overte.git
synced 2025-08-07 19:50:38 +02:00
prevent overflow of local injectors buffer
This commit is contained in:
parent
e882e7b648
commit
cdf6c332a6
1 changed files with 16 additions and 16 deletions
|
@ -1097,26 +1097,26 @@ void AudioClient::handleRecordedAudioInput(const QByteArray& audio) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioClient::prepareLocalAudioInjectors() {
|
void AudioClient::prepareLocalAudioInjectors() {
|
||||||
if (_outputPeriod == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int bufferCapacity = _localInjectorsStream.getSampleCapacity();
|
|
||||||
if (_localToOutputResampler) {
|
|
||||||
// avoid overwriting the buffer,
|
|
||||||
// instead of failing on writes because the buffer is used as a lock-free pipe
|
|
||||||
bufferCapacity -=
|
|
||||||
_localToOutputResampler->getMaxOutput(AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL) *
|
|
||||||
AudioConstants::STEREO;
|
|
||||||
bufferCapacity += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int samplesNeeded = std::numeric_limits<int>::max();
|
int samplesNeeded = std::numeric_limits<int>::max();
|
||||||
while (samplesNeeded > 0) {
|
while (samplesNeeded > 0) {
|
||||||
// lock for every write to avoid locking out the device callback
|
// unlock between every write to allow device switching
|
||||||
// this lock is intentional - the buffer is only lock-free in its use in the device callback
|
|
||||||
Lock lock(_localAudioMutex);
|
Lock lock(_localAudioMutex);
|
||||||
|
|
||||||
|
// in case of a device switch, consider bufferCapacity volatile across iterations
|
||||||
|
if (_outputPeriod == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bufferCapacity = _localInjectorsStream.getSampleCapacity();
|
||||||
|
if (_localToOutputResampler) {
|
||||||
|
// avoid overwriting the buffer,
|
||||||
|
// instead of failing on writes because the buffer is used as a lock-free pipe
|
||||||
|
bufferCapacity -=
|
||||||
|
_localToOutputResampler->getMaxOutput(AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL) *
|
||||||
|
AudioConstants::STEREO;
|
||||||
|
bufferCapacity += 1;
|
||||||
|
}
|
||||||
|
|
||||||
samplesNeeded = bufferCapacity - _localSamplesAvailable.load(std::memory_order_relaxed);
|
samplesNeeded = bufferCapacity - _localSamplesAvailable.load(std::memory_order_relaxed);
|
||||||
if (samplesNeeded <= 0) {
|
if (samplesNeeded <= 0) {
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue