mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-04 06:24:41 +02:00
make the AudioInjectorScriptingInterface a singleton
This commit is contained in:
parent
7e36c51edc
commit
2c667d209d
5 changed files with 40 additions and 34 deletions
|
@ -450,6 +450,9 @@ Application::~Application() {
|
||||||
_audio.thread()->quit();
|
_audio.thread()->quit();
|
||||||
_audio.thread()->wait();
|
_audio.thread()->wait();
|
||||||
|
|
||||||
|
// kill any audio injectors that are still around
|
||||||
|
|
||||||
|
|
||||||
_octreeProcessor.terminate();
|
_octreeProcessor.terminate();
|
||||||
_voxelHideShowThread.terminate();
|
_voxelHideShowThread.terminate();
|
||||||
_voxelEditSender.terminate();
|
_voxelEditSender.terminate();
|
||||||
|
|
|
@ -11,6 +11,15 @@
|
||||||
|
|
||||||
#include "AudioScriptingInterface.h"
|
#include "AudioScriptingInterface.h"
|
||||||
|
|
||||||
|
AudioScriptingInterface& AudioScriptingInterface::getInstance() {
|
||||||
|
static AudioScriptingInterface staticInstance;
|
||||||
|
return staticInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioScriptingInterface::stopAllInjectors() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions* injectorOptions) {
|
AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions* injectorOptions) {
|
||||||
|
|
||||||
if (sound->isStereo()) {
|
if (sound->isStereo()) {
|
||||||
|
@ -23,15 +32,18 @@ AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjec
|
||||||
injector->moveToThread(injectorThread);
|
injector->moveToThread(injectorThread);
|
||||||
|
|
||||||
// start injecting when the injector thread starts
|
// start injecting when the injector thread starts
|
||||||
connect(injectorThread, SIGNAL(started()), injector, SLOT(injectAudio()));
|
connect(injectorThread, &QThread::started, injector, &AudioInjector::injectAudio);
|
||||||
|
|
||||||
// connect the right slots and signals so that the AudioInjector is killed once the injection is complete
|
// connect the right slots and signals so that the AudioInjector is killed once the injection is complete
|
||||||
connect(injector, SIGNAL(finished()), injector, SLOT(deleteLater()));
|
connect(injector, &AudioInjector::finished, injector, &AudioInjector::deleteLater);
|
||||||
connect(injector, SIGNAL(finished()), injectorThread, SLOT(quit()));
|
connect(injector, &AudioInjector::finished, injectorThread, &QThread::quit);
|
||||||
connect(injectorThread, SIGNAL(finished()), injectorThread, SLOT(deleteLater()));
|
connect(injector, &AudioInjector::finished, this, &AudioScriptingInterface::injectorStopped);
|
||||||
|
connect(injectorThread, &QThread::finished, injectorThread, &QThread::deleteLater);
|
||||||
|
|
||||||
injectorThread->start();
|
injectorThread->start();
|
||||||
|
|
||||||
|
_activeInjectors.insert(injector);
|
||||||
|
|
||||||
return injector;
|
return injector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,24 +57,9 @@ bool AudioScriptingInterface::isInjectorPlaying(AudioInjector* injector) {
|
||||||
return (injector != NULL);
|
return (injector != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioScriptingInterface::startDrumSound(float volume, float frequency, float duration, float decay,
|
void AudioScriptingInterface::injectorStopped() {
|
||||||
const AudioInjectorOptions* injectorOptions) {
|
qDebug() << "Removing" << sender() << "from active injectors";
|
||||||
|
qDebug() << _activeInjectors.size();
|
||||||
Sound* sound = new Sound(volume, frequency, duration, decay);
|
_activeInjectors.remove(static_cast<AudioInjector*>(sender()));
|
||||||
AudioInjector* injector = new AudioInjector(sound, *injectorOptions);
|
qDebug() << _activeInjectors.size();
|
||||||
sound->setParent(injector);
|
|
||||||
|
|
||||||
QThread* injectorThread = new QThread();
|
|
||||||
|
|
||||||
injector->moveToThread(injectorThread);
|
|
||||||
|
|
||||||
// start injecting when the injector thread starts
|
|
||||||
connect(injectorThread, SIGNAL(started()), injector, SLOT(injectAudio()));
|
|
||||||
|
|
||||||
// connect the right slots and signals so that the AudioInjector is killed once the injection is complete
|
|
||||||
connect(injector, SIGNAL(finished()), injector, SLOT(deleteLater()));
|
|
||||||
connect(injector, SIGNAL(finished()), injectorThread, SLOT(quit()));
|
|
||||||
connect(injectorThread, SIGNAL(finished()), injectorThread, SLOT(deleteLater()));
|
|
||||||
|
|
||||||
injectorThread->start();
|
|
||||||
}
|
}
|
|
@ -19,12 +19,20 @@ const AudioInjectorOptions DEFAULT_INJECTOR_OPTIONS;
|
||||||
|
|
||||||
class AudioScriptingInterface : public QObject {
|
class AudioScriptingInterface : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
static AudioScriptingInterface& getInstance();
|
||||||
|
|
||||||
|
void stopAllInjectors();
|
||||||
public slots:
|
public slots:
|
||||||
static AudioInjector* playSound(Sound* sound, const AudioInjectorOptions* injectorOptions = NULL);
|
AudioInjector* playSound(Sound* sound, const AudioInjectorOptions* injectorOptions = NULL);
|
||||||
static void stopInjector(AudioInjector* injector);
|
void stopInjector(AudioInjector* injector);
|
||||||
static bool isInjectorPlaying(AudioInjector* injector);
|
bool isInjectorPlaying(AudioInjector* injector);
|
||||||
static void startDrumSound(float volume, float frequency, float duration, float decay,
|
|
||||||
const AudioInjectorOptions* injectorOptions = NULL);
|
void injectorStopped();
|
||||||
|
|
||||||
|
private:
|
||||||
|
AudioScriptingInterface() {};
|
||||||
|
QSet<AudioInjector*> _activeInjectors;
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif // hifi_AudioScriptingInterface_h
|
#endif // hifi_AudioScriptingInterface_h
|
||||||
|
|
|
@ -290,7 +290,7 @@ void ScriptEngine::init() {
|
||||||
qScriptRegisterMetaType(this, animationDetailsToScriptValue, animationDetailsFromScriptValue);
|
qScriptRegisterMetaType(this, animationDetailsToScriptValue, animationDetailsFromScriptValue);
|
||||||
|
|
||||||
registerGlobalObject("Script", this);
|
registerGlobalObject("Script", this);
|
||||||
registerGlobalObject("Audio", &_audioScriptingInterface);
|
registerGlobalObject("Audio", &AudioScriptingInterface::getInstance());
|
||||||
registerGlobalObject("Controller", _controllerScriptingInterface);
|
registerGlobalObject("Controller", _controllerScriptingInterface);
|
||||||
registerGlobalObject("Entities", &_entityScriptingInterface);
|
registerGlobalObject("Entities", &_entityScriptingInterface);
|
||||||
registerGlobalObject("Quat", &_quatLibrary);
|
registerGlobalObject("Quat", &_quatLibrary);
|
||||||
|
|
|
@ -141,9 +141,7 @@ private:
|
||||||
static VoxelsScriptingInterface _voxelsScriptingInterface;
|
static VoxelsScriptingInterface _voxelsScriptingInterface;
|
||||||
static EntityScriptingInterface _entityScriptingInterface;
|
static EntityScriptingInterface _entityScriptingInterface;
|
||||||
|
|
||||||
AbstractControllerScriptingInterface* _controllerScriptingInterface;
|
AbstractControllerScriptingInterface* _controllerScriptingInterface; AvatarData* _avatarData;
|
||||||
AudioScriptingInterface _audioScriptingInterface;
|
|
||||||
AvatarData* _avatarData;
|
|
||||||
QString _scriptName;
|
QString _scriptName;
|
||||||
QString _fileNameString;
|
QString _fileNameString;
|
||||||
Quat _quatLibrary;
|
Quat _quatLibrary;
|
||||||
|
|
Loading…
Reference in a new issue