// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/media/audio/audio_core/audio_device_settings.h"

#include "src/lib/testing/loop_fixture/test_loop_fixture.h"
#include "src/media/audio/audio_core/audio_driver.h"

namespace media::audio {
namespace {

static constexpr audio_stream_unique_id_t kTestUniqueId = {
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}};

static constexpr HwGainState kDefaultInitialHwGainState = {
    false,   /* cur_mute */
    false,   /* cur_agc */
    0.0,     /* cur_gain */
    true,    /* can_mute */
    true,    /* can_agc */
    -160.0f, /* min_gain */
    24.0f,   /* max_gain */
    1.0f     /* gain_step */
};

class AudioDeviceSettingsTest : public gtest::TestLoopFixture {};

// If agc is not supported, then always return 'false' for agc enabled.
TEST_F(AudioDeviceSettingsTest, AgcFalseWhenNotSupported) {
  // Set AGC/Mute to 'true' but not supported.
  HwGainState hw_gain_state = kDefaultInitialHwGainState;
  hw_gain_state.cur_agc = true;
  hw_gain_state.can_agc = false;
  AudioDeviceSettings settings(kTestUniqueId, hw_gain_state, false);

  auto gain_info = settings.GetGainInfo();

  EXPECT_NE(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_ENABLED,
            fuchsia::media::AudioGainInfoFlags::AGC_ENABLED);
  EXPECT_NE(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED,
            fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED);
}

// If can_mute is false, still allow the device to be muted. In cases without the hardware mute
// we'll implement mute in software.
TEST_F(AudioDeviceSettingsTest, MuteTrueWhenNotSupported) {
  // Set AGC/Mute to 'true' but not supported.
  HwGainState hw_gain_state = kDefaultInitialHwGainState;
  hw_gain_state.cur_mute = true;
  hw_gain_state.can_mute = false;
  AudioDeviceSettings settings(kTestUniqueId, hw_gain_state, false);

  auto gain_info = settings.GetGainInfo();

  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::MUTE,
            fuchsia::media::AudioGainInfoFlags::MUTE);
}

TEST_F(AudioDeviceSettingsTest, SetGainInfoDoesNothingWithNoFlags) {
  // Set AGC/Mute to 'true' but not supported.
  HwGainState hw_gain_state = kDefaultInitialHwGainState;
  hw_gain_state.cur_mute = true;
  hw_gain_state.cur_agc = true;
  hw_gain_state.can_mute = true;
  hw_gain_state.can_agc = true;
  hw_gain_state.cur_gain = 5.0;
  AudioDeviceSettings settings(kTestUniqueId, hw_gain_state, false);

  // Verify initial state.
  auto gain_info = settings.GetGainInfo();
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::MUTE,
            fuchsia::media::AudioGainInfoFlags::MUTE);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_ENABLED,
            fuchsia::media::AudioGainInfoFlags::AGC_ENABLED);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED,
            fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED);
  EXPECT_EQ(5.0f, gain_info.gain_db);

  // Update gain state
  fuchsia::media::AudioGainInfo new_gain_info;
  new_gain_info.gain_db = 10.0;
  new_gain_info.flags = {};
  EXPECT_FALSE(settings.SetGainInfo(new_gain_info, {} /* flags */));

  // State should match initial state.
  gain_info = settings.GetGainInfo();
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::MUTE,
            fuchsia::media::AudioGainInfoFlags::MUTE);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_ENABLED,
            fuchsia::media::AudioGainInfoFlags::AGC_ENABLED);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED,
            fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED);
  EXPECT_EQ(5.0f, gain_info.gain_db);
}

TEST_F(AudioDeviceSettingsTest, SetGainInfoOnlyGainDb) {
  // Set AGC/Mute to 'true' but not supported.
  HwGainState hw_gain_state = kDefaultInitialHwGainState;
  hw_gain_state.cur_mute = true;
  hw_gain_state.cur_agc = true;
  hw_gain_state.can_mute = true;
  hw_gain_state.can_agc = true;
  hw_gain_state.cur_gain = 5.0;
  AudioDeviceSettings settings(kTestUniqueId, hw_gain_state, false);

  // Verify initial state.
  auto gain_info = settings.GetGainInfo();
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::MUTE,
            fuchsia::media::AudioGainInfoFlags::MUTE);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_ENABLED,
            fuchsia::media::AudioGainInfoFlags::AGC_ENABLED);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED,
            fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED);
  EXPECT_EQ(5.0f, gain_info.gain_db);

  // Update gain state
  fuchsia::media::AudioGainInfo new_gain_info;
  new_gain_info.gain_db = 10.0;
  new_gain_info.flags = {};
  EXPECT_TRUE(settings.SetGainInfo(new_gain_info, fuchsia::media::AudioGainValidFlags::GAIN_VALID));

  // Only gain updated.
  gain_info = settings.GetGainInfo();
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::MUTE,
            fuchsia::media::AudioGainInfoFlags::MUTE);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_ENABLED,
            fuchsia::media::AudioGainInfoFlags::AGC_ENABLED);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED,
            fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED);
  EXPECT_EQ(10.0f, gain_info.gain_db);
}

TEST_F(AudioDeviceSettingsTest, SetGainInfoOnlyMute) {
  // Set AGC/Mute to 'true' but not supported.
  HwGainState hw_gain_state = kDefaultInitialHwGainState;
  hw_gain_state.cur_mute = true;
  hw_gain_state.cur_agc = true;
  hw_gain_state.can_mute = true;
  hw_gain_state.can_agc = true;
  hw_gain_state.cur_gain = 5.0;
  AudioDeviceSettings settings(kTestUniqueId, hw_gain_state, false);

  // Verify initial state.
  auto gain_info = settings.GetGainInfo();
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::MUTE,
            fuchsia::media::AudioGainInfoFlags::MUTE);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_ENABLED,
            fuchsia::media::AudioGainInfoFlags::AGC_ENABLED);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED,
            fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED);
  EXPECT_EQ(5.0f, gain_info.gain_db);

  // Update gain state
  fuchsia::media::AudioGainInfo new_gain_info;
  new_gain_info.gain_db = 10.0;
  new_gain_info.flags = {};
  EXPECT_TRUE(settings.SetGainInfo(new_gain_info, fuchsia::media::AudioGainValidFlags::MUTE_VALID));

  // Only gain updated.
  gain_info = settings.GetGainInfo();
  EXPECT_NE(gain_info.flags & fuchsia::media::AudioGainInfoFlags::MUTE,
            fuchsia::media::AudioGainInfoFlags::MUTE);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_ENABLED,
            fuchsia::media::AudioGainInfoFlags::AGC_ENABLED);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED,
            fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED);
  EXPECT_EQ(5.0f, gain_info.gain_db);
}

TEST_F(AudioDeviceSettingsTest, SetGainInfoOnlyAgc) {
  // Set AGC/Mute to 'true' but not supported.
  HwGainState hw_gain_state = kDefaultInitialHwGainState;
  hw_gain_state.cur_mute = true;
  hw_gain_state.cur_agc = true;
  hw_gain_state.can_mute = true;
  hw_gain_state.can_agc = true;
  hw_gain_state.cur_gain = 5.0;
  AudioDeviceSettings settings(kTestUniqueId, hw_gain_state, false);

  // Verify initial state.
  auto gain_info = settings.GetGainInfo();
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::MUTE,
            fuchsia::media::AudioGainInfoFlags::MUTE);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_ENABLED,
            fuchsia::media::AudioGainInfoFlags::AGC_ENABLED);
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED,
            fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED);
  EXPECT_EQ(5.0f, gain_info.gain_db);

  // Update gain state
  fuchsia::media::AudioGainInfo new_gain_info;
  new_gain_info.gain_db = 10.0;
  new_gain_info.flags = {};
  EXPECT_TRUE(settings.SetGainInfo(new_gain_info, fuchsia::media::AudioGainValidFlags::AGC_VALID));

  // Only gain updated.
  gain_info = settings.GetGainInfo();
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::MUTE,
            fuchsia::media::AudioGainInfoFlags::MUTE);
  EXPECT_NE(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_ENABLED,
            fuchsia::media::AudioGainInfoFlags::AGC_ENABLED);
  // Note that we expect AgcSupported to remain unchanged.
  EXPECT_EQ(gain_info.flags & fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED,
            fuchsia::media::AudioGainInfoFlags::AGC_SUPPORTED);
  EXPECT_EQ(5.0f, gain_info.gain_db);
}

}  // namespace
}  // namespace media::audio
