package com.Javen;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.text.format.Time;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.Javen44100.R;
public class AudioRecordActivity extends Activity {
	private static final String TAG = "AudioRecordActivity";
	private Button startButton, stopButton, playButton;
	private int bufferSizeInBytes = 0;
	
	private int audioSource = MediaRecorder.AudioSource.MIC;
	
	private static int sampleRateInHz = 44100;
	
	private static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
	
	private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
	
    private static final String AudioName = "/sdcard/love.raw"; 
    
    private String NewAudioName = "/sdcard/new.wav"; 
	
	private AudioRecord audioRecord;
	
	
	private MediaPlayer mediaPlayer;
	
	
	private boolean isRecord = false;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
      
        Time time=new Time();  
        time.setToNow();  
        String times= time.year+"."+(time.month+1)+"."+time.monthDay+"_"+time.hour+":"+time.minute+":"+time.second;
        NewAudioName = "/sdcard/"+times+".wav";
        init();
    }
    
    private void init()
    {
    	startButton = (Button)findViewById(R.id.startButton);
    	stopButton = (Button)findViewById(R.id.stopButton);
    	playButton = (Button)findViewById(R.id.playButton);
    	
    	creatAudioRecord();
    	startButton.setOnClickListener(new AudioRecordLinstener());
    	stopButton.setOnClickListener(new AudioRecordLinstener());
    	playButton.setOnClickListener(new AudioRecordLinstener());
    	
    }
    
    private void creatAudioRecord()
    {
    	
    	bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
    	Log.d(TAG, "creatAudioRecord-->bufferSizeInBytes="+bufferSizeInBytes);
    	
    	
    	audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);
    	
    	
    	mediaPlayer = new MediaPlayer();
    }
    
    class AudioRecordLinstener implements OnClickListener
    {
		@Override
		public void onClick(View v)
		{
			if(v == startButton)
			{
				startAudioRecord();
			}
			if(v == stopButton)
			{
				stopAudioRecord();
			}
			if(v == playButton)
			{
				playMusic();
			}
		}
    }
    
    
    private final class PrepareListener implements OnPreparedListener
    {
		@Override
		public void onPrepared(MediaPlayer mp)
		{
			
			mediaPlayer.start();
		}
    	
    }
    
    
     * 播放录制的音频
     */
    private void playMusic()
    {
    	
    	File file = new File(NewAudioName);
    	if(file.exists())
    	{
    	 	try
    		{
        		mediaPlayer.reset();
    			mediaPlayer.setDataSource(NewAudioName);
    			mediaPlayer.prepare();
    			
    			mediaPlayer.setOnPreparedListener(new PrepareListener()); 
    		} catch (IllegalArgumentException e)
    		{
    			
    			e.printStackTrace();
    		} catch (SecurityException e)
    		{
    			
    			e.printStackTrace();
    		} catch (IllegalStateException e)
    		{
    			
    			e.printStackTrace();
    		} catch (IOException e)
    		{
    			
    			e.printStackTrace();
    		}
    	}
    }
    
    
     * 开始录制音频
     */
    private void startAudioRecord()
    {
    	audioRecord.startRecording();
    	isRecord = true;
    	new AudioRecordThread().start();
    }
    
    
     * 停止录制音频
     */
    private void  stopAudioRecord()
	{
    	close();  
	}
    
    private void close() 
    {  
        if (audioRecord != null) 
        {  
            System.out.println("stopRecord");  
            isRecord = false;
            audioRecord.stop();  
            audioRecord.release();
            audioRecord = null;  
        }  
    }  
    
    
     * 音频数据写入线程
     * @author Administrator
     *
     */
    class AudioRecordThread extends Thread
    {
    	@Override
    	public void run()
    	{
    		super.run();
    		writeDataToFile();
    		copyWaveFile(AudioName, NewAudioName);
    	}
    }
    
    
     * 把录制的音频裸数据写入到文件中去
     * 这里将数据写入文件,但是并不能播放,因为AudioRecord获得的音频是原始的裸音频, 
     * 如果需要播放就必须加入一些格式或者编码的头信息。但是这样的好处就是你可以对音频的 裸数据进行处理,比如你要做一个爱说话的TOM 
     * 猫在这里就进行音频的处理,然后重新封装 所以说这样得到的音频比较容易做一些音频的处理。 
     */
    private void writeDataToFile()
    {
    	
    	byte[] audioData = new byte[bufferSizeInBytes];
    	int readSize = 0;
    	FileOutputStream fos = null;
    	File file = new File(AudioName);
    	if(file.exists())
    		file.delete();
    	try
		{
			fos = new FileOutputStream(file);
		} catch (FileNotFoundException e)
		{
			
			e.printStackTrace();
		}
    	
    	while(isRecord == true)
    	{
    		readSize = audioRecord.read(audioData, 0, bufferSizeInBytes);
    		Log.d(TAG, "readSize ="+readSize);
    		if(AudioRecord.ERROR_INVALID_OPERATION != readSize)
    		{
    			try
				{
					fos.write(audioData);
				} catch (IOException e)
				{
					
					e.printStackTrace();
				}
    		}
    	}
    	
    	try
		{
			fos.close();
		} catch (IOException e)
		{
			
			e.printStackTrace();
		}
    }
    
    
    private void copyWaveFile(String inFileName, String outFileName)
    {
    	FileInputStream in = null;
    	FileOutputStream out = null;
    	long totalAudioLen = 0;  
        long totalDataLen = totalAudioLen + 36;  
        long longSampleRate = sampleRateInHz;  
        int channels = 2;  
        long byteRate = 16 * sampleRateInHz * channels / 8;
        
        byte[] data = new byte[bufferSizeInBytes];
    	try
		{
    		in = new FileInputStream(inFileName);
    		out = new FileOutputStream(outFileName);
			
			totalAudioLen = in.getChannel().size();
			totalDataLen = totalAudioLen + 36;  
			WriteWaveFileHeader(out, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate);  
			while(in.read(data) != -1)
			{
				out.write(data);
			}
			
			in.close();
			out.close();
		} catch (FileNotFoundException e)
		{
			
			e.printStackTrace();
		} catch (IOException e)
		{
			
			e.printStackTrace();
		}
    }
    
    
     * 这里提供一个头信息。插入这些信息就可以得到可以播放的文件。 
     * 音频的文件,可以发现前面的头文件可以说基本一样哦。每种格式的文件都有 
     * 自己特有的头文件。 
     */  
    private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen,  
            long totalDataLen, long longSampleRate, int channels, long byteRate)  
            throws IOException {  
        byte[] header = new byte[44];  
        header[0] = 'R'; 
        header[1] = 'I';  
        header[2] = 'F';  
        header[3] = 'F';  
        header[4] = (byte) (totalDataLen & 0xff);  
        header[5] = (byte) ((totalDataLen >> 8) & 0xff);  
        header[6] = (byte) ((totalDataLen >> 16) & 0xff);  
        header[7] = (byte) ((totalDataLen >> 24) & 0xff);  
        header[8] = 'W';  
        header[9] = 'A';  
        header[10] = 'V';  
        header[11] = 'E';  
        header[12] = 'f'; 
        header[13] = 'm';  
        header[14] = 't';  
        header[15] = ' ';  
        header[16] = 16; 
        header[17] = 0;  
        header[18] = 0;  
        header[19] = 0;  
        header[20] = 1; 
        header[21] = 0;  
        header[22] = (byte) channels;  
        header[23] = 0;  
        header[24] = (byte) (longSampleRate & 0xff);  
        header[25] = (byte) ((longSampleRate >> 8) & 0xff);  
        header[26] = (byte) ((longSampleRate >> 16) & 0xff);  
        header[27] = (byte) ((longSampleRate >> 24) & 0xff);  
        header[28] = (byte) (byteRate & 0xff);  
        header[29] = (byte) ((byteRate >> 8) & 0xff);  
        header[30] = (byte) ((byteRate >> 16) & 0xff);  
        header[31] = (byte) ((byteRate >> 24) & 0xff);  
        header[32] = (byte) (2 * 16 / 8); 
        header[33] = 0;  
        header[34] = 16; 
        header[35] = 0;  
        header[36] = 'd';  
        header[37] = 'a';  
        header[38] = 't';  
        header[39] = 'a';  
        header[40] = (byte) (totalAudioLen & 0xff);  
        header[41] = (byte) ((totalAudioLen >> 8) & 0xff);  
        header[42] = (byte) ((totalAudioLen >> 16) & 0xff);  
        header[43] = (byte) ((totalAudioLen >> 24) & 0xff);  
        out.write(header, 0, 44);  
    }  
    
    @Override
    protected void onDestroy()
    {
    	close();
    	if(mediaPlayer != null)
    	{
    		mediaPlayer.release();  
       	    mediaPlayer = null;
    	}
    	super.onDestroy();
    }
}