(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; var eventCallbackName = ''; var eventCallbackRate = 1000; var vuValue = -70; var vuChange = 10; var callbackTimer = 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 GetFTUE() { return ftue; } function SetFTUE(b) { ftue = b; } function GetOS() { return 100000000; } 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; } // Session Functions function SessionAddTrack() {} function SessionGetControlState(mixerIds) { 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 response = []; var name, o, i, j; for (j=0; j<4; j++) { for (i=0; i