// 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_CRAS_CLIENT_IMPL_H_
#define MEDIA_PERCEPTION_CRAS_CLIENT_IMPL_H_

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

#include "media_perception/cras_client_wrapper.h"

namespace mri {

// A wrapper class that encapsulates methods used for interacting with Chrome
// audio service on ChromeOS devices. This class is not thread safe and so it
// should not be accessed from multiple threads.
class CrasClientImpl : public CrasClientWrapper {
 public:
  CrasClientImpl()
      : client_(nullptr),
        audio_format_(nullptr),
        audio_capture_params_(nullptr),
        has_audio_capture_started_(false) {}

  ~CrasClientImpl() override;

  // Connects to CrAS server.
  bool Connect() override;

  // Disconnects from CrAS server.
  void Disconnect() override;

  // Checks if it has been connected to CrAS server.
  bool IsConnected() const override;

  // Starts audio capture. Return value indicates success or failure.
  bool StartAudioCapture() override;

  // Stops audio capture.
  void StopAudioCapture() override;

  // Checks if audio capture has been started.
  bool HasAudioCaptureStarted() const override;

  // Sets parameters for audio capture. Return value indicates success or
  // failure.
  bool SetParams(const std::string &device_name, unsigned int num_channels,
                 unsigned int block_size, unsigned int frame_rate,
                 snd_pcm_format_t format) override;

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

 private:
  // Destructs audio_format_ and audio_capture_params_;
  void DestroyParams();

  // Destructs client_;
  void DestroyClient();

  struct cras_client *client_;
  struct cras_audio_format *audio_format_;
  struct cras_stream_params *audio_capture_params_;
  bool has_audio_capture_started_;
  std::string device_name_;
  cras_stream_id_t stream_id_;
};

}  // namespace mri

#endif  // MEDIA_PERCEPTION_CRAS_CLIENT_IMPL_H_
