Mcd.db

From PhatHack Wiki

Jump to: navigation, search

Contents

[edit] PhatDB

[edit] Introduction

Phatdb is the name I have given to the mcd.db file format created by PhatNoise Media Manager software to be playable by Kenwood Car Stereo head units supporting ACDrive Technology.

The PhatDB is a database of song metadata. It contains information on all tracks, artists, albums, genres and playlists in a compact format. The concept is similar to the itunesdb database found on ipods, though phatdb is less complex.

This document describes the format of the PhatDB file.

A Free Software program and library to build mcd.db files is available here:

http://phatdb.sourceforge.net/

[edit] File Format

All multibyte types are stored in big endian (network) byte order. They must be byte-swapped to be read on little-endian PC platforms.


The overall structure looks like this:

Header
Tracks List
Artist List
Album List
Genre List
Playlists List

[edit] Header

The file begins with a header containing the following elements:

Offset Name Type Value Description
0x00000000 magic uint32 0x3af7d87c File Signature
0x00000004 unknown uint32 0x00000002 Version?
0x00000008 codepage uint32 0x000001b6 Codepage 437
0x0000000c unknown uint32 0x00000002 Constant?
0x00000010 n_tracks uint32   Total Number of Tracks
0x00000014 n_artists uint32   Total Number of Artists
0x00000018 n_albums uint32   Total Number of Albums
0x0000001c n_genres uint32   Total Number of Genres
0x00000020 n_playlists uint32   Total Number of Playlists
0x00000024 artists_len uint32   Len of Artists Array
0x00000028 albums_len uint32   Len of Albumns Array
0x0000002c genres_len uint32   Len of Genres Array
0x00000030 playlists_len uint32   Len of Playlist Array
0x00000034 unknown uint32 0x00000000 Constant?

[edit] Track List

The File Header is immediately followed by an array of n_tracks track structures (offsets are relative to start of track structure). Tracks are stored in alphabetical order.:

Offset Name Type Value Description
0x00000000 artists_id uint32   Artist ID
0x00000004 album_id uint32   Album ID
0x00000008 genre_id uint32   Genre ID
0x0000000c unknown uint32 0x00000000 Constant?
0x00000010 title phat_str   Track Title
0x0000xxxx path phat_str   Track Path

Where the phat_str structure looks like this:

Offset Name Type Value Description
0x00000000 string_length uint16   Length of String (bytes)
0x00000002 string_width uint16   Width of String?
0x00000004 data string   Character Array

When string_width is 2 (Track Title) data is UCS-2 encoded. When string_width is 1 (Track Path), data is CP437 encoded. data is null-terminated and padded to a multiple of 4 bytes. string_length is the length of data (including padding).

[edit] List Sections

Immediately following the track listing, there are sections for artists, albums and genres. All lists are in alphabetical order. Each section has the following format:

Offset Name Type Value Description
0x00000000 item_list phat_list[]   PhatDB Item List
0x00000xxx track_item_arr uint32[]   Track/Item Assignment Array
0x00000xxx item_index uint32[28]   Item Index


The structure of the phat_list is as follows:

Offset Name Type Value Description
0x00000000 array_offset uint32   Item Array Offset
0x00000004 name phat_str   Item Name String

array_offset is an index into track_item_arr. This array contains a mapping of track id's relating to that item (artist, album, genre). The length of the each array is given by the fields in the header artists_len, albums_len and genre_len. item_index seems to be an index for skipping through large arrays, perhaps indexed alphabetically?

[edit] Playlists

The playlists section immediately follows the genre section. It is identical to the sections above except that it does not have the item_index.

Personal tools