Technical Overview
The following is an informal technical summary of the proposed Cart Chunk file format.
Note: This is a technical summary of the proposed CartChunk file format only. Neither CartChunk.org nor any of its participants represent this as the official text of the AES X-87 project, nor as the proposed AES-46 standard. For information regarding AES project X-87, AES-46, or any other AES standards information, we recommend you check out the AES Standards website or contact the AES Standards Organization directly.
CART/Audio Delivery Extension
to the
WAVE File Format
('cart' Chunk)
Technical Overview
Dick Pierce
Geoff Steadman
The proposed "cart" format describes a file convention for communicating audio and associated basic radio traffic and continuity data via a dedicated chunk embedded in EBU Broadcast Wave File (BWF, B-Wave or bext) compliant wave files.
0 INTRODUCTION
The radio broadcast industry utilizes a wide variety of production, on-air and other equipment in daily operation. No single vendor dominates the industry. Users have long complained about the inability to transport audio and traffic/continuity data between systems in a uniform and easy fashion. This is due to the lack of any uniform agreed-upon exchange format for communicating this information between systems. Different on-air delivery systems often use proprietary audio file formats and incompatible access methods to manage audio storage and playback, yet the scheduling, continuity or traffic information they use to label audio files share many common attributes. Further, audio data itself is represented in various, often proprietary formats. To simplify the communication between different systems such as audio production and on-air delivery systems, a common representation for both continuity/traffic information and audio data is desirable.
The RIFF WAVE format has emerged as a dominant audio representation, and supports a wide variety of audio formats (linear PCM, MPEG, different samples rates and sample sizes, multiple tracks, etc.). The RIFF conventions allow the arbitrary addition of other data without impacting the ability of diverse RIFF-compliant applications from reading and interpreting needed data. Thus, adding an extension to a WAVE file allows inclusion of needed continuity/traffic data to a widely accepted representation.
The RIFF specification requires all readers to be able to read all compliant RIFF files. When such an application encounters data that it is not prepared to handle, it can simply ignore the data and move on. There are some RIFF WAVE consumer applications that are intolerant of new and unknown chunks. For this reason alone, these applications are not RIFF-compliant. They may be front-ended by so-called "chunk stripper" utilities, the combination of which are then RIFF-compliant.
The cart format described here utilizes a widely used audio file format (WAVE and EBU BWF). It incorporates the common cart labeling information into a specialized chunk within the file itself, As a result, the burden of linking multiple systems is reduced to producer applications writing a single file, and the consumer applications reading it. The destination application can extract information and insert it into the native database application as needed.
Communication between a production/delivery system can be reduced to a simple, purely passive link. Production applications can write the properly formatted WAVE file in a "drop box" location. Consumer applications (such as radio delivery systems) periodically poll the drop-box for new additions, opens them, and uses theirits own native access methods for adding this information to theirits database. Providing this type of "translation layer" offers vendors a means of integration with other systems, without impacting their own native file formats and access methods.
The result is that both production/editing systems and on-air delivery systems can communicate readily without the need for implementation-specific intelligence or design. However, the use of this new data is not necessarily limited to these applications or the examples illustrated here.
1 SCOPE
This proposed format provides a convention for communicating basic radio traffic and continuity data via a dedicated chunk embedded in EBU BWF-compliant wave files. The new RIFF chunk supports most common data used in radio traffic and continuity systems, while the WAVE format itself supports most sample rates, sample widths, and audio formats.
Note that this format does not purport to suggest representation of this or other data within a specific applications space, only in the public interchange between disparate systems. Any such private representation may be covered by other conventions irrelevant to this standard, or by a particular vendors best judgement.
2 'CART' CHUNK DESCRIPTION
An EBU/BEXT wave format file with an added optional cart chunk will have the following minimal chunks:
<WAVE-form> ->
RIFF(WAVE
<fmt-ck> // mandatory for all WAVE files
[<fact-ck>] // required for MPEG format files
<bext-ck> // EBU Broadcast Extension information
[<mpeg-ck>] // required for EBU MPEG format files
[<cart-ck>] // optional cart information
<data-ck> // audio data, required for all WAVE files
Note: Any additional chunk types that are present in the file are considered private. Applications are not required to interpret or make use of these chunks.
The cart chunk is described in the following C-style data definitions:
typedef struct cartchunk_tag
{
DWORD ckID; // FOURCC chunk ID: "cart"
DWORD ckSize; // chunk data length in bytes
BYTE ckData[ckSize]; // data, as CART_EXTENSION type
}
typedef struct cart_extension_tag
{
CHAR Version[4]; // Version of the data structure
CHAR Title[64]; // ASCII title of cart audio sequence
CHAR Artist[64]; // ASCII artist/creator name
CHAR CutID[64]; // ASCII cut number identification
CHAR ClientID[64]; // ASCII client identification
CHAR Category[64]; // ASCII Category ID, PSA, NEWS, etc
CHAR Classification[64]; // ASCII Classification or auxiliary key
CHAR OutCue[64]; // ASCII out cue text
CHAR StartDate[10]; // ASCII yyyy/mm/dd
CHAR StartTime[8]; // ASCII hh:mm:ss
CHAR EndDate[10]; // ASCII yyyy/mm/dd
CHAR EndTime[8]; // ASCII hh:mm:ss
CHAR ProducerAppID[64]; // Name of vendor/application
CHAR ProducerAppVersion[64]; // Version of producer application
CHAR UserDef[64]; // User defined text
DWORD dwLevelReference; // Sample value for 0 dB reference
CART_TIMER PostTimer[8]; // 8 time markers after head
CHAR Reserved[276]; // Reserved for future expansion
CHAR URL[1024]; // Uniform resource locator
CHAR TagText[]; // Free form text for scripts or tags
} CART_EXTENSION;
typedef struct cart_timer_tag
{ // Post timer storage unit
FOURCC dwUsage; // FOURCC timer usage ID
DWORD dwValue; // timer value in samples from head
} CART_TIMER;
4.1.1 Field Descriptions
The date and time representations have been updated to recommend
compliance with date and time representation as described in ISO 8601.
3 APPENDICES
3.1 Recommended Category Names
The following is a list of recommended categories and aliases.
Category |
Aliases |
All |
ALL |
Beds |
BED, BEDS |
Sound bits |
BIT, BITS |
Commercials |
COM, COMM |
Contests |
CON, CONT |
Daily playlists |
DAY |
Emergency broadcast |
EB |
Sound effects |
EFX, SND |
Fillers |
FIL, FILL |
Station ID |
ID |
Intros |
INT, INTR |
Jingles |
JIN, JING |
Liners |
LIN, LINE |
Logos |
LOG, LOGO |
Magic call |
MAG, MAGI |
Music |
MUS, MUSC |
Network delay |
NET, NETW |
News |
NEW, NEWS |
Promos |
PRO, PROM |
Public Service Announcements |
PSA |
Segues |
SEG |
Shows |
SHW, SHOW |
Spots |
SPO, SPOT |
Sports |
SPR, SPRT |
Stagers |
STG, STAG |
Announcer stack |
STK, STAK |
Sweeps |
SWP, SWEP |
Test tones |
TST, TEST |
Temporary |
TMP, TEMP |
3.2 Recommended Mark Timer Identification
Below is a list of basic timer types, and their proposed (FOURCC) names. The basic types may be qualified by appending "s" (lower-case) to signify a start, "e" (lower case) to signify an end, or a digit to signify a sequence.
Timer ID |
Description |
Start/End |
Enumerated |
Multiples |
Unused |
No |
No |
Yes |
|
SEG |
Segue timer |
Yes |
Yes |
Yes |
AUD |
Audio boundary |
Yes |
No |
No |
INT |
Intro |
Yes |
Yes |
Yes |
OUT |
Outtro |
Yes |
Yes |
Yes |
SEC |
Secondary |
Yes |
Yes |
Yes |
TER |
Tertiary |
Yes |
Yes |
Yes |
MRK |
Generic marker |
No |
Yes |
Yes |
EOD |
End-of-data |
No |
No |
Yes |
Timers so designated in the timers can be specified in one of three ways:
Each application should prioritize the order in which the timers are written so that the important timers, like EOD, will always be present and the less important ones, like "MRK", can be dropped if the limit of 8 is reached.
3.3 Legacy Version
The previous 'cart' chunk format prior to Version 0100 did not include provision for the URL/URI field. That version is included here for comparison and completeness
typedef struct cart_extension_tag_V0000 { CHAR Version[4]; // Version of the data structure CHAR Title[64]; // ASCII title of cart audio sequence CHAR Artist[64]; // ASCII artist/creator name CHAR CutID[64]; // ASCII cut number identification CHAR ClientID[64]; // ASCII client identification CHAR Category[64]; // ASCII Category ID, PSA, NEWS, etc CHAR Classification[64]; // ASCII Classification or auxiliary key CHAR OutCue[64]; // ASCII out cue text CHAR StartDate[10]; // ASCII yyyy/mm/dd CHAR StartTime[8]; // ASCII hh:mm:ss CHAR EndDate[10]; // ASCII yyyy/mm/dd CHAR EndTime[8]; // ASCII hh:mm:ss CHAR ProducerAppID[64]; // Name of vendor/application CHAR ProducerAppVersion[64]; // Version of producer application CHAR UserDef[64]; // User defined text DWORD dwLevelReference // Sample value for 0 dB reference CART_TIMER PostTimer[8]; // 8 time markers after head CHAR Reserved[276]; // Reserved for future expansion CHAR TagText[]; // Free form text for scripts or tags } CART_EXTENSION_V000;
typedef struct cart_timer_tag { // Post timer storage unit FOURCC dwUsage; // FOURCC timer usage ID DWORD dwValue; // timer value in samples from head } CART_TIMER;