// Copyright 2013 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.
//
// AlsaWrapper is a simple stateless class that wraps the alsa library commands
// we want to use.  It's purpose is to allow injection of a mock so that the
// higher level code is testable.

#ifndef MEDIA_AUDIO_ALSA_ALSA_WRAPPER_H_
#define MEDIA_AUDIO_ALSA_ALSA_WRAPPER_H_

#include <alsa/asoundlib.h>

#include "base/macros.h"
#include "media/base/media_export.h"

namespace media {

class MEDIA_EXPORT AlsaWrapper {
 public:
  AlsaWrapper();
  virtual ~AlsaWrapper();

  virtual int DeviceNameHint(int card, const char* iface, void*** hints);
  virtual char* DeviceNameGetHint(const void* hint, const char* id);
  virtual int DeviceNameFreeHint(void** hints);
  virtual int CardNext(int* rcard);

  virtual int PcmOpen(snd_pcm_t** handle, const char* name,
                      snd_pcm_stream_t stream, int mode);
  virtual int PcmClose(snd_pcm_t* handle);
  virtual int PcmPrepare(snd_pcm_t* handle);
  virtual int PcmDrain(snd_pcm_t* handle);
  virtual int PcmDrop(snd_pcm_t* handle);
  virtual int PcmDelay(snd_pcm_t* handle, snd_pcm_sframes_t* delay);
  virtual snd_pcm_sframes_t PcmWritei(snd_pcm_t* handle,
                                      const void* buffer,
                                      snd_pcm_uframes_t size);
  virtual snd_pcm_sframes_t PcmReadi(snd_pcm_t* handle,
                                     void* buffer,
                                     snd_pcm_uframes_t size);
  virtual int PcmRecover(snd_pcm_t* handle, int err, int silent);
  virtual int PcmSetParams(snd_pcm_t* handle, snd_pcm_format_t format,
                           snd_pcm_access_t access, unsigned int channels,
                           unsigned int rate, int soft_resample,
                           unsigned int latency);
  virtual int PcmGetParams(snd_pcm_t* handle, snd_pcm_uframes_t* buffer_size,
                           snd_pcm_uframes_t* period_size);
  virtual const char* PcmName(snd_pcm_t* handle);
  virtual snd_pcm_sframes_t PcmAvailUpdate(snd_pcm_t* handle);
  virtual snd_pcm_state_t PcmState(snd_pcm_t* handle);
  virtual int PcmStart(snd_pcm_t* handle);

  virtual int MixerOpen(snd_mixer_t** mixer, int mode);
  virtual int MixerAttach(snd_mixer_t* mixer, const char* name);
  virtual int MixerElementRegister(snd_mixer_t* mixer,
                                   struct snd_mixer_selem_regopt* options,
                                   snd_mixer_class_t** classp);
  virtual void MixerFree(snd_mixer_t* mixer);
  virtual int MixerDetach(snd_mixer_t* mixer, const char* name);
  virtual int MixerClose(snd_mixer_t* mixer);
  virtual int MixerLoad(snd_mixer_t* mixer);
  virtual snd_mixer_elem_t* MixerFirstElem(snd_mixer_t* mixer);
  virtual snd_mixer_elem_t* MixerNextElem(snd_mixer_elem_t* elem);
  virtual int MixerSelemIsActive(snd_mixer_elem_t* elem);
  virtual const char* MixerSelemName(snd_mixer_elem_t* elem);
  virtual int MixerSelemSetCaptureVolumeAll(snd_mixer_elem_t* elem, long value);
  virtual int MixerSelemGetCaptureVolume(snd_mixer_elem_t* elem,
                                         snd_mixer_selem_channel_id_t channel,
                                         long* value);
  virtual int MixerSelemHasCaptureVolume(snd_mixer_elem_t* elem);
  virtual int MixerSelemGetCaptureVolumeRange(snd_mixer_elem_t* elem,
                                              long* min, long* max);
  virtual void* MixerElemGetCallbackPrivate(const snd_mixer_elem_t* obj);
  virtual void MixerElemSetCallback(snd_mixer_elem_t* obj,
                                    snd_mixer_elem_callback_t val);
  virtual void MixerElemSetCallbackPrivate(snd_mixer_elem_t* obj, void* val);
  virtual snd_mixer_elem_t* MixerFindSelem(snd_mixer_t* mixer,
                                           const snd_mixer_selem_id_t* id);
  virtual int MixerHandleEvents(snd_mixer_t* mixer);
  virtual int MixerPollDescriptors(snd_mixer_t* mixer,
                                   struct pollfd* pfds,
                                   unsigned int space);
  virtual int MixerPollDescriptorsCount(snd_mixer_t* mixer);
  virtual int MixerSelemGetPlaybackSwitch(snd_mixer_elem_t* elem,
                                          snd_mixer_selem_channel_id_t channel,
                                          int* value);
  virtual int MixerSelemGetPlaybackVolume(snd_mixer_elem_t* elem,
                                          snd_mixer_selem_channel_id_t channel,
                                          long* value);
  virtual int MixerSelemGetPlaybackVolumeRange(snd_mixer_elem_t* elem,
                                               long* min,
                                               long* max);
  virtual int MixerSelemHasPlaybackSwitch(snd_mixer_elem_t* elem);
  virtual void MixerSelemIdSetIndex(snd_mixer_selem_id_t* obj,
                                    unsigned int val);
  virtual void MixerSelemIdSetName(snd_mixer_selem_id_t* obj, const char* val);
  virtual int MixerSelemSetPlaybackSwitch(snd_mixer_elem_t* elem,
                                          snd_mixer_selem_channel_id_t channel,
                                          int value);
  virtual int MixerSelemSetPlaybackVolumeAll(snd_mixer_elem_t* elem,
                                             long value);
  virtual int MixerSelemIdMalloc(snd_mixer_selem_id_t** ptr);
  virtual void MixerSelemIdFree(snd_mixer_selem_id_t* obj);

  virtual const char* StrError(int errnum);

 private:
  int ConfigureHwParams(snd_pcm_t* handle,
                        snd_pcm_hw_params_t* hw_params,
                        snd_pcm_format_t format,
                        snd_pcm_access_t access,
                        unsigned int channels,
                        unsigned int rate,
                        int soft_resample,
                        unsigned int latency);
  DISALLOW_COPY_AND_ASSIGN(AlsaWrapper);
};

}  // namespace media

#endif  // MEDIA_AUDIO_ALSA_ALSA_WRAPPER_H_
