package cn.tee3.avd;
/**
 * Created by bob.liu on 2015/8/24.
 */

/**
 * 音频流导入接口.
 *
 * 音频导入相关功能接口。
 */
public class FakeAudioCapturer {
    private static final String TAG = "FakeAudioCapturer";

    /** 获取一个音频采集器对象
     * @return 音频采集器对象指针。
     * @note 音频采集器整个引擎对象只有一个，为所有房间共用；
     */
    public static FakeAudioCapturer instance() {
        return SingletonHolder.INSTANCE;
    }
    /** 销毁一个视频采集器对象
     *
     * @param[in] *capturer 视频采集器对象指针。
     */
    public static void destoryCapturer(FakeAudioCapturer capturer) {
        Tlog.d(TAG, "destoryAudioCapturer, capturer:" + capturer);
        if (null == capturer) {
            return ;
        }
        //capturer.dispose();
        Tlog.v(TAG, "destoryAudioCapturer, out:");
    }
    public long nativeCapture() {
		return nativeobj;
    }
    private static class SingletonHolder {
        static final FakeAudioCapturer INSTANCE = new FakeAudioCapturer();
    }
    private FakeAudioCapturer() {
        nativeobj = nativeCreateAudioCapturer();
        if (0 == nativeobj) {
            throw new RuntimeException("Failed to Create FakeAudioCapturer!");
        }
    }
    protected void dispose() {
        if (0 != this.nativeobj) {
            nativeFreeAudioCapturer(this.nativeobj);
            this.nativeobj = 0;
        }
    }

    /** 判断Capturer是否正在运行
     * @return 是否在运行。
     */
    public boolean isRunning() {
        return nativeisRunning();
    }

    /** 当前AVD引擎使用音频导入作为缺省音频源
     * @return 返回错误代码：
     * 	AVD_OK						成功
     */
    public int enable(boolean isEnable) {
        return nativeenable(isEnable);
    }

    /** 给Capturer输入PCM原始数据
     *
     * @param[in] timestamp_ns 时间戳, nanos second。
     * @param[in] sampleRate 音频采样率
     * @param[in] channels 音频采集通道数
     * @param[in] data  音频内容数据指针
     * @param[in] len   音频内容大小
     * @return 返回错误代码：
     * 	AVD_OK						成功
     *	Err_Invalid_Arg				参数不合法，可忽略
     *	Err_Wrong_Status			状态不对，可忽略
     */
    public int inputCapturedFrame(long timestamp_ns, int sampleRate, int channels,  byte[] data, int len) {
        return nativeinputCapturedFrame(timestamp_ns, sampleRate, channels, data, len);
    }
    /** 给Capturer输入AAC编码后的数据
     *
     * @param[in] timestamp_ns 时间戳, nanos second。
     * @param[in] sampleRate 音频采样率
     * @param[in] channels 音频采集通道数
     * @param[in] data 音频内容数据指针
     * @param[in] len  音频内容大小
     * @param[in] samplesOfEncodedData  音频编码数据包含的采样数（一般情况AAC每次编码都是1024 * channels个采样）
     * @return 返回错误代码：
     * 	AVD_OK						成功
     *
     */
    public int inputAACFrame(long timestamp_ns, int sampleRate, int channels,  byte[] data, int len, int samplesOfEncodedData) {
        return nativeinputAACFrame(timestamp_ns, sampleRate, channels, data, len, samplesOfEncodedData);
    }
    ///
    private long nativeobj = 0;
    ///
    private native long nativeCreateAudioCapturer();
    private native void nativeFreeAudioCapturer(long nativeobj);
    //
    private native boolean nativeisRunning();
    private native int nativeenable(boolean nativeobj);
    private native int nativeinputCapturedFrame(long timestamp_ns,int sampleRate, int channels,  byte[] data, int len);
    private native int nativeinputAACFrame(long timestamp_ns, int sampleRate, int channels,  byte[] data, int len, int samples);

}
