3 import javazoom.jl.player.advanced.*;
4 import javazoom.jl.player.*;
6 // Standard Java Packages
7 import java.util.concurrent.atomic.AtomicBoolean;
9 import java.util.LinkedList;
10 import java.io.FileInputStream;
12 /** Class MP3Decoder for the smart home application benchmark
14 * This class decodes mp3 files into raw pcm data
16 * @author Ali Younis <ayounis @ uci.edu>
20 public class MP3Decoder extends AudioDeviceBase {
22 private class PlaybackList extends PlaybackListener {
23 private MP3Decoder decoder;
24 public PlaybackList(MP3Decoder _d) {
28 public void playbackFinished(PlaybackEvent evt) {
32 public void playbackStarted(PlaybackEvent evt) {
37 private String fileName = "";
38 private LinkedList<short[]> audioLinkedList = new LinkedList<short[]>();
39 private AtomicBoolean decodeDone = new AtomicBoolean();
40 private long dataLength = 0;
42 public MP3Decoder(String _fileName) {
44 decodeDone.set(false);
46 PlaybackList pl = new PlaybackList(this);
49 AdvancedPlayer ap = new AdvancedPlayer(new FileInputStream(fileName), this);
50 ap.setPlayBackListener(pl);
53 } catch (Exception e) {
58 public List<short[]> getDecodedFrames() {
60 while (decodeDone.get() == false) {
61 // just block until done
64 return audioLinkedList;
67 public long getAudioFrameLength() {
69 return dataLength / 2;
72 protected void decodeDone() {
76 public int getPosition() {
77 // not used, just needed for AdvancedPlayer to work.
81 protected void writeImpl(short[] _samples, int _offs, int _len) {
82 short[] sample = new short[_len];
84 for (int i = 0; i < _len; i++, j++) {
85 sample[i] = _samples[j];
87 synchronized (audioLinkedList) {
88 audioLinkedList.addLast(sample);
91 dataLength += (long)_len;