int WaveFile_Open(WaveFile* This, String* Sorc) { int OpenStatus = File_Open(WStream, Sorc, READONLY); if(! OpenStatus) return 0; char RIFFChars[5]; char WAVEChars[5]; char FACTChars[5]; RIFFChars[4] = 0; WAVEChars[4] = 0; FACTChars[4] = 0; File_Read_Buffer(WStream, RIFFChars, 4); //RIFF File_Read_Int(WStream); //Size File_Read_Buffer(WStream, WAVEChars, 4); //WAVE if(strcmp(RIFFChars, "RIFF")) return 0; if(strcmp(WAVEChars, "WAVE")) return 0; File_Read_Int32(WStream); //fmt int fmtSize = File_Read_Int32(WStream); File_Read_Int16(WStream); //FormatTag Header.Channel = File_Read_Int16(WStream); Header.SamplePerSecond = File_Read_Int32(WStream); Header.BytePerSecond = File_Read_Int32(WStream); Header.BlockAlign = File_Read_Int16(WStream); Header.BitPerSample = File_Read_Int16(WStream); if(fmtSize == 16) { //No extra info }else File_Read_Int16(WStream); //Extra info File_Read_Buffer(WStream, FACTChars, 4); if(! strcmp(FACTChars, "fact")) { int factSize = File_Read_Int32(WStream); File_SetPosition(WStream, File_GetPosition(WStream) + factSize + 4); } Header.DataSize = File_Read_Int32(WStream); Header.DataPosition = File_GetPosition(WStream); Header.BytePerSample = Header.BitPerSample / 8; Header.DataNum = Header.DataSize / Header.BytePerSample / Header.Channel; return 1; }
int WaveFile_FetchAll(WaveFile* This, char* Dest) { File_SetPosition(WStream, Header.DataPosition); File_Read_Buffer(WStream, Dest, Header.DataSize); return Header.DataSize; }
int RUCE_RUDB_Load(RUCE_DB_Entry* Dest, String* Path) { File Sorc; File_Ctor(& Sorc); if(! File_Open(& Sorc, Path, READONLY)) return -1; int ReverseEndian = 0; int64_t FLen = File_GetLength(& Sorc); if(FLen < 48) return -1; char CBuffer[8]; uint32_t Header[4]; uint64_t DataSize; File_Read_Buffer(& Sorc, Header, 12); if(Header[0] != RUDB_Header) { Endian_Switch_Array_UInt32(Header, 4); ReverseEndian = 1; } if(Header[0] != RUDB_Header) return -2; if(Header[2] > RUDB_VERSION) return -3; File_Read_Buffer(& Sorc, CBuffer, 4); if(strncmp(CBuffer, "DATA", 4)) return -4; File_Read_Buffer(& Sorc, & DataSize, 8); if(DataSize < 8) return -5; char* Data = malloc(DataSize); File_Read_Buffer(& Sorc, Data, DataSize); if(Header[1] != CRC32Sum(Data, DataSize, 0)) return -6; memcpy(& (Dest -> HopSize), Data, 8); Data += 8; if(ReverseEndian) Endian_Switch_Array_Int32(& (Dest -> HopSize), 2); while(Data != Data + DataSize) { if(! strncmp(Data, "FRME", 4)) { Data += 4; memcpy(Header, Data, 4); Data += 4; if(ReverseEndian) Endian_Switch_UInt32(Header); int OldSize = Dest -> FrameList_Index + 1; Array_Resize(RUCE_DB_Frame, Dest -> FrameList, OldSize + Header[0]); for(int i = 0 + OldSize; i < Header[0] + OldSize; ++i) { RUCE_DB_Frame_Ctor(& (Dest -> FrameList[i])); if(strncmp(Data, "FRMB", 4)) return -255; Data += 4; memcpy(& (Dest -> FrameList[i].Position), Data, 4); Data += 4; int Cnt; memcpy(& Cnt, Data, 4); Data += 4; if(ReverseEndian) { Endian_Switch_Int32(& (Dest -> FrameList[i].Position)); Endian_Switch_Int32(& Cnt); } Array_Resize(float, Dest -> FrameList[i].Freq, Cnt); Array_Resize(float, Dest -> FrameList[i].Ampl, Cnt); Array_Resize(float, Dest -> FrameList[i].Phse, Cnt); Dest -> FrameList[i].Freq_Index = Cnt - 1; Dest -> FrameList[i].Ampl_Index = Cnt - 1; Dest -> FrameList[i].Phse_Index = Cnt - 1; if(Dest -> FrameList[i].Noiz) free(Dest -> FrameList[i].Noiz); Dest -> FrameList[i].Noiz = RAlloc_Float(Dest -> NoizSize); memcpy(Dest -> FrameList[i].Freq, Data, Cnt * 4); Data += Cnt * 4; memcpy(Dest -> FrameList[i].Ampl, Data, Cnt * 4); Data += Cnt * 4; memcpy(Dest -> FrameList[i].Phse, Data, Cnt * 4); Data += Cnt * 4; memcpy(Dest -> FrameList[i].Noiz, Data, Dest -> NoizSize * 4); Data += Dest -> NoizSize * 4; if(ReverseEndian) { Endian_Switch_Array_Float(Dest -> FrameList[i].Freq, Cnt); Endian_Switch_Array_Float(Dest -> FrameList[i].Ampl, Cnt); Endian_Switch_Array_Float(Dest -> FrameList[i].Phse, Cnt); Endian_Switch_Array_Float(Dest -> FrameList[i].Noiz, Dest -> NoizSize); } } } else if(! strncmp(Data, "PULS", 4))