History

fix for playSound called from same thread

Stephen Birarda committed 11 years ago

Commit 1ba85511 parent 51132582 files · +18 −24Browse files

Showing the changes to libraries/script-engine/src/AudioScriptingInterface.cpp (1 of 2 files). Show all

Unified · Split

libraries/script-engine/src/AudioScriptingInterface.cpp+18−21
@@ -31,44 +31,41 @@ AudioScriptingInterface::AudioScriptingInterface() : · 30 unmodified lines
3131 }
3232
3333 ScriptAudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions& injectorOptions) {
34− AudioInjector* injector = NULL;
35− QMetaObject::invokeMethod(this, "invokedPlaySound", Qt::BlockingQueuedConnection,
36− Q_RETURN_ARG(AudioInjector*, injector),
37− Q_ARG(Sound*, sound), Q_ARG(const AudioInjectorOptions&, injectorOptions));
38− if (injector) {
39− return new ScriptAudioInjector(injector);
40− } else {
41− return NULL;
34+ if (QThread::currentThread() != thread()) {
35+ ScriptAudioInjector* injector = NULL;
36+
37+ QMetaObject::invokeMethod(this, "playSound", Qt::BlockingQueuedConnection,
38+ Q_RETURN_ARG(ScriptAudioInjector*, injector),
39+ Q_ARG(Sound*, sound), Q_ARG(const AudioInjectorOptions&, injectorOptions));
40+ return injector;
4241 }
43−}
44−
45−AudioInjector* AudioScriptingInterface::invokedPlaySound(Sound* sound, const AudioInjectorOptions& injectorOptions) {
42+
4643 if (sound) {
4744 // stereo option isn't set from script, this comes from sound metadata or filename
4845 AudioInjectorOptions optionsCopy = injectorOptions;
4946 optionsCopy.stereo = sound->isStereo();
50−
47+
5148 QThread* injectorThread = new QThread();
5249 injectorThread->setObjectName("Audio Injector Thread");
53−
50+
5451 AudioInjector* injector = new AudioInjector(sound, optionsCopy);
5552 injector->setLocalAudioInterface(_localAudioInterface);
56−
53+
5754 injector->moveToThread(injectorThread);
58−
55+
5956 // start injecting when the injector thread starts
6057 connect(injectorThread, &QThread::started, injector, &AudioInjector::injectAudio);
61−
58+
6259 // connect the right slots and signals for AudioInjector and thread cleanup
6360 connect(injector, &AudioInjector::destroyed, injectorThread, &QThread::quit);
6461 connect(injectorThread, &QThread::finished, injectorThread, &QThread::deleteLater);
65−
62+
6663 injectorThread->start();
67−
68− return injector;
69−
64+
65+ return new ScriptAudioInjector(injector);
66+
7067 } else {
7168 qDebug() << "AudioScriptingInterface::playSound called with null Sound object.";
7269 return NULL;
7370 }
74−}
71+}