//////////////////////////////////////////////////////////////////////////////// // // Risen Sound Resource file format specs. // Copyright (c) 2009 Nico Bendlin // // +-----------------+ // | resource header | // +-----------------+ // | property data | // +-----------------+ // | resource data | // +-----------------+ // // Duration (long) // Complete playtime of the resource data in milliseconds. // // Flags (char) // Flags & 0x01 = Is2D, Flags & 0x02 = IsSoftware. If the // filename contains "%_sw" IsSoftware flag is set and if // the name contains "%_2d" Is2D + IsSoftware are present. // // Links (bTObjArray) // A bTObjArray starts with uint8_t Version (01) followed // by an uint32_t Count. An eCSoundResource2::SLink entry // has a bCString Name and uint32_t Offset (milliseconds). // //////////////////////////////////////////////////////////////////////////////// struct Head { char8_t ResMagic[4]; // "GR01" char8_t ResClass[4]; // "SN04" uint32_t PropOffset; uint32_t PropLength; uint32_t DataOffset; uint32_t DataLength; uint64_t RawTimestamp; // (FILETIME) char8_t RawFileExt[8]; // ".wav" } // @Head.PropOffset class Prop { class PropertyObject { uint8_t Header[6]; // 01,00,01,01,00,01 bCString ClassName; // 0010,"eCSoundResource2" uint8_t unknown[3]; // 01,00,00 uint16_t ClassVersion; // 00C9 uint16_t Version; // 00C9 uint32_t DataSize; class PropertyData { uint16_t Version; // 00C9 uint32_t Count; for( Count ) { bCString Name; bCString Type; uint16_t Version; // 001E uint32_t Size; uint8_t Data[Size]; } } struct ClassData { uint16_t ClassVersion; // 00C9 } } } // @Head.DataOffset class Data { uint8_t Frames[Head.DataLength]; // MPEG Audio frames (MPEG-1, Layer III, 44.1 kHz) }