/
SoundFile.java
133 lines (109 loc) · 3.8 KB
/
SoundFile.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package cassette.audiofiles;
import cassette.audiofiles.SoundBase;
import cassette.audiofiles.MediaPlayerHandlerCallback;
import java.io.IOException;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.res.AssetFileDescriptor;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import processing.core.PApplet;
public class SoundFile extends SoundBase implements MediaPlayerHandlerCallback {
private MediaPlayerHandler handler;
private MediaPlayer player;
public SoundFile(PApplet parent, String fileName) {
super(parent);
AssetFileDescriptor afd = null;
try {
afd = activity.getAssets().openFd(fileName);
MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
metaRetriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
} catch (IOException e) {
e.printStackTrace();
}
HandlerThread backgroundThread = new HandlerThread("MediaPlayer");
backgroundThread.start();
handler = new MediaPlayerHandler(backgroundThread.getLooper());
handler.setCallback(this);
handler.sendMessage(handler.obtainMessage(MediaPlayerHandler.MSG_INIT_PLAYER, afd));
}
public void play() {
handler.sendMessage(handler.obtainMessage(MediaPlayerHandler.MSG_START_PLAYER));
}
public void stop() {
handler.sendMessage(handler.obtainMessage(MediaPlayerHandler.MSG_STOP_PLAYER));
}
public void loop() {
handler.sendMessage(handler.obtainMessage(MediaPlayerHandler.MSG_SETLOOPINGON_PLAYER));
handler.sendMessage(handler.obtainMessage(MediaPlayerHandler.MSG_START_PLAYER));
}
@Override
public void onPause() {
}
@Override
public void onResume() {
}
@Override
public String getEventName() {
return "soundFileEvent";
}
private class MediaPlayerHandler extends Handler {
public static final int MSG_INIT_PLAYER = 0;
public static final int MSG_START_PLAYER = 1;
public static final int MSG_STOP_PLAYER = 2;
public static final int MSG_SETLOOPINGON_PLAYER = 3;
MediaPlayerHandlerCallback callback;
public MediaPlayerHandler(Looper looper) {
super(looper);
}
public void setCallback (MediaPlayerHandlerCallback cb) {
this.callback = cb;
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_INIT_PLAYER:
AssetFileDescriptor afd = (AssetFileDescriptor) msg.obj;
callback.initPlayer(afd);
break;
case MSG_START_PLAYER:
callback.startPlayer();
break;
case MSG_STOP_PLAYER:
callback.stopPlayer();
break;
case MSG_SETLOOPINGON_PLAYER:
callback.setLoopingONPlayer();
break;
default:
break;
}
}
}
@Override
public void initPlayer(AssetFileDescriptor afd) {
player = new MediaPlayer();
try {
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
player.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void startPlayer() {
player.start();
}
@Override
public void setLoopingONPlayer() {
player.setLooping(true);
}
@Override
public void stopPlayer() {
player.stop();
}
}