#include <stdbool.h>
#include <limits.h>

#ifndef mice_playback_h
#define mice_playback_h

/* Channel to play music on */
#define CHANNEL	0x08

struct decoder_fn
{
	/**
	 * Set decoder parameters.
	 * \param	decoder Structure to store parameters.
	 * \return	0 on success, else failure.
	 */
	int (* init)(const char* file);

	/**
	 * Get sampling rate of file.
	 * \return	Sampling rate.
	 */
	uint32_t (* rate)(void);

	/**
	 * Get number of channels of file.
	 * \return	Number of channels for opened file.
	 */
	uint8_t (* channels)(void);

	/**
	 * Size of output buffer used in decode().
	 */
	size_t buffSize;

	/**
	 * Fill buffer with decoded samples.
	 * \param buffer	Output buffer to fill.
	 * \return		Samples read for each channel.
	 */
	uint64_t (* decode)(void*);

	/**
	 * Free codec resources.
	 */
	void (* exit)(void);

	/**
	 * Optional. Set to NULL if unavailable.
	 * Get number of samples in audio file.
	 */
	size_t (* getFileSamples)(void);
};

struct playbackInfo_t
{
	char file[PATH_MAX];
	struct errInfo_t *errInfo;

	/* If 0, then the duration of file is unavailable. */
	size_t samples_total;
	size_t samples_played;
	size_t samples_per_second;
};

/**
 * Pause or play current file.
 *
 * \return	True if paused.
 */
bool togglePlayback(void);

/**
 * Stops current playback. Playback thread should exit as a result.
 */
void stopPlayback(void);

/**
 * Returns whether music is playing or paused.
 */
bool isPlaying(void);

/**
 * Returns whether playback is currently paused.
 */
bool isPaused(void);

/**
 * Should only be called from a new thread only, and have only one playback
 * thread at time. This function has not been written for more than one
 * playback thread in mind.
 *
 * \param	infoIn	Playback information.
 */
void playFile(void* infoIn);

#endif
