1   package org.daisy.pipeline.audio.impl;
2   
3   import java.io.BufferedInputStream;
4   import java.io.InputStream;
5   import java.util.Map;
6   import java.util.Optional;
7   
8   import javax.sound.sampled.AudioFileFormat;
9   import javax.sound.sampled.AudioInputStream;
10  import javax.sound.sampled.AudioSystem;
11  import javax.sound.sampled.UnsupportedAudioFileException;
12  
13  import org.daisy.pipeline.audio.AudioDecoder;
14  import org.daisy.pipeline.audio.AudioDecoderService;
15  import org.daisy.pipeline.audio.AudioFileTypes;
16  
17  import org.osgi.service.component.annotations.Component;
18  
19  @Component(
20  	name = "system-audio-decoder",
21  	immediate = true,
22  	service = { AudioDecoderService.class }
23  )
24  public class SystemAudioDecoder implements AudioDecoderService {
25  
26  	@Override
27  	public boolean supportsFileType(AudioFileFormat.Type fileType) {
28  		return AudioFileTypes.WAVE.equals(fileType);
29  	}
30  
31  	@Override
32  	public Optional<AudioDecoder> newDecoder(Map<String,String> params) {
33  		return Optional.of(getInstance());
34  	}
35  
36  	static AudioDecoder instance = null;
37  
38  	static AudioDecoder getInstance() {
39  		if (instance == null)
40  			instance = new AudioDecoder() {
41  					@Override
42  					public AudioInputStream decode(InputStream input) throws UnsupportedAudioFileException, Throwable {
43  						/* Javadoc of AudioSystem.getAudioInputStream: The implementation of this
44  						 * method may require multiple parsers to examine the stream to determine
45  						 * whether they support it. These parsers must be able to mark the stream,
46  						 * read enough data to determine whether they support the stream, and, if
47  						 * not, reset the stream's read pointer to its original position. If the
48  						 * input stream does not support these operation, this method may fail with
49  						 * an IOException. */
50  						if (!input.markSupported())
51  							input = new BufferedInputStream(input);
52  						return AudioSystem.getAudioInputStream(input);
53  					}
54  				};
55  		return instance;
56  	}
57  }