luis@16
|
1 /*
|
luis@28
|
2 * HumanEchoServlet
|
luis@16
|
3 *
|
luis@16
|
4 * Version information
|
luis@16
|
5 *
|
luis@16
|
6 * 3 December 2013
|
luis@16
|
7 *
|
luis@16
|
8 * Copyright notice
|
luis@16
|
9 */
|
luis@15
|
10
|
luis@15
|
11 import java.util.Properties;
|
luis@15
|
12 import java.io.IOException;
|
luis@15
|
13
|
luis@28
|
14 import java.io.FileInputStream;
|
luis@28
|
15 import java.io.BufferedInputStream;
|
luis@28
|
16 import java.io.File;
|
luis@28
|
17
|
Chris@60
|
18 import java.nio.file.Files;
|
Chris@60
|
19 import java.nio.file.Path;
|
Chris@60
|
20 import java.nio.file.StandardCopyOption;
|
Chris@60
|
21
|
luis@21
|
22 import org.apache.log4j.Logger;
|
luis@16
|
23
|
luis@28
|
24 import javax.servlet.*;
|
luis@28
|
25 import javax.servlet.http.*;
|
luis@0
|
26
|
luis@0
|
27 import com.mathworks.toolbox.javabuilder.MWJavaObjectRef;
|
luis@0
|
28 import com.mathworks.toolbox.javabuilder.MWNumericArray;
|
luis@11
|
29 import com.mathworks.toolbox.javabuilder.MWStructArray;
|
luis@0
|
30 import com.mathworks.toolbox.javabuilder.MWException;
|
luis@15
|
31 import com.mathworks.toolbox.javabuilder.internal.MCRConfiguration;
|
luis@15
|
32
|
luis@15
|
33 import uk.ac.soton.isvr.*;
|
luis@0
|
34
|
luis@0
|
35 public class HumanEchoServlet extends HttpServlet {
|
Chris@54
|
36
|
luis@0
|
37 private HumanEcho echo;
|
luis@28
|
38 private static Logger logger = Logger.getLogger(HumanEchoServlet.class);
|
luis@0
|
39
|
Chris@54
|
40 private String outdir = "";
|
Chris@54
|
41 private String indir = "";
|
luis@16
|
42
|
Chris@60
|
43 private static Integer dirId = 0;
|
Chris@60
|
44
|
luis@0
|
45 public void init(ServletConfig config) throws ServletException {
|
luis@0
|
46 super.init(config);
|
luis@0
|
47
|
Chris@51
|
48 logger.info("In init");
|
Chris@42
|
49
|
Chris@51
|
50 logger.info("java.library.path is " +
|
Chris@42
|
51 System.getProperty("java.library.path"));
|
Chris@42
|
52
|
luis@15
|
53 try {
|
luis@15
|
54 Properties properties = new Properties();
|
Chris@42
|
55 properties.load
|
Chris@42
|
56 (Thread.currentThread().getContextClassLoader().
|
Chris@51
|
57 getResourceAsStream("HumanEcho.properties"));
|
luis@15
|
58
|
Chris@54
|
59 outdir = properties.getProperty("outdir");
|
Chris@54
|
60 indir = properties.getProperty("indir");
|
luis@15
|
61
|
Chris@54
|
62 logger.info("WAV file directory is " + outdir);
|
Chris@42
|
63
|
Chris@51
|
64 } catch (Exception e) {
|
Chris@51
|
65 logger.error("Failed to load app properties: " + e.getMessage());
|
luis@15
|
66 e.printStackTrace();
|
luis@15
|
67 }
|
luis@15
|
68
|
luis@0
|
69 try {
|
Chris@42
|
70 // Test that we can construct one of the MATLAB objects
|
Chris@42
|
71
|
Chris@42
|
72 long before = System.currentTimeMillis();
|
luis@0
|
73 echo = new HumanEcho();
|
Chris@42
|
74 long after = System.currentTimeMillis();
|
Chris@51
|
75 logger.info("Created a HumanEcho object: it took " + (after - before) + " ms");
|
Chris@42
|
76 } catch (MWException e) {
|
Chris@51
|
77 logger.error("Failed to construct HumanEcho object: " + e.getMessage());
|
luis@0
|
78 e.printStackTrace();
|
luis@0
|
79 }
|
Chris@51
|
80
|
Chris@51
|
81 logger.info("Init completed");
|
luis@0
|
82 }
|
luis@0
|
83
|
luis@0
|
84 public void destroy() {
|
luis@0
|
85 super.destroy();
|
luis@0
|
86
|
Chris@42
|
87 if (echo != null) {
|
luis@0
|
88 echo.dispose();
|
luis@0
|
89 }
|
luis@0
|
90 }
|
luis@0
|
91
|
Chris@60
|
92 protected synchronized String getDirToken() {
|
Chris@60
|
93 dirId = dirId + 1;
|
Chris@60
|
94 return dirId.toString();
|
Chris@60
|
95 }
|
Chris@60
|
96
|
luis@11
|
97 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
luis@0
|
98
|
Chris@51
|
99 logger.info("In doGet");
|
Chris@47
|
100
|
Chris@54
|
101 logger.info("Distance (as string) is: " + request.getParameter("dist"));
|
Chris@54
|
102
|
luis@11
|
103 // todo: validate/normalise distance
|
Chris@54
|
104 Double dist = Double.parseDouble(request.getParameter("dist"));
|
Chris@60
|
105 Double azim = Double.parseDouble(request.getParameter("azim"));
|
Chris@60
|
106 String orientation = request.getParameter("orient");
|
Chris@60
|
107 Double dirweight = Double.parseDouble(request.getParameter("dirweight"));
|
luis@38
|
108
|
Chris@60
|
109 logger.info("Got parameters");
|
luis@38
|
110
|
luis@11
|
111 MWStructArray Input = null;
|
luis@0
|
112
|
luis@28
|
113 String outputfname = new String();
|
luis@28
|
114
|
Chris@60
|
115 // this needs to be distinct for the parameters
|
Chris@60
|
116 StringBuilder sb = new StringBuilder();
|
Chris@42
|
117
|
Chris@60
|
118 sb.append("e_d");
|
Chris@60
|
119 sb.append(dist);
|
Chris@60
|
120 sb.append("_a");
|
Chris@60
|
121 sb.append(azim);
|
luis@16
|
122
|
Chris@60
|
123 if (orientation.equals("horz")) {
|
Chris@60
|
124 sb.append("_H");
|
Chris@60
|
125 } else if (orientation.equals("angled")) {
|
Chris@60
|
126 sb.append("_A");
|
Chris@60
|
127 }
|
luis@0
|
128
|
Chris@60
|
129 sb.append("_w");
|
Chris@60
|
130 sb.append(dirweight);
|
Chris@47
|
131
|
Chris@60
|
132 outputfname = sb.toString();
|
Chris@46
|
133
|
Chris@62
|
134 String target = outdir + File.separator + outputfname + ".wav";
|
Chris@60
|
135 File targetFile = new File(target);
|
Chris@60
|
136 targetFile.deleteOnExit();
|
luis@11
|
137
|
Chris@60
|
138 if (!targetFile.exists()) {
|
luis@11
|
139
|
Chris@60
|
140 try {
|
Chris@60
|
141 logger.info("Property catalina.base is " + System.getProperty("catalina.base"));
|
Chris@60
|
142
|
Chris@62
|
143 String tempDir = outdir + File.separator + getDirToken();
|
Chris@60
|
144 File tempDirFilePath = new File(tempDir);
|
Chris@60
|
145 tempDirFilePath.mkdirs();
|
Chris@60
|
146
|
Chris@60
|
147 // Matlab structure:
|
Chris@60
|
148 //
|
Chris@60
|
149 // Input = struct('dist', 0.9, 'azim', 0, 'orient',
|
Chris@60
|
150 // 'horz', 'dirweight', 0.2, 'outdir', '/tmp/wav',
|
Chris@60
|
151 // 'outname', 'foo.wav', 'indir', '/path/to/hrir')
|
Chris@60
|
152
|
Chris@60
|
153 String[] InputStructFields = {
|
Chris@60
|
154 "dist", "azim", "orient", "dirweight",
|
Chris@60
|
155 "outdir", "outname", "indir"
|
Chris@60
|
156 };
|
Chris@60
|
157
|
Chris@60
|
158 Input = new MWStructArray(1, 1, InputStructFields);
|
Chris@60
|
159 Input.set("dist", 1, Double.valueOf(dist));
|
Chris@60
|
160 Input.set("azim", 1, Double.valueOf(azim));
|
Chris@60
|
161 Input.set("orient", 1, orientation);
|
Chris@60
|
162 Input.set("dirweight", 1, Double.valueOf(dirweight));
|
Chris@60
|
163 Input.set("outdir", 1, tempDir);
|
Chris@60
|
164 Input.set("indir", 1, indir);
|
Chris@60
|
165
|
Chris@60
|
166 Input.set("outname", 1, outputfname);
|
Chris@60
|
167
|
Chris@60
|
168 Object[] result = echo.simulateBinauralSignals(Input);
|
Chris@60
|
169
|
Chris@62
|
170 File createdFile = new File(tempDir + File.separator + outputfname + ".wav");
|
Chris@60
|
171 if (!createdFile.exists()) {
|
Chris@60
|
172 String err = "The simulateBinauralSignals call failed to create expected output file \"" + createdFile + "\"";
|
Chris@60
|
173 logger.error(err);
|
Chris@60
|
174 throw new ServletException(err);
|
Chris@60
|
175 }
|
Chris@60
|
176
|
Chris@60
|
177 Files.move(createdFile.toPath(),
|
Chris@60
|
178 targetFile.toPath(),
|
Chris@60
|
179 StandardCopyOption.ATOMIC_MOVE);
|
Chris@60
|
180
|
Chris@60
|
181 tempDirFilePath.delete();
|
Chris@60
|
182
|
Chris@60
|
183 } catch (MWException e) {
|
Chris@60
|
184 logger.error("Failed to calculate simulateBinauralSignals: " + e.getMessage());
|
Chris@60
|
185 e.printStackTrace();
|
Chris@60
|
186 throw new ServletException(e.getMessage());
|
Chris@60
|
187 }
|
Chris@60
|
188 }
|
luis@0
|
189
|
luis@28
|
190 // Creating the stream
|
luis@28
|
191 ServletOutputStream stream = null;
|
luis@28
|
192 BufferedInputStream buf = null;
|
luis@28
|
193
|
luis@28
|
194 try{
|
luis@28
|
195 stream = response.getOutputStream();
|
Chris@54
|
196
|
Chris@60
|
197 logger.info("About to read WAV data from \"" + target + "\"");
|
luis@28
|
198
|
luis@28
|
199 //set response headers
|
luis@32
|
200 response.setContentType("audio/x-wav");
|
Chris@67
|
201 response.addHeader("Content-Disposition","attachment; filename=" + outputfname + ".wav");
|
Chris@60
|
202 response.setContentLength( (int) targetFile.length( ) );
|
luis@28
|
203
|
Chris@60
|
204 FileInputStream input = new FileInputStream(targetFile);
|
luis@28
|
205 buf = new BufferedInputStream(input);
|
luis@28
|
206
|
Chris@54
|
207 int b = 0;
|
Chris@54
|
208 int total = 0;
|
Chris@54
|
209
|
Chris@54
|
210 // read from the file; write to the ServletOutputStream
|
Chris@54
|
211 while ((b = buf.read()) != -1) {
|
Chris@54
|
212 stream.write(b);
|
Chris@54
|
213 total += 1;
|
Chris@54
|
214 }
|
Chris@54
|
215
|
Chris@54
|
216 logger.info("Successfully wrote " + total + " byte(s) to client");
|
luis@28
|
217
|
luis@28
|
218 } catch (IOException ioe){
|
Chris@51
|
219 logger.error("Failed to read wav data: " + ioe.getMessage());
|
luis@28
|
220 throw new ServletException(ioe.getMessage( ));
|
luis@28
|
221 } finally {
|
Chris@54
|
222 if (stream != null) stream.close();
|
Chris@54
|
223 if (buf != null) buf.close();
|
Chris@54
|
224 }
|
luis@0
|
225 }
|
luis@0
|
226 }
|