* stats working decently

This commit is contained in:
Seth Call 2015-12-11 21:14:00 -06:00
parent 37929de36e
commit 3707a3abd6
9 changed files with 109 additions and 58 deletions

View File

@ -257,12 +257,13 @@ ConfigureTracksStore = @ConfigureTracksStore
$root = $(@getDOMNode())
$select = $root.find('select.vsts')
vstSelected = $select.val()
if vstSelected != 'NONE'
vstSelected = {file: vstSelected}
#if vstSelected != 'NONE'
vstSelected = {file: vstSelected}
if @state.configureTracks?.trackType == 'midi'
@updateMidiAssociations()
else
logger.debug("associating vst", vstSelected)
ConfigureTracksActions.associateVSTWithTrack(vstSelected)

View File

@ -118,7 +118,7 @@ ConfigureTracksActions = @ConfigureTracksActions
() =>
{participant: {client_id: this.props.clientId, user: name: 'You', possessive: 'Your'}, }
,
{width:380, positions:['right', 'left'], offsetParent:$root.closest('.screen'), extraClasses: 'self'})
{width:385, positions:['right', 'left'], offsetParent:$root.closest('.screen'), extraClasses: 'self'})
unless this.props.hasMixer
$mute.on("mouseenter", false)

View File

@ -125,7 +125,7 @@ MixerActions = @MixerActions
() =>
{participant: this.props.participant}
,
{width:380, positions:['right', 'left'], offsetParent:$root.closest('.screen')})
{width:385, positions:['right', 'left'], offsetParent:$root.closest('.screen')})
unless this.props.hasMixer
$mute.on("mouseenter", false)

View File

@ -17,8 +17,9 @@ ReactCSSTransitionGroup = React.addons.CSSTransitionGroup
for participant in session.otherParticipants()
if participant.user.id == context.JK.currentUserId
if participant.client_id == @app.clientId
participant.user.possessive = "Your"
participant.self = true
else
participant.user.possessive = participant.user.name + "'s"

View File

@ -4,6 +4,13 @@ MixerActions = @MixerActions
ptrCount = 0
StatsInfo = {
aggregate: {
latency: {
good: (user, stats) -> "#{user.possessive} total latency from them to you is very low.",
warn: (user, stats) -> "#{user.possessive} total latency from them to you is typical.",
poor: (user, stats) -> "#{user.possessive} total latency from them to you is poor."
}
},
system: {
cpu: {
good: (user, stats) -> "#{user.possessive} computer processor is not overworked by JamKazam or the your system.",
@ -106,21 +113,39 @@ StatsInfo = {
if info?
extraInfo = info
# "Windows WDM-KS"
computerStats = []
networkStats = []
audioStats = []
aggregateStats = []
aggregate = @state.stats?.aggregate
network = @state.stats?.network
system = @state.stats?.system
audio = @state.stats?.audio
aggregateTag = null
if aggregate?
if aggregate.latency
aggregateStats.push(@stat(aggregate, 'aggregate', 'Latency', 'latency', Math.round(aggregate.latency)))
aggregateTag =
`<div className="aggregate-stats stats-holder">
<h3>Aggregate</h3>
{aggregateStats}
</div>`
if system?
if system.cpu?
computerStats.push(@stat(system, 'system', 'Processor', 'cpu', Math.round(system.cpu) + ' %'))
if audio?
if audio.latency?
audioStats.push(@stat(audio, 'audio', 'Latency', 'latency', audio.latency.toFixed(1) + ' ms'))
if audio.input_jitter?
audioStats.push(@stat(audio, 'audio', 'Input Jitter', 'input_jitter', audio.input_jitter.toFixed(2)))
if audio.output_jitter?
audioStats.push(@stat(audio, 'audio', 'Output Jitter', 'output_jitter', audio.output_jitter.toFixed(2)))
if audio.audio_in_type?
audio_type = '?'
audio_long = audio.audio_in_type.toLowerCase()
@ -140,33 +165,31 @@ StatsInfo = {
else if audio.framesize == 10
framesize = '10'
audioStats.push(@stat(audio, 'audio', 'Frame Size', 'framesize', framesize))
if audio.latency?
audioStats.push(@stat(audio, 'audio', 'Latency', 'latency', audio.latency.toFixed(1) + ' ms'))
if audio.input_jitter?
audioStats.push(@stat(audio, 'audio', 'Input Jitter', 'input_jitter', audio.input_jitter.toFixed(2)))
if audio.output_jitter?
audioStats.push(@stat(audio, 'audio', 'Output Jitter', 'output_jitter', audio.output_jitter.toFixed(2)))
networkTag = null
if network?
if network.net_bitrate?
networkStats.push(@stat(network, 'network', 'Bandwidth', 'net_bitrate', Math.round(network.net_bitrate) + ' k'))
if network.ping?
networkStats.push(@stat(network, 'network', 'Latency', 'ping', (network.ping / 2).toFixed(1) + ' ms'))
#if network.jitter?
if network.audiojq_median?
networkStats.push(@stat(network, 'network', 'Jitter Queue', 'audiojq_median', network.audiojq_median.toFixed(1)))
# networkStats.
if network.jitter_var?
networkStats.push(@stat(network, 'network', 'Jitter', 'jitter_var', network.jitter_var.toFixed(1)))
if network.pkt_loss?
networkStats.push(@stat(network, 'network', 'Packet Loss', 'pkt_loss', network.pkt_loss.toFixed(1) + ' %'))
if network.wifi?
if network.wifi
value = 'Wi-Fi'
else
value = 'Ethernet'
networkStats.push(@stat(network, 'network', 'Connectivity', 'wifi', value))
if network.audio_bitrate_rx?
networkStats.push(@stat(network, 'network', 'Audio Bw Rx', 'audio_bitrate_rx', Math.round(network.net_bitrate_rx) + ' k'))
if network.audio_bitrate_tx?
networkStats.push(@stat(network, 'network', 'Audio Bw Tx', 'audio_bitrate_tx', Math.round(network.net_bitrate_tx) + ' k'))
if network.video_rtpbw_rx?
networkStats.push(@stat(network, 'network', 'Video Bw Rx', 'video_rtpbw_rx', Math.round(network.video_rtpbw_rx) + ' k'))
if network.video_rtpbw_tx?
networkStats.push(@stat(network, 'network', 'Video Bw Tx', 'video_rtpbw_tx', Math.round(network.video_rtpbw_tx) + ' k'))
networkTag =
`<div className="network-stats stats-holder">
@ -178,6 +201,7 @@ StatsInfo = {
<h3>Session Diagnostics &amp; Stats: {this.props.participant.user.name}</h3>
<div className="stats-area">
{aggregateTag}
<div className="computer-stats stats-holder">
<h3>Computer</h3>
{computerStats}

View File

@ -11,12 +11,19 @@ SessionStatThresholds = gon.session_stat_thresholds
NetworkThresholds = SessionStatThresholds.network
SystemThresholds = SessionStatThresholds.system
AudioThresholds = SessionStatThresholds.audio
AggregateThresholds = SessionStatThresholds.aggregate
@SessionStatsStore = Reflux.createStore(
{
listenables: @SessionStatsActions
rawStats: null
init: ->
# Register with the app store to get @app
this.listenTo(context.AppStore, this.onAppInit)
onAppInit: (@app) ->
onPushStats: (stats) ->
@rawStats = stats
@changed()
@ -25,10 +32,13 @@ AudioThresholds = SessionStatThresholds.audio
value = holder[field]
fieldLevel = field + '_level'
fieldThreshold = threshold[field]
if value? && fieldThreshold?
if fieldThreshold.inverse
if value <= fieldThreshold.poor
if fieldThreshold.zero_is_good
holder[fieldLevel] = 'good'
else if value <= fieldThreshold.poor
holder[fieldLevel] = 'poor'
@participantClassification = 3
else if value <= fieldThreshold.warn
@ -59,11 +69,19 @@ AudioThresholds = SessionStatThresholds.audio
changed: () ->
@stats = {}
console.log("rawStats", @rawStats)
self = null
for participant in @rawStats
if participant.id == @app.clientId
self = participant
break
for participant in @rawStats
@participantClassification = 1 # 1=good, 2=warn, 3=poor
# CPU is 0-100
total_latency = 0
if participant.cpu?
system = {cpu: participant.cpu}
@ -74,39 +92,24 @@ AudioThresholds = SessionStatThresholds.audio
network = participant.network
if network?
# audio_bitrate: 256
# net_bitrate: 286.19244384765625
# ping: 0.08024691045284271
# ping_var: 0.6403124332427979
# pkt_loss: 100
# wifi: false
@classify(network, 'audiojq_median', NetworkThresholds)
@classify(network, 'net_bitrate', NetworkThresholds)
@classify(network, 'jitter_var', NetworkThresholds)
@classify(network, 'audio_bitrate_rx', NetworkThresholds)
@classify(network, 'audio_bitrate_tx', NetworkThresholds)
@classify(network, 'video_rtpbw_tx', NetworkThresholds)
@classify(network, 'video_rtpbw_rx', NetworkThresholds)
@classify(network, 'ping', NetworkThresholds)
@classify(network, 'pkt_loss', NetworkThresholds)
@classify(network, 'wifi', NetworkThresholds)
total_latency += network.ping / 2
total_latency += network.audiojq_median * 2.5
else
total_latency = null
audio = participant.audio
if audio?
# acpu: 5.148329734802246
# audio_in: "Fast Track"
# audio_in_type: "Core Audio"
# cpu: 22.44668960571289
# framesize: 2.5
# in_latency: 5.020833492279053
# input_iio_jitter: -0.0015926361083984375
# input_jitter: 0.2977011799812317
# input_median: 400.16632080078125
# io_out_latency: "Expected Latency = 9.54 +/- 1.00 ms [Raw/PaBuff/PaRing Latency: 9.54 / 12.04 / 0.00 ms]"
# out_latency: 4.520833492279053
# output_iio_jitter: -0.07366180419921875
# output_jitter: 0.40290364623069763
# output_median: 400.0581970214844
# output_name: 4
# samplerate: 48000
if audio.cpu?
system = {cpu: audio.cpu}
@classify(system, 'cpu', SystemThresholds)
@ -122,6 +125,19 @@ AudioThresholds = SessionStatThresholds.audio
@classify(audio, 'output_jitter', AudioThresholds)
@classify(audio, 'audio_in_type', AudioThresholds)
if total_latency != null
total_latency += audio.out_latency
total_latency += self.audio.in_latency
else
total_latency = null
if !self?
aggregate = {latency: total_latency}
@classify(aggregate, 'latency', AggregateThresholds)
participant.aggregate = aggregate
switch @participantClassification
when 1 then participant.classification = 'good'
when 2 then participant.classification = 'warn'

View File

@ -116,12 +116,12 @@ $session-screen-divider: 1190px;
border-width: 1px;
border-style: solid;
padding:10px;
height: 341px;
height: 477px;
margin-top: 20px;
}
.stats-area {
float: left;
padding: 0 20px 20px 20px;
padding: 0 25px 20px 20px;
color: #cccccc;
h3 {

View File

@ -398,14 +398,15 @@
}
&.SessionStatsHover {
width:380px;
height:450px;
width:385px;
height:571px;
@include border_box_sizing;
h3 {
margin-top:20px;
color: white;
margin-left:20px;
font-weight:bold;
}
&.self {

View File

@ -379,22 +379,30 @@ if defined?(Bundler)
config.max_multiple_users_same_ip = 2
config.session_stat_thresholds = {
network: {
wifi: {warn: true, poor: true, eql: true},
net_bitrate: {warn: 210, poor: 155, inverse:true},
ping: {warn: 40, poor: 70},
pkt_loss: {warn: 3, poor: 10},
audiojq_median: {warn: 2.1, poor: 5.1}
wifi: {warn: true, poor: true, eql: true},
net_bitrate: {warn: 210, poor: 155, inverse:true},
audio_bitrate_tx:{warn: 128, poor: 96, inverse:true},
audio_bitrate_rx:{warn: 128, poor: 96, inverse:true},
video_rtpbw_tx: {warn: 600.1, poor: 400.1, inverse: true, zero_is_good: true},
video_rtpbw_rx: {warn: 600.1, poor: 400.1, inverse: true, zero_is_good: true},
ping: {warn: 30.1, poor: 50.1},
pkt_loss: {warn: 2.1, poor: 5.1},
audiojq_median: {warn: 4.1, poor: 6.1},
jitter_var: {warn: 2.1, poor: 4.1}
},
system: {
cpu: {warn: 70, poor:85}
cpu: {warn: 60.1, poor:80.1}
},
audio: {
audio_in_type: {warn: 'Windows WDM-KS', poor: nil, eql:true},
audio_out_type: {warn: 'Windows WDM-KS', poor: nil, eql:true},
framesize: {warn: 2.6, poor: 2.6},
latency: {warn: 10, poor: 20},
input_jitter: {warn: 0.5, poor: 1},
output_jitter: {warn: 0.5, poor: 1},
input_jitter: {warn: 0.51, poor: 1.01},
output_jitter: {warn: 0.51, poor: 1.01},
},
aggregate: {
latency: {warn: 20.1, poor: 35.1}
}
}
config.vst_enabled = true