Difference between revisions of "SABS & SABL Files"

From COD Engine Research
Jump to: navigation, search
(Structure)
m
Line 3: Line 3:
 
SAB(Stream) and SAB(Load). The B is most likely "bank" as the game code refers to a "sound bank" when loading SABL/SABS files.  
 
SAB(Stream) and SAB(Load). The B is most likely "bank" as the game code refers to a "sound bank" when loading SABL/SABS files.  
  
* SABS = Snd Alias Bank Stream
+
* SABS = Snd Asset Bank Stream
* SABL = Snd Alias Bank Load
+
* SABL = Snd Asset Bank Load
 
== Structure ==
 
== Structure ==
 
Thanks to Jakes625, Red-EyeX32, master131, and kokole.
 
Thanks to Jakes625, Red-EyeX32, master131, and kokole.

Revision as of 09:06, 25 December 2014

SAB(Stream) and SAB(Load). The B is most likely "bank" as the game code refers to a "sound bank" when loading SABL/SABS files.

  • SABS = Snd Asset Bank Stream
  • SABL = Snd Asset Bank Load

Structure

Thanks to Jakes625, Red-EyeX32, master131, and kokole.

struct hash_entry_t
{
	u8 md5[0x10];                   // md5 of the audio file
}; // 0x10
 
enum snd_asset_format
{
  SND_ASSET_FORMAT_PCMS16 = 0x0,
  SND_ASSET_FORMAT_PCMS24 = 0x1,
  SND_ASSET_FORMAT_PCMS32 = 0x2,
  SND_ASSET_FORMAT_IEEE = 0x3,
  SND_ASSET_FORMAT_XMA4 = 0x4,
  SND_ASSET_FORMAT_MP3 = 0x5,
  SND_ASSET_FORMAT_MSADPCM = 0x6,
  SND_ASSET_FORMAT_WMA = 0x7,
  SND_ASSET_FORMAT_FLAC = 0x8,
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,
  SND_ASSET_FORMAT_MPC = 0xA,
  SND_ASSET_FORMAT_COUNT = 0xB,
};
 
frameRateTable = { 8000, 12000, 16000, 24000, 32000, 44100, 48000, 96000, 192000 };
 
struct SndAssetBankEntry
{
	unsigned int id; 			// this is a hash of the name. Name Found in SndAlias asset in ff
        unsigned int size;
	unsigned int offset;
	unsigned int frameCount; 
	char frameRateIndex; 			// see frameRateTable
	char channelCount; 		// enum 0x1 = mono 0x2 = dual
	char looping;
	snd_asset_format format;
}; // 0x14
 
struct SndAssetBankHeader
{
	unsigned int magic; 		        // "2UX#"
	unsigned int version; 		        // 0x0E
	unsigned int entrySize;           // 0x14
	unsigned int checksumSize;            // 0x10
	unsigned int dependencySize;          // 0x40
	unsigned int entryCount; 		// number of sound entries NOT NAME ENTRIES
	unsigned int dependencyCount; 			// always 0x8 for some reason, might be the size of the next 3 fields
	unsigned int pad32;
	__int64 fileSize; 		// Size of the whole file
	__int64 entryOffset; 			// &SndAssetBankEntry[0]
	__int64 checksumOffset; 			// &hash_entry_t[0]
	char checksumChecksum[16];         // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be > 0x830)
	char dependencies[30][64];
	char padding[0x38];
}; // 0x800

To calculate the duration of an audio entry:

durationInMilliseconds = 1000 * frameCount / frameRate;

Note that "frameRate" is the actual frame rate value from the table and not the index/flag value from the structure.