/***************************************************************************** linear PCM sub-format 1 of .WAV format *****************************************************************************/ #include <stdio.h> /* fread() */ #include "sound.h" /* in WAV.C */ int wav_validate(sound_info_t *info, unsigned sub_type); /***************************************************************************** *****************************************************************************/ static int get_sample(sound_info_t *info, short *left, short *right) { unsigned char buffer[4]; if(info->depth == 16 && info->channels == 2) { if(fread(buffer, 1, 4, info->infile) != 4) return -1; *left = read_le16(buffer + 0); *right = read_le16(buffer + 2); } else if(info->depth == 16 && info->channels == 1) { if(fread(buffer, 1, 2, info->infile) != 2) return -1; *left = read_le16(buffer + 0); *right = *left; } else if(info->depth == 8 && info->channels == 2) { if(fread(buffer, 1, 2, info->infile) != 2) return -1; *left = buffer[0] << 8; *right = buffer[1] << 8; } else if(info->depth == 8 && info->channels == 1) { if(fread(buffer, 1, 1, info->infile) != 1) return -1; *left = buffer[0] << 8; *right = *left; } else return -1; return 0; } /***************************************************************************** *****************************************************************************/ static int validate(sound_info_t *info) { fseek(info->infile, 0, SEEK_SET); /* WAV sub-format #1 is linear PCM */ return wav_validate(info, 1); } /***************************************************************************** *****************************************************************************/ codec_t _wav01 = { ".wav linear PCM", validate, get_sample };