#include #include #include #include #pragma pack(push, 1) struct WavChunkHeader { char id[4]; unsigned int size; }; struct WavRiffHeader { char chunk_id[4]; unsigned int chunk_size; char format[4]; }; struct WavFmtHeader { char chunk_id[4]; unsigned int chunk_size; unsigned short audio_format; unsigned short num_channels; unsigned int sample_rate; unsigned int byte_rate; unsigned short block_align; unsigned short bits_per_sample; }; struct WavDataHeader { char chunk_id[4]; unsigned int chunk_size; unsigned char *data; }; #pragma pack(pop) int main() { struct WavRiffHeader header; struct WavFmtHeader fmt_header; //FILE *fp = fopen("/home/azq2/.local/share/Steam/SteamApps/common/Half-Life/valve/sound/scientist/stopasking.wav", "rb"); FILE *fp = fopen("/tmp/test.wav", "rb"); if (fread(&header, sizeof(struct WavRiffHeader), 1, fp) != 1 || fread(&fmt_header, sizeof(struct WavFmtHeader), 1, fp) != 1) { fprintf(stderr, "Corrupted\n"); return 1; } fseek(fp, sizeof(struct WavRiffHeader) + fmt_header.chunk_size + sizeof(struct WavChunkHeader), SEEK_SET); printf( "channels: %d\n" "audio_format: %d\n" "sample_rate: %d\n" "bits_per_sample: %d\n", fmt_header.num_channels, fmt_header.audio_format, fmt_header.sample_rate, fmt_header.bits_per_sample ); // double freq = (double) fmt_header.sample_rate; struct WavDataHeader data_chunk; struct WavChunkHeader chunk; while (!feof(fp)) { if (fread(&chunk, sizeof(struct WavChunkHeader), 1, fp) != 1) { fprintf(stderr, "Corrupted!!!\n"); break; } memcpy(data_chunk.chunk_id, chunk.id, sizeof(chunk.id)); data_chunk.chunk_size = chunk.size; printf("id = %c.%c.%c.%c\n", data_chunk.chunk_id[0], data_chunk.chunk_id[1], data_chunk.chunk_id[2], data_chunk.chunk_id[3]); printf("size = %d\n", data_chunk.chunk_size); data_chunk.data = (unsigned char *) malloc(data_chunk.chunk_size); if (fread(data_chunk.data, 1, data_chunk.chunk_size, fp) != data_chunk.chunk_size) { fprintf(stderr, "Corrupted data!!!\n"); break; } unsigned int max_samples = data_chunk.chunk_size / (fmt_header.bits_per_sample / 8); if (fmt_header.bits_per_sample == 8) { for (unsigned int i = 0; i < max_samples; ++i) { // printf("%f;%f\n", i / freq, (double) data_chunk.data[i] / pow(2, fmt_header.bits_per_sample - 1)); char value = (char) (data_chunk.data[i]); printf("%.0f\n", (double) value * 500 / 128); } } else if (fmt_header.bits_per_sample == 16) { for (unsigned int i = 0; i < max_samples * 2; i += 2) { // printf("%f;%f\n", i / freq, (double) data_chunk.data[i] / pow(2, fmt_header.bits_per_sample - 1)); short value = (short) (data_chunk.data[i] << 8 | data_chunk.data[i + 1]); printf("%d\n", value * 300 / 32767); } } free(data_chunk.data); break; } fclose(fp); }