// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef INCLUDE_COMMON_H_
#define INCLUDE_COMMON_H_

#include <pthread.h>
#include <set>
#include <string>

#include "include/sample_format.h"

struct TestConfig {
  enum TestType {
    kInvalid,
    kASharpMinorScale,
    kSingleTone,
  };

  TestConfig()
      : type(kInvalid),
        alsa_device("default"),
        format(SampleFormat::kPcmS16),
        tone_length_sec(0.3f),
        frequency(440.0f),  // Middle-A
        sample_rate(44100),
        start_volume(1.0f),
        end_volume(1.0f),
        channels(2) {
  }

  TestType type;
  std::string alsa_device;
  SampleFormat format;
  double tone_length_sec;
  double frequency;
  int sample_rate;
  double start_volume;  // TODO(ajwong): Figure out units, and use this value.
  double end_volume;
  int channels;
  std::set<int> active_channels;
};

struct AudioFunTestConfig {
  AudioFunTestConfig()
      : allowed_delay_sec(1.5),
        fft_size(2048u),
        match_window_size(7),
        confidence_threshold(3),
        sample_rate(64000),
        sample_format(SampleFormat::kPcmS16),
        num_mic_channels(2),
        num_speaker_channels(2),
        test_rounds(10),
        tone_length_sec(10.0f),
        volume_gain(50),
        min_frequency(4000),
        max_frequency(10000),
        verbose(false) {}

  std::set<int> active_speaker_channels;
  std::set<int> active_mic_channels;
  double allowed_delay_sec;
  int fft_size;
  int match_window_size;
  double confidence_threshold;
  std::string player_command;
  std::string player_fifo;
  std::string recorder_command;
  std::string recorder_fifo;
  int sample_rate;
  SampleFormat sample_format;
  int num_mic_channels;
  int num_speaker_channels;
  int test_rounds;
  double tone_length_sec;
  int volume_gain;
  int min_frequency;
  int max_frequency;
  bool verbose;
};

// Parse the active channel list. The input should be a comma separated list of
// integer. The output would be a set of integers.
void ParseActiveChannels(const char *arg, std::set<int> *output);

#endif  // INCLUDE_COMMON_H_
