/*
 * audio.h: Frontend Status Monitor plugin for the AUDIO Disk Recorder
 *
 * See the README file for copyright information and how to reach the author.
 *
 */

#ifndef __FEMON_AUDIO_H
#define __FEMON_AUDIO_H

enum eAudioCodec {
  AUDIO_CODEC_INVALID = -1,
  AUDIO_CODEC_UNKNOWN,
  AUDIO_CODEC_MPEG1_I,
  AUDIO_CODEC_MPEG1_II,
  AUDIO_CODEC_MPEG1_III,
  AUDIO_CODEC_MPEG2_I,
  AUDIO_CODEC_MPEG2_II,
  AUDIO_CODEC_MPEG2_III,
  AUDIO_CODEC_HEAAC,
  AUDIO_CODEC_LATM
  };

enum eAudioChannelMode {
  AUDIO_CHANNEL_MODE_INVALID = -1,
  AUDIO_CHANNEL_MODE_STEREO,
  AUDIO_CHANNEL_MODE_JOINT_STEREO,
  AUDIO_CHANNEL_MODE_DUAL,
  AUDIO_CHANNEL_MODE_SINGLE
  };

enum eAudioBitrate {
  AUDIO_BITRATE_RESERVED = -3,
  AUDIO_BITRATE_FREE = -2,
  AUDIO_BITRATE_INVALID = -1
  };

enum eAudioSamplingFrequency {
  AUDIO_SAMPLING_FREQUENCY_RESERVED = -2,
  AUDIO_SAMPLING_FREQUENCY_INVALID = -1
  };

enum eAudioCenterMixLevel {
  AUDIO_CENTER_MIX_LEVEL_INVALID = -1,
  AUDIO_CENTER_MIX_LEVEL_MINUS_3dB,
  AUDIO_CENTER_MIX_LEVEL_MINUS_4_5dB,
  AUDIO_CENTER_MIX_LEVEL_MINUS_6dB,
  AUDIO_CENTER_MIX_LEVEL_RESERVED
  };

enum eAudioSurroundMixLevel {
  AUDIO_SURROUND_MIX_LEVEL_INVALID = -1,
  AUDIO_SURROUND_MIX_LEVEL_MINUS_3dB,
  AUDIO_SURROUND_MIX_LEVEL_MINUS_6dB,
  AUDIO_SURROUND_MIX_LEVEL_0_dB,
  AUDIO_SURROUND_MIX_LEVEL_RESERVED
  };

enum eAudioDolbySurroundMode {
  AUDIO_DOLBY_SURROUND_MODE_INVALID = -1,
  AUDIO_DOLBY_SURROUND_MODE_NOT_INDICATED,
  AUDIO_DOLBY_SURROUND_MODE_NOT_DOLBYSURROUND,
  AUDIO_DOLBY_SURROUND_MODE_DOLBYSURROUND,
  AUDIO_DOLBY_SURROUND_MODE_RESERVED
  };

enum eAudioBitstreamMode {
  AUDIO_BITSTREAM_MODE_INVALID = -1,
  AUDIO_BITSTREAM_MODE_CM,
  AUDIO_BITSTREAM_MODE_ME,
  AUDIO_BITSTREAM_MODE_VI,
  AUDIO_BITSTREAM_MODE_HI,
  AUDIO_BITSTREAM_MODE_D,
  AUDIO_BITSTREAM_MODE_C,
  AUDIO_BITSTREAM_MODE_E,
  AUDIO_BITSTREAM_MODE_VO_KAR
  };

enum eAudioCodingMode {
  AUDIO_CODING_MODE_INVALID = -1,
  AUDIO_CODING_MODE_1_1,
  AUDIO_CODING_MODE_1_0,
  AUDIO_CODING_MODE_2_0,
  AUDIO_CODING_MODE_3_0,
  AUDIO_CODING_MODE_2_1,
  AUDIO_CODING_MODE_3_1,
  AUDIO_CODING_MODE_2_2,
  AUDIO_CODING_MODE_3_2,
  };

typedef struct audio_info {
  eAudioCodec codec;             // enum
  double      bitrate;           // bit/s or eAudioBitrate
  int         samplingFrequency; // Hz or eAudioSamplingFrequency
  int         channelMode;       // eAudioChannelMode
} audio_info_t;

typedef struct ac3_info {
  int         bitrate;           // bit/s or eAudioBitrate
  int         samplingFrequency; // Hz or eAudioSamplingFrequency
  int         bitstreamMode;     // 0..7 or eAudioBitstreamMode
  int         audioCodingMode;   // 0..7 or eAudioCodingMode
  int         dolbySurroundMode; // eAudioDolbySurroundMode
  int         centerMixLevel;    // eAudioCenterMixLevel
  int         surroundMixLevel;  // eAudioSurroundMixLevel
  int         dialogLevel;       // -dB
  bool        lfe;               // boolean
} ac3_info_t;

class cFemonAudioIf {
public:
  cFemonAudioIf() {}
  virtual ~cFemonAudioIf() {}

  // enum
  virtual void SetAudioCodec(eAudioCodec codecP) = 0;
  // kbit/s or eAudioBitrate
  virtual void SetAudioBitrate(double bitRateP) = 0;
  // Hz or eAudioSamplingFrequency
  virtual void SetAudioSamplingFrequency(int samplingP) = 0;
  // eAudioChannelMode
  virtual void SetAudioChannel(eAudioChannelMode modeP) = 0;
  };

class cFemonAC3If {
public:
  cFemonAC3If() {}
  virtual ~cFemonAC3If() {}

  // bit/s or eAudioBitrate
  virtual void SetAC3Bitrate(int bitRateP) = 0;
  // Hz or eAudioSamplingFrequency
  virtual void SetAC3SamplingFrequency(int samplingP) = 0;
  // 0..7 or eAudioBitstreamMode
  virtual void SetAC3Bitstream(int modeP) = 0;
  // 0..7 or eAudioCodingMode
  virtual void SetAC3AudioCoding(int modeP) = 0;
  // eAudioDolbySurroundMode
  virtual void SetAC3DolbySurround(int modeP) = 0;
  // eAudioCenterMixLevel
  virtual void SetAC3CenterMix(int levelP) = 0;
  // eAudioSurroundMixLevel
  virtual void SetAC3SurroundMix(int levelP) = 0;
  // -dB
  virtual void SetAC3Dialog(int levelP) = 0;
  // boolean
  virtual void SetAC3LFE(bool onoffP) = 0;
  };

#endif //__FEMON_AUDIO_H
