import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import ca.uol.aig.fftpack.RealDoubleFFT;
public class AudioProcessing extends Activity implements OnClickListener{
    // AudioRecord 객체에서 주파수는 8kHz, 오디오 채널은 하나, 샘플은 16비트를 사용
    int frequency = 8000;
    int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
    int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
    private RealDoubleFFT transformer;
    int blockSize = 256;
 
    Button startStopButton;
    boolean started = false;
 
 
    RecordAudio recordTask;
 
   ImageView imageView;
    Bitmap bitmap;
    Canvas canvas;
    Paint paint;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        startStopButton = (Button)findViewById(R.id.StartStopButton);
        startStopButton.setOnClickListener(this);
        transformer = new RealDoubleFFT(blockSize);
        imageView = (ImageView)findViewById(R.id.ImageView01);
        bitmap = Bitmap.createBitmap((int)256, (int)100, Bitmap.Config.ARGB_8888);
        canvas = new Canvas(bitmap);
        paint = new Paint();
        paint.setColor(Color.GREEN);
        imageView.setImageBitmap(bitmap);
    }
    private class RecordAudio extends AsyncTask<Void, double[], Void>{
        @Override
        protected Void doInBackground(Void... params) {
            try{
            
                int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
 
                AudioRecord audioRecord = new AudioRecord(
                        MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize);
 
            
                short[] buffer = new short[blockSize];
                double[] toTransform = new double[blockSize];
 
                audioRecord.startRecording();
 
                while(started){
                    int bufferReadResult = audioRecord.read(buffer, 0, blockSize);
 
                  
                    for(int i = 0; i < blockSize && i < bufferReadResult; i++){
                        toTransform[i] = (double)buffer[i] / Short.MAX_VALUE; // 부호 있는 16비트
                    }
 
                    transformer.ft(toTransform);
    
                    publishProgress(toTransform);
                }
 
                audioRecord.stop();
            }catch(Throwable t){
                Log.e("AudioRecord", "Recording Failed");
            }
 
            return null;
        }
 
        @Override
        protected void onProgressUpdate(double[]... toTransform) {
            canvas.drawColor(Color.BLACK);
 
            for(int i = 0; i < toTransform[0].length; i++){
                int x = i;
                int downy = (int) (100 - (toTransform[0][i] * 10));
                int upy = 100;
 
                canvas.drawLine(x, downy, x, upy, paint);
            }
            imageView.invalidate();
        }
    }
 
    @Override
    public void onClick(View arg0) {
        if(started){
            started = false;
            startStopButton.setText("Start");
            recordTask.cancel(true);
        }else{
            started = true;
            startStopButton.setText("Stop");
            recordTask = new RecordAudio();
            recordTask.execute();
        }
    }
}