#pragma once
#include "wut.h"

/**
 * \defgroup mic Microphone
 * \ingroup mic
 * @{
 */

#ifdef __cplusplus
extern "C" {
#endif

typedef int MICHandle;

typedef struct MICWorkMemory MICWorkMemory;
typedef struct MICStatus MICStatus;

typedef enum MICError
{
   MIC_ERROR_OK                =  0,
   MIC_ERROR_NOT_OPENED        = -1,
   MIC_ERROR_INVALID_HANDLE    = -2,
   MIC_ERROR_INIT              = -5,
   MIC_ERROR_ALREADY_CLOSED    = -7,
   MIC_ERROR_INVALID_INSTANCE  = -8,
} MICError;

typedef enum MICInstance
{
   MIC_INSTANCE_0 = 0,
   MIC_INSTANCE_1 = 1
} MICInstance;

struct MICWorkMemory
{
   //! Maximum amount of samples at a time must be at least 0x2800.
   size_t sampleMaxCount;

   //! A 0x40 aligned buffer of size sampleMaxCount * 2.
   void *sampleBuffer;
};
WUT_CHECK_OFFSET(MICWorkMemory, 0x00, sampleMaxCount);
WUT_CHECK_OFFSET(MICWorkMemory, 0x04, sampleBuffer);
WUT_CHECK_SIZE(MICWorkMemory, 0x08);

struct MICStatus
{
   int state;    // 1 << 1 = Open
   int availableData;
   int bufferPos;
};
WUT_CHECK_OFFSET(MICStatus, 0x00, state);
WUT_CHECK_OFFSET(MICStatus, 0x04, availableData);
WUT_CHECK_OFFSET(MICStatus, 0x08, bufferPos);
WUT_CHECK_SIZE(MICStatus, 0x0C);

/**
 * The second parameter to MICInit is unused, any value is valid.
 */
MICHandle
MICInit(MICInstance instance, int unused, MICWorkMemory *workMemory,
        MICError *outError);

MICError
MICOpen(MICHandle handle);

MICError
MICGetState(MICHandle handle, int state, uint32_t *outStateVal);

MICError
MICSetState(MICHandle handle, int state, uint32_t stateVal);

MICError
MICGetStatus(MICHandle handle, MICStatus *outStatus);

MICError
MICSetDataConsumed(MICHandle handle, int dataAmountConsumed);

MICError
MICClose(MICHandle handle);

MICError
MICUninit(MICHandle handle);

#ifdef __cplusplus
}
#endif

/** @} */
