History

cleanup AudioInjector memory management

Stephen Birarda committed 11 years ago

Commit 7b485821 parent c5c3d246 files · +49 −73Browse files

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

Unified · Split

libraries/script-engine/src/AudioScriptingInterface.cpp+74−0
@@ -0,0 +1,74 @@
1//
2// AudioScriptingInterface.cpp
3// libraries/audio/src
4//
5// Created by Stephen Birarda on 1/2/2014.
6// Copyright 2014 High Fidelity, Inc.
7//
8// Distributed under the Apache License, Version 2.0.
9// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10//
11
12#include "AudioScriptingInterface.h"
13
14void registerAudioMetaTypes(QScriptEngine* engine) {
15 qScriptRegisterMetaType(engine, injectorOptionsToScriptValue, injectorOptionsFromScriptValue);
16 qScriptRegisterMetaType(engine, soundSharedPointerToScriptValue, soundSharedPointerFromScriptValue);
17 qScriptRegisterMetaType(engine, soundPointerToScriptValue, soundPointerFromScriptValue);
18}
19
20AudioScriptingInterface& AudioScriptingInterface::getInstance() {
21 static AudioScriptingInterface staticInstance;
22 return staticInstance;
23}
24
25AudioScriptingInterface::AudioScriptingInterface() :
26 _localAudioInterface(NULL)
27{
28
29}
30
31AudioInjector* AudioScriptingInterface::playSound(Sound* sound, const AudioInjectorOptions& injectorOptions) {
32 AudioInjector* injector = NULL;
33 QMetaObject::invokeMethod(this, "invokedPlaySound", Qt::BlockingQueuedConnection,
34 Q_RETURN_ARG(AudioInjector*, injector),
35 Q_ARG(Sound*, sound), Q_ARG(const AudioInjectorOptions&, injectorOptions));
36 return injector;
37}
38
39AudioInjector* AudioScriptingInterface::invokedPlaySound(Sound* sound, const AudioInjectorOptions& injectorOptions) {
40 if (sound) {
41 // stereo option isn't set from script, this comes from sound metadata or filename
42 AudioInjectorOptions optionsCopy = injectorOptions;
43 optionsCopy.stereo = sound->isStereo();
44
45 QThread* injectorThread = new QThread();
46 injectorThread->setObjectName("Audio Injector Thread");
47
48 AudioInjector* injector = new AudioInjector(sound, optionsCopy);
49 injector->setLocalAudioInterface(_localAudioInterface);
50
51 injector->moveToThread(injectorThread);
52
53 // start injecting when the injector thread starts
54 connect(injectorThread, &QThread::started, injector, &AudioInjector::injectAudio);
55
56
57 // connect the right slots and signals for AudioInjector and thread cleanup
58 connect(injector, &AudioInjector::destroyed, injectorThread, &QThread::quit);
59 connect(injectorThread, &QThread::finished, injectorThread, &QThread::deleteLater);
60 connect(injectorThread, &QThread::destroyed, this, &AudioScriptingInterface::threadDead);
61
62 injectorThread->start();
63
64 return injector;
65
66 } else {
67 qDebug() << "AudioScriptingInterface::playSound called with null Sound object.";
68 return NULL;
69 }
70}
71
72void AudioScriptingInterface::threadDead() {
73 qDebug() << "The audio thread has gone down";
74}