1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 /** 6 * A global object that gets used by the C++ interface. 7 */ 8 var media = (function() { 9 'use strict'; 10 11 var manager = null; 12 13 /** 14 * Users of |media| must call initialize prior to calling other methods. 15 */ 16 function initialize(playerManager) { 17 manager = playerManager; 18 } 19 20 /** 21 * Call to modify or add a system property. 22 */ 23 function onSystemProperty(timestamp, key, value) { 24 console.log('System properties not yet implemented'); 25 } 26 27 /** 28 * Call to modify or add a property on a player. 29 */ 30 function onPlayerProperty(id, timestamp, key, value) { 31 manager.updatePlayerInfo(id, timestamp, key, value); 32 } 33 34 function onPlayerPropertyNoRecord(id, timestamp, key, value) { 35 manager.updatePlayerInfoNoRecord(id, timestamp, key, value); 36 } 37 38 /** 39 * Call to add a player. 40 */ 41 function onPlayerOpen(id, timestamp) { 42 manager.addPlayer(id, timestamp); 43 } 44 45 /** 46 * Call to remove a player. 47 */ 48 function onPlayerClose(id) { 49 manager.removePlayer(id); 50 } 51 52 var media = { 53 onSystemProperty: onSystemProperty, 54 onPlayerProperty: onPlayerProperty, 55 onPlayerPropertyNoRecord: onPlayerPropertyNoRecord, 56 onPlayerOpen: onPlayerOpen, 57 onPlayerClose: onPlayerClose, 58 59 initialize: initialize 60 }; 61 62 // Everything beyond this point is for backwards compatibility reasons. 63 // It will go away when the backend is updated. 64 65 media.onNetUpdate = function(update) { 66 // TODO(tyoverby): Implement 67 }; 68 69 media.onRendererTerminated = function(renderId) { 70 util.object.forEach(manager.players_, function(playerInfo, id) { 71 if (playerInfo.properties['render_id'] == renderId) { 72 media.onPlayerClose(id); 73 } 74 }); 75 }; 76 77 // For whatever reason, addAudioStream is also called on 78 // the removal of audio streams. 79 media.addAudioStream = function(event) { 80 switch (event.status) { 81 case 'created': 82 media.onPlayerOpen(event.id); 83 // We have to simulate the timestamp since it isn't provided to us. 84 media.onPlayerProperty( 85 event.id, (new Date()).getTime(), 'playing', event.playing); 86 break; 87 case 'closed': 88 media.onPlayerClose(event.id); 89 break; 90 } 91 }; 92 media.onItemDeleted = function() { 93 // This only gets called when an audio stream is removed, which 94 // for whatever reason is also handled by addAudioStream... 95 // Because it is already handled, we can safely ignore it. 96 }; 97 98 media.onMediaEvent = function(event) { 99 var source = event.renderer + ':' + event.player; 100 101 // Although this gets called on every event, there is nothing we can do 102 // about this because there is no onOpen event. 103 media.onPlayerOpen(source); 104 media.onPlayerPropertyNoRecord( 105 source, event.ticksMillis, 'render_id', event.renderer); 106 media.onPlayerPropertyNoRecord( 107 source, event.ticksMillis, 'player_id', event.player); 108 109 var propertyCount = 0; 110 util.object.forEach(event.params, function(value, key) { 111 key = key.trim(); 112 113 // These keys get spammed *a lot*, so put them on the display 114 // but don't log list. 115 if (key === 'buffer_start' || 116 key === 'buffer_end' || 117 key === 'buffer_current' || 118 key === 'is_downloading_data') { 119 media.onPlayerPropertyNoRecord( 120 source, event.ticksMillis, key, value); 121 } else { 122 media.onPlayerProperty(source, event.ticksMillis, key, value); 123 } 124 propertyCount += 1; 125 }); 126 127 if (propertyCount === 0) { 128 media.onPlayerProperty( 129 source, event.ticksMillis, 'EVENT', event.type); 130 } 131 }; 132 133 return media; 134 }()); 135