changes to allow AudioInjectorOptions to operate as a hash from js

This commit is contained in:
Stephen Birarda 2014-11-11 10:24:21 -08:00
parent d083e75d2d
commit a8681cd5b6
7 changed files with 85 additions and 89 deletions

View file

@ -75,7 +75,7 @@ void AudioInjector::injectAudio() {
packetStream << QUuid::createUuid(); packetStream << QUuid::createUuid();
// pack the stereo/mono type of the stream // pack the stereo/mono type of the stream
packetStream << _options.isStereo(); packetStream << _options.stereo;
// pack the flag for loopback // pack the flag for loopback
uchar loopbackFlag = (uchar) true; uchar loopbackFlag = (uchar) true;
@ -83,13 +83,13 @@ void AudioInjector::injectAudio() {
// pack the position for injected audio // pack the position for injected audio
int positionOptionOffset = injectAudioPacket.size(); int positionOptionOffset = injectAudioPacket.size();
packetStream.writeRawData(reinterpret_cast<const char*>(&_options.getPosition()), packetStream.writeRawData(reinterpret_cast<const char*>(&_options.position),
sizeof(_options.getPosition())); sizeof(_options.position));
// pack our orientation for injected audio // pack our orientation for injected audio
int orientationOptionOffset = injectAudioPacket.size(); int orientationOptionOffset = injectAudioPacket.size();
packetStream.writeRawData(reinterpret_cast<const char*>(&_options.getOrientation()), packetStream.writeRawData(reinterpret_cast<const char*>(&_options.orientation),
sizeof(_options.getOrientation())); sizeof(_options.orientation));
// pack zero for radius // pack zero for radius
float radius = 0; float radius = 0;
@ -97,23 +97,23 @@ void AudioInjector::injectAudio() {
// pack 255 for attenuation byte // pack 255 for attenuation byte
int volumeOptionOffset = injectAudioPacket.size(); int volumeOptionOffset = injectAudioPacket.size();
quint8 volume = MAX_INJECTOR_VOLUME * _options.getVolume(); quint8 volume = MAX_INJECTOR_VOLUME * _options.volume;
packetStream << volume; packetStream << volume;
packetStream << _options.ignorePenumbra(); packetStream << _options.ignorePenumbra;
QElapsedTimer timer; QElapsedTimer timer;
timer.start(); timer.start();
int nextFrame = 0; int nextFrame = 0;
int numPreAudioDataBytes = injectAudioPacket.size(); int numPreAudioDataBytes = injectAudioPacket.size();
bool shouldLoop = _options.getLoop(); bool shouldLoop = _options.loop;
// loop to send off our audio in NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL byte chunks // loop to send off our audio in NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL byte chunks
quint16 outgoingInjectedAudioSequenceNumber = 0; quint16 outgoingInjectedAudioSequenceNumber = 0;
while (_currentSendPosition < soundByteArray.size() && !_shouldStop) { while (_currentSendPosition < soundByteArray.size() && !_shouldStop) {
int bytesToCopy = std::min(((_options.isStereo()) ? 2 : 1) * NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL, int bytesToCopy = std::min(((_options.stereo) ? 2 : 1) * NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL,
soundByteArray.size() - _currentSendPosition); soundByteArray.size() - _currentSendPosition);
// Measure the loudness of this frame // Measure the loudness of this frame
@ -125,12 +125,12 @@ void AudioInjector::injectAudio() {
_loudness /= (float)(bytesToCopy / sizeof(int16_t)); _loudness /= (float)(bytesToCopy / sizeof(int16_t));
memcpy(injectAudioPacket.data() + positionOptionOffset, memcpy(injectAudioPacket.data() + positionOptionOffset,
&_options.getPosition(), &_options.position,
sizeof(_options.getPosition())); sizeof(_options.position));
memcpy(injectAudioPacket.data() + orientationOptionOffset, memcpy(injectAudioPacket.data() + orientationOptionOffset,
&_options.getOrientation(), &_options.orientation,
sizeof(_options.getOrientation())); sizeof(_options.orientation));
volume = MAX_INJECTOR_VOLUME * _options.getVolume(); volume = MAX_INJECTOR_VOLUME * _options.volume;
memcpy(injectAudioPacket.data() + volumeOptionOffset, &volume, sizeof(volume)); memcpy(injectAudioPacket.data() + volumeOptionOffset, &volume, sizeof(volume));
// resize the QByteArray to the right size // resize the QByteArray to the right size

View file

@ -9,33 +9,54 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#include <RegisteredMetaTypes.h>
#include "AudioInjectorOptions.h" #include "AudioInjectorOptions.h"
AudioInjectorOptions::AudioInjectorOptions(QObject* parent) : AudioInjectorOptions::AudioInjectorOptions() :
QObject(parent), position(0.0f, 0.0f, 0.0f),
_position(0.0f, 0.0f, 0.0f), volume(1.0f),
_volume(1.0f), loop(false),
_loop(false), orientation(glm::vec3(0.0f, 0.0f, 0.0f)),
_orientation(glm::vec3(0.0f, 0.0f, 0.0f)), stereo(false),
_isStereo(false), ignorePenumbra(false)
_ignorePenumbra(false)
{ {
} }
AudioInjectorOptions::AudioInjectorOptions(const AudioInjectorOptions& other) { QScriptValue injectorOptionsToScriptValue(QScriptEngine* engine, const AudioInjectorOptions& injectorOptions) {
_position = other._position; QScriptValue obj = engine->newObject();
_volume = other._volume; obj.setProperty("position", vec3toScriptValue(engine, injectorOptions.position));
_loop = other._loop; obj.setProperty("volume", injectorOptions.volume);
_orientation = other._orientation; obj.setProperty("loop", injectorOptions.loop);
_isStereo = other._isStereo; obj.setProperty("orientation", quatToScriptValue(engine, injectorOptions.orientation));
_ignorePenumbra = other._ignorePenumbra; obj.setProperty("stereo", injectorOptions.stereo);
obj.setProperty("ignorePenumbra", injectorOptions.ignorePenumbra);
return obj;
} }
void AudioInjectorOptions::operator=(const AudioInjectorOptions& other) { void injectorOptionsFromScriptValue(const QScriptValue& object, AudioInjectorOptions& injectorOptions) {
_position = other._position; if (object.property("position").isValid()) {
_volume = other._volume; vec3FromScriptValue(object.property("position"), injectorOptions.position);
_loop = other._loop; }
_orientation = other._orientation;
_isStereo = other._isStereo; if (object.property("volume").isValid()) {
_ignorePenumbra = other._ignorePenumbra; injectorOptions.volume = object.property("volume").toNumber();
} }
if (object.property("loop").isValid()) {
injectorOptions.loop = object.property("loop").toBool();
}
if (object.property("orientation").isValid()) {
quatFromScriptValue(object.property("orientation"), injectorOptions.orientation);
}
if (object.property("stereo").isValid()) {
injectorOptions.stereo = object.property("stereo").toBool();
}
if (object.property("ignorePenumbra").isValid()) {
injectorOptions.ignorePenumbra = object.property("ignorePenumbra").toBool();
}
}

View file

@ -12,54 +12,25 @@
#ifndef hifi_AudioInjectorOptions_h #ifndef hifi_AudioInjectorOptions_h
#define hifi_AudioInjectorOptions_h #define hifi_AudioInjectorOptions_h
#include <QtCore/QObject> #include <QtScript/qscriptengine.h>
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <glm/gtx/quaternion.hpp> #include <glm/gtx/quaternion.hpp>
#include <RegisteredMetaTypes.h> class AudioInjectorOptions {
class AudioInjectorOptions : public QObject {
Q_OBJECT
Q_PROPERTY(glm::quat orientation READ getOrientation WRITE setOrientation)
Q_PROPERTY(glm::vec3 position READ getPosition WRITE setPosition)
Q_PROPERTY(float volume READ getVolume WRITE setVolume)
Q_PROPERTY(bool loop READ getLoop WRITE setLoop)
Q_PROPERTY(bool isStereo READ isStereo WRITE setIsStereo)
Q_PROPERTY(bool ignorePenumbra READ ignorePenumbra WRITE setIgnorePenumbra)
public: public:
AudioInjectorOptions(QObject* parent = 0); AudioInjectorOptions();
AudioInjectorOptions(const AudioInjectorOptions& other); glm::vec3 position;
void operator=(const AudioInjectorOptions& other); float volume;
bool loop;
const glm::vec3& getPosition() const { return _position; } glm::quat orientation;
void setPosition(const glm::vec3& position) { _position = position; } bool stereo;
bool ignorePenumbra;
float getVolume() const { return _volume; }
void setVolume(float volume) { _volume = volume; }
bool getLoop() const { return _loop; }
void setLoop(bool loop) { _loop = loop; }
const glm::quat& getOrientation() const { return _orientation; }
void setOrientation(const glm::quat& orientation) { _orientation = orientation; }
const bool isStereo() const { return _isStereo; }
void setIsStereo(const bool isStereo) { _isStereo = isStereo; }
const bool ignorePenumbra() const {return _ignorePenumbra; }
void setIgnorePenumbra(bool ignorePenumbra) { _ignorePenumbra = ignorePenumbra; }
private:
glm::vec3 _position;
float _volume;
bool _loop;
glm::quat _orientation;
bool _isStereo;
bool _ignorePenumbra;
}; };
Q_DECLARE_METATYPE(AudioInjectorOptions) Q_DECLARE_METATYPE(AudioInjectorOptions);
QScriptValue injectorOptionsToScriptValue(QScriptEngine* engine, const AudioInjectorOptions& injectorOptions);
void injectorOptionsFromScriptValue(const QScriptValue& object, AudioInjectorOptions& injectorOptions);
#endif // hifi_AudioInjectorOptions_h #endif // hifi_AudioInjectorOptions_h

View file

@ -11,6 +11,10 @@
#include "AudioScriptingInterface.h" #include "AudioScriptingInterface.h"
void registerAudioMetaTypes(QScriptEngine* engine) {
qScriptRegisterMetaType(engine, injectorOptionsToScriptValue, injectorOptionsFromScriptValue);
}
AudioScriptingInterface& AudioScriptingInterface::getInstance() { AudioScriptingInterface& AudioScriptingInterface::getInstance() {
static AudioScriptingInterface staticInstance; static AudioScriptingInterface staticInstance;
return staticInstance; return staticInstance;
@ -40,7 +44,7 @@ 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()) {
const_cast<AudioInjectorOptions*>(injectorOptions)->setIsStereo(true); const_cast<AudioInjectorOptions*>(injectorOptions)->stereo = true;
} }
AudioInjector* injector = new AudioInjector(sound, *injectorOptions); AudioInjector* injector = new AudioInjector(sound, *injectorOptions);

View file

@ -44,4 +44,7 @@ private:
QList< QPointer<AudioInjector> > _activeInjectors; QList< QPointer<AudioInjector> > _activeInjectors;
AbstractAudioInterface* _localLoopbackInterface; AbstractAudioInterface* _localLoopbackInterface;
}; };
void registerAudioMetaTypes(QScriptEngine* engine);
#endif // hifi_AudioScriptingInterface_h #endif // hifi_AudioScriptingInterface_h

View file

@ -166,8 +166,8 @@ void Player::pausePlayer() {
void Player::setupAudioThread() { void Player::setupAudioThread() {
_audioThread = new QThread(); _audioThread = new QThread();
_options.setPosition(_avatar->getPosition()); _options.position = _avatar->getPosition();
_options.setOrientation(_avatar->getOrientation()); _options.orientation = _avatar->getOrientation();
_injector.reset(new AudioInjector(_recording->getAudio(), _options), &QObject::deleteLater); _injector.reset(new AudioInjector(_recording->getAudio(), _options), &QObject::deleteLater);
_injector->moveToThread(_audioThread); _injector->moveToThread(_audioThread);
_audioThread->start(); _audioThread->start();
@ -292,8 +292,8 @@ void Player::play() {
qDebug() << "WARNING: Player couldn't find head data."; qDebug() << "WARNING: Player couldn't find head data.";
} }
_options.setPosition(_avatar->getPosition()); _options.position = _avatar->getPosition();
_options.setOrientation(_avatar->getOrientation()); _options.orientation = _avatar->getOrientation();
_injector->setOptions(_options); _injector->setOptions(_options);
} }
@ -360,7 +360,7 @@ void Player::setCurrentTime(unsigned int currentTime) {
} }
void Player::setVolume(float volume) { void Player::setVolume(float volume) {
_options.setVolume(volume); _options.volume = volume;
if (_injector) { if (_injector) {
_injector->setOptions(_options); _injector->setOptions(_options);
} }

View file

@ -234,7 +234,6 @@ bool ScriptEngine::setScriptContents(const QString& scriptContents, const QStrin
return true; return true;
} }
Q_SCRIPT_DECLARE_QMETAOBJECT(AudioInjectorOptions, QObject*)
Q_SCRIPT_DECLARE_QMETAOBJECT(LocalVoxels, QString) Q_SCRIPT_DECLARE_QMETAOBJECT(LocalVoxels, QString)
void ScriptEngine::init() { void ScriptEngine::init() {
@ -254,6 +253,7 @@ void ScriptEngine::init() {
registerMenuItemProperties(this); registerMenuItemProperties(this);
registerAnimationTypes(this); registerAnimationTypes(this);
registerAvatarTypes(this); registerAvatarTypes(this);
registerAudioMetaTypes(this);
Bitstream::registerTypes(this); Bitstream::registerTypes(this);
qScriptRegisterMetaType(this, EntityItemPropertiesToScriptValue, EntityItemPropertiesFromScriptValue); qScriptRegisterMetaType(this, EntityItemPropertiesToScriptValue, EntityItemPropertiesFromScriptValue);
@ -275,9 +275,6 @@ void ScriptEngine::init() {
QScriptValue soundMetaObject = newQMetaObject(&Sound::staticMetaObject, soundConstructorValue); QScriptValue soundMetaObject = newQMetaObject(&Sound::staticMetaObject, soundConstructorValue);
globalObject().setProperty("Sound", soundMetaObject); globalObject().setProperty("Sound", soundMetaObject);
QScriptValue injectionOptionValue = scriptValueFromQMetaObject<AudioInjectorOptions>();
globalObject().setProperty("AudioInjectionOptions", injectionOptionValue);
QScriptValue localVoxelsValue = scriptValueFromQMetaObject<LocalVoxels>(); QScriptValue localVoxelsValue = scriptValueFromQMetaObject<LocalVoxels>();
globalObject().setProperty("LocalVoxels", localVoxelsValue); globalObject().setProperty("LocalVoxels", localVoxelsValue);