#include <stdio.h> /* FILE */
#include <kernel/kernel.h>
#include <kernel/driver.h>
#define DEBUG
#include <kernel/debug.h>
/* these assumes sizeof(short)==2
and it assumes little-endian CPU (e.g. x86)
these functions used to read from sound files */
#define read_le16(S) *(unsigned short *)(S)
#define read_le32(S) *(unsigned long *)(S)
unsigned short read_be16(unsigned char *buffer);
unsigned long read_be32(unsigned char *buffer);
/* these functions used to write to sound hardware */
#define write_le16(D,S) *(unsigned short *)(D) = S
/* byte offsets in "fmt " block of RIFF/WAVE file */
#define WAV_FMT_LEN 0 /* 32-bit actual length of "fmt " block */
#define WAV_FMT_FMT 4 /* 16-bit compression type */
#define WAV_FMT_CHAN 6 /* 16-bit mono/stereo */
#define WAV_FMT_RATE 8 /* 32-bit sample rate */
#define WAV_FMT_BPS 12 /* 32-bit ? */
#define WAV_FMT_ALIGN 16 /* 16-bit ? */
#define WAV_FMT_DEPTH 18 /* 16-bit bits/sample */
#define WAV_FMT_SIZE 20 /* min. length of "fmt " block */
#if (defined(__TURBOC__) || !defined(__cplusplus)) && !defined(bool)
typedef enum
{
false = 0, true = 1
} bool;
#endif
typedef struct sound_t sound_t;
struct sound_t
{
bool (*open)(sound_t *snd);
long (*find_closest_rate)(sound_t *snd, long rate);
int (*set_fmt)(sound_t *snd, unsigned char depth,
unsigned char channels, long rate);
void (*set_volume)(sound_t *snd, unsigned char level);
int (*write_sample)(sound_t *snd, short left, short right);
void (*stop_playback)(sound_t *snd, bool wait);
void (*close)(sound_t *snd);
void (*irq)(sound_t *snd, unsigned num);
};
typedef struct
{
FILE *infile;
unsigned long bytes_left;
void *fsd;
unsigned char channels;
unsigned char depth;
long rate;
} sound_info_t;
typedef struct
{
const char *name;
int (*validate)(sound_info_t *info);
int (*get_sample)(sound_info_t *info, short *left, short *right);
} codec_t;