mirror of
https://github.com/overte-org/overte.git
synced 2025-04-22 09:13:28 +02:00
Merge pull request #9294 from fayeli/tablet-mic-level
Audio level calculation in tabletUI.js
This commit is contained in:
commit
9502a8b0c4
4 changed files with 59 additions and 3 deletions
interface/resources/qml/hifi/tablet
libraries/script-engine/src
scripts/system/tablet-ui
|
@ -5,11 +5,16 @@ Item {
|
|||
id: tablet
|
||||
objectName: "tablet"
|
||||
|
||||
property double miclevel: 0.8
|
||||
property double micLevel: 0.8
|
||||
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
|
||||
// called by C++ code to keep audio bar updated
|
||||
function setMicLevel(newMicLevel) {
|
||||
tablet.micLevel = newMicLevel;
|
||||
}
|
||||
|
||||
// used to look up a button by its uuid
|
||||
function findButtonIndex(uuid) {
|
||||
if (!uuid) {
|
||||
|
@ -101,7 +106,7 @@ Item {
|
|||
}
|
||||
Rectangle {
|
||||
id: audioBarMask
|
||||
width: parent.width * tablet.miclevel
|
||||
width: parent.width * tablet.micLevel
|
||||
color: "#333333"
|
||||
radius: 5
|
||||
anchors.bottom: parent.bottom
|
||||
|
@ -183,7 +188,7 @@ Item {
|
|||
|
||||
PropertyChanges {
|
||||
target: tablet
|
||||
miclevel: 0
|
||||
micLevel: 0
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
@ -141,6 +141,15 @@ void TabletProxy::removeButton(QObject* tabletButtonProxy) {
|
|||
}
|
||||
}
|
||||
|
||||
void TabletProxy::updateAudioBar(const double micLevel) {
|
||||
auto tablet = getQmlTablet();
|
||||
if (!tablet) {
|
||||
qCCritical(scriptengine) << "Could not find tablet in TabletRoot.qml";
|
||||
} else {
|
||||
QMetaObject::invokeMethod(tablet, "setMicLevel", Qt::AutoConnection, Q_ARG(QVariant, QVariant(micLevel)));
|
||||
}
|
||||
}
|
||||
|
||||
void TabletProxy::addButtonsToHomeScreen() {
|
||||
auto tablet = getQmlTablet();
|
||||
if (!tablet) {
|
||||
|
|
|
@ -84,6 +84,13 @@ public:
|
|||
*/
|
||||
Q_INVOKABLE void removeButton(QObject* tabletButtonProxy);
|
||||
|
||||
/**jsdoc
|
||||
* @function TabletProxy#updateAudioBar
|
||||
* Updates the audio bar in tablet to reflect latest mic level
|
||||
* @param micLevel {double} mic level value between 0 and 1
|
||||
*/
|
||||
Q_INVOKABLE void updateAudioBar(const double micLevel);
|
||||
|
||||
QString getName() const { return _name; }
|
||||
protected:
|
||||
|
||||
|
|
|
@ -55,4 +55,39 @@
|
|||
Script.update.connect(updateShowTablet);
|
||||
// Script.setInterval(updateShowTablet, 1000);
|
||||
|
||||
// Initialise variables used to calculate audio level
|
||||
var accumulatedLevel = 0.0;
|
||||
// Note: Might have to tweak the following two based on the rate we're getting the data
|
||||
var AVERAGING_RATIO = 0.05;
|
||||
var MIC_LEVEL_UPDATE_INTERVAL_MS = 100;
|
||||
|
||||
// Calculate microphone level with the same scaling equation (log scale, exponentially averaged) in AvatarInputs and pal.js
|
||||
function getMicLevel() {
|
||||
var LOUDNESS_FLOOR = 11.0;
|
||||
var LOUDNESS_SCALE = 2.8 / 5.0;
|
||||
var LOG2 = Math.log(2.0);
|
||||
var micLevel = 0.0;
|
||||
accumulatedLevel = AVERAGING_RATIO * accumulatedLevel + (1 - AVERAGING_RATIO) * (MyAvatar.audioLoudness);
|
||||
// Convert to log base 2
|
||||
var logLevel = Math.log(accumulatedLevel + 1) / LOG2;
|
||||
|
||||
if (logLevel <= LOUDNESS_FLOOR) {
|
||||
micLevel = logLevel / LOUDNESS_FLOOR * LOUDNESS_SCALE;
|
||||
} else {
|
||||
micLevel = (logLevel - (LOUDNESS_FLOOR - 1.0)) * LOUDNESS_SCALE;
|
||||
}
|
||||
if (micLevel > 1.0) {
|
||||
micLevel = 1.0;
|
||||
}
|
||||
return micLevel;
|
||||
}
|
||||
|
||||
Script.setInterval(function() {
|
||||
if (tabletShown) {
|
||||
var currentMicLevel = getMicLevel();
|
||||
var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
|
||||
tablet.updateAudioBar(currentMicLevel);
|
||||
}
|
||||
}, MIC_LEVEL_UPDATE_INTERVAL_MS);
|
||||
|
||||
}()); // END LOCAL_SCOPE
|
||||
|
|
Loading…
Reference in a new issue