После того, как я пару раз ломал голову, я думаю, что наконец понял (Прочтите мои комментарии).
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
short * stereoChannel;
short * leftChannel;
short * rightChannel;
char Subchunk2[4];
int move = 0;
short channel = 1;
int val = 50000;
int main(){
FILE *fp = fopen("bin.wav","rb");
if (!fp){
printf("Couldn't open file!\n");
return 0;
}
while (1){
fseek(fp,36+move,SEEK_SET);
fread(Subchunk2,4*sizeof(char),1,fp);
if (!strcmp(Subchunk2,"data")){
break;
}
move++;
}
fseek(fp,22,SEEK_SET);
fread(&channel,sizeof(short),1,fp);
fseek(fp,36+move+4,SEEK_SET);
int num;
fread(&num,sizeof(int),1,fp);
stereoChannel = malloc(num*sizeof(short));
fseek(fp,4,SEEK_CUR);
fread(stereoChannel,sizeof(short),num,fp);
if (channel == 2){
val=0;
printf("wavfile in stereo\n");
leftChannel = malloc(num*sizeof(short)/2);
rightChannel = malloc(num*sizeof(short)/2);
int channelpoint = 0;
for (int inc=0;inc<num/2;inc++){
leftChannel[channelpoint] = stereoChannel[inc*2];
rightChannel[channelpoint] = stereoChannel[(inc*2)+1];
channelpoint++;
}
for (int k=0; k<50000; k++){
printf("stereo sample %d L: %d R: %d \n",k,leftChannel[k],rightChannel[k]);
}
free(rightChannel);
free(leftChannel);
}
for (int k=0; k<val; k++){ // If this is stereo, it would print nothing because val was set to 0
printf("mono sample %d is %d\n", k, stereoChannel[k]);
}
free(stereoChannel);
return 0;
}
Печать:
...
stereo sample 49981 L: 8039 R: 6943
stereo sample 49982 L: 9277 R: 10518
stereo sample 49983 L: 13398 R: 16936
stereo sample 49984 L: 13305 R: 15692
stereo sample 49985 L: 2715 R: 9778
stereo sample 49986 L: -5680 R: 5595
stereo sample 49987 L: -3632 R: 3921
...
Пояснение к while loop
. Этот код проверяет наличие тега data
, потому что не каждый тег данных wav-файла начинается со смещения 36. (Возможно, мне стоит добавить функцию, которая проверяет, является ли файл wav-файлом, потому что без него это будет l oop навсегда и может вызвать сегментацию ошибка.)
Поделитесь своими мыслями.