(function(context,$) { "use strict"; context.JK = context.JK || {}; context.JK.FakeJamClient = function(app, p2pMessageFactory) { var logger = context.JK.logger; logger.info("*** Fake JamClient instance initialized. ***"); // Change this to false if you want to see FTUE with fake jam client var ftueStatus = true; var eventCallbackName = ''; var eventCallbackRate = 1000; var vuValue = -70; var vuChange = 10; var callbackTimer = null; var _mix = -30; var device_id = -1; var latencyCallback = null; var frameSize = 2.5; var fakeJamClientRecordings = null; var p2pCallbacks = null; 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 OpenSystemBrowser(href) { dbg("OpenSystemBrowser('" + href + "')"); context.window.open(href); } function FTUEGetInputLatency() { dbg("FTUEGetInputLatency"); return 2; } function FTUESetInputLatency(latency) { dbg("FTUESetInputLatency:" + latency); } function FTUEGetOutputLatency() { dbg("FTUEGetOutputLatency"); return 2; } function FTUESetOutputLatency(latency) { dbg("FTUESetOutputLatency:" + latency); } function FTUEGetVolumeRanges () { dbg("FTUEGetVolumeRanges"); return { input_maximum: 20, input_minimum: -80, output_maximum: 20, output_minimum: -80 }; } function FTUEHasControlPanel() { dbg("FTUEHasControlPanel"); return true; } function FTUEGetFrameSize(newSize) { dbg("FTUEGetFrameSize"); return frameSize; } function FTUESetFrameSize(newSize) { dbg("FTUESetFrameSize:" + newSize); // one of 2.5, 5 or 10 frameSize = newSize; } function FTUEOpenControlPanel() { dbg("FTUEOpenControlPanel"); context.alert("Simulated ASIO Dialog"); } function FTUEInit() { dbg("FTUEInit"); } function FTUERefreshDevices() { dbg("FTUERefreshDevices()"); } function FTUESave(b) { dbg("FTUESave(" + b + ")"); } function FTUEGetStatus() { return ftueStatus; } function FTUESetStatus(b) { ftueStatus = b; } function FTUESetMusicDevice(id) { dbg("FTUESetMusicDevice"); } function FTUEGetDevices() { dbg('FTUEGetMusicDevices'); return { "ASIO4ALL v2":"ASIO4ALL v2 - ASIO", "M-Audio FW ASIO":"M-AUDIO FW ASIO - ASIO" }; } function FTUEGetMusicInputs() { dbg('FTUEGetMusicInputs'); return { "i~11~MultiChannel (FW AP Multi)~0^i~11~Multichannel (FW AP Multi)~1": "Multichannel (FW AP Multi) - Channel 1/Multichannel (FW AP Multi) - Channel 2" }; } function FTUEGetMusicOutputs() { dbg('FTUEGetMusicOutputs'); return { "o~11~Multichannel (FW AP Multi)~0^o~11~Multichannel (FW AP Multi)~1": "Multichannel (FW AP Multi) - Channel 1/Multichannel (FW AP Multi) - Channel 2" }; } function FTUEGetChatInputs() { dbg('FTUEGetChatInputs'); return { "i~11~MultiChannel (FW AP Multi)~0^i~11~Multichannel (FW AP Multi)~1": "Multichannel (FW AP Multi) - Channel 1/Multichannel (FW AP Multi) - Channel 2" }; } function FTUESetMusicInput() { dbg('FTUESetMusicInput'); } function FTUESetChatInput() { dbg('FTUESetChatInput'); } function FTUESetMusicOutput() { dbg('FTUESetMusicOutput'); } function FTUEGetInputVolume() { dbg('FTUEGetInputVolume'); return -60; } function FTUESetInputVolume() { dbg('FTUESetInputVolume'); } function FTUEGetOutputVolume() { dbg('FTUEGetOutputVolume'); return -40; } function FTUESetOutputVolume() { dbg('FTUESetOutputVolume'); } function FTUEGetChatInputVolume() { dbg('FTUEGetChatInputVolume'); return -10; } function FTUESetChatInputVolume() { dbg('FTUESetChatInputVolume'); } function FTUERegisterVUCallbacks() { dbg('FTUERegisterVUCallbacks'); } function FTUERegisterLatencyCallback(functionName) { dbg('FTUERegisterLatencyCallback'); latencyCallback = functionName; } function FTUEStartLatency() { function cb() { // Change 4192 to modify latency MS results (in microseconds) eval(latencyCallback + "(10.0)"); } context.setTimeout(cb, 1000); } function RegisterVolChangeCallBack(functionName) { dbg('RegisterVolChangeCallBack'); } function GetOS() { return 100000000; } function GetOSAsString() { return "Win32"; //return "Mac"; } function LatencyUpdated(map) { dbg('LatencyUpdated:' + JSON.stringify(map)); } function LeaveSession(map) { dbg('LeaveSession:' + JSON.stringify(map)); } // this is not a real bridge method; purely used by the fake jam client function RegisterP2PMessageCallbacks(callbacks) { p2pCallbacks = callbacks; } function P2PMessageReceived(from, payload) { dbg('P2PMessageReceived'); // this function is different in that the payload is a JSON ready string; // whereas a real p2p message is base64 encoded binary packaged data try { payload = JSON.parse(payload); } catch(e) { logger.warn("unable to parse payload as JSON from client %o, %o, %o", from, e, payload); } var callback = p2pCallbacks[payload.type]; if(callback) { callback(from, payload); } } 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(recordingId, groupedClientTracks) { dbg('StartRecording'); fakeJamClientRecordings.StartRecording(recordingId, groupedClientTracks); } function StopPlayTest() { dbg('StopPlayTest'); } function StopRecording(recordingId, groupedTracks, errorReason, detail) { dbg('StopRecording'); fakeJamClientRecordings.StopRecording(recordingId, groupedTracks, errorReason, detail); } function AbortRecording(recordingId, errorReason, errorDetail) { dbg('AbortRecording'); fakeJamClientRecordings.AbortRecording(recordingId, errorReason, errorDetail); } 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","device_type": 0,"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","device_type": 1,"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","device_type": 2,"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","device_type": 3,"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; } // Session Functions function SessionAddTrack() {} function SessionAudioResync() { logger.debug("Fake JamClient: SessionAudioResync()"); } function SessionGetControlState(mixerIds) { dbg("SessionGetControlState"); var groups = [0, 1, 2, 3, 7, 9]; var names = [ "FW AP Multi", "FW AP Multi", "FW AP Multi", "FW AP Multi", "", "" ]; var clientIds = [ "", "", "", "", "3933ebec-913b-43ab-a4d3-f21dc5f8955b", "" ]; var response = []; for (var i=0; i 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 types = ["music", "non-music", "music", "non-music"]; var response = []; var name, o, i, j; for (j=0; j<4; j++) { for (i=0; i