jam-cloud/web/app/assets/javascripts/trackHelpers.js

126 lines
4.9 KiB
JavaScript

/**
* Functions related to VU meters.
* These functions are intimately tied to the markup defined in the
* VU templates in _vu_meters.html.erb
*/
(function(context, $) {
"use strict";
var ChannelGroupIds = context.JK.ChannelGroupIds
context.JK = context.JK || {};
// As these are helper functions, just have a single
// static object with functions. Each function should
// take all necessary arguments to complete its work.
context.JK.TrackHelpers = {
getTrackInfo: async function(jamClient, masterTracks) {
if(masterTracks === undefined) {
masterTracks = await context.jamClient.SessionGetAllControlState(true);
}
var userTracks = await context.JK.TrackHelpers.getUserTracks(jamClient, masterTracks);
var backingTracks = await context.JK.TrackHelpers.getBackingTracks(jamClient, masterTracks);
var metronomeTracks = await context.JK.TrackHelpers.getTracks(jamClient, ChannelGroupIds.MetronomeGroup);
return {
userTracks: userTracks,
backingTracks: backingTracks,
metronomeTracks: metronomeTracks
}
},
// allTracks is the result of SessionGetAllControlState; as an optimization
getTracks: async function(jamClient, groupId, allTracks) {
var tracks = [];
if(!allTracks) {
allTracks = await context.jamClient.SessionGetAllControlState(true);
}
//var trackIds = jamClient.SessionGetIDs();
//var allTracks = jamClient.SessionGetControlState(trackIds, true);
// get client's tracks
for (var i=0; i < allTracks.length; i++) {
if (allTracks[i].group_id === groupId) {
tracks.push(allTracks[i]);
}
}
return tracks;
},
// allTracks is the result of SessionGetAllControlState; as an optimization
getBackingTracks: async function(jamClient, allTracks) {
var mediaTracks = await context.JK.TrackHelpers.getTracks(jamClient, ChannelGroupIds.MediaTrackGroup, allTracks);
var backingTracks = []
context._.each(mediaTracks, function(mediaTrack) {
// the check for 'not managed' means this is not a track opened by a recording, basically
// we do not try and sync these sorts of backing tracks to the server, because they
// are already encompassed by
if(mediaTrack.media_type == "BackingTrack" && !mediaTrack.managed) {
var track = {};
track.client_track_id = mediaTrack.persisted_track_id;
track.client_resource_id = mediaTrack.rid;
track.filename = mediaTrack.filename;
backingTracks.push(track);
}
})
return backingTracks;
},
/**
* This function resolves which tracks to configure for a user
* when creating or joining a session. By default, tracks are pulled
* from jamClient. If none exist there, the first instrument from the
* user's profile is used.
*/
getUserTracks: async function(jamClient, allTracks) {
var localMusicTracks = [];
var localMidiTracks = [];
var i;
localMusicTracks = await context.JK.TrackHelpers.getTracks(jamClient, ChannelGroupIds.AudioInputMusicGroup, allTracks);
localMidiTracks = await context.JK.TrackHelpers.getTracks(jamClient, ChannelGroupIds.MidiInputMusicGroup, allTracks);
localMusicTracks = localMusicTracks.concat(localMidiTracks)
var trackObjects = [];
for (i=0; i < localMusicTracks.length; i++) {
var track = {};
track.client_track_id = localMusicTracks[i].id;
track.client_resource_id = localMusicTracks[i].rid;
if(localMusicTracks[i].instrument_id === 0) {
track.instrument_id = context.JK.server_to_client_instrument_map["Other"].server_id;
}
else {
var instrument = context.JK.client_to_server_instrument_map[localMusicTracks[i].instrument_id]
if (instrument) {
track.instrument_id = instrument.server_id
}
else {
logger.debug("backend reported an invalid instrument ID of " + localMusicTracks[i].instrument_id)
track.instrument_id = 'other'
}
}
if (localMusicTracks[i].stereo) {
track.sound = "stereo";
}
else {
track.sound = "mono";
}
trackObjects.push(track);
}
return trackObjects;
}
};
})(window, jQuery);