source: main/trunk/model-sites-dev/multimodal-mdl/collect/salami-ground-truth/script2/hybrid-audio-player.js@ 28746

Last change on this file since 28746 was 28746, checked in by davidb, 10 years ago

Latest version of Firefox now supports Web-Audio, but the written JS files for Greenstone (for audio) don't seem to play nicely. Make it use the Firefox audio extension for now

  • Property svn:executable set to *
File size: 6.2 KB
Line 
1
2Element.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
14Element.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
27function isDefined(v) {
28 return typeof v !== "undefined";
29}
30
31/* // ***** */
32/* Move above in to more general header file */
33
34
35// Useful shorthands
36var SVG_NS ="http://www.w3.org/2000/svg";
37var XLINK_NS = "http://www.w3.org/1999/xlink";
38
39
40var hasStructuredAudio = false;
41var hasChromaSelfSimMap = false;
42
43var allData = null;
44var yScaleSimImg = null;
45var caAlgorithm = null;
46var duration = null;
47
48var webAudioContext = null;
49//var webAudioSource = null;
50//var webAudioJSProcessor = null;
51
52if (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
62var is_firefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
63if (is_firefox) {
64 webAudioContext = null;
65}
66
67// ******
68// * Frequency Player/Plotter part of Hybrid Player
69// ******
70
71function 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
87function 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
99function 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
128function 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
165allData = [ [] ];
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
173yScaleSimImg=gs.variables.cgiargYScaleSimImg || 0.5;
174
175caAlgorithm=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});
Note: See TracBrowser for help on using the repository browser.