package com.sc.lesa.mediashar.jlib.media;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;

public class MyAudioRecord extends Thread {


    private static String TAG = "MyAudioRecord";

    protected AudioRecord mAudioRecord;
    private int mEncodeFormat = AudioFormat.ENCODING_PCM_16BIT;
    private int mChannelMode = AudioFormat.CHANNEL_CONFIGURATION_MONO;
    private int mSampleRate = 44100;
    private int mAudioSource=AudioFormat.ENCODING_PCM_16BIT;
    private final int mFrameSize = 2048;//帧buffer 大小

    private boolean mExit = false;
    private OnDataInput mOnDataInput;

    /**
     *
     * @param audioSource 音频源
     * 详细音频源类型请查看{@link MediaRecorder.AudioSource}
     *
     * @param sampleRateInHz 采样频率 默认44100
     * {@link AacFormat#SampleRate44100} {@link AacFormat#SampleRate48000}
     *
     * @param channelConfig 声道采集配置
     * See {@link AudioFormat#CHANNEL_IN_MONO} and{@link AudioFormat#CHANNEL_IN_STEREO}.
     * {@link AudioFormat#CHANNEL_IN_MONO} is guaranteed to work on all devices.
     *
     * @param audioFormat 采集格式
     * See {@link AudioFormat#ENCODING_PCM_8BIT}, {@link AudioFormat#ENCODING_PCM_16BIT},
     * and {@link AudioFormat#ENCODING_PCM_FLOAT}.
     */
    public MyAudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat){
        super(TAG);
        this.mAudioSource=audioSource;
        this.mSampleRate=sampleRateInHz;
        this.mChannelMode=channelConfig;
        this.mEncodeFormat=audioFormat;
        init();
    }
    public void setOnDataInput(OnDataInput onDataInput){
        this.mOnDataInput = onDataInput;
    }

    @Override
    public void run() {
        mAudioRecord.startRecording();
        byte[] buffer = new byte[mFrameSize];
        int num = 0;
        while (!mExit){
            num = mAudioRecord.read(buffer, 0, mFrameSize);
            if(mOnDataInput!= null)mOnDataInput.inputData(buffer,0,num);
            Log.d(TAG, "buffer len " + ", num = " + num);
        }
        Log.d(TAG, "exit loop");

        distory();
        Log.d(TAG, "clean up");
    }

    private void init(){
        int minBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannelMode,
                mEncodeFormat);
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                mSampleRate, mChannelMode, mEncodeFormat, minBufferSize * 2);
    }

    private void distory(){
        mAudioRecord.stop();
        mAudioRecord.release();
        mAudioRecord=null;
        mOnDataInput.release();
        mOnDataInput=null;

    }

    public void release(){
        this.mExit=true;
    }

    public interface OnDataInput{
        public void inputData(byte[] bytes,int offset,int len);
        public void release();
    }
}