mumble-voip_mumble/src/mumble/AudioOutputCache.cpp

82 lines
2.1 KiB
C++

// Copyright 2022-2023 The Mumble Developers. All rights reserved.
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file at the root of the
// Mumble source tree or at <https://www.mumble.info/LICENSE>.
#include "AudioOutputCache.h"
#include <cassert>
#include <cstring>
AudioOutputCache::AudioOutputCache(std::size_t initialCapacity) {
m_audioData.reserve(initialCapacity);
}
gsl::span< const Mumble::Protocol::byte > AudioOutputCache::getAudioData() const {
return m_audioData;
}
bool AudioOutputCache::isLastFrame() const {
return m_isLastFrame;
}
float AudioOutputCache::getVolumeAdjustment() const {
return m_volumeAdjustment;
}
bool AudioOutputCache::containsPositionalInformation() const {
return m_containsPosition;
}
const std::array< float, 3 > &AudioOutputCache::getPositionalInformation() const {
assert(m_containsPosition);
return m_position;
}
Mumble::Protocol::audio_context_t AudioOutputCache::getContext() const {
return m_audioContext;
}
void AudioOutputCache::setCapacity(std::size_t capacity) {
m_audioData.reserve(capacity);
}
void AudioOutputCache::loadFrom(const Mumble::Protocol::AudioData &audioData) {
// First copy audio data
m_audioData.clear();
m_audioData.resize(audioData.payload.size());
std::memcpy(m_audioData.data(), audioData.payload.data(), audioData.payload.size());
// Then copy remaining fields (that we care about)
m_isLastFrame = audioData.isLastFrame;
m_volumeAdjustment = audioData.volumeAdjustment.factor;
m_audioContext = static_cast< Mumble::Protocol::audio_context_t >(audioData.targetOrContext);
// And finally copy positional data, if available
if (audioData.containsPositionalData) {
m_containsPosition = true;
assert(m_position.size() == 3);
assert(audioData.position.size() == 3);
for (unsigned int i = 0; i < 3; ++i) {
m_position[i] = audioData.position[i];
}
} else {
m_containsPosition = false;
}
}
void AudioOutputCache::clear() {
m_audioData.clear();
}
bool AudioOutputCache::isValid() const {
return !m_audioData.empty();
}
AudioOutputCache::operator bool() const {
return isValid();
}