package
codes.orion.swplayer;
import
java.io.IOException;
import
android.media.AudioTrack;
import
android.media.AudioFormat;
import
android.os.Handler;
import
android.util.Log;
public
class
MediaObj {
private
AudioTrack audioTrack;
private
Handler handler =
new
Handler();
private
Runnable updateThread =
new
Runnable(){
public
void
run() {
byte
[] bytes=stream(minbufsize);
int
dsize=data_size();
if
(audioTrack.write(bytes,
0
, dsize)<dsize) {
Log.w(
null
,
"Data not written completely"
);
}
handler.postDelayed(updateThread,
50
);
}
};
private
int
samplerate,channeltype,minbufsize;
public
void
setDataSource(String sourceFile)
throws
IOException {
openFile(sourceFile);
samplerate=getSampleRate();
if
(getChannel()==
1
)
channeltype=AudioFormat.CHANNEL_OUT_MONO;
else
channeltype=AudioFormat.CHANNEL_OUT_STEREO;
minbufsize=AudioTrack.getMinBufferSize (samplerate, channeltype, AudioFormat.ENCODING_PCM_16BIT);
audioTrack =
new
AudioTrack(android.media.AudioManager.STREAM_MUSIC,samplerate,channeltype,
AudioFormat.ENCODING_PCM_16BIT,
minbufsize*
2
,
AudioTrack.MODE_STREAM);
}
public
void
prepare() {
}
public
void
play() {
handler.post(updateThread);
audioTrack.play();
}
public
MediaObj() {
JNIinit();
}
@Override
protected
void
finalize()
throws
Throwable {
JNIexit();
handler.removeCallbacks(updateThread);
super
.finalize();
}
public
native
byte
[] stream(
int
minbufsize);
public
native
int
data_size();
public
native
void
openFile(String sourceFile)
throws
IOException;
public
native
int
getSampleRate();
public
native
int
getChannel();
public
native
void
JNIinit();
public
native
void
JNIexit();
static
{
System.loadLibrary(
"mediaobj-jni"
);
}
}