1 |
|
---|
2 | Element.prototype.getElementWidth = function() {
|
---|
3 | if (typeof this.clip !== "undefined") {
|
---|
4 | return this.clip.width;
|
---|
5 | } else {
|
---|
6 | if (this.style.pixelWidth) {
|
---|
7 | return this.style.pixelWidth;
|
---|
8 | } else {
|
---|
9 | return this.offsetWidth;
|
---|
10 | }
|
---|
11 | }
|
---|
12 | };
|
---|
13 |
|
---|
14 | Element.prototype.getElementHeight = function() {
|
---|
15 | if (typeof this.clip !== "undefined") {
|
---|
16 | return this.clip.height;
|
---|
17 | } else {
|
---|
18 | if (this.style.pixelHeight) {
|
---|
19 | return this.style.pixelHeight;
|
---|
20 | } else {
|
---|
21 | return this.offsetHeight;
|
---|
22 | }
|
---|
23 | }
|
---|
24 | };
|
---|
25 |
|
---|
26 |
|
---|
27 | function isDefined(v) {
|
---|
28 | return typeof v !== "undefined";
|
---|
29 | }
|
---|
30 |
|
---|
31 | /* // ***** */
|
---|
32 | /* Move above in to more general header file */
|
---|
33 |
|
---|
34 |
|
---|
35 | // Useful shorthands
|
---|
36 | var SVG_NS ="http://www.w3.org/2000/svg";
|
---|
37 | var XLINK_NS = "http://www.w3.org/1999/xlink";
|
---|
38 |
|
---|
39 |
|
---|
40 | var hasStructuredAudio = false;
|
---|
41 | var hasChromaSelfSimMap = false;
|
---|
42 |
|
---|
43 | var allData = null;
|
---|
44 | var yScaleSimImg = null;
|
---|
45 | var caAlgorithm = null;
|
---|
46 | var duration = null;
|
---|
47 |
|
---|
48 | var webAudioContext = null;
|
---|
49 | //var webAudioSource = null;
|
---|
50 | //var webAudioJSProcessor = null;
|
---|
51 |
|
---|
52 | if (typeof AudioContext == "function") {
|
---|
53 | webAudioContext = new AudioContext();
|
---|
54 | } else if (typeof webkitAudioContext == "function") {
|
---|
55 | webAudioContext = new webkitAudioContext();
|
---|
56 | }
|
---|
57 |
|
---|
58 | // Latest Firefox now seems to natively support Web audio, but doesn
|
---|
59 | // seem to play nicely with the work here
|
---|
60 | // => set webAudioContext back to null to force it to use the
|
---|
61 | // original Firefox audio extension
|
---|
62 | var is_firefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
|
---|
63 | if (is_firefox) {
|
---|
64 | webAudioContext = null;
|
---|
65 | }
|
---|
66 |
|
---|
67 | // ******
|
---|
68 | // * Frequency Player/Plotter part of Hybrid Player
|
---|
69 | // ******
|
---|
70 |
|
---|
71 | function freqPlayerAudioPlay(event)
|
---|
72 | {
|
---|
73 | console.info("Audio play pressed");
|
---|
74 |
|
---|
75 | if (audioMode == "stopped") {
|
---|
76 | // Nolonger used (Firefox fails to fire this event on a fresh 'play' once an existing play has finished)
|
---|
77 |
|
---|
78 | // take a fresh snapshot of the transform mode selected in the web page
|
---|
79 |
|
---|
80 | //var transformMode = $('input:radio[name=visualization]:checked').val();
|
---|
81 | //chromaTransform.setTransformMode(transformMode);
|
---|
82 |
|
---|
83 | }
|
---|
84 | audioMode = "playing";
|
---|
85 | }
|
---|
86 |
|
---|
87 | function freqPlayerAudioPause()
|
---|
88 | {
|
---|
89 | console.info("Audio pause pressed");
|
---|
90 | audioMode = "paused";
|
---|
91 |
|
---|
92 | // if stoping dualPlay
|
---|
93 | leftSong.pause();
|
---|
94 | rightSong.pause();
|
---|
95 | baseSong.volume = 1.0;
|
---|
96 |
|
---|
97 | }
|
---|
98 |
|
---|
99 | function freqPlayerAudioEnded()
|
---|
100 | {
|
---|
101 | console.info("Audio play/playlist ended");
|
---|
102 |
|
---|
103 | audioMode = "stopped";
|
---|
104 | needsRefresh = true;
|
---|
105 |
|
---|
106 | //console.log("reset freq plot called");
|
---|
107 | //frequencyPlotter.reset();
|
---|
108 |
|
---|
109 | }
|
---|
110 |
|
---|
111 | // ******
|
---|
112 | // * Meandre (server-side) workflow part of Hybrid Player
|
---|
113 | // ******
|
---|
114 | //
|
---|
115 | // Started when 'play' is pressed
|
---|
116 |
|
---|
117 | // (workflows now in their own folder '$httpCollection/script/meandre-workflow/*.js)
|
---|
118 | // the global variable 'meandreWorkflows' stores which flows are available
|
---|
119 |
|
---|
120 |
|
---|
121 |
|
---|
122 |
|
---|
123 |
|
---|
124 | // ******
|
---|
125 | // * Structured Audio (CAA) part of Hybrid Player
|
---|
126 | // ******
|
---|
127 |
|
---|
128 | function caaInit()
|
---|
129 | {
|
---|
130 | // duration information is now available
|
---|
131 | var audio = document.getElementById('rta-audio-element');
|
---|
132 | duration = audio.duration;
|
---|
133 |
|
---|
134 | if (!isDefined(allData)) {
|
---|
135 | // degenerate case
|
---|
136 |
|
---|
137 | var ground_truth = []; // empty ground truth
|
---|
138 |
|
---|
139 | var numSegs = 4;
|
---|
140 | var gap = duration/numSegs;
|
---|
141 |
|
---|
142 | var label = [ "a", "b" ];
|
---|
143 | var val = [ 0, 1];
|
---|
144 |
|
---|
145 | var equal_spacing = [];
|
---|
146 | for (var i=0; i<numSegs; i++) {
|
---|
147 | equal_spacing.push( {o: i*gap, f: i*gap+gap, l: label[i%2], a: val[i%2] } );
|
---|
148 | }
|
---|
149 |
|
---|
150 | allData = [ ground_truth, equal_spacing ];
|
---|
151 |
|
---|
152 | caAlgorithm = 1;
|
---|
153 | hasStructuredAudio = true;
|
---|
154 | }
|
---|
155 |
|
---|
156 | svgGTStructuredInit();
|
---|
157 | svgCAStructuredInit(caAlgorithm);
|
---|
158 | svgAudioDBInit();
|
---|
159 | }
|
---|
160 |
|
---|
161 | // Fake the allData array -- First value is ground-truth => make empty
|
---|
162 | //allData = [ [], JSON.parse(gs.documentMetadata["json_seriesData"]) ];
|
---|
163 |
|
---|
164 | // Set up position zero as empty "ground truth" data
|
---|
165 | allData = [ [] ];
|
---|
166 |
|
---|
167 | // ****
|
---|
168 |
|
---|
169 | // The following is actually the XSLT page param
|
---|
170 | // 'p.yScaleSimImg;, which presumably automatically generates
|
---|
171 | // gs.cgiParams.yScaleSimImg (if present). Defaults to 0.5
|
---|
172 |
|
---|
173 | yScaleSimImg=gs.variables.cgiargYScaleSimImg || 0.5;
|
---|
174 |
|
---|
175 | caAlgorithm=gs.variables.cgiargCAAlgorithm;
|
---|
176 |
|
---|
177 |
|
---|
178 |
|
---|
179 | $(function() {
|
---|
180 |
|
---|
181 |
|
---|
182 |
|
---|
183 | var audio = document.getElementById('rta-audio-element');
|
---|
184 | audio.addEventListener('loadedmetadata', caaInit, false);
|
---|
185 |
|
---|
186 | audio.addEventListener('MozAudioAvailable', freqPlayerAudioAvailable, false);
|
---|
187 | audio.addEventListener('loadedmetadata', freqPlayerLoadedAudioMetadata, false);
|
---|
188 |
|
---|
189 | audio.addEventListener('play', freqPlayerAudioPlay, false);
|
---|
190 | audio.addEventListener('pause', freqPlayerAudioPause, false);
|
---|
191 | audio.addEventListener('ended', freqPlayerAudioEnded, false);
|
---|
192 |
|
---|
193 |
|
---|
194 | console.log("****### Adding dual play loadmetadata event listeners in hybrid-audio-player.js");
|
---|
195 | baseSong = document.getElementById("rta-audio-element");
|
---|
196 | baseSong.addEventListener('loadedmetadata', initPannedPlaybackSampleRate, false);
|
---|
197 |
|
---|
198 | leftSong = document.getElementById("leftsong");
|
---|
199 | leftSong.addEventListener('MozAudioAvailable', audioAvailableLeft, false);
|
---|
200 | leftSong.addEventListener('loadedmetadata', loadedMetadataLeft, false);
|
---|
201 |
|
---|
202 | rightSong = document.getElementById("rightsong");
|
---|
203 | rightSong.addEventListener('MozAudioAvailable', audioAvailableRight, false);
|
---|
204 | rightSong.addEventListener('loadedmetadata', loadedMetadataRight, false);
|
---|
205 |
|
---|
206 |
|
---|
207 | var controlMarkerDiv = document.getElementById("controlMarker");
|
---|
208 | controlMarkerDiv.addEventListener('mousedown', playFromOffsetRTAEvent, false);
|
---|
209 |
|
---|
210 | /*
|
---|
211 | var oControlDiv = controlMarker.previousSibling;
|
---|
212 | console.log("** ocontrol = " + oControlDiv + ", type = " + oControlDiv.nodeType)
|
---|
213 | // skip over any text nodes ... (done this way to cope with browser differences)
|
---|
214 | while (oControlDiv && oControlDiv.nodeType != 1) {
|
---|
215 | oControlDiv = oControlDiv.previousSibling;
|
---|
216 | console.log("** in loop ocontrol = " + oControlDiv + ", type = " + oControlDiv.nodeType)
|
---|
217 | }
|
---|
218 |
|
---|
219 | if (oControlDiv) {
|
---|
220 | oControlDiv.setAttribute("onmousedown","javascript:playFromOffsetRTAEvent(event)");
|
---|
221 | //oControlDiv.addEventListener('mousedown', playFromOffsetRTAEvent, false);
|
---|
222 | //oControlDiv.addEventListener('mousedown', playFromOffsetRTAEvent, false);
|
---|
223 | }
|
---|
224 | else {
|
---|
225 | console.warn("Warning: failed to find SoundManager2 PagePlayer oControl div");
|
---|
226 | }
|
---|
227 | */
|
---|
228 |
|
---|
229 | });
|
---|