jam-cloud/app/assets/javascripts/fakeJamClient.js

383 lines
19 KiB
JavaScript
Raw Normal View History

(function(context,$) {
"use strict";
context.JK = context.JK || {};
context.JK.FakeJamClient = function(app) {
var logger = context.JK.logger;
logger.info("*** Fake JamClient instance initialized. ***");
var ftue = false;
2013-01-30 16:50:43 +00:00
var eventCallbackName = '';
var eventCallbackRate = 1000;
var vuValue = -70;
var vuChange = 10;
var callbackTimer = null;
2013-04-10 15:01:29 +00:00
var _mix = -30;
2013-05-12 05:43:36 +00:00
var device_id = -1;
function dbg(msg) { logger.debug('FakeJamClient: ' + msg); }
// Bummer that javascript doesn't have much in the way of reflection.
// arguments.callee.name would probably do what we want, but it's deprecated
// and not allowed when using "strict"
// (Wishing I could write a single function which debug logs the name of the
// current function and a JSON stringify of the arguments).
function GetFTUE() { return ftue; }
function SetFTUE(b) { ftue = b; }
function GetOS() { return 100000000; }
function GetOSAsString() { return "Win32"; }
function LatencyUpdated(map) { dbg('LatencyUpdated:' + JSON.stringify(map)); }
function LeaveSession(map) { dbg('LeaveSession:' + JSON.stringify(map)); }
function P2PMessageReceived(s1,s2) { dbg('P2PMessageReceived:' + s1 + ',' + s2); }
function JoinSession(sessionId) {dbg('JoinSession:' + sessionId);}
function ParticipantLeft(session, participant) {
dbg('ParticipantLeft:' + JSON.stringify(session) + ',' +
JSON.stringify(participant));
}
function ParticipantJoined(session, participant) {
dbg('ParticipantJoined:' + JSON.stringify(session) + ',' +
JSON.stringify(participant));
}
function RecordTestBegin() { dbg('RecordTestBegin'); }
function RecordTestEnd() { dbg('RecordTestBegin'); }
function RecordTestPlayback() { dbg('RecordTestBegin'); }
function SendP2PMessage(s1,s2) { dbg('SendP2PMessage:' + s1 + ',' + s2); }
function SetASIOEnabled(i1, i2, i3, i4, i5, i6) {
dbg('SetASIOEnabled(' + i1 + ',' + i2 + ',' + i3 + ',' + i4 + ',' + i5 + ',' + i6 + ')');
}
function SignalLatencyUpdated(client) {
dbg('SignalLatencyUpdated:' + JSON.stringify(client));
}
function SignalSendP2PMessage(s1,ba) {
dbg('SignalSendP2PMessage:' + JSON.stringify(arguments));
}
function StartPlayTest(s) { dbg('StartPlayTest' + JSON.stringify(arguments)); }
function StartRecordTest(s) { dbg('StartRecordTest' + JSON.stringify(arguments)); }
function StartRecording(map) { dbg('StartRecording' + JSON.stringify(arguments)); }
function StopPlayTest() { dbg('StopPlayTest'); }
function StopRecording(map) { dbg('StopRecording' + JSON.stringify(arguments)); }
function TestASIOLatency(s) { dbg('TestASIOLatency' + JSON.stringify(arguments)); }
function TestLatency(clientID, callbackFunctionName, timeoutCallbackName) {
logger.debug("Fake JamClient: TestLatency called with client, " + clientID + " and callback function name: " + callbackFunctionName);
var response = {
clientID: clientID,
latency: 50
};
var js = callbackFunctionName + "(" + JSON.stringify(response) + ");";
eval(js);
}
function GetASIODevices() {
var response =[{"device_id":0,"device_name":"Realtek High Definition Audio","interfaces":[{"interface_id":0,"interface_name":"Realtek HDA SPDIF Out","pins":[{"is_input":false,"pin_id":0,"pin_name":"PC Speaker"}]},{"interface_id":1,"interface_name":"Realtek HD Audio rear output","pins":[{"is_input":false,"pin_id":0,"pin_name":"PC Speaker"}]},{"interface_id":2,"interface_name":"Realtek HD Audio Mic input","pins":[{"is_input":true,"pin_id":0,"pin_name":"Recording Control"}]},{"interface_id":3,"interface_name":"Realtek HD Audio Line input","pins":[{"is_input":true,"pin_id":0,"pin_name":"Recording Control"}]},{"interface_id":4,"interface_name":"Realtek HD Digital input","pins":[{"is_input":true,"pin_id":0,"pin_name":"Capture"}]},{"interface_id":5,"interface_name":"Realtek HD Audio Stereo input","pins":[{"is_input":true,"pin_id":0,"pin_name":"Recording Control"}]}],"wavert_supported":false},{"device_id":1,"device_name":"M-Audio FW Audiophile","interfaces":[{"interface_id":0,"interface_name":"FW AP Multi","pins":[{"is_input":false,"pin_id":0,"pin_name":"Output"},{"is_input":true,"pin_id":1,"pin_name":"Input"}]},{"interface_id":1,"interface_name":"FW AP 1/2","pins":[{"is_input":false,"pin_id":0,"pin_name":"Output"},{"is_input":true,"pin_id":1,"pin_name":"Input"}]},{"interface_id":2,"interface_name":"FW AP SPDIF","pins":[{"is_input":false,"pin_id":0,"pin_name":"Output"},{"is_input":true,"pin_id":1,"pin_name":"Input"}]},{"interface_id":3,"interface_name":"FW AP 3/4","pins":[{"is_input":false,"pin_id":0,"pin_name":"Output"}]}],"wavert_supported":false},{"device_id":2,"device_name":"Virtual Audio Cable","interfaces":[{"interface_id":0,"interface_name":"Virtual Cable 2","pins":[{"is_input":true,"pin_id":0,"pin_name":"Capture"},{"is_input":false,"pin_id":1,"pin_name":"Output"}]},{"interface_id":1,"interface_name":"Virtual Cable 1","pins":[{"is_input":true,"pin_id":0,"pin_name":"Capture"},{"is_input":false,"pin_id":1,"pin_name":"Output"}]}],"wavert_supported":false},{"device_id":3,"device_name":"WebCamDV WDM Audio Capture","interfaces":[{"interface_id":0,"interface_name":"WebCamDV Audio","pins":[{"is_input":true,"pin_id":0,"pin_name":"Recording Control"},{"is_input":false,"pin_id":1,"pin_name":"Volume Control"}]}],"wavert_supported":false}];
return response;
}
2013-01-30 16:50:43 +00:00
// Session Functions
function SessionAddTrack() {}
function SessionGetControlState(mixerIds) {
2013-02-07 04:58:41 +00:00
var groups = [0, 1, 2, 3, 7, 9];
var names = [
2013-02-07 04:58:41 +00:00
"FW AP Multi",
"FW AP Multi",
"FW AP Multi",
"FW AP Multi",
"",
""
];
var clientIds = [
2013-02-07 04:58:41 +00:00
"",
"",
"",
"",
"3933ebec-913b-43ab-a4d3-f21dc5f8955b",
""
];
2013-01-30 16:50:43 +00:00
var response = [];
for (var i=0; i<mixerIds.length; i++) {
response.push({
client_id: clientIds[i],
group_id: groups[i],
2013-01-30 16:50:43 +00:00
id: mixerIds[i],
master: true,
monitor: true,
mute: false,
name: names[i],
2013-01-30 16:50:43 +00:00
range_high: 20,
range_low: -80,
record: true,
stereo: true,
volume_left: -40,
volume_right:-40,
instrument_id:'electric guitar'
2013-01-30 16:50:43 +00:00
});
}
return response;
}
function SessionGetIDs() {
return [
"FW AP Multi_0_10000",
2013-02-07 04:58:41 +00:00
"FW AP Multi_1_10100",
"FW AP Multi_2_10200",
2013-02-07 04:58:41 +00:00
"FW AP Multi_3_10500",
"User@208.191.152.98#",
"User@208.191.152.98_*"
];
2013-01-30 16:50:43 +00:00
}
function SessionRegisterCallback(callbackName) {
eventCallbackName = callbackName;
if (callbackTimer) { context.clearInterval(callbackTimer); }
if (eventCallbackName) {
callbackTimer = context.setInterval(doCallbacks, eventCallbackRate);
}
}
function SessionSetControlState(stringValue) {}
function SessionSetRecordingFilename(filename) {}
function SessionSetRecordingFolder(folderName) {}
function SessionStartPlay() {}
function SessionStartRecording() {}
function SessionStopPlay() {}
function SessionStopRecording() {}
2013-04-10 15:01:29 +00:00
function SessionGetMasterLocalMix() {
logger.debug('SessionGetMasterLocalMix. Returning: ' + _mix);
return _mix;
}
function SessionSetMasterLocalMix(level) {
logger.debug('SessionSetMasterLocalMix(' + level + ')');
_mix = level;
}
2013-01-30 16:50:43 +00:00
function doCallbacks() {
var names = ["left_vu", "right_vu"];
var ids = ["FW AP Multi_2_10200", "FW AP Multi_0_10000"];
var args = [];
for (var i=0; i<ids.length; i++) {
for (var j=0; j<names.length; j++) {
args.push('"' + names[j] + '"');
args.push('"' + ids[i] + '"');
args.push(vuValue);
}
2013-01-30 16:50:43 +00:00
}
var js = eventCallbackName + '(' + args.join(',') + ')';
eval(js);
2013-01-30 16:50:43 +00:00
vuValue += vuChange;
if (vuValue > 10 || vuValue < -70) { vuChange = vuChange * -1; }
}
function SetVURefreshRate(rateMS) {
eventCallbackRate = rateMS;
if (callbackTimer) { context.clearInterval(callbackTimer); }
if (eventCallbackName) {
callbackTimer = context.setInterval(doCallbacks, eventCallbackRate);
}
}
// Track Functions
// Returns a list of objects representing all available audio devices and
// pins on the current system. On my windows box, I get 38 objects back.
// First couple examples included here. Note that the list tends to come
// back with all of the left inputs, then all the right inputs, then all
// the left outputs, then all the right outputs.
function TrackGetChannels() {
// Real example:
/*
{
device_id: "1394\\M-Audio&FW_Audiophile",
full_id: "i~1~\\\\?\\1394#m-audio&fw_audiophile#d4eb0700036c0d00#{6994ad04-93ef-11d0-a3cc-00a0c9223196}\\fwap_12",
id: "\\\\?\\1394#m-audio&fw_audiophile#d4eb0700036c0d00#{6994ad04-93ef-11d0-a3cc-00a0c9223196}\\fwap_12",
input: true,
left: true,
name: "M-Audio FW Audiophile: FW AP 1/2 - Left"
},
*/
// But we'll just build a list of names and fake it
var devices = [
"M-Audio FW Audiophile: FW AP 1/2",
"M-Audio FW Audiophile: FW Multi 1/2",
"M-Audio FW Audiophile: FW SPDIF 1/2",
"Realtek High Definition Audio: Realtek HD Digital",
"Realtek High Definition Audio: Realtek HD Line",
"Realtek High Definition Audio: Realtek HD Audio Mic",
"Realtek High Definition Audio: Realtek HD Audio Stereo",
"WebCamDV WDM Audio Capture: WebCamDV Audio"
];
var suffixes = [ " - Left", " - Right", " - Left", " - Right"];
var lefts = [true, false, true, false];
var inputs = [true, true, false, false];
var response = [];
var name, o, i, j;
for (j=0; j<4; j++) {
for (i=0; i<devices.length; i++) {
name = devices[i] + suffixes[j];
o = {
device_id: name,
full_id: name,
id: name,
input: inputs[j],
left: lefts[j],
name: name
};
response.push(o);
}
}
return response;
}
function TrackGetCount() {
return 1; // Real version returns whatever was set
}
function TrackGetInstrument(trackNumber) {}
2013-05-12 05:43:36 +00:00
function TrackGetDevices() {
var response =[{"device_id":0,"device_name":"Realtek High Definition Audio","interfaces":[{"interface_id":0,"interface_name":"Realtek HDA SPDIF Out","pins":[{"is_input":false,"pin_id":0,"pin_name":"PC Speaker"}]},{"interface_id":1,"interface_name":"Realtek HD Audio rear output","pins":[{"is_input":false,"pin_id":0,"pin_name":"PC Speaker"}]},{"interface_id":2,"interface_name":"Realtek HD Audio Mic input","pins":[{"is_input":true,"pin_id":0,"pin_name":"Recording Control"}]},{"interface_id":3,"interface_name":"Realtek HD Audio Line input","pins":[{"is_input":true,"pin_id":0,"pin_name":"Recording Control"}]},{"interface_id":4,"interface_name":"Realtek HD Digital input","pins":[{"is_input":true,"pin_id":0,"pin_name":"Capture"}]},{"interface_id":5,"interface_name":"Realtek HD Audio Stereo input","pins":[{"is_input":true,"pin_id":0,"pin_name":"Recording Control"}]}],"wavert_supported":false},{"device_id":1,"device_name":"M-Audio FW Audiophile","interfaces":[{"interface_id":0,"interface_name":"FW AP Multi","pins":[{"is_input":false,"pin_id":0,"pin_name":"Output"},{"is_input":true,"pin_id":1,"pin_name":"Input"}]},{"interface_id":1,"interface_name":"FW AP 1/2","pins":[{"is_input":false,"pin_id":0,"pin_name":"Output"},{"is_input":true,"pin_id":1,"pin_name":"Input"}]},{"interface_id":2,"interface_name":"FW AP SPDIF","pins":[{"is_input":false,"pin_id":0,"pin_name":"Output"},{"is_input":true,"pin_id":1,"pin_name":"Input"}]},{"interface_id":3,"interface_name":"FW AP 3/4","pins":[{"is_input":false,"pin_id":0,"pin_name":"Output"}]}],"wavert_supported":false},{"device_id":2,"device_name":"Virtual Audio Cable","interfaces":[{"interface_id":0,"interface_name":"Virtual Cable 2","pins":[{"is_input":true,"pin_id":0,"pin_name":"Capture"},{"is_input":false,"pin_id":1,"pin_name":"Output"}]},{"interface_id":1,"interface_name":"Virtual Cable 1","pins":[{"is_input":true,"pin_id":0,"pin_name":"Capture"},{"is_input":false,"pin_id":1,"pin_name":"Output"}]}],"wavert_supported":false},{"device_id":3,"device_name":"WebCamDV WDM Audio Capture","interfaces":[{"interface_id":0,"interface_name":"WebCamDV Audio","pins":[{"is_input":true,"pin_id":0,"pin_name":"Recording Control"},{"is_input":false,"pin_id":1,"pin_name":"Volume Control"}]}],"wavert_supported":false}];
return response;
}
function TrackSetMusicDevice(id) {
device_id = id;
}
// mock response of this method by allowing only even device IDs to open control panel
function TrackHasControlPanel() {
var devices = TrackGetDevices();
if (devices[device_id].device_id % 2 === 0) {
return true;
}
else {
return false;
}
}
function TrackOpenControlPanel() {
return;
}
function TrackLoadAssignments() {}
function TrackSave() {}
// Set a Track Assignment.
// assignment is an enum:
// CHAT = -2, OUTPUT = -1, UNASSIGNED = 0
function TrackSetAssignment(chanId, isInput, assignment) {}
// Get a Track Assignment.
function TrackGetAssignment(chanId, isInput) {
// CHAT = -2, OUTPUT = -1, UNASSIGNED = 0
return 0;
}
function TrackSetCount(count) {}
function TrackSetInstrument(track, instrumentId) {}
// Method which sets volume
function UpdateMixer(mixerId) {}
// Client Update Functions
function ClientUpdateVersion() { return "Compiled 1.2.3"; }
function ClientUpdateStartDownload(url, progressCallback, successCallback, failureCallback) {
// simulate a bunch of download callbacks
var count = 0;
var max = 100;
var bytesReceived = 0;
var bytesTotal = 10000;
function fire() {
count++;
setTimeout(function() {
bytesReceived = ( count / max ) * bytesTotal;
JK.ClientUpdate.DownloadProgressCallback(bytesReceived, bytesTotal, 0, 0)
if(count < max) {
fire()
}
else {
JK.ClientUpdate.DownloadFailureCallback("/some/path/here")
}
}, 50)
}
fire()
}
function ClientUpdateStartUpdate(path, successCallback, failureCallback) {}
// Javascript Bridge seems to camel-case
// Set the instance functions:
this.GetASIODevices = GetASIODevices;
this.GetFTUE = GetFTUE;
this.GetOS = GetOS;
this.GetOSAsString = GetOSAsString;
this.JoinSession = JoinSession;
this.LatencyUpdated = LatencyUpdated;
this.LeaveSession = LeaveSession;
this.P2PMessageReceived = P2PMessageReceived;
this.ParticipantJoined = ParticipantJoined;
this.ParticipantLeft = ParticipantLeft;
this.RecordTestBegin = RecordTestBegin;
this.RecordTestEnd = RecordTestEnd;
this.RecordTestPlayback = RecordTestPlayback;
this.SendP2PMessage = SendP2PMessage;
this.SetASIOEnabled = SetASIOEnabled;
this.SetFTUE = SetFTUE;
this.SignalLatencyUpdated = SignalLatencyUpdated;
this.SignalSendP2PMessage = SignalSendP2PMessage;
this.StartPlayTest = StartPlayTest;
this.StartRecordTest = StartRecordTest;
this.StartRecording = StartRecording;
this.StopPlayTest = StopPlayTest;
this.StopRecording = StopRecording;
this.TestASIOLatency = TestASIOLatency;
this.TestLatency = TestLatency;
this.connected = true;
2013-01-30 16:50:43 +00:00
// Session
this.SessionAddTrack = SessionAddTrack;
this.SessionGetControlState = SessionGetControlState;
this.SessionGetIDs = SessionGetIDs;
this.SessionRegisterCallback = SessionRegisterCallback;
this.SessionSetControlState = SessionSetControlState;
this.SessionSetRecordingFilename = SessionSetRecordingFilename;
this.SessionSetRecordingFolder = SessionSetRecordingFolder;
this.SessionStartPlay = SessionStartPlay;
this.SessionStartRecording = SessionStartRecording;
this.SessionStopPlay = SessionStopPlay;
this.SessionStopRecording = SessionStopRecording;
this.SetVURefreshRate = SetVURefreshRate;
2013-04-10 15:01:29 +00:00
this.SessionGetMasterLocalMix = SessionGetMasterLocalMix;
this.SessionSetMasterLocalMix = SessionSetMasterLocalMix;
// Track
this.TrackGetChannels = TrackGetChannels;
this.TrackSetAssignment = TrackSetAssignment;
this.TrackGetAssignment = TrackGetAssignment;
this.TrackSetCount = TrackSetCount;
this.TrackGetCount = TrackGetCount;
this.TrackSave = TrackSave;
this.TrackLoadAssignments = TrackLoadAssignments;
this.TrackSetInstrument = TrackSetInstrument;
this.TrackGetInstrument = TrackGetInstrument;
2013-05-12 05:43:36 +00:00
this.TrackGetDevices = TrackGetDevices;
this.TrackSetMusicDevice = TrackSetMusicDevice;
this.TrackHasControlPanel = TrackHasControlPanel;
this.TrackOpenControlPanel = TrackOpenControlPanel;
// Client Update
this.ClientUpdateVersion = ClientUpdateVersion;
this.ClientUpdateStartDownload = ClientUpdateStartDownload;
this.ClientUpdateStartUpdate = ClientUpdateStartUpdate;
};
})(window,jQuery);