// Copyright 2020 The Chromium 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 MEDIA_AUDIO_CRAS_AUDIO_MANAGER_CHROMEOS_H_
#define MEDIA_AUDIO_CRAS_AUDIO_MANAGER_CHROMEOS_H_

#include <cras_types.h>

#include <memory>
#include <string>
#include <vector>

#include "ash/components/audio/audio_device.h"
#include "ash/components/audio/cras_audio_handler.h"
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "media/audio/audio_manager_base.h"
#include "media/audio/cras/audio_manager_cras_base.h"

namespace media {

class MEDIA_EXPORT AudioManagerChromeOS : public AudioManagerCrasBase {
 public:
  AudioManagerChromeOS(std::unique_ptr<AudioThread> audio_thread,
                   AudioLogFactory* audio_log_factory);

  AudioManagerChromeOS(const AudioManagerChromeOS&) = delete;
  AudioManagerChromeOS& operator=(const AudioManagerChromeOS&) = delete;

  ~AudioManagerChromeOS() override;

  // AudioManager implementation.
  bool HasAudioOutputDevices() override;
  bool HasAudioInputDevices() override;
  void GetAudioInputDeviceNames(AudioDeviceNames* device_names) override;
  void GetAudioOutputDeviceNames(AudioDeviceNames* device_names) override;
  AudioParameters GetInputStreamParameters(
      const std::string& device_id) override;
  std::string GetAssociatedOutputDeviceID(
      const std::string& input_device_id) override;
  std::string GetDefaultInputDeviceID() override;
  std::string GetDefaultOutputDeviceID() override;
  std::string GetGroupIDOutput(const std::string& output_device_id) override;
  std::string GetGroupIDInput(const std::string& input_device_id) override;
  bool Shutdown() override;

  // AudioManagerCrasBase implementation.
  bool IsDefault(const std::string& device_id, bool is_input) override;
  enum CRAS_CLIENT_TYPE GetClientType() override;

  // Stores information about the system audio processing effects and
  // properties that are provided by the system audio processing module (APM).
  struct SystemAudioProcessingInfo {
    bool aec_supported = false;
    int32_t aec_group_id = ash::CrasAudioHandler::kSystemAecGroupIdNotAvailable;
    bool ns_supported = false;
    bool agc_supported = false;
  };

  // Produces AudioParameters for the system, including audio processing
  // capabilities tailored for the system,
  static AudioParameters GetStreamParametersForSystem(
      int user_buffer_size,
      bool has_keyboard,
      const AudioManagerChromeOS::SystemAudioProcessingInfo& system_apm_info);

 protected:
  AudioParameters GetPreferredOutputStreamParameters(
      const std::string& output_device_id,
      const AudioParameters& input_params) override;

 private:
  // Get default output buffer size for this board.
  int GetDefaultOutputBufferSizePerBoard();

  // Get any system APM effects that are supported for this board.
  SystemAudioProcessingInfo GetSystemApmEffectsSupportedPerBoard();

  void GetAudioDeviceNamesImpl(bool is_input, AudioDeviceNames* device_names);

  std::string GetHardwareDeviceFromDeviceId(const ash::AudioDeviceList& devices,
                                            bool is_input,
                                            const std::string& device_id);

  void GetAudioDevices(ash::AudioDeviceList* devices);
  void GetAudioDevicesOnMainThread(ash::AudioDeviceList* devices,
                                   base::WaitableEvent* event);
  uint64_t GetPrimaryActiveInputNode();
  uint64_t GetPrimaryActiveOutputNode();
  void GetPrimaryActiveInputNodeOnMainThread(uint64_t* active_input_node_id,
                                             base::WaitableEvent* event);
  void GetPrimaryActiveOutputNodeOnMainThread(uint64_t* active_output_node_id,
                                              base::WaitableEvent* event);
  void GetDefaultOutputBufferSizeOnMainThread(int32_t* buffer_size,
                                              base::WaitableEvent* event);
  void GetSystemApmEffectsSupportedOnMainThread(
      SystemAudioProcessingInfo* system_apm_info,
      base::WaitableEvent* event);

  void WaitEventOrShutdown(base::WaitableEvent* event);

  // Signaled if AudioManagerCras is shutting down.
  base::WaitableEvent on_shutdown_;

  // Task runner of browser main thread. CrasAudioHandler should be only
  // accessed on this thread.
  scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;

  // For posting tasks from audio thread to |main_task_runner_|.
  base::WeakPtr<AudioManagerChromeOS> weak_this_;

  base::WeakPtrFactory<AudioManagerChromeOS> weak_ptr_factory_;
};

}  // namespace media

#endif  // MEDIA_AUDIO_CRAS_AUDIO_MANAGER_CHROMEOS_H_
