// Copyright 2018 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 MEDIA_PERCEPTION_AUDIO_RECEIVER_H_
#define MEDIA_PERCEPTION_AUDIO_RECEIVER_H_

#include <cras_client.h>
#include <cras_helpers.h>
#include <cras_types.h>
#include <cras_util.h>
#include <map>
#include <stdint.h>
#include <stdio.h>
#include <string>

#include "media_perception/chrome_audio_service_client.h"
#include "media_perception/device_management.pb.h"

namespace mri {

// Handles interaction with a single audio device and piping outputs to the
// registered handlers. By itself, this class is not thread safe.
class AudioReceiver {
 public:
  explicit AudioReceiver(const std::string& device_id);

  ~AudioReceiver() { DestroyParams(); }

  // Returns true if the |requested| params match the current |params_|.
  bool CaptureFormatMatches(const AudioStreamParams& requested);

  // Returns the size of the frame handler map.
  int GetFrameHandlerCount();

  // Sets the audio stream |params_| on the AudioReceiver.
  bool SetAudioStreamParams(const AudioStreamParams& params);

  AudioStreamParams GetAudioStreamParams();

  // Attempts to start audio capture.
  bool StartAudioCaptureForDeviceIdx(struct cras_client* client, int dev_idx);

  // Adds an audio frame handler into the frame handler map. Return value is the
  // frame handler id.
  int AddAudioFrameHandler(ChromeAudioServiceClient::AudioFrameHandler handler);

  // Callback when getting a new audio frame.
  void ProcessAudioSamples(const uint8_t* samples, unsigned int num_samples);

  // Attempts to remove a frame handler based on id value. Return value
  // indicates success or failure.
  bool RemoveFrameHandler(int frame_handler_id);

  void StopAudioCapture(struct cras_client* client);

 private:
  void DestroyParams();

  // Keeps track of the current capture parameters for an audio device.
  AudioStreamParams params_;

  // Cras structures managed by the AudioReceiver class.
  struct cras_audio_format* audio_format_;
  struct cras_stream_params* audio_capture_params_;
  cras_stream_id_t stream_id_;

  // The device id associated with this device.
  std::string device_id_;

  // Keeps a counter to ensure that each frame handler has a unique id.
  int frame_handler_counter_;

  // Stores a map of frame handler ids to AudioFrameHandlers.
  std::map<int /* frame_handler_id */,
           ChromeAudioServiceClient::AudioFrameHandler>
      frame_handler_id_to_audio_frame_handler_map_;
};

}  // namespace mri

#endif  // MEDIA_PERCEPTION_AUDIO_RECEIVER_H_
