mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-04 07:24:59 +02:00
Merge branch 'master' of https://github.com/highfidelity/hifi into orange
This commit is contained in:
commit
5ebbdaca05
17 changed files with 221 additions and 86 deletions
|
@ -549,14 +549,18 @@ void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const Hif
|
||||||
|
|
||||||
nodeList->findNodeAndUpdateWithDataFromPacket(receivedPacket);
|
nodeList->findNodeAndUpdateWithDataFromPacket(receivedPacket);
|
||||||
} else if (mixerPacketType == PacketTypeMuteEnvironment) {
|
} else if (mixerPacketType == PacketTypeMuteEnvironment) {
|
||||||
|
SharedNodePointer sendingNode = nodeList->sendingNodeForPacket(receivedPacket);
|
||||||
|
if (sendingNode->getCanAdjustLocks()) {
|
||||||
QByteArray packet = receivedPacket;
|
QByteArray packet = receivedPacket;
|
||||||
populatePacketHeader(packet, PacketTypeMuteEnvironment);
|
populatePacketHeader(packet, PacketTypeMuteEnvironment);
|
||||||
|
|
||||||
nodeList->eachNode([&](const SharedNodePointer& node){
|
nodeList->eachNode([&](const SharedNodePointer& node){
|
||||||
if (node->getType() == NodeType::Agent && node->getActiveSocket() && node->getLinkedData() && node != nodeList->sendingNodeForPacket(receivedPacket)) {
|
if (node->getType() == NodeType::Agent && node->getActiveSocket() &&
|
||||||
|
node->getLinkedData() && node != sendingNode) {
|
||||||
nodeList->writeDatagram(packet, packet.size(), node);
|
nodeList->writeDatagram(packet, packet.size(), node);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// let processNodeData handle it.
|
// let processNodeData handle it.
|
||||||
nodeList->processNodeData(senderSockAddr, receivedPacket);
|
nodeList->processNodeData(senderSockAddr, receivedPacket);
|
||||||
|
|
|
@ -508,18 +508,22 @@
|
||||||
// To make this work we block the first mouseup event after the elements
|
// To make this work we block the first mouseup event after the elements
|
||||||
// received focus. If we block all mouseup events the user will not
|
// received focus. If we block all mouseup events the user will not
|
||||||
// be able to click within the selected text.
|
// be able to click within the selected text.
|
||||||
|
// We also check to see if the value has changed to make sure we aren't
|
||||||
|
// blocking a mouse-up event when clicking on an input spinner.
|
||||||
var els = document.querySelectorAll("input, textarea");
|
var els = document.querySelectorAll("input, textarea");
|
||||||
for (var i = 0; i < els.length; i++) {
|
for (var i = 0; i < els.length; i++) {
|
||||||
var clicked = false;
|
var clicked = false;
|
||||||
|
var originalText;
|
||||||
els[i].onfocus = function() {
|
els[i].onfocus = function() {
|
||||||
|
originalText = this.value;
|
||||||
this.select();
|
this.select();
|
||||||
clicked = false;
|
clicked = false;
|
||||||
};
|
};
|
||||||
els[i].onmouseup = function(e) {
|
els[i].onmouseup = function(e) {
|
||||||
if (!clicked) {
|
if (!clicked && originalText == this.value) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
clicked = true;
|
|
||||||
}
|
}
|
||||||
|
clicked = true;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,17 +12,27 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
var createdRenderMenu = false;
|
var createdRenderMenu = false;
|
||||||
|
var createdGeneratedAudioMenu = false;
|
||||||
|
|
||||||
var ENTITIES_MENU = "Developer > Entities";
|
var DEVELOPER_MENU = "Developer";
|
||||||
|
|
||||||
|
var ENTITIES_MENU = DEVELOPER_MENU + " > Entities";
|
||||||
var COLLISION_UPDATES_TO_SERVER = "Don't send collision updates to server";
|
var COLLISION_UPDATES_TO_SERVER = "Don't send collision updates to server";
|
||||||
|
|
||||||
var RENDER_MENU = "Developer > Render";
|
var RENDER_MENU = DEVELOPER_MENU + " > Render";
|
||||||
var ENTITIES_ITEM = "Entities";
|
var ENTITIES_ITEM = "Entities";
|
||||||
var AVATARS_ITEM = "Avatars";
|
var AVATARS_ITEM = "Avatars";
|
||||||
|
|
||||||
|
var AUDIO_MENU = DEVELOPER_MENU + " > Audio";
|
||||||
|
var AUDIO_SOURCE_INJECT = "Generated Audio";
|
||||||
|
var AUDIO_SOURCE_MENU = AUDIO_MENU + " > Generated Audio Source";
|
||||||
|
var AUDIO_SOURCE_PINK_NOISE = "Pink Noise";
|
||||||
|
var AUDIO_SOURCE_SINE_440 = "Sine 440hz";
|
||||||
|
|
||||||
|
|
||||||
function setupMenus() {
|
function setupMenus() {
|
||||||
if (!Menu.menuExists("Developer")) {
|
if (!Menu.menuExists(DEVELOPER_MENU)) {
|
||||||
Menu.addMenu("Developer");
|
Menu.addMenu(DEVELOPER_MENU);
|
||||||
}
|
}
|
||||||
if (!Menu.menuExists(ENTITIES_MENU)) {
|
if (!Menu.menuExists(ENTITIES_MENU)) {
|
||||||
Menu.addMenu(ENTITIES_MENU);
|
Menu.addMenu(ENTITIES_MENU);
|
||||||
|
@ -54,6 +64,20 @@ function setupMenus() {
|
||||||
if (!Menu.menuItemExists(RENDER_MENU, AVATARS_ITEM)) {
|
if (!Menu.menuItemExists(RENDER_MENU, AVATARS_ITEM)) {
|
||||||
Menu.addMenuItem({ menuName: RENDER_MENU, menuItemName: AVATARS_ITEM, isCheckable: true, isChecked: Scene.shouldRenderAvatars })
|
Menu.addMenuItem({ menuName: RENDER_MENU, menuItemName: AVATARS_ITEM, isCheckable: true, isChecked: Scene.shouldRenderAvatars })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!Menu.menuExists(AUDIO_MENU)) {
|
||||||
|
Menu.addMenu(AUDIO_MENU);
|
||||||
|
}
|
||||||
|
if (!Menu.menuItemExists(AUDIO_MENU, AUDIO_SOURCE_INJECT)) {
|
||||||
|
Menu.addMenuItem({ menuName: AUDIO_MENU, menuItemName: AUDIO_SOURCE_INJECT, isCheckable: true, isChecked: false });
|
||||||
|
Menu.addMenu(AUDIO_SOURCE_MENU);
|
||||||
|
Menu.addMenuItem({ menuName: AUDIO_SOURCE_MENU, menuItemName: AUDIO_SOURCE_PINK_NOISE, isCheckable: true, isChecked: false });
|
||||||
|
Menu.addMenuItem({ menuName: AUDIO_SOURCE_MENU, menuItemName: AUDIO_SOURCE_SINE_440, isCheckable: true, isChecked: false });
|
||||||
|
Menu.setIsOptionChecked(AUDIO_SOURCE_PINK_NOISE, true);
|
||||||
|
Audio.selectPinkNoise();
|
||||||
|
createdGeneratedAudioMenu = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Menu.menuItemEvent.connect(function (menuItem) {
|
Menu.menuItemEvent.connect(function (menuItem) {
|
||||||
|
@ -67,6 +91,14 @@ Menu.menuItemEvent.connect(function (menuItem) {
|
||||||
Scene.shouldRenderEntities = Menu.isOptionChecked(ENTITIES_ITEM);
|
Scene.shouldRenderEntities = Menu.isOptionChecked(ENTITIES_ITEM);
|
||||||
} else if (menuItem == AVATARS_ITEM) {
|
} else if (menuItem == AVATARS_ITEM) {
|
||||||
Scene.shouldRenderAvatars = Menu.isOptionChecked(AVATARS_ITEM);
|
Scene.shouldRenderAvatars = Menu.isOptionChecked(AVATARS_ITEM);
|
||||||
|
} else if (menuItem == AUDIO_SOURCE_INJECT && !createdGeneratedAudioMenu) {
|
||||||
|
Audio.injectGeneratedNoise(Menu.isOptionChecked(AUDIO_SOURCE_INJECT));
|
||||||
|
} else if (menuItem == AUDIO_SOURCE_PINK_NOISE && !createdGeneratedAudioMenu) {
|
||||||
|
Audio.selectPinkNoise();
|
||||||
|
Menu.setIsOptionChecked(AUDIO_SOURCE_SINE_440, false);
|
||||||
|
} else if (menuItem == AUDIO_SOURCE_SINE_440 && !createdGeneratedAudioMenu) {
|
||||||
|
Audio.selectSine440();
|
||||||
|
Menu.setIsOptionChecked(AUDIO_SOURCE_PINK_NOISE, false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -87,6 +119,12 @@ function scriptEnding() {
|
||||||
Menu.removeMenuItem(RENDER_MENU, ENTITIES_ITEM);
|
Menu.removeMenuItem(RENDER_MENU, ENTITIES_ITEM);
|
||||||
Menu.removeMenuItem(RENDER_MENU, AVATARS_ITEM);
|
Menu.removeMenuItem(RENDER_MENU, AVATARS_ITEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (createdGeneratedAudioMenu) {
|
||||||
|
Audio.injectGeneratedNoise(false);
|
||||||
|
Menu.removeMenuItem(AUDIO_MENU, AUDIO_SOURCE_INJECT);
|
||||||
|
Menu.removeMenu(AUDIO_SOURCE_MENU);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setupMenus();
|
setupMenus();
|
||||||
|
|
|
@ -611,6 +611,10 @@ void Application::cleanupBeforeQuit() {
|
||||||
|
|
||||||
// destroy the AudioClient so it and its thread have a chance to go down safely
|
// destroy the AudioClient so it and its thread have a chance to go down safely
|
||||||
DependencyManager::destroy<AudioClient>();
|
DependencyManager::destroy<AudioClient>();
|
||||||
|
|
||||||
|
#ifdef HAVE_DDE
|
||||||
|
DependencyManager::destroy<DdeFaceTracker>();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::~Application() {
|
Application::~Application() {
|
||||||
|
@ -1743,7 +1747,9 @@ void Application::setActiveFaceTracker() {
|
||||||
#ifdef HAVE_FACESHIFT
|
#ifdef HAVE_FACESHIFT
|
||||||
DependencyManager::get<Faceshift>()->setTCPEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift));
|
DependencyManager::get<Faceshift>()->setTCPEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift));
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_DDE
|
||||||
DependencyManager::get<DdeFaceTracker>()->setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::DDEFaceRegression));
|
DependencyManager::get<DdeFaceTracker>()->setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::DDEFaceRegression));
|
||||||
|
#endif
|
||||||
#ifdef HAVE_VISAGE
|
#ifdef HAVE_VISAGE
|
||||||
DependencyManager::get<Visage>()->updateEnabled();
|
DependencyManager::get<Visage>()->updateEnabled();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -210,6 +210,8 @@ public:
|
||||||
bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated; }
|
bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated; }
|
||||||
|
|
||||||
FaceTracker* getActiveFaceTracker();
|
FaceTracker* getActiveFaceTracker();
|
||||||
|
void setActiveFaceTracker();
|
||||||
|
|
||||||
QSystemTrayIcon* getTrayIcon() { return _trayIcon; }
|
QSystemTrayIcon* getTrayIcon() { return _trayIcon; }
|
||||||
ApplicationOverlay& getApplicationOverlay() { return _applicationOverlay; }
|
ApplicationOverlay& getApplicationOverlay() { return _applicationOverlay; }
|
||||||
Overlays& getOverlays() { return _overlays; }
|
Overlays& getOverlays() { return _overlays; }
|
||||||
|
@ -390,8 +392,6 @@ public slots:
|
||||||
|
|
||||||
void notifyPacketVersionMismatch();
|
void notifyPacketVersionMismatch();
|
||||||
|
|
||||||
void setActiveFaceTracker();
|
|
||||||
|
|
||||||
void domainConnectionDenied(const QString& reason);
|
void domainConnectionDenied(const QString& reason);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
|
@ -362,28 +362,36 @@ Menu::Menu() {
|
||||||
|
|
||||||
QAction* noFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::NoFaceTracking,
|
QAction* noFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::NoFaceTracking,
|
||||||
0, true,
|
0, true,
|
||||||
qApp, SLOT(setActiveFaceTracker()));
|
this, SLOT(setActiveFaceTracker()));
|
||||||
faceTrackerGroup->addAction(noFaceTracker);
|
faceTrackerGroup->addAction(noFaceTracker);
|
||||||
|
|
||||||
#ifdef HAVE_FACESHIFT
|
#ifdef HAVE_FACESHIFT
|
||||||
QAction* faceshiftFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::Faceshift,
|
QAction* faceshiftFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::Faceshift,
|
||||||
0, false,
|
0, false,
|
||||||
qApp, SLOT(setActiveFaceTracker()));
|
this, SLOT(setActiveFaceTracker()));
|
||||||
faceTrackerGroup->addAction(faceshiftFaceTracker);
|
faceTrackerGroup->addAction(faceshiftFaceTracker);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_DDE
|
||||||
QAction* ddeFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::DDEFaceRegression,
|
QAction* ddeFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::DDEFaceRegression,
|
||||||
0, false,
|
0, false,
|
||||||
qApp, SLOT(setActiveFaceTracker()));
|
this, SLOT(setActiveFaceTracker()));
|
||||||
faceTrackerGroup->addAction(ddeFaceTracker);
|
faceTrackerGroup->addAction(ddeFaceTracker);
|
||||||
|
#endif
|
||||||
#ifdef HAVE_VISAGE
|
#ifdef HAVE_VISAGE
|
||||||
QAction* visageFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::Visage,
|
QAction* visageFaceTracker = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::Visage,
|
||||||
0, false,
|
0, false,
|
||||||
qApp, SLOT(setActiveFaceTracker()));
|
this, SLOT(setActiveFaceTracker()));
|
||||||
faceTrackerGroup->addAction(visageFaceTracker);
|
faceTrackerGroup->addAction(visageFaceTracker);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_DDE
|
||||||
|
faceTrackingMenu->addSeparator();
|
||||||
|
QAction* ddeFaceTrackerReset = addActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::ResetDDETracking,
|
||||||
|
Qt::CTRL | Qt::Key_Apostrophe,
|
||||||
|
DependencyManager::get<DdeFaceTracker>().data(), SLOT(resetTracking()));
|
||||||
|
ddeFaceTrackerReset->setVisible(false);
|
||||||
|
faceTrackingMenu->addAction(ddeFaceTrackerReset);
|
||||||
|
#endif
|
||||||
|
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderSkeletonCollisionShapes);
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderSkeletonCollisionShapes);
|
||||||
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderHeadCollisionShapes);
|
addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderHeadCollisionShapes);
|
||||||
|
@ -484,30 +492,6 @@ Menu::Menu() {
|
||||||
audioIO.data(),
|
audioIO.data(),
|
||||||
SLOT(sendMuteEnvironmentPacket()));
|
SLOT(sendMuteEnvironmentPacket()));
|
||||||
|
|
||||||
addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::AudioSourceInject,
|
|
||||||
0,
|
|
||||||
false,
|
|
||||||
audioIO.data(),
|
|
||||||
SLOT(toggleAudioSourceInject()));
|
|
||||||
QMenu* audioSourceMenu = audioDebugMenu->addMenu("Generated Audio Source");
|
|
||||||
{
|
|
||||||
QAction *pinkNoise = addCheckableActionToQMenuAndActionHash(audioSourceMenu, MenuOption::AudioSourcePinkNoise,
|
|
||||||
0,
|
|
||||||
false,
|
|
||||||
audioIO.data(),
|
|
||||||
SLOT(selectAudioSourcePinkNoise()));
|
|
||||||
|
|
||||||
QAction *sine440 = addCheckableActionToQMenuAndActionHash(audioSourceMenu, MenuOption::AudioSourceSine440,
|
|
||||||
0,
|
|
||||||
true,
|
|
||||||
audioIO.data(),
|
|
||||||
SLOT(selectAudioSourceSine440()));
|
|
||||||
|
|
||||||
QActionGroup* audioSourceGroup = new QActionGroup(audioSourceMenu);
|
|
||||||
audioSourceGroup->addAction(pinkNoise);
|
|
||||||
audioSourceGroup->addAction(sine440);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto scope = DependencyManager::get<AudioScope>();
|
auto scope = DependencyManager::get<AudioScope>();
|
||||||
|
|
||||||
QMenu* audioScopeMenu = audioDebugMenu->addMenu("Audio Scope");
|
QMenu* audioScopeMenu = audioDebugMenu->addMenu("Audio Scope");
|
||||||
|
@ -1003,3 +987,11 @@ void Menu::visibilityChanged(Discoverability::Mode discoverabilityMode) {
|
||||||
qCDebug(interfaceapp) << "ERROR Menu::visibilityChanged() called with unrecognized value.";
|
qCDebug(interfaceapp) << "ERROR Menu::visibilityChanged() called with unrecognized value.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Menu::setActiveFaceTracker() {
|
||||||
|
#ifdef HAVE_DDE
|
||||||
|
bool isUsingDDE = Menu::getInstance()->isOptionChecked(MenuOption::DDEFaceRegression);
|
||||||
|
Menu::getInstance()->getActionForOption(MenuOption::ResetDDETracking)->setVisible(isUsingDDE);
|
||||||
|
#endif
|
||||||
|
qApp->setActiveFaceTracker();
|
||||||
|
}
|
||||||
|
|
|
@ -68,6 +68,7 @@ public slots:
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void setVisibility();
|
void setVisibility();
|
||||||
|
void setActiveFaceTracker();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static Menu* _instance;
|
static Menu* _instance;
|
||||||
|
@ -123,9 +124,6 @@ namespace MenuOption {
|
||||||
const QString AudioScopeTwentyFrames = "Twenty";
|
const QString AudioScopeTwentyFrames = "Twenty";
|
||||||
const QString AudioStats = "Audio Stats";
|
const QString AudioStats = "Audio Stats";
|
||||||
const QString AudioStatsShowInjectedStreams = "Audio Stats Show Injected Streams";
|
const QString AudioStatsShowInjectedStreams = "Audio Stats Show Injected Streams";
|
||||||
const QString AudioSourceInject = "Generated Audio";
|
|
||||||
const QString AudioSourcePinkNoise = "Pink Noise";
|
|
||||||
const QString AudioSourceSine440 = "Sine 440hz";
|
|
||||||
const QString BandwidthDetails = "Bandwidth Details";
|
const QString BandwidthDetails = "Bandwidth Details";
|
||||||
const QString BlueSpeechSphere = "Blue Sphere While Speaking";
|
const QString BlueSpeechSphere = "Blue Sphere While Speaking";
|
||||||
const QString BookmarkLocation = "Bookmark Location";
|
const QString BookmarkLocation = "Bookmark Location";
|
||||||
|
@ -230,6 +228,7 @@ namespace MenuOption {
|
||||||
const QString RenderAmbientLight8 = "CAMPUS_SUNSET";
|
const QString RenderAmbientLight8 = "CAMPUS_SUNSET";
|
||||||
const QString RenderAmbientLight9 = "FUNSTON_BEACH_SUNSET";
|
const QString RenderAmbientLight9 = "FUNSTON_BEACH_SUNSET";
|
||||||
const QString ResetAvatarSize = "Reset Avatar Size";
|
const QString ResetAvatarSize = "Reset Avatar Size";
|
||||||
|
const QString ResetDDETracking = "Reset DDE Tracking";
|
||||||
const QString ResetSensors = "Reset Sensors";
|
const QString ResetSensors = "Reset Sensors";
|
||||||
const QString RunningScripts = "Running Scripts";
|
const QString RunningScripts = "Running Scripts";
|
||||||
const QString RunTimingTests = "Run Timing Tests";
|
const QString RunTimingTests = "Run Timing Tests";
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include <SharedUtil.h>
|
#include <SharedUtil.h>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
|
@ -19,10 +20,21 @@
|
||||||
#include "DdeFaceTracker.h"
|
#include "DdeFaceTracker.h"
|
||||||
#include "FaceshiftConstants.h"
|
#include "FaceshiftConstants.h"
|
||||||
#include "InterfaceLogging.h"
|
#include "InterfaceLogging.h"
|
||||||
|
#include "Menu.h"
|
||||||
|
|
||||||
|
|
||||||
static const QHostAddress DDE_FEATURE_POINT_SERVER_ADDR("127.0.0.1");
|
static const QHostAddress DDE_SERVER_ADDR("127.0.0.1");
|
||||||
static const quint16 DDE_FEATURE_POINT_SERVER_PORT = 5555;
|
static const quint16 DDE_SERVER_PORT = 64204;
|
||||||
|
static const quint16 DDE_CONTROL_PORT = 64205;
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
static const QString DDE_PROGRAM_PATH = QCoreApplication::applicationDirPath() + "/dde/dde.exe";
|
||||||
|
#elif defined(Q_OS_MAC)
|
||||||
|
static const QString DDE_PROGRAM_PATH = QCoreApplication::applicationDirPath() + "/dde.app/Contents/MacOS/dde";
|
||||||
|
#endif
|
||||||
|
static const QStringList DDE_ARGUMENTS = QStringList()
|
||||||
|
<< "--udp=" + DDE_SERVER_ADDR.toString() + ":" + QString::number(DDE_SERVER_PORT)
|
||||||
|
<< "--receiver=" + QString::number(DDE_CONTROL_PORT)
|
||||||
|
<< "--headless";
|
||||||
|
|
||||||
static const int NUM_EXPRESSIONS = 46;
|
static const int NUM_EXPRESSIONS = 46;
|
||||||
static const int MIN_PACKET_SIZE = (8 + NUM_EXPRESSIONS) * sizeof(float) + sizeof(int);
|
static const int MIN_PACKET_SIZE = (8 + NUM_EXPRESSIONS) * sizeof(float) + sizeof(int);
|
||||||
|
@ -121,14 +133,16 @@ struct Packet {
|
||||||
};
|
};
|
||||||
|
|
||||||
DdeFaceTracker::DdeFaceTracker() :
|
DdeFaceTracker::DdeFaceTracker() :
|
||||||
DdeFaceTracker(QHostAddress::Any, DDE_FEATURE_POINT_SERVER_PORT)
|
DdeFaceTracker(QHostAddress::Any, DDE_SERVER_PORT, DDE_CONTROL_PORT)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DdeFaceTracker::DdeFaceTracker(const QHostAddress& host, quint16 port) :
|
DdeFaceTracker::DdeFaceTracker(const QHostAddress& host, quint16 serverPort, quint16 controlPort) :
|
||||||
|
_ddeProcess(NULL),
|
||||||
_host(host),
|
_host(host),
|
||||||
_port(port),
|
_serverPort(serverPort),
|
||||||
|
_controlPort(controlPort),
|
||||||
_lastReceiveTimestamp(0),
|
_lastReceiveTimestamp(0),
|
||||||
_reset(false),
|
_reset(false),
|
||||||
_leftBlinkIndex(0), // see http://support.faceshift.com/support/articles/35129-export-of-blendshapes
|
_leftBlinkIndex(0), // see http://support.faceshift.com/support/articles/35129-export-of-blendshapes
|
||||||
|
@ -157,17 +171,50 @@ DdeFaceTracker::DdeFaceTracker(const QHostAddress& host, quint16 port) :
|
||||||
}
|
}
|
||||||
|
|
||||||
DdeFaceTracker::~DdeFaceTracker() {
|
DdeFaceTracker::~DdeFaceTracker() {
|
||||||
if (_udpSocket.isOpen()) {
|
setEnabled(false);
|
||||||
_udpSocket.close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DdeFaceTracker::setEnabled(bool enabled) {
|
void DdeFaceTracker::setEnabled(bool enabled) {
|
||||||
|
#ifdef HAVE_DDE
|
||||||
// isOpen() does not work as one might expect on QUdpSocket; don't test isOpen() before closing socket.
|
// isOpen() does not work as one might expect on QUdpSocket; don't test isOpen() before closing socket.
|
||||||
_udpSocket.close();
|
_udpSocket.close();
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
_udpSocket.bind(_host, _port);
|
_udpSocket.bind(_host, _serverPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (enabled && !_ddeProcess) {
|
||||||
|
// Terminate any existing DDE process, perhaps left running after an Interface crash
|
||||||
|
const char* DDE_EXIT_COMMAND = "exit";
|
||||||
|
_udpSocket.writeDatagram(DDE_EXIT_COMMAND, DDE_SERVER_ADDR, _controlPort);
|
||||||
|
|
||||||
|
qDebug() << "[Info] DDE Face Tracker Starting";
|
||||||
|
_ddeProcess = new QProcess(qApp);
|
||||||
|
connect(_ddeProcess, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(processFinished(int, QProcess::ExitStatus)));
|
||||||
|
_ddeProcess->start(QCoreApplication::applicationDirPath() + DDE_PROGRAM_PATH, DDE_ARGUMENTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enabled && _ddeProcess) {
|
||||||
|
_ddeProcess->kill(); // More robust than trying to send an "exit" command to DDE
|
||||||
|
_ddeProcess = NULL;
|
||||||
|
qDebug() << "[Info] DDE Face Tracker Stopped";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void DdeFaceTracker::processFinished(int exitCode, QProcess::ExitStatus exitStatus) {
|
||||||
|
if (_ddeProcess) {
|
||||||
|
// DDE crashed or was manually terminated
|
||||||
|
qDebug() << "[Info] DDE Face Tracker Stopped Unexpectedly";
|
||||||
|
_udpSocket.close();
|
||||||
|
_ddeProcess = NULL;
|
||||||
|
Menu::getInstance()->setIsOptionChecked(MenuOption::NoFaceTracking, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DdeFaceTracker::resetTracking() {
|
||||||
|
qDebug() << "[Info] Reset DDE Tracking";
|
||||||
|
const char* DDE_RESET_COMMAND = "reset";
|
||||||
|
_udpSocket.writeDatagram(DDE_RESET_COMMAND, DDE_SERVER_ADDR, _controlPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DdeFaceTracker::isActive() const {
|
bool DdeFaceTracker::isActive() const {
|
||||||
|
@ -239,7 +286,7 @@ void DdeFaceTracker::decodePacket(const QByteArray& buffer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute relative translation
|
// Compute relative translation
|
||||||
float LEAN_DAMPING_FACTOR = 200.0f;
|
float LEAN_DAMPING_FACTOR = 75.0f;
|
||||||
translation -= _referenceTranslation;
|
translation -= _referenceTranslation;
|
||||||
translation /= LEAN_DAMPING_FACTOR;
|
translation /= LEAN_DAMPING_FACTOR;
|
||||||
translation.x *= -1;
|
translation.x *= -1;
|
||||||
|
|
|
@ -12,6 +12,11 @@
|
||||||
#ifndef hifi_DdeFaceTracker_h
|
#ifndef hifi_DdeFaceTracker_h
|
||||||
#define hifi_DdeFaceTracker_h
|
#define hifi_DdeFaceTracker_h
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN) || defined(Q_OS_OSX)
|
||||||
|
#define HAVE_DDE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <QProcess>
|
||||||
#include <QUdpSocket>
|
#include <QUdpSocket>
|
||||||
|
|
||||||
#include <DependencyManager.h>
|
#include <DependencyManager.h>
|
||||||
|
@ -45,8 +50,10 @@ public:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setEnabled(bool enabled);
|
void setEnabled(bool enabled);
|
||||||
|
void resetTracking();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void processFinished(int exitCode, QProcess::ExitStatus exitStatus);
|
||||||
|
|
||||||
//sockets
|
//sockets
|
||||||
void socketErrorOccurred(QAbstractSocket::SocketError socketError);
|
void socketErrorOccurred(QAbstractSocket::SocketError socketError);
|
||||||
|
@ -55,11 +62,14 @@ private slots:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DdeFaceTracker();
|
DdeFaceTracker();
|
||||||
DdeFaceTracker(const QHostAddress& host, quint16 port);
|
DdeFaceTracker(const QHostAddress& host, quint16 serverPort, quint16 controlPort);
|
||||||
~DdeFaceTracker();
|
~DdeFaceTracker();
|
||||||
|
|
||||||
|
QProcess* _ddeProcess;
|
||||||
|
|
||||||
QHostAddress _host;
|
QHostAddress _host;
|
||||||
quint16 _port;
|
quint16 _serverPort;
|
||||||
|
quint16 _controlPort;
|
||||||
|
|
||||||
float getBlendshapeCoefficient(int index) const;
|
float getBlendshapeCoefficient(int index) const;
|
||||||
void decodePacket(const QByteArray& buffer);
|
void decodePacket(const QByteArray& buffer);
|
||||||
|
|
|
@ -115,8 +115,11 @@ void OculusManager::initSdk() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void OculusManager::shutdownSdk() {
|
void OculusManager::shutdownSdk() {
|
||||||
|
if (_ovrHmd) {
|
||||||
ovrHmd_Destroy(_ovrHmd);
|
ovrHmd_Destroy(_ovrHmd);
|
||||||
|
_ovrHmd = nullptr;
|
||||||
ovr_Shutdown();
|
ovr_Shutdown();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OculusManager::init() {
|
void OculusManager::init() {
|
||||||
|
@ -125,6 +128,12 @@ void OculusManager::init() {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OculusManager::deinit() {
|
||||||
|
#ifdef OVR_DIRECT_MODE
|
||||||
|
shutdownSdk();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void OculusManager::connect() {
|
void OculusManager::connect() {
|
||||||
#ifndef OVR_DIRECT_MODE
|
#ifndef OVR_DIRECT_MODE
|
||||||
initSdk();
|
initSdk();
|
||||||
|
|
|
@ -51,6 +51,7 @@ class Text3DOverlay;
|
||||||
class OculusManager {
|
class OculusManager {
|
||||||
public:
|
public:
|
||||||
static void init();
|
static void init();
|
||||||
|
static void deinit();
|
||||||
static void connect();
|
static void connect();
|
||||||
static void disconnect();
|
static void disconnect();
|
||||||
static bool isConnected();
|
static bool isConnected();
|
||||||
|
|
|
@ -112,6 +112,7 @@ int main(int argc, const char* argv[]) {
|
||||||
exitCode = app.exec();
|
exitCode = app.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OculusManager::deinit();
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
ReleaseMutex(mutex);
|
ReleaseMutex(mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -493,7 +493,7 @@ void AudioClient::start() {
|
||||||
_sourceGain.initialize();
|
_sourceGain.initialize();
|
||||||
_noiseSource.initialize();
|
_noiseSource.initialize();
|
||||||
_toneSource.initialize();
|
_toneSource.initialize();
|
||||||
_sourceGain.setParameters(0.25f, 0.0f);
|
_sourceGain.setParameters(0.05f, 0.0f);
|
||||||
_inputGain.setParameters(1.0f, 0.0f);
|
_inputGain.setParameters(1.0f, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -727,8 +727,8 @@ void AudioClient::handleAudioInput() {
|
||||||
|
|
||||||
QByteArray inputByteArray = _inputDevice->readAll();
|
QByteArray inputByteArray = _inputDevice->readAll();
|
||||||
|
|
||||||
|
// Add audio source injection if enabled
|
||||||
if (!_muted && _audioSourceInjectEnabled) {
|
if (!_muted && _audioSourceInjectEnabled) {
|
||||||
|
|
||||||
int16_t* inputFrameData = (int16_t*)inputByteArray.data();
|
int16_t* inputFrameData = (int16_t*)inputByteArray.data();
|
||||||
const uint32_t inputFrameCount = inputByteArray.size() / sizeof(int16_t);
|
const uint32_t inputFrameCount = inputByteArray.size() / sizeof(int16_t);
|
||||||
|
|
||||||
|
@ -737,17 +737,12 @@ void AudioClient::handleAudioInput() {
|
||||||
#if ENABLE_INPUT_GAIN
|
#if ENABLE_INPUT_GAIN
|
||||||
_inputGain.render(_inputFrameBuffer); // input/mic gain+mute
|
_inputGain.render(_inputFrameBuffer); // input/mic gain+mute
|
||||||
#endif
|
#endif
|
||||||
// Add audio source injection if enabled
|
|
||||||
if (_audioSourceInjectEnabled) {
|
|
||||||
|
|
||||||
if (_toneSourceEnabled) { // sine generator
|
if (_toneSourceEnabled) { // sine generator
|
||||||
_toneSource.render(_inputFrameBuffer);
|
_toneSource.render(_inputFrameBuffer);
|
||||||
}
|
} else if(_noiseSourceEnabled) { // pink noise generator
|
||||||
else if(_noiseSourceEnabled) { // pink noise generator
|
|
||||||
_noiseSource.render(_inputFrameBuffer);
|
_noiseSource.render(_inputFrameBuffer);
|
||||||
}
|
}
|
||||||
_sourceGain.render(_inputFrameBuffer); // post gain
|
_sourceGain.render(_inputFrameBuffer); // post gain
|
||||||
}
|
|
||||||
_inputFrameBuffer.copyFrames(1, inputFrameCount, inputFrameData, true /*copy out*/);
|
_inputFrameBuffer.copyFrames(1, inputFrameCount, inputFrameData, true /*copy out*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -972,8 +967,8 @@ void AudioClient::setIsStereoInput(bool isStereoInput) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioClient::toggleAudioSourceInject() {
|
void AudioClient::enableAudioSourceInject(bool enable) {
|
||||||
_audioSourceInjectEnabled = !_audioSourceInjectEnabled;
|
_audioSourceInjectEnabled = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioClient::selectAudioSourcePinkNoise() {
|
void AudioClient::selectAudioSourcePinkNoise() {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// AudioClient.h
|
// AudioClient.h
|
||||||
// interface/src
|
// libraries/audio-client/src
|
||||||
//
|
//
|
||||||
// Created by Stephen Birarda on 1/22/13.
|
// Created by Stephen Birarda on 1/22/13.
|
||||||
// Copyright 2013 High Fidelity, Inc.
|
// Copyright 2013 High Fidelity, Inc.
|
||||||
|
@ -143,9 +143,9 @@ public slots:
|
||||||
void audioMixerKilled();
|
void audioMixerKilled();
|
||||||
void toggleMute();
|
void toggleMute();
|
||||||
|
|
||||||
void toggleAudioSourceInject();
|
virtual void enableAudioSourceInject(bool enable);
|
||||||
void selectAudioSourcePinkNoise();
|
virtual void selectAudioSourcePinkNoise();
|
||||||
void selectAudioSourceSine440();
|
virtual void selectAudioSourceSine440();
|
||||||
|
|
||||||
void toggleAudioNoiseReduction() { _isNoiseGateEnabled = !_isNoiseGateEnabled; }
|
void toggleAudioNoiseReduction() { _isNoiseGateEnabled = !_isNoiseGateEnabled; }
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,10 @@ public:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
virtual bool outputLocalInjector(bool isStereo, qreal volume, AudioInjector* injector) = 0;
|
virtual bool outputLocalInjector(bool isStereo, qreal volume, AudioInjector* injector) = 0;
|
||||||
|
|
||||||
|
virtual void enableAudioSourceInject(bool enable) = 0;
|
||||||
|
virtual void selectAudioSourcePinkNoise() = 0;
|
||||||
|
virtual void selectAudioSourceSine440() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(AbstractAudioInterface*)
|
Q_DECLARE_METATYPE(AbstractAudioInterface*)
|
||||||
|
|
|
@ -9,9 +9,10 @@
|
||||||
// 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 "AudioScriptingInterface.h"
|
||||||
|
|
||||||
#include "ScriptAudioInjector.h"
|
#include "ScriptAudioInjector.h"
|
||||||
#include "ScriptEngineLogging.h"
|
#include "ScriptEngineLogging.h"
|
||||||
#include "AudioScriptingInterface.h"
|
|
||||||
|
|
||||||
void registerAudioMetaTypes(QScriptEngine* engine) {
|
void registerAudioMetaTypes(QScriptEngine* engine) {
|
||||||
qScriptRegisterMetaType(engine, injectorOptionsToScriptValue, injectorOptionsFromScriptValue);
|
qScriptRegisterMetaType(engine, injectorOptionsToScriptValue, injectorOptionsFromScriptValue);
|
||||||
|
@ -69,3 +70,23 @@ ScriptAudioInjector* AudioScriptingInterface::playSound(Sound* sound, const Audi
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioScriptingInterface::injectGeneratedNoise(bool inject) {
|
||||||
|
if (_localAudioInterface) {
|
||||||
|
_localAudioInterface->enableAudioSourceInject(inject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioScriptingInterface::selectPinkNoise() {
|
||||||
|
if (_localAudioInterface) {
|
||||||
|
_localAudioInterface->selectAudioSourcePinkNoise();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioScriptingInterface::selectSine440() {
|
||||||
|
if (_localAudioInterface) {
|
||||||
|
_localAudioInterface->selectAudioSourceSine440();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,10 @@ protected:
|
||||||
// this method is protected to stop C++ callers from calling, but invokable from script
|
// this method is protected to stop C++ callers from calling, but invokable from script
|
||||||
Q_INVOKABLE ScriptAudioInjector* playSound(Sound* sound, const AudioInjectorOptions& injectorOptions = AudioInjectorOptions());
|
Q_INVOKABLE ScriptAudioInjector* playSound(Sound* sound, const AudioInjectorOptions& injectorOptions = AudioInjectorOptions());
|
||||||
|
|
||||||
|
Q_INVOKABLE void injectGeneratedNoise(bool inject);
|
||||||
|
Q_INVOKABLE void selectPinkNoise();
|
||||||
|
Q_INVOKABLE void selectSine440();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void mutedByMixer();
|
void mutedByMixer();
|
||||||
void environmentMuted();
|
void environmentMuted();
|
||||||
|
|
Loading…
Reference in a new issue