(function(context,$) { "use strict"; context.JK = context.JK || {}; context.JK.SessionScreen = function(app) { var logger = context.JK.logger; var sessionId; var session = null; var users = {}; // Light cache of user info for session users. var tracks = {}; var mixers = []; // Replicate the Channel Group enum from C++ var ChannelGroupIds = { 0: "MasterGroup", 1: "MonitorGroup", 2: "AudioInputMusicGroup", 3: "AudioInputChatGroup", 4: "MediaTrackGroup", 5: "StreamOutMusicGroup", 6: "StreamOutChatGroup", 7: "UserMusicInputGroup", 8: "UserChatInputGroup", 9: "PeerAudioInputMusicGroup" }; function beforeShow(data) { sessionId = data.id; } function afterShow(data) { context.JK.joinMusicSession(sessionId, app); // Subscribe for callbacks on audio events context.jamClient.SessionRegisterCallback("JK.HandleBridgeCallback"); $.ajax({ type: "GET", url: "/api/sessions/" + sessionId }).done(updateSession); } function beforeHide(data) { // Move joinSession function to this file for ease of finding it? context.JK.leaveMusicSession(sessionId); // 'unregister' for callbacks context.jamClient.SessionRegisterCallback(""); } function updateSession(sessionData) { session = sessionData; updateParticipants(function() { renderSession(); }); } /** * Make sure that for each participant in the session, we have user info. */ function updateParticipants(onComplete) { var callCount = 0; $.each(session.participants, function(index, value) { if (!(this.user.id in users)) { callCount += 1; $.ajax({ type: "GET", url: "/api/users/" + this.user.id }).done(function(user) { callCount -= 1; users[user.id] = user; // We'll be using our own photo url instead of gravatar. //var hash = context.JK.calcMD5(user.email); //users[user.id].photo_url = 'http://www.gravatar.com/avatar/' + hash; }); } }); if (!(onComplete)) { return; } // TODO: generalize this pattern. Likely needed elsewhere. function checker() { if (callCount === 0) { onComplete(); } else { context.setTimeout(checker, 10); } } checker(); } function renderSession() { _updateMixers(); _renderTracks(); } // Get the latest list of underlying audio mixer channels function _updateMixers() { var mixerIds = context.jamClient.SessionGetIDs(); mixers = context.jamClient.SessionGetControlState(mixerIds); logger.debug("Mixers updated:"); logger.debug(mixers); } // Given a clientId, return a dictionary of mixer ids which // correspond to that client's tracks // TODO - this is hard-coded. Need fix from Nat function _inputMixerForClient(clientId) { // Iterate over the mixers, but simply return the first // mixer in the AudioInputMusicGroup var mixer = null; for (var i=0; i 8) { colorClass = 'vu-red-'; } if (i >= lights) { state = 'off'; } selector = '#tracks table[mixer-id="' + mixerId + '"] td.vu' + i; $light = $(selector); $light.addClass(colorClass + state); } } function _addTrack(trackData) { trackData["left-vu"] = $('#template-vu').html(); trackData["right-vu"] = trackData["left-vu"]; var template = $('#template-session-track').html(); var newTrack = context.JK.fillTemplate(template, trackData); $('#session-mytracks-container').append(newTrack); tracks[trackData.clientId] = new context.JK.SessionTrack(trackData.clientId); } function _userJoinedSession(header, payload) { // Just refetch the session and update. $.ajax({ type: "GET", url: "/api/sessions/" + sessionId }).done(function(response) { updateSession(response); }); } function handleBridgeCallback() { var eventName = null; var mixerId = null; var value = null; var tuples = arguments.length / 3; for (var i=0; i