mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 13:38:02 +02:00
Merge pull request #8635 from zzmp/fix/local-audio-injection
fix missing local audition for audio injectors
This commit is contained in:
commit
fdb4addf53
4 changed files with 16 additions and 24 deletions
|
@ -1039,7 +1039,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) :
|
||||||
cameraMenuChanged();
|
cameraMenuChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the local loopback interface for local sounds from audio scripts
|
// set the local loopback interface for local sounds
|
||||||
|
AudioInjector::setLocalAudioInterface(audioIO.data());
|
||||||
AudioScriptingInterface::getInstance().setLocalAudioInterface(audioIO.data());
|
AudioScriptingInterface::getInstance().setLocalAudioInterface(audioIO.data());
|
||||||
|
|
||||||
this->installEventFilter(this);
|
this->installEventFilter(this);
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
|
|
||||||
int audioInjectorPtrMetaTypeId = qRegisterMetaType<AudioInjector*>();
|
int audioInjectorPtrMetaTypeId = qRegisterMetaType<AudioInjector*>();
|
||||||
|
|
||||||
|
AbstractAudioInterface* AudioInjector::_localAudioInterface{ nullptr };
|
||||||
|
|
||||||
AudioInjectorState operator& (AudioInjectorState lhs, AudioInjectorState rhs) {
|
AudioInjectorState operator& (AudioInjectorState lhs, AudioInjectorState rhs) {
|
||||||
return static_cast<AudioInjectorState>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
|
return static_cast<AudioInjectorState>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
|
||||||
};
|
};
|
||||||
|
@ -37,24 +39,15 @@ AudioInjectorState& operator|= (AudioInjectorState& lhs, AudioInjectorState rhs)
|
||||||
return lhs;
|
return lhs;
|
||||||
};
|
};
|
||||||
|
|
||||||
AudioInjector::AudioInjector(QObject* parent) :
|
|
||||||
QObject(parent)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioInjector::AudioInjector(const Sound& sound, const AudioInjectorOptions& injectorOptions) :
|
AudioInjector::AudioInjector(const Sound& sound, const AudioInjectorOptions& injectorOptions) :
|
||||||
_audioData(sound.getByteArray()),
|
AudioInjector(sound.getByteArray(), injectorOptions)
|
||||||
_options(injectorOptions)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioInjector::AudioInjector(const QByteArray& audioData, const AudioInjectorOptions& injectorOptions) :
|
AudioInjector::AudioInjector(const QByteArray& audioData, const AudioInjectorOptions& injectorOptions) :
|
||||||
_audioData(audioData),
|
_audioData(audioData),
|
||||||
_options(injectorOptions)
|
_options(injectorOptions)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AudioInjector::stateHas(AudioInjectorState state) const {
|
bool AudioInjector::stateHas(AudioInjectorState state) const {
|
||||||
|
@ -447,7 +440,7 @@ AudioInjector* AudioInjector::playSound(SharedSoundPointer sound, const float vo
|
||||||
|
|
||||||
QByteArray samples = sound->getByteArray();
|
QByteArray samples = sound->getByteArray();
|
||||||
if (stretchFactor == 1.0f) {
|
if (stretchFactor == 1.0f) {
|
||||||
return playSoundAndDelete(samples, options, nullptr);
|
return playSoundAndDelete(samples, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
const int standardRate = AudioConstants::SAMPLE_RATE;
|
const int standardRate = AudioConstants::SAMPLE_RATE;
|
||||||
|
@ -465,11 +458,11 @@ AudioInjector* AudioInjector::playSound(SharedSoundPointer sound, const float vo
|
||||||
nInputFrames);
|
nInputFrames);
|
||||||
|
|
||||||
Q_UNUSED(nOutputFrames);
|
Q_UNUSED(nOutputFrames);
|
||||||
return playSoundAndDelete(resampled, options, nullptr);
|
return playSoundAndDelete(resampled, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioInjector* AudioInjector::playSoundAndDelete(const QByteArray& buffer, const AudioInjectorOptions options, AbstractAudioInterface* localInterface) {
|
AudioInjector* AudioInjector::playSoundAndDelete(const QByteArray& buffer, const AudioInjectorOptions options) {
|
||||||
AudioInjector* sound = playSound(buffer, options, localInterface);
|
AudioInjector* sound = playSound(buffer, options);
|
||||||
|
|
||||||
if (sound) {
|
if (sound) {
|
||||||
sound->_state |= AudioInjectorState::PendingDelete;
|
sound->_state |= AudioInjectorState::PendingDelete;
|
||||||
|
@ -479,9 +472,8 @@ AudioInjector* AudioInjector::playSoundAndDelete(const QByteArray& buffer, const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
AudioInjector* AudioInjector::playSound(const QByteArray& buffer, const AudioInjectorOptions options, AbstractAudioInterface* localInterface) {
|
AudioInjector* AudioInjector::playSound(const QByteArray& buffer, const AudioInjectorOptions options) {
|
||||||
AudioInjector* injector = new AudioInjector(buffer, options);
|
AudioInjector* injector = new AudioInjector(buffer, options);
|
||||||
injector->setLocalAudioInterface(localInterface);
|
|
||||||
|
|
||||||
// grab the AudioInjectorManager
|
// grab the AudioInjectorManager
|
||||||
auto injectorManager = DependencyManager::get<AudioInjectorManager>();
|
auto injectorManager = DependencyManager::get<AudioInjectorManager>();
|
||||||
|
|
|
@ -48,9 +48,7 @@ AudioInjectorState& operator|= (AudioInjectorState& lhs, AudioInjectorState rhs)
|
||||||
// until it dies.
|
// until it dies.
|
||||||
class AudioInjector : public QObject {
|
class AudioInjector : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AudioInjector(QObject* parent);
|
|
||||||
AudioInjector(const Sound& sound, const AudioInjectorOptions& injectorOptions);
|
AudioInjector(const Sound& sound, const AudioInjectorOptions& injectorOptions);
|
||||||
AudioInjector(const QByteArray& audioData, const AudioInjectorOptions& injectorOptions);
|
AudioInjector(const QByteArray& audioData, const AudioInjectorOptions& injectorOptions);
|
||||||
|
|
||||||
|
@ -66,11 +64,11 @@ public:
|
||||||
float getVolume() const { return _options.volume; }
|
float getVolume() const { return _options.volume; }
|
||||||
glm::vec3 getPosition() const { return _options.position; }
|
glm::vec3 getPosition() const { return _options.position; }
|
||||||
bool isStereo() const { return _options.stereo; }
|
bool isStereo() const { return _options.stereo; }
|
||||||
void setLocalAudioInterface(AbstractAudioInterface* localAudioInterface) { _localAudioInterface = localAudioInterface; }
|
|
||||||
|
|
||||||
bool stateHas(AudioInjectorState state) const ;
|
bool stateHas(AudioInjectorState state) const ;
|
||||||
static AudioInjector* playSoundAndDelete(const QByteArray& buffer, const AudioInjectorOptions options, AbstractAudioInterface* localInterface);
|
static void setLocalAudioInterface(AbstractAudioInterface* audioInterface) { _localAudioInterface = audioInterface; }
|
||||||
static AudioInjector* playSound(const QByteArray& buffer, const AudioInjectorOptions options, AbstractAudioInterface* localInterface);
|
static AudioInjector* playSoundAndDelete(const QByteArray& buffer, const AudioInjectorOptions options);
|
||||||
|
static AudioInjector* playSound(const QByteArray& buffer, const AudioInjectorOptions options);
|
||||||
static AudioInjector* playSound(SharedSoundPointer sound, const float volume, const float stretchFactor, const glm::vec3 position);
|
static AudioInjector* playSound(SharedSoundPointer sound, const float volume, const float stretchFactor, const glm::vec3 position);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
@ -98,6 +96,8 @@ private:
|
||||||
int64_t injectNextFrame();
|
int64_t injectNextFrame();
|
||||||
bool injectLocally();
|
bool injectLocally();
|
||||||
|
|
||||||
|
static AbstractAudioInterface* _localAudioInterface;
|
||||||
|
|
||||||
QByteArray _audioData;
|
QByteArray _audioData;
|
||||||
AudioInjectorOptions _options;
|
AudioInjectorOptions _options;
|
||||||
AudioInjectorState _state { AudioInjectorState::NotFinished };
|
AudioInjectorState _state { AudioInjectorState::NotFinished };
|
||||||
|
@ -107,7 +107,6 @@ private:
|
||||||
float _loudness { 0.0f };
|
float _loudness { 0.0f };
|
||||||
int _currentSendOffset { 0 };
|
int _currentSendOffset { 0 };
|
||||||
std::unique_ptr<NLPacket> _currentPacket { nullptr };
|
std::unique_ptr<NLPacket> _currentPacket { nullptr };
|
||||||
AbstractAudioInterface* _localAudioInterface { nullptr };
|
|
||||||
AudioInjectorLocalBuffer* _localBuffer { nullptr };
|
AudioInjectorLocalBuffer* _localBuffer { nullptr };
|
||||||
|
|
||||||
int64_t _nextFrame { 0 };
|
int64_t _nextFrame { 0 };
|
||||||
|
|
|
@ -45,7 +45,7 @@ ScriptAudioInjector* AudioScriptingInterface::playSound(SharedSoundPointer sound
|
||||||
// stereo option isn't set from script, this comes from sound metadata or filename
|
// stereo option isn't set from script, this comes from sound metadata or filename
|
||||||
AudioInjectorOptions optionsCopy = injectorOptions;
|
AudioInjectorOptions optionsCopy = injectorOptions;
|
||||||
optionsCopy.stereo = sound->isStereo();
|
optionsCopy.stereo = sound->isStereo();
|
||||||
auto injector = AudioInjector::playSound(sound->getByteArray(), optionsCopy, _localAudioInterface);
|
auto injector = AudioInjector::playSound(sound->getByteArray(), optionsCopy);
|
||||||
if (!injector) {
|
if (!injector) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue