293:6635f14613ba
Anton Shestakov <av6@dwimlabs.net>, Wed, 01 Nov 2017 00:50:57 +0800
Makefile: use file targets more, results in incremental building Less work to do when only some files get changed, but more work when building from scratch. But, multiple compilers can run in parallel.

next change 318:4201f7b06df7
previous change 273:85331fa82c74

coffee/calls.coffee

Permissions: -rw-r--r--

Other formats: Feeds:
class Tram.Call extends Backbone.Model
idAttribute: 'jid'
initialize: ->
@on('change:local/stream', @updateLocalStreamURL)
@on('change:remote/stream', @updateRemoteStreamURL)
updateStreamURL: (sattr, uattr) ->
if @has(uattr)
URL.revokeObjectURL(@get(uattr))
stream = @get(sattr)
if stream
@set(uattr, URL.createObjectURL(stream))
else
@unset(uattr)
updateLocalStreamURL: ->
@updateStreamURL('local/stream', 'local/stream/url')
updateRemoteStreamURL: ->
@updateStreamURL('remote/stream', 'remote/stream/url')
class Tram.Calls extends Backbone.Collection
model: Tram.Call
class Tram.CallView extends Backbone.View
templateEl: $($('#video-block-template').html())
events:
'click [data-mute-cam]': -> @model.set('local/video/muted', true)
'click [data-unmute-cam]': -> @model.set('local/video/muted', false)
'click [data-mute-mic]': -> @model.set('local/audio/muted', true)
'click [data-unmute-mic]': -> @model.set('local/audio/muted', false)
'click [data-mute-audio]': -> @model.set('remote/audio/muted', true)
'click [data-unmute-audio]': -> @model.set('remote/audio/muted', false)
'click [data-hang-up]': -> @model.get('contact').trigger('action/hangup')
initialize: ->
@setElement(@templateEl.clone())
@$local = @$('video.local')
@$remote = @$('video.remote')
@bind()
bind: ->
@listenTo(@model, 'change:local/stream/url', @updateLocal)
@listenTo(@model, 'change:remote/stream/url', @updateRemote)
@listenTo(@model, 'change:local/video/muted', @muteCam)
@listenTo(@model, 'change:local/audio/muted', @muteMic)
@listenTo(@model, 'change:remote/audio/muted', @muteAudio)
@listenTo(@model, 'remove', @remove)
updateLocal: ->
if @model.has('local/stream/url')
@updateVideo(@$local, @model.get('local/stream/url'))
else
@removeVideo(@$local)
updateRemote: ->
if @model.has('remote/stream/url')
@updateVideo(@$remote, @model.get('remote/stream/url'))
else
@removeVideo(@$remote)
updateVideo: ($video, url) ->
$video.each ->
@src = url
@play()
removeVideo: ($video) ->
$video.each ->
@pause()
@removeAttribute('src')
toggleTracks: (tracks, state) ->
if tracks?
for track in tracks
track.enabled = state
muteCam: ->
muted = @model.get('local/video/muted')
@toggleTracks(@model.get('local/stream')?.getVideoTracks?(), not muted)
muteMic: ->
muted = @model.get('local/audio/muted')
@toggleTracks(@model.get('local/stream')?.getAudioTracks?(), not muted)
muteAudio: ->
muted = @model.get('remote/audio/muted')
@toggleTracks(@model.get('remote/stream')?.getAudioTracks?(), not muted)
render: ->
@rivet = rivets.bind(@el, call: @model, view: @)
@
remove: ->
@rivet.unbind()
super
class Tram.CallsApp extends Backbone.View
initialize: ->
@listenTo(@collection, 'add', @onAdd)
onAdd: (model) ->
model.view = new Tram.CallView(model: model)
@$el.append(model.view.render().el)