/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.drrickorang.loopback;


/**
 * This file stores constants that are used across multiple files.
 */

public class Constant {
    public static final double TWO_PI = 2.0 * Math.PI;
    public static final long   NANOS_PER_MILLI = 1000000;
    public static final int    MILLIS_PER_SECOND = 1000;
    public static final int    SECONDS_PER_HOUR = 3600;

    public static final int LOOPBACK_PLUG_AUDIO_THREAD_TEST_TYPE_LATENCY = 222;
    public static final int LOOPBACK_PLUG_AUDIO_THREAD_TEST_TYPE_BUFFER_PERIOD = 223;
    public static final int LOOPBACK_PLUG_AUDIO_THREAD_TEST_TYPE_CALIBRATION = 224;

    public static final int AUDIO_THREAD_TYPE_JAVA = 0;
    public static final int AUDIO_THREAD_TYPE_NATIVE = 1;

    public static final int BYTES_PER_SHORT = 2;
    public static final int SHORTS_PER_INT = 2;
    // FIXME Assumes 16-bit and mono, will not work for other bit depths or multi-channel.
    public static final int BYTES_PER_FRAME = 2;    // bytes per sample

    // prime numbers that don't overlap with FFT frequencies
    public static final double PRIME_FREQUENCY_1 = 703.0;
    public static final double PRIME_FREQUENCY_2 = 719.0;

    // amplitude for ToneGeneration
    public static final double SINE_WAVE_AMPLITUDE = 0.8;
    public static final double TWO_SINE_WAVES_AMPLITUDE = 0.4;

    // the number used to configured PipeShort/PipeByteBuffer
    public static final int MAX_SHORTS = 65536;

    // used to identify a variable is currently unknown
    public static final int UNKNOWN = -1;

    // used when joining a thread
    public static final int JOIN_WAIT_TIME_MS = 1000;

    // Loopback on Java thread test audio tone constants
    public static final int LOOPBACK_SAMPLE_FRAMES = 300;
    public static final double LOOPBACK_AMPLITUDE = 0.95;
    public static final int LOOPBACK_FREQUENCY = 4000;

    // Settings Activity and ADB constants
    public static final int SAMPLING_RATE_MAX = 48000;
    public static final int SAMPLING_RATE_MIN = 8000;
    public static final int PLAYER_BUFFER_FRAMES_MAX = 8000;
    public static final int PLAYER_BUFFER_FRAMES_MIN = 16;
    public static final int RECORDER_BUFFER_FRAMES_MAX = 8000;
    public static final int RECORDER_BUFFER_FRAMES_MIN = 16;
    public static final int BUFFER_TEST_DURATION_SECONDS_MAX = 36000;
    public static final int BUFFER_TEST_DURATION_SECONDS_MIN = 1;
    public static final int BUFFER_TEST_WAVE_PLOT_DURATION_SECONDS_MAX = 120;
    public static final int BUFFER_TEST_WAVE_PLOT_DURATION_SECONDS_MIN = 1;
    public static final int MAX_NUM_LOAD_THREADS = 20;
    public static final int MIN_NUM_LOAD_THREADS = 0;
    public static final int MIN_NUM_CAPTURES = 1;
    public static final int MAX_NUM_CAPTURES = 100;
    public static final int DEFAULT_NUM_CAPTURES = 5;
    public static final int MIN_IGNORE_FIRST_FRAMES = 0;
    // impulse happens after 300 ms and shouldn't be ignored
    public static final int MAX_IGNORE_FIRST_FRAMES = SAMPLING_RATE_MAX * 3 / 10;
    public static final int DEFAULT_IGNORE_FIRST_FRAMES = 0;


    // Controls size of pre allocated timestamp arrays
    public static final int MAX_RECORDED_LATE_CALLBACKS_PER_SECOND = 2;
    // Ignore first few buffer callback periods
    public static final int BUFFER_PERIOD_DISCARD = 10;
}
