package project.game.flyingbugs;
import min3d.core.RendererActivity;
import min3d.vos.Light;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.media.MediaPlayer;
import android.media.audiofx.Visualizer;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
public class Game3dView extends RendererActivity {
private GameUI mUI;
String filename;
MediaPlayer mp;
PowerManager.WakeLock wakeLock;
PowerManager pm;
private static final float VISUALIZER_HEIGHT_DIP = 500f;
private static boolean isPlaying = false;
private Visualizer mVisualizer;
private LinearLayout mLinearLayout;
private VisualizerView mVisualizerView;
private TextView mStatusTextView;
protected void onCreateSetContentView() {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreateSetContentView();
Intent i = getIntent();
Bundle extras = i.getExtras();
filename = extras.getString("musicData");
mStatusTextView = new TextView(this);
mLinearLayout = new LinearLayout(this);
mLinearLayout.setOrientation(LinearLayout.VERTICAL);
mLinearLayout.addView(mStatusTextView);
setContentView(mLinearLayout);
try {
playAudio(filename);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
wakelock();
setupVisualizerFxAndUI();
mVisualizer.setEnabled(true);
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mediaPlayer) {
mVisualizer.setEnabled(false);
}
});
mStatusTextView.setText("Playing audio...");
mUI = new GameUI(this);
mUI.setVisibility(View.VISIBLE);
this.addContentView(mUI,new android.view.ViewGroup.LayoutParams(android.view.ViewGroup.LayoutParams.FILL_PARENT,android.view.ViewGroup.LayoutParams.FILL_PARENT));
}
public void wakelock(){
pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "WakeLock Test");
wakeLock.acquire();
}
public void playAudio(String url) throws Exception{
killMediaPlayer();
if(mp == null){
mp = new MediaPlayer(); //미디어 생성
mp.setDataSource(url); //파일 경로
mp.prepare(); //준비
mp.setLooping(false); //반복 재생 false
mp.start(); //음악 시작
isPlaying = true;
}
}
private void setupVisualizerFxAndUI() {
// Create a VisualizerView (defined below), which will render the
// simplified audio
// wave form to a Canvas.
mVisualizerView = new VisualizerView(this);
mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, (int) (VISUALIZER_HEIGHT_DIP * getResources().getDisplayMetrics().density)));
mLinearLayout.addView(mVisualizerView);
// Create the Visualizer object and attach it to our media player.
mVisualizer = new Visualizer(mp.getAudioSessionId());
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
mVisualizer.setDataCaptureListener(
new Visualizer.OnDataCaptureListener() {
public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
mVisualizerView.updateVisualizer(bytes);
}
public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
}
}, Visualizer.getMaxCaptureRate() / 2, true, false);
}
private void killMediaPlayer() {
if(mp != null && isPlaying == true){
try{
mp.pause();
mVisualizer.release();
mp.release();
mp = null;
wakeLock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void onPause(){
super.onPause();
if(mp != null){
killMediaPlayer();
}
}
@Override
public void initScene() {
// TODO Auto-generated method stub
scene.lights().add(new Light());
}
@Override
public void updateScene() {
// TODO Auto-generated method stub
}
@Override
public void onInitScene() {
// TODO Auto-generated method stub
super.onInitScene();
}
@Override
public void onUpdateScene() {
// TODO Auto-generated method stub
super.onUpdateScene();
}
}
class VisualizerView extends View {
// byte = 1byte, flaot = 4byte
private byte[] mBytes;
private float[] mPoints;
private Rect mRect = new Rect();
private Paint mForePaint = new Paint();
int count = 50;
public VisualizerView(Context context) {
super(context);
init();
}
private void init() {
mBytes = null;
mForePaint.setStrokeWidth(1f);
mForePaint.setAntiAlias(true);
mForePaint.setColor(Color.rgb(0, 128, 255));
}
public void updateVisualizer(byte[] bytes) {
mBytes = bytes;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mBytes == null) {
return;
}
if (mPoints == null || mPoints.length < mBytes.length * 4) {
mPoints = new float[mBytes.length * 4];
}
mRect.set(0, 0, getWidth(), getHeight());
for (int i = 0; i < mBytes.length - 1; i++) {
mPoints[i * 4] = mRect.width() * i / (mBytes.length - 1);
mPoints[i * 4 + 1] = mRect.height() / 2 + ((byte) (mBytes[i] + 128)) * (mRect.height() / 2) / 128;
mPoints[i * 4 + 2] = mRect.width() * (i + 1) / (mBytes.length - 1);
mPoints[i * 4 + 3] = mRect.height() / 2 + ((byte) (mBytes[i + 1] + 128)) * (mRect.height() / 2) / 128; }
canvas.drawLines(mPoints, mForePaint);
}
}
위에 소스입니다. mp3파일을 가지고 파형은 그려지는데
어쩔때는 파형이 안그려지고 ㅡㅡㅡㅡㅡㅡ 일자로만 나오고
또 어느때는 파형이 파형이 잘 그려집니다.
그래서 문제점을 찾아보니 byte의 값이 -128로만 일정하게 나오더라구요
데이터도 잘 넘어와서 노래가 나오는데 왜 되다 안되다 하는지 잘 모르겠어서 이렇게 남깁니다.
질문 1. 업데이트 하는 부분은 잘 불러와지는데 byte의 값이 왜 일정하게 -128로만 나오는지를 모르겠습니다.
질문 2. 자바로 리스너를 만든건데 저걸 xml로 바꾼다면 어떻게 바꿔야 할지?? 클래스부분을 xml로 만들어야되는데 이걸 잘 모르겠네요
거기에 중간중간 클래스를 뷰로 만든걸 사용해야되는데..어찌해야되는지?
질문 3. 현재 만들어진것은 파형이 1~3초정도?의 노래에 대한 파형이 나오는데 이걸 노래전체에 대한 파형을 그리고 싶은데 한번에 무슨
방법이 없을까요?