#ifndef DEPENDENCY_AUDIO_DECODE_WAV //Stubs: //(none required) #else snd_sequence_struct *snd_decode_wav(uint8 *buffer,int32 bytes){ //ref: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ if (bytes<44) return NULL; if ((*(uint32*)&buffer[12])!=0x20746d66) return NULL;//"fmt " if ((*(uint16*)&buffer[20])!=1) return NULL;//PCM = 1 (i.e. Linear quantization) Values other than 1 indicate some form of compression. static int32 rif_type; rif_type=0; if ((*(uint32*)&buffer[0])==0x46464952) rif_type=1;//RIFF //if ((*(uint32*)&buffer[0])==0x????????) rif_type=1;//RIFX (not supported yet) if (rif_type==0) return NULL; static int32 out_bytes; static uint8 *bufout; static int32 chunk1size; chunk1size=*(uint32*)&buffer[16]; //qbs_print(qbs_str((int32)chunk1size),1); //read next chunk static uint32 chunk2name; static int32 chunk2size; skip_chunk: if ((20+chunk1size)>=bytes) return NULL;//no more chunks! chunk2name=*(uint32*)&buffer[20+chunk1size]; chunk2size=*(uint32*)&buffer[20+chunk1size+4]; if (chunk2name!=0x61746164){ chunk1size+=(8+chunk2size); goto skip_chunk;//it's probably a "fact" chunk, pointless for PCM data } out_bytes=chunk2size; bufout=(uint8*)malloc(out_bytes); memcpy(bufout,buffer+20+chunk1size+8,out_bytes); //qbs_print(qbs_str((int32)out_bytes),1); //attach to new sequence static int32 seq_handle; seq_handle=list_add(snd_sequences); static snd_sequence_struct *seq; seq=(snd_sequence_struct*)list_get(snd_sequences,seq_handle); memset(seq,0,sizeof(snd_sequence_struct)); seq->references=1; seq->channels=*(uint16*)&buffer[22]; seq->sample_rate=*(uint32*)&buffer[24]; seq->bits_per_sample=*(uint16*)&buffer[34]; seq->endian=1;//little (Microsoft format) seq->is_unsigned=0; if (seq->bits_per_sample==8) seq->is_unsigned=1; seq->data=(uint16*)bufout; seq->data_size=out_bytes; //qbs_print(qbs_str((int32)seq->channels),1); //qbs_print(qbs_str((int32)seq->sample_rate),1); //qbs_print(qbs_str((int32)seq->bits_per_sample),1); return seq; } #endif