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초정도?의 노래에 대한 파형이 나오는데 이걸 노래전체에 대한 파형을 그리고 싶은데 한번에 무슨

             방법이 없을까요?