Multimedia Programming Interface and Data Specifications 1.0 - RIFF
Multimedia Programming Interface and Data Specifications 1.0 - RIFF
August 1991
This document describes the programming interfaces and data specifications for multimedia that
are common to both OS/2 and Windows environments. These specifications may be enhanced to
incorporate new technologies or modified based on customer feedback and, as such, specifications
incorporated into any final product may vary.
IBM and OS/2 are registered trademarks of International Business Machines Corporation.
Contents
Contents
Chunks......................................................................................................................................... 2-2
Escape Sequences for Four-Character Codes and String Chunks ............................................ 2-7
Usage Codes for Extra Header and Extra Entry Fields ..................................................... 2-24
This document describes the file format and control interface specifications for multimedia. These
specifications allow developers to use common file format and device control interfaces.
The RIFF file format is suitable for the following multimedia tasks:
• Musical Instrument Digital Interface (MIDI) and RIFF MIDI file formats
The Media Control Interface (MCI) provides a command set for playing and recording multimedia
devices and resource files. Developers creating multimedia applications are encouraged to use this
high-level command interface rather than the low-level functions specific to each platform. The
MCI command set acts as a platform-independent layer that sits between multimedia applications
and the underlying system software.
• Developers can incorporate new multimedia devices and file formats in the MCI command set
by creating new MCI drivers to interpret the commands.
• New commands and command options can be added to support special features or functions
required by new multimedia devices or file formats.
Using MCI, an application can control multimedia devices using simple command strings like
open, play, and close. The MCI command strings provide a generic interface to different
multimedia devices, reducing the number of commands a developer needs to learn. A multimedia
application might even accept MCI commands from an end user and pass them unchanged to the
MCI driver, which parses the command and performs the appropriate action.
Chapter 3, “Media Control Interface,” describes MCI and its command set in detail.
• Compression techniques
To register these multimedia elements, request a Multimedia Developer Registration Kit from the
following group:
Microsoft Corporation
Multimedia Systems Group
Product Marketing
One Microsoft Way
Redmond, WA 98052-6399
The Multimedia Developer Registration Kit also lists currently defined multimedia elements.
Chapter 2
The Resource Interchange File Format (RIFF) is a tagged file structure developed for use on
multimedia platforms. This chapter defines RIFF and describes the file structures based on RIFF.
If your application requires a new file format, you should define it using the RIFF tagged file
structure described in this chapter.
RIFF has a counterpart, RIFX, that is used to define RIFF file formats that use the Motorola
integer byte-ordering format rather than the Intel format. A RIFX file is the same as a RIFF file,
except that the first four bytes are ‘RIFX’ instead of ‘RIFF’, and integer byte ordering is
represented in Motorola format.
Notation Conventions
The following table lists some of the notation conventions used in this document. Further
conventions and the notation for documenting RIFF forms are presented later in the document in
the section “Notation for Representing Sample RIFF Files.”
Notation Description
<element label> RIFF file element with the label “element label”
<element label: TYPE> RIFF file element with data type “TYPE”
[<element label>] Optional RIFF file element
<element label>... One or more copies of the specified element
[<element label>]... Zero or more copies of the specified element
Chunks
The basic building block of a RIFF file is called a chunk. Using C syntax, a chunk can be defined
as follows:
For example, the four-character code ‘FOO’ is stored as a sequence of four bytes: 'F', 'O', 'O', ' ' in
ascending addresses. For quick comparisons, a four-character code may also be treated as a 32-bit
number.
The three parts of the chunk are described in the following table:
Part Description
ckID A four-character code that identifies the representation of the chunk data
data. A program reading a RIFF file can skip over any chunk whose chunk
ID it doesn't recognize; it simply skips the number of bytes specified by
ckSize plus the pad byte, if present.
ckSize A 32-bit unsigned value identifying the size of ckData. This size value does
not include the size of the ckID or ckSize fields or the pad byte at the end of
ckData.
ckData Binary data of fixed or variable size. The start of ckData is word-aligned
with respect to the start of the RIFF file. If the chunk size is an odd number of
bytes, a pad byte with value zero is written after ckData. Word aligning
improves access speed (for chunks resident in memory) and maintains
compatibility with EA IFF. The ckSize value does not include the pad byte.
We can represent a chunk with the following notation (in this example, the ckSize and pad byte
are implicit):
<ckID> ( <ckData> )
Two types of chunks, the ‘LIST’ and ‘RIFF’ chunks, may contain nested chunks, or subchunks.
These special chunk types are discussed later in this document. All other chunk types store a
single element of binary data in <ckData>.
RIFF Forms
A RIFF form is a chunk with a ‘RIFF’ chunk ID. The term also refers to a file format that follows
the RIFF framework. The following is the current list of registered RIFF forms. Each is described
in Chapter 3, “Multimedia File Formats.”
Using the notation for representing a chunk, a RIFF form looks like the following:
The first four bytes of a RIFF form make up a chunk ID with values ‘R’, ‘I’, ‘F’, ‘F’. The ckSize
field is required, but for simplicity it is omitted from the notation.
The first DWORD of chunk data in the ‘RIFF’ chunk (shown above as <formType>) is a four-
character code value identifying the data representation, or form type, of the file. Following the
form-type code is a series of subchunks. Which subchunks are present depends on the form type.
The definition of a particular RIFF form typically includes the following:
The form-type code for a RIFF form must be unique. To guarantee this uniqueness, you must
register any new form types before release. See “Registering Multimedia Formats” in Chapter 1,
“Overview of Multimedia Specifications,” for information on registering RIFF forms.
Like RIFF forms, RIFX forms must also be registered. Registering a RIFF form does not
automatically register the RIFX counterpart. No RIFX form types are currently defined.
Registered Form and Chunk Types
By convention, the form-type code for registered form types contains only digits and uppercase
letters. Form-type codes that are all uppercase denote a registered, unique form type. Use
lowercase letters for temporary or prototype chunk types.
Certain chunk types are also globally unique and must also be registered before use. These
registered chunk types are not specific to a certain form type; they can be used in any form. If a
registered chunk type can be used to store your data, you should use the registered chunk type
rather than define your own chunk type containing the same type of information.
For example, a chunk with chunk ID ‘INAM’ always contains the name or title of a file. Also,
within all RIFF files, filenames or titles are contained within chunks with ID ‘INAM’ and have a
standard data format.
Chunk types that are used only in a certain form type use a lowercase chunk ID. A lowercase
chunk ID has specific meaning only within the context of a specific form type. After a form
designer is allocated a registered form type, the designer can choose lowercase chunk types to use
within that form. See “Registering Multimedia Formats” in Chapter 1, “Overview of Multimedia
Specifications,” for information on registering form types.
For example, a chunk with ID ‘scln’ inside one form type might contain the “number of scan
lines.” Inside some other form type, a chunk with ID ‘scln’ might mean “secondary lambda
number.”
Notation for Representing Sample RIFF Files
RIFF is a binary format, but it is easier to comprehend an ASCII representation of a RIFF file.
This section defines a standard notation used to present samples of various types of RIFF files. If
you define a RIFF form, we urge you to use this notation in any file format samples you provide in
your documentation.
The following table summarizes the elements of the RIFF notation required for representing
sample RIFF files:
Notation Description
<ckID> (<ckData>)
The chunk with ID <ckID> and data <ckData>. As previously
described, <ckID> is a four-character code which may be enclosed
by single quotes for emphasis.
For example, the following notation describes a ‘RIFF’ chunk with a
form type of ‘QRST’. The data portion of this chunk contains a
‘FOO’ subchunk.
RIFF('QRST' FOO(17 23))
<number>[<modifier>]
A number in Intel format, where <number> is an optional sign
(+ or -) followed by one or more digits and modified by the optional
<modifier>. Valid <modifier> values follow:
Modifier Meaning
None 16-bit number in decimal format
H 16-bit number in hexadecimal format
C 8-bit number in decimal format
CH 8-bit number in hexadecimal format
L 32-bit number in decimal format
LH 32-bit number in hexadecimal format
Note that -1 and 65535 represent the same value. The application
reading this file must know whether to interpret the number as
signed or unsigned.
'<chars>'
A four-character code (32-bit quantity) consisting of a sequence of
zero to four ASCII characters <chars> in the given order. If
<chars> is less than four characters long, it is implicitly padded on
the right with blanks. Two single quotes is equivalent to four blanks.
Examples follow.
'RIFF'
'xyz'
''
The following escape sequences can be used in four-character codes and string chunks:
Escape Sequence ASCII Value Description
\n 10 Newline character
\t 9 Horizontal tab character
\b 8 Backspace character
\r 13 Carriage return character
\f 12 Form feed character
\\ 92 Backslash
\' 39 Single quote
\" 34 Double quote
\ddd Octal ddd Arbitrary character
Extended Notation for Representing RIFF Form Definitions
To unambiguously define the structure of new RIFF forms, document the RIFF form using the
basic notation along with the following extended notation:
Notation Description
<name>
A label that refers to some element of the file, where <name> is the name of
the label. Examples follow:
<NAME-ck>
<GOBL-form>
<bitmap-bits>
<foo>
This example defines the ‘hdr’ chunk's data as containing one of <hdr-x>,
<hdr-y>, or <hdr-z>.
element...
One or more occurrences of element may be present. An ellipsis has this
meaning only if it follows an element; in cases such as “el1 | el2 | ... | elN,”
the ellipsis has its ordinary English meaning. If there is any possibility of
confusion, an ellipsis should only be used to indicate one or more
occurrences. An example follows:
<data-ck> ➝ data(<count:INT> <item:INT>...)
This example defines the data of the ‘data’ chunk to contain an integer
<count>, followed by one or more occurrences of the integer <item>.
[element]...
Zero or more occurrences of element may be present. An example follows.
<data-ck> ➝ data(<count:INT> [<item:INT>]...)
This example defines the data of the ‘data’ chunk to contain an integer
<count> followed by zero or more occurrences of an integer <item>.
{elements}
The group of elements within the braces should be considered a single
element. An example follows:
<blorg> ➝ <this> | {<that> | <other>}...
Wherever possible, the types used in the structure should be the types listed in
the following section, “Atomic Labels,” because these types are more
portable than C types such as int. The structure fields are assumed to be
present in the file in the order given, with no padding or forced alignment.
Unless the RIFF chunk ID is ‘RIFX’, integer byte ordering is assumed to be
in Intel format.
// comment
An explanatory comment to a rule. An example follows:
<weekend> ➝ 'Sat'|'Sun' // Four-character code
// for day
Atomic Labels
The following are atomic labels, which are labels that refer to primitive data types. Where
available, the equivalent Microsoft C data type is also listed.
NULL-terminated means that the string is followed by a character with ASCII value 0.
A size prefix is an unsigned integer, stored as a byte or a word in Intel format, that specifies the
length of the string. In the case of strings with BZ or WZ modifiers, the size prefix specifies the
size of the string without the terminating NULL.
Note: The WINDOWS.H header file defines the C types BYTE, WORD, LONG, and DWORD. These types
correspond to labels <BYTE>, <WORD>, <LONG>, and <DWORD>, respectively.
The following example defines <GOBL-form>, the hypothetical RIFF form of type ‘GOBL’. To
fully document a new RIFF form definition, a developer would also provide detailed descriptions
of each file element, including the semantics of each chunk and sample files documented using the
standard notation.
// An object is a:
<obj-list> ➝ LIST( 'obj' { <sqr-ck> | // square,
<circ-ck> | // circle,
<poly-ck> }... ) // or polygon
The following sample RIFF form adheres to the form definition for form type GOBL. The file
contains three subchunks:
• An ‘INFO’ list
• An ‘org’ chunk
• An ‘obj’ chunk
The ‘INFO’ list and ‘org’ chunk each have two subchunks. The ‘INFO’ list is a registered global
chunk that can be used within any RIFF file. The ‘INFO’ list is described in the ‘INFO List
Chunk,” later in this chapter.
Since the definition of the GOBL form does not refer to the INFO chunk, software that expects
only ‘org’ and ‘obj’ chunks in a GOBL form would ignore the unknown ‘INFO’ chunk.
RIFF( 'GOBL'
LIST('INFO' // INFO list containing filename and copyright
INAM("A House"Z)
ICOP("(C) Copyright Encyclopedia International 1991"Z)
)
In a string table, all strings used in a structure are stored at the end of the structure in packed
format. The structure includes fields that specify the offsets from the beginning of the string table
to the individual strings. An example follows:
typedef struct
{
INT iWidgetNumber; // the widget number
WORD offszWidgetName; // an offset to a string in <rgchStrTab>
WORD offszWidgetDesc; // an offset to a string in <rgchStrTab>
INT iQuantity; // how many widgets
CHAR rgchStrTab[1]; // string table (allocate as large as needed)
} WIDGET;
If multiple chunks within the file need to reference variable-length strings, you can store the
strings in a single chunk that acts as a string table. The chunks that refer to the strings contain
offsets relative to the beginning of the data part of the string table chunk.
In a BZSTR series, a series of strings is stored in packed format. Each string is a BZSTR, with a
byte size prefix and a NULL terminator. This format retains the ease-of-use characteristics of the
ZSTR while providing the string size, allowing the application to quickly skip unneeded strings.
When storing multiline strings, separate lines with a carriage return/line feed pair (ASCII
13/ASCII 10 pair). Although applications vary in their requirements for new line symbols
(carriage return only, line feed only, or both), it is generally easier to strip out extra characters than
to insert extra ones. Inserting characters might require reallocating memory blocks or pre-scanning
the chunk before allocating memory for it.
The following lists guidelines for deciding which storage method is appropriate for your
application.
LIST Chunk
A LIST chunk contains a list, or ordered sequence, of subchunks. A LIST chunk is defined as
follows:
The <list-type> is a four-character code that identifies the contents of the list.
If an application recognizes the list type, it should know how to interpret the sequence of
subchunks. However, since a LIST chunk may contain only subchunks (after the list type), an
application that does not know about a specific list type can still walk through the sequence of
subchunks.
Like chunk IDs, list types must be registered, and an all-lowercase list type has meaning relative to
the form that contains it. See “Registering Multimedia Formats” in Chapter 1, “Overview of
Multimedia Specifications,” for information on registering list types.
The ‘INFO’ list is a registered global form type that can store information that helps identify the
contents of the chunk. This information is useful but does not affect the way a program interprets
the file; examples are copyright information and comments. An ‘INFO’ list is a ‘LIST’ chunk with
list type ‘INFO’. The following shows a sample ‘INFO’ list chunk:
An ‘INFO’ list should contain only the following chunks. New chunks may be defined, but an
application should ignore any chunk it doesn't understand. The chunks listed below may only
appear in an ‘INFO’ list. Each chunk contains a ZSTR, or null-terminated text string.
Chunk ID Description
IARL Archival Location. Indicates where the subject of the file is archived.
IART Artist. Lists the artist of the original subject of the file. For example,
“Michaelangelo.”
ICMS Commissioned. Lists the name of the person or organization that
commissioned the subject of the file. For example, “Pope Julian II.”
ICMT Comments. Provides general comments about the file or the subject of the
file. If the comment is several sentences long, end each sentence with a
period. Do not include newline characters.
ICOP Copyright. Records the copyright information for the file. For example,
“Copyright Encyclopedia International 1991.” If there are multiple
copyrights, separate them by a semicolon followed by a space.
ICRD Creation date. Specifies the date the subject of the file was created. List dates
in year-month-day format, padding one-digit months and days with a zero on
the left. For example, “1553-05-03” for May 3, 1553.
ICRP Cropped. Describes whether an image has been cropped and, if so, how it was
cropped. For example, “lower right corner.”
IDIM Dimensions. Specifies the size of the original subject of the file. For example,
“8.5 in h, 11 in w.”
IDPI Dots Per Inch. Stores dots per inch setting of the digitizer used to produce the
file, such as “300.”
IENG Engineer. Stores the name of the engineer who worked on the file. If there are
multiple engineers, separate the names by a semicolon and a blank. For
example, “Smith, John; Adams, Joe.”
IGNR Genre. Describes the original work, such as, “landscape,” “portrait,” “still
life,” etc.
IKEY Keywords. Provides a list of keywords that refer to the file or subject of the
file. Separate multiple keywords with a semicolon and a blank. For example,
“Seattle; aerial view; scenery.”
ILGT Lightness. Describes the changes in lightness settings on the digitizer required
to produce the file. Note that the format of this information depends on
hardware used.
IMED Medium. Describes the original subject of the file, such as, “computer image,”
“drawing,” “lithograph,” and so forth.
INAM Name. Stores the title of the subject of the file, such as, “Seattle From
Above.”
IPLT Palette Setting. Specifies the number of colors requested when digitizing an
image, such as “256.”
IPRD Product. Specifies the name of the title the file was originally intended for,
such as “Encyclopedia of Pacific Northwest Geography.”
ISBJ Subject. Describes the conbittents of the file, such as “Aerial view of Seattle.”
ISFT Software. Identifies the name of the software package used to create the file,
such as “Microsoft WaveEdit.”
ISHP Sharpness. Identifies the changes in sharpness for the digitizer required to
produce the file (the format depends on the hardware used).
ISRC Source. Identifies the name of the person or organization who supplied the
original subject of the file. For example, “Trey Research.”
ISRF Source Form. Identifies the original form of the material that was digitized,
such as “slide,” “paper,” “map,” and so forth. This is not necessarily the same
as IMED.
ITCH Technician. Identifies the technician who digitized the subject file. For
example, “Smith, John.”
CSET (Character Set) Chunk
To define character-set and language information for a RIFF file, use the CSET chunk. The CSET
chunk defines the code page and country, language, and dialect codes for the file. These values
can be overridden for specific file elements; see “Usage Codes for Extra Header and Extra Entry
Fields,” later in this chapter, for information on specifying character set information in a
compound file.
Field Description
wCodePage Specifies the code page used for file elements. If the CSET
chunk is not present, or if this field has value zero, assume
standard ISO 8859/1 code page (identical to code page
1004 without code points defined in hex columns 0, 1, 8,
and 9).
wCountryCode Specifies the country code used for file elements. See
“Country Codes,” following this section, for a list of
currently defined country codes.
If the CSET chunk is not present, or if this field has value
zero, assume USA (country code 001).
wLanguage, Specify the language and dialect used for file elements. See
wDialect “Language and Dialect Codes,” later in this chapter, for a
list of language and dialect codes.
If the CSET chunk is not present, or if these fields have
value zero, assume US English (language code 9, dialect
code 1).
Country Codes
Specify one of the following pairs of language-code and dialect-code values in the wLanguage
and wDialect fields:
The goals of the compound file structure are to maximize flexibility and extensibility while
minimizing implementation costs. Using the compound file structure, developers of multimedia
data formats can define both simple and complex file formats.
The structure is flexible enough to be used for many purposes, but it can be simplified for use with
simple file formats. Designers of new multimedia file formats can restrict the use of standard
header fields, requiring some and removing others.
For example, a developer might define a compound file format that stores a series of bitmaps in a
single file, thus reducing compact disc seek times. Another developer might define a compound
file format that contains a special type of audio resource, using the compound file header
information to identify the attributes of the audio data stored within.
Structural Overview
Files based upon the compound file structure contain the following two RIFF chunks at their
topmost level:
The CTOC chunk indexes the CGRP chunk, which contains the actual multimedia data elements.
Defined using the standard chunk notation, a compound file is represented as follows:
The CTOC chunk functions mainly as an index, allowing direct access to elements within a
compound file. The CTOC chunk also contains information about the attributes of the entire file
and of each media element within the file.
To provide the maximum flexibility for defining compound file formats, the CTOC chunk can be
customized at several levels. The CTOC chunk contains fields whose length and usage is defined
by other CTOC fields. This parameterization adds complexity, but it provides flexibility to file
format designers and allows applications to correctly read data without necessarily knowing the
specific file format definition.
Structural Overview
The CTOC chunk defines the contents of the CGRP chunk. The CTOC chunk has the following
components:
• Header information defining the size of the CTOC chunk, the number of entries in the CGRP
chunk, the size of the CGRP chunk, and general information about the entire header file
• A parameter table definition defining the size and contents of the header parameter table and
CTOC table entries
• A header parameter table defining attributes that apply to the entire compound file.
• CTOC table entries defining the location, size, name, and attributes of the compound file
elements contained in the CGRP chunk.
These components appear sequentially in the CTOC chunk. The individual fields in the CTOC
chunk are the following:
<CTOC-chunk>➝ CTOC (
<dwHeaderSize:DWORD> // Header information
<dwEntriesTotal:DWORD>
<dwEntriesDeleted:DWORD>
<dwEntriesUnused:DWORD>
<dwBytesTotal:DWORD>
<dwBytesDeleted:DWORD>
<dwHeaderFlags:DWORD>
<CTOC-table-entry> ➝
<dwOffset:DWORD>
<dwSize:DWORD>
<dwMedType:DWORD>
<dwMedUsage:DWORD>
<dwCompressTech:DWORD>
<dwUncompressBytes:DWORD>
<adwExEntField:DWORD[wExEntFields]>
<bEntryFlags:BYTE>
<achName:CHAR[wNameSize]>
[<bEntryPad:BYTE>]...
The header information section defines general information about the CTOC header and about the
entire compound file. It contains the following fields:
The parameter table definition defines the size and contents of the header parameter table and
CTOC table. It contains the following fields:
The header parameter table is an optional component generally used to define attributes of the
entire compound file.
The CTOC table entries define the location, size, name, and other information about the individual
compound file elements contained in the CGRP chunk. The number of CTOC table entries is
determined by the dwEntriesTotal field in the header information of the CTOC chunk.
Each CTOC table entry is a structure containing the following fields:
The following are valid usage codes for elements in the awExHdrFldUsage and
awExEntFldUsage arrays, both of which are fields of the CTOC header. These arrays define the
meaning of data stored in the adwExHdrField and adwExEntField “extra fields.” All usage
codes apply to both header fields and entry fields, unless explicitly stated otherwise.
Values marked in the extra header field arrays generally apply to all elements in the CFRG chunk,
while values marked in the extra entry field arrays generally apply only to the element referenced
by the corresponding CTOC table entry.
Flag Description
CTOC_EFU_UNUSED (0x00) The field is unused. This usage code may be used to
logically delete a header field.
CTOC_EFU_LASTMODTIME When used to describe an extra header field, the field
(0x01) contains the time that any portion of the CTOC or CGRP
was last modified.
When used to describe an extra entry field, the field
contains the time that the corresponding CTOC table entry,
or the compound file element it refers to, was last modified.
The field is interpreted as a DWORD containing the
number of seconds that have elapsed since 00:00:00
Greenwich Mean Time (GMT), January 1, 1970.
CTOC_EFU_CODEPAGE The field contains the code page and country code for the
achName field. These values override any values specified
in a CSET chunk.
When used to describe an extra header field, the field
contains code-page and country-code information for all
CTOC table entries. When used to describe an extra entry
field, the field contains information for that specific CTOC
table entry.
The low-order word of the field contains one of the
following code page values:
Zero
Use standard ISO 8859/1 code page. This is identical to
code page 1004 without code points defined in hex
columns 0, 1, 8, and 9.
CTOC_CHARSET_CODEPAGE (0x0000nnnn)
Use code page 0xnnnn, where 0xnnnn is the 16-bit
code page number. For example, 0x00000352 for OS/2
code page 850, or 0x000004E4 for Windows 3.1 code
page 1252.
code page 850, or 0x000004E4 for Windows 3.1 code
page 1252.
The high-order word contains one of the following country
codes:
Zero
Ignore this field.
Country code
See “Country Codes,” earlier in this chapter, for a list
of currently defined country codes.
CTOC_EFU_LANGUAGE The field contains language and dialect information for the
achName field. These values override any values specified
in a CSET chunk.
When used to describe an extra header field, the field
contains language information for all CTOC table entries.
When used to describe an extra entry field, the field
contains information for that specific CTOC table entry.
The low-order word of the field contains one of the
following language codes:
Zero
Ignore this field.
Language code
See “Language and Dialect Codes,” earlier in this
chapter, for a list of currently defined language codes.
The high-order word of the field contains one of the
following dialect codes:
Zero
Ignore this field.
Dialect code
See “Language and Dialect Codes,” earlier in this
chapter, for a list of currently defined dialect codes.
CTOC_EFU_COMPRESSPARAM0 Specifies a compression parameter. See “Compression of
(0x05) through Compound File Elements,” later in this chapter.
CTOC_EFU_COMPRESSPARAM9
(0x14)
Compound file elements can be compressed. The dwCompressTech field of a CTOC table entry
contains a FOURCC compression technique identifier for the corresponding compound file
element. If the field is zero, the compound file element is not compressed.
The definition of a specific compression technique may specify that either the entire compound
file element is compressed, or that some specific subset, for example one or more RIFF chunks, is
compressed.
The dwUncompressSize field contains the number of bytes that the compound file element will
occupy in memory after decompression. If the compound file element is not compressed, this field
contain the same value as the dwSize field, which identifies the file size of the compound file
element.
Compression techniques may demand extra header fields or extra entry fields for decompression
parameters. Compression technique identifiers, and any new entry fields corresponding to
decompression technique parameters, must be unique. See “Registering Multimedia Formats” in
Chapter 1, “Overview of Multimedia Specifications,” for information on registering compression
techniques.
Compound File Element Group (CGRP) Chunk
The actual elements of data referenced by the CTOC chunk are stored in a compound file Element
Group (CGRP) chunk. The CGRP chunk contains all the compound file elements, concatenated
together into one contiguous block of data. Some of the elements in the CGRP chunk might be
unused, if the element was marked for deletion or was altered and stored elsewhere within the
CGRP chunk.
Elements within the CGRP chunk are of arbitrary size and can appear in a specific or arbitrary
order, depending upon the file format definition. Each element is identified by a corresponding
CTOC table entry.
Using the standard RIFF notation, the CGRP chunk is defined as follows:
The specific file format definition can specify which of the two chunks appear first the data file.
Generally, the CTOC chunk is placed at the front of the file to reduce the seek and read times
required to access it. During authoring time, an application might place the CTOC chunk at the
end of the file, so it can be expanded as elements are added to the CGRP chunk.
Chapter 3
This chapter describes the multimedia file formats. Most of these file formats are based on the
Resource Interchange File Format (RIFF), described in Chapter 2.
The <CTOC-chunk> and <CGRP-chunk> formats are defined in “Compound File Structure,” in
Chapter 2, “Resource Interchange File Format.”
Each compound file element must be capable of standing alone as an independent file. An element
may not be a random chunk (except the RIFF chunk, indicating a RIFF file) or random binary data
(unless the binary data is supposed to be treated as a file).
The Windows 3.0 and Presentation Manager 1.2 DIBs are similar, so they are discussed together.
Windows 3.0 and Presentation Manager 1.2 DIB files consist of the following sequence of data
structures:
• A file header
• A color table
The bitmap file header contains information about the type, size, and layout of a device-
independent bitmap (DIB) file. In both the Windows 3.0 and Presentation Manager 1.2 DIBs, it is
defined as a BITMAPFILEHEADER data structure:
Field Description
bfType Specifies the file type. It must consist of the character sequence BM
(WORD value 0x4D42).
bfSize Specifies the file size in bytes.
bfReserved1 Reserved. Must be set to zero.
bfReserved2 Reserved. Must be set to zero.
bfOffBits Specifies the byte offset from the BITMAPFILEHEADER structure
to the actual bitmap data in the file.
The BITMAPINFO and BITMAPCOREINFO data structures define the dimensions and color
information for Windows 3.0 and Presentation Manager 1.2 DIBs, respectively. They are defined
as follows:
These structures are essentially alike, and this section discusses them simultaneously. Each field
name for the Windows BITMAPINFO structure is followed by the corresponding field name for
the Presentation Manager BITMAPCOREINFO 1.2 structure, in parentheses.
Because these structures are essentially alike, except for the added fields in the Windows 3.0
structure, this section discusses them simultaneously. Each field name for the Windows structure
is followed by the corresponding field name for the Presentation Manager structure, in
parentheses.
Common Fields
The following fields are present in both the Windows 3.0 and Presentation Manager 1.2 formats:
The following fields are present only in the Windows 3.0 BITMAPINFOHEADER structure:
Field Description
biCompression Specifies the type of compression for a compressed bitmap. It can be
one of the following values:
Value Meaning
BI_RGB Specifies that the bitmap is not compressed.
BI_RLE4 Specifies a run-length encoded format for bitmaps with
4 bits-per-pixel. The compression format is a two-byte
format consisting of a count byte followed by two
word-length color indexes.
BI_RLE8 Specifies a run-length encoded format for bitmaps with
8 bits-per-pixel. The compression format is a two-byte
format consisting of a count byte followed by a color-
index byte.
The color table is a collection of 24-bit RGB values. There are as many entries in the color table as
there are colors in the bitmap. The color table isn't present for bitmaps with 24 color bits because
each pixel is represented by 24-bit RGB values in the actual bitmap data area.
The color table for Windows 3.0 and Presentation Manager 1.2 DIBs consists of an array of
RGBQUAD and RGBTRIPLE structures, respectively. These structures are defined as follows:
Because these structures are essentially alike, this section discusses them simultaneously. Each
field name for the Windows RGBQUAD structure is followed by the corresponding field name for
the Presentation Manager RGBTRIPLE structure, in parentheses.
Order of Colors
The colors in the table should appear in order of importance. This can help a device driver render a
bitmap on a device that cannot display as many colors as there are in the bitmap. If the DIB is in
Windows 3.0 format, the driver can use the biClrImportant field of the BITMAPINFOHEADER
structure to determine which colors are important.
Field Descriptions
The biSize (bcSize) field can have any of the following values:
Value Meaning
1 The bitmap is monochrome, and the color table contains two entries. Each bit
in the bitmap array represents a pixel. If the bit is clear, the pixel is displayed
with the color of the first entry in the color table. If the bit is set, the pixel has
the color of the second entry in the table.
4 The bitmap has a maximum of 16 colors. Each pixel in the bitmap is
represented by a four-bit index into the color table.
For example, if the first byte in the bitmap is 0x1F, then the byte represents
two pixels. The first pixel contains the color in the second table entry, and the
second pixel contains the color in the 16th table entry.
8 The bitmap has a maximum of 256 colors. Each pixel in the bitmap is
represented by a byte-sized index into the color table. For example, if the first
byte in the bitmap is 0x1F, then the first pixel has the color of the thirty-
second table entry.
24 The bitmap has a maximum of 224 colors. The bmiColors (bmciColors) field
is NULL, and each three bytes in the bitmap array represent the relative
intensities of red, green, and blue, respectively, of a pixel.
For Windows 3.0 DIBs, the field of the BITMAPINFOHEADER structure specifies the number of
color indexes in the color table actually used by the bitmap. If the biClrUsed field is set to 0, the
bitmap uses the maximum number of colors corresponding to the value of the field.
Bitmap Data
The bits in the array are packed together, but each line of pixels, or scan line, must be zero-padded
to end on a LONG boundary. When the bitmap is in memory, segment boundaries can appear
anywhere in the bitmap. The origin of the bitmap is the lower-left corner. The following section
discusses compression formats for the Windows 3.0 bitmap data.
Windows supports run-length encoded formats for compressing 4- and 8-bit bitmaps.
Compression reduces the disk and memory storage required for the bitmap. The following sections
describe the compression formats.
When the biCompression field is set to BI_RLE8, the bitmap is compressed using a run-length
encoding format for an 8-bit bitmap. This format uses two modes:
RDIB’ form is defined as follows, using the standard RIFF form definition notation:
The <DIB-data> format is defined in “Device Independent Bitmap File Format,” earlier in this
chapter.
<RDIB-form> ➝
RIFF('RDIB'
<bmhd-ck> // Bitmap header chunk
[ <pal-file> | // Internal palette chunk
<XPAL-ck> ] // External palette chunk
<bitmap-data> ) // Bitmap data
The <pal-file> chunk can be any of the palette-file formats discussed in “Palette File Format,”
later in this chapter. The <bmhd-ck>, <XPAL-chunk>, and <bitmap-data> are described in the
following sections.
If the dwCompression field equals BI_RGB or BI_RLE8 or BI_RLE4, then the extended RDIB
has the same bitmap format as a simple RDIB.
Each pixel format defines the orientation, or position of the bitmap origin. Windows bitmaps
(identified by a value of ‘data’ in the dwPelFormat field) have the origin at the bottom left. By
default, the other formats have the origin at the top left.
Field Description
dwMemSize Equal to the size of the bitmap bits if the bits are uncompressed. For
RDIBs with dwPelFormat equal to ‘data,’ dwMemSize has one of the
following values:
dwPelFormat Specifies a FOURCC code defining the pixel format of the bitmap data.
The bitmap data is stored in a chunk (or chunks) that has the same
chunk ID as is contained in dwPelFormat. The compression scheme
and pixel depth of the bitmap data are recorded in the dwCompression
and dwBitCount fields. The current bitmap data values are as follows:
wTransType Specifies the type of transparency representation, if any, used for this
image. This is normally used for either image overlay applications,
where one image may be visually on top of another, and all pels of the
transparency color should not be drawn. Examples include sprites, clip
art and motion video overlay. Wherever the transparency color occurs
in the picture, the background should be visible.
This information is stored with the image, so that multiple images that
use the same color map may all have different transparency color.
There are 5 different values for the transparency variable. These are:
Value Result
BITT_NONE No pels are considered transparent in this
(0x0000) image.
BITT_MAPINDEX One of the color map/palette entries should be
(0x0001) considered the transparency color. All
instances of this pel should NOT be drawn,
and the existing background should be
allowed to show through.
BITT_SINGLECOLOR A single RGB or YUV value is considered
(0x0002) transparent and should not be drawn.
BITT_BITPLANE An individual bit plane is considered
(0x0003) transparent, and all pels that have that bit or
bits “on” should not be drawn.
BITT_MULTILEVEL A set of bits indicate multiple levels of
(0x0004) transparency or opacity. This is usually used
with 32-bit RGB, where the high 8 bits
indicate transparency.
dwTransVal These bytes allow the image definition to indicate the exact information
about the transparent color. The information is dependent on the value
of the wTransType as follows:
dwHdrSize Specifies the size of the data portion of the <bmhdr> chunk. This is
always 40, the size of the BITMAPINFOHEADER structure.
dwWidth Specifies the width of the DIB in pixels.
dwHeight Specifies the height of the DIB in pixels.
wPlanes Specifies the number of planes. This value is normally 1, but it can be 3
or 4 for 24-bit RGB and 32-bit RGB images, respectively. In a
multiplane DIB, each color component (for example, red, green, and
blue) is stored as a separate plane, and each plan is stored in a separate
bitmap data chunk. For example, in a 3-plane, 24-bit ‘rgbb’ bitmap, the
red colors are stored in one ‘rgbb’ chunk, the green colors in a second
‘rgbb’ chunk, and the blue colors in a third ‘rgbb’ chunk.
Allowing the separate RGB planes to be compressed independently can
dramatically improve the compression ratio. The wPlanes value must
be 1 if dwPelFormat equals ‘data’.
wBitCount Specifies the number of bits per pixel. If the dwPelFormat field equals
‘data’, this field must contain values compatible with the Windows 3.0
DIB definition.
dwCompression Specifies the type of compression for a compressed bitmap. It can be
one of the following values:
Value Meaning
BI_NONE Specifies that the bitmap is not compressed. Pixel
(0xFFFF0000) values are not padded to four-byte boundaries.
BI_RGB Specifies that the bitmap is an uncompressed, 1-,
(0x00000000) 4-, 8-, or a 24-bit image. For 24-bit images, the
palette is optional. Bitmap bits are represented as
defined by Windows 3.0 for BI_RGB DIBs. The
dwPelFormat field must be set to ‘data’.
BI_RLE8 Specifies a run-length encoded, compressed
(0x00000001) bitmap (as defined by Windows 3.0 BI_RLE8
DIBs). The palette is required. The dwPelFormat
field must be set to ‘data’.
BI_RLE4 Specifies a run-length encoded, compressed
(0x00000002) bitmap (as defined by Windows 3.0 BI_RLE4
DIBs). The palette is required. The dwPelFormat
field must be set to ‘data’.
BI_PACK Specifies a simple PACKBITS byte compression
(0xFFF0001) scheme consisting of one-byte counts followed by
byte data, in the form:
<count byte n><data byte1><data byte2>...<data byte n>
<count byte n><data byte to repeat>
Value Result
0 Bitmap uses the maximum number of colors
corresponding to the value of the wBitCount field.
Nonzero If the wBitCount is less than 24, dwClrUsed
specifies the actual number of colors which the
graphics engine or device driver will access.
graphics engine or device driver will access.
If the wBitCount field is set to 24, dwClrUsed
specifies the size of the reference color table used
to optimize performance of Windows color
palettes.
dwClrImportant Specifies the number of color indexes that are considered important for
displaying the bitmap. If this value is 0, then all colors are important.
Transitional Compression
If the dwCompression field is set to BI_TRANS, the data is transitionally compressed using a
table of byte transitions or sequences. Values in the data indicate a table position to start at, and
the table provides continuing references to other table positions. Transitional compression applies
only to eight-bit data, either from an eight-bit palettized image or from a multi-plane image in
which each color component is represented in eight bits.
The table consists of up to 256 16-byte rows at the beginning of the data section of the object.
Nibbles (half-bytes) in the data section indicate an offset into a table row, at which location is
stored the actual byte value. The actual value then becomes the row applicable to the next data
nibble. The transitional encoding scheme is described more fully in a separate IBM document.
In transitional compression, the data section is a two-part compound object having the following
items:
• A transition table
The transition table consists of an integer indicating the table size in bytes and a table of 16-byte
rows. The first byte in each row is a row number and the next 15 are transition values. Rows are in
descending sequence. The image is compressed according to the following rules:
• Data is in nibbles (half-bytes) or in nibble-pairs (successive half-bytes which may cross a byte
boundary).
• The first byte is a nibble-pair. It is the first byte of the image and also the first row number.
• Following a nibble-pair is a series of transition nibbles (1-15) ended by a terminator (0). Each
transition nibble indicates an offset in the current row at which the next byte in the image is
found; this value is also the next row number.
• The terminator indicates that the next image byte is not in the table, but instead in the
following nibble-pair. This value is also the next row number.
• If the picture has an odd number of nibbles (i.e., it ends in the first half of the last byte), an
extra zero nibble is included.
CCC Compression
TBD.
Palette Chunk
A PLT chunk represents a color table and consists of a valid PAL file. The PAL file format is
defined in “Palette File Format,” later in this chapter.
Instead of a PLT chunk, an RDIB may contain an XPLT chunk, which indicates that the bitmap's
palette is stored outside the bitmap. The palette might be stored in a separate file or as a separate
compound file element. The XPLT chunk indicates the name and location of the external palette
chunk and is defined as follows:
The fccLocation contains one of the following FOURCC values specifying the location of the
external chunk:
The szPaletteName consists of a null-terminated string (ZSTR) containing the name of the
external chunk containing the palette.
The <bitmap-data> contains bitmap data in the format specified by the biPelFormat field of the
<bmhd-chunk>.
MIDI and RIFF MIDI File Formats
The Musical Instrument Digital Interface (MIDI) file format represents a Standard MIDI File, as
defined by the MIDI Manufacturers Association. A MIDI file contains commands instructing
instruments to play specific notes and perform other operations.
The specifications for MIDI and MIDI files can be obtained from the following organization:
The ‘RMID’ format consists of a standard MIDI file enclosed in a RIFF chunk. Enclosing the
MIDI file in a ‘RIFF’ chunk allows the file to be consistently identified; for example, an ‘INFO’
list can be included in the file.
The ‘RMID’ form is defined as follows, using the standard RIFF form definition:
Field Description
palVersion Specifies the Windows version number for the structure.
palNumEntries Specifies the number of palette color entries.
palPalEntry[] Specifies an array of PALETTEENTRY data structures that define
the color and usage of each entry in the logical palette.
The colors in the palette entry table should appear in order of importance. This is because entries
earlier in the logical palette are most likely to be placed in the system palette.
The PALETTEENTRY data structure specifies the color and usage of an entry in a logical color
palette. The structure is defined as follows:
the bitmap's palette is stored outside the bitmap. The palette might be stored in a separate file or as
a separate compound file element. The XPLT chunk indicates the name and location of the
external palette chunk and is defined as follows:
The fccLocation contains one of the following FOURCC values specifying the location of the
external chunk:
The szPaletteName consists of a null-terminated string (ZSTR) containing the name of the
external chunk containing the palette.
The <bitmap-data> contains bitmap data in the format specified by the biPelFormat field of the
<bmhd-chunk>.
MIDI and RIFF MIDI File Formats
The Musical Instrument Digital Interface (MIDI) file format represents a Standard MIDI File, as
defined by the MIDI Manufacturers Association. A MIDI file contains commands instructing
instruments to play specific notes and perform other operations.
The specifications for MIDI and MIDI files can be obtained from the following organization:
The ‘RMID’ format consists of a standard MIDI file enclosed in a RIFF chunk. Enclosing the
MIDI file in a ‘RIFF’ chunk allows the file to be consistently identified; for example, an ‘INFO’
list can be included in the file.
The ‘RMID’ form is defined as follows, using the standard RIFF form definition:
Field Description
palVersion Specifies the Windows version number for the structure.
palNumEntries Specifies the number of palette color entries.
palPalEntry[] Specifies an array of PALETTEENTRY data structures that define
the color and usage of each entry in the logical palette.
The colors in the palette entry table should appear in order of importance. This is because entries
earlier in the logical palette are most likely to be placed in the system palette.
The PALETTEENTRY data structure specifies the color and usage of an entry in a logical color
palette. The structure is defined as follows:
Field Description
peRed Specifies the intensity of red for the palette entry color.
peGreen Specifies the intensity of green for the palette entry color.
peBlue Specifies the intensity of blue for the palette entry color.
peFlags Specifies how the palette entry is to be used.
• A palette-header chunk
Field Description
dwMapType FOURCC code specifying the type of palette. Currently, the following
palette types are identified:
Code Description
‘data’ Specifies an RGB palette. Data chunk contains a
LOGPALETTE structure.
‘yuvp’ Specifies a YUV palette. Data chunk contains a YUV
palette.
‘xyzp’ Specifies an XYZ palette. Data chunk contains a XYZ
palette.
Value Description
PAL_UNREGISTERED (0xFFFF)
Color map does not contain colors from a registered color
map.
PAL_VGA (0x0000)
Color map contains the standard 16 VGA colors.
PAL_AVC198 (0x0001)
Standard AVC 198-entry palette.
Standard AVC 198-entry palette.
wCustomBase Specifies the index of the first custom color of the palette. The
beginning of the palette contains the entries of the registered map, so
wCustomBase also indicates the number of entries in the registered
palette. Map entries starting with wCustomBase comprise additional
custom colors used in the bitmap. Ignore this value if
wRegisteredPalette is PAL_UNREGISTERED, or if wCustomBase
contains 0xFFFF.
wCustomCnt Specifies the number of custom colors in the palette. Ignore this value
if wRegisteredPalette is PAL_UNREGISTERED, or if this field
contains 0xFFFF.
wRsvBase Specifies the index of the first reserved color of the palette. Reserved
colors are those reserved for menus, text, and other screen elements.
Reserved colors must be stored contiguously. Ignore this field if it
contains 0xFFFF.
wRsvCnt Specifies the number of reserved entries. Ignore this field if it contains
0xFFFF.
wArtBase Specifies the index of the first art color of the palette. Art colors are
colors used for text and drawing. Art colors consist of a number of
hues, each of which has multiple intensities. The various intensities are
used for anti-aliasing, a method of using different shades of a color to
improve the quality of images displayed on low-resolution devices.
For example, if the first art color is red anti-aliased to black with three
intensities, the first three entries in the palette would be dark red,
medium red, and bright red. The art colors constitute an array, and all
hues have the same number of intensities. The user can set both the
number of hues and the number of intensities. Ignore these fields if they
contain 0xFFFF.
wArtCnt Specifies the number of art colors. Ignore this field if it contains
0xFFFF.
wNumIntense Specifies the number of palette entries reserved for the anti-aliased
levels of a given art color. This field must be present if wArtBase is
present. Ignore this field if it contains 0xFFFF.
RTF is described in the Microsoft Word Technical Reference: For Windows and OS/2, published
by Microsoft Press.
Waveform Audio File Format (WAVE)
This section describes the Waveform format, which is used to represent digitized sound.
The WAVE form is defined as follows. Programs must expect (and ignore) any unknown chunks
encountered, as with all RIFF forms. However, <fmt-ck> must always occur before
<wave-data>, and both of these chunks are mandatory in a WAVE file.
<WAVE-form> ➝
RIFF( 'WAVE'
<fmt-ck> // Format
[<fact-ck>] // Fact chunk
[<cue-ck>] // Cue points
[<playlist-ck>] // Playlist
[<assoc-data-list>] // Associated data list
<wave-data> ) // Wave data
The WAVE format chunk <fmt-ck> specifies the format of the <wave-data>. The <fmt-ck> is
defined as follows:
<common-fields> ➝
struct
{
WORD wFormatTag; // Format category
WORD wChannels; // Number of channels
DWORD dwSamplesPerSec; // Sampling rate
DWORD dwAvgBytesPerSec; // For buffer estimation
WORD wBlockAlign; // Data block size
}
Field Description
wFormatTag A number indicating the WAVE format category of the file. The
content of the <format-specific-fields> portion of the ‘fmt’ chunk,
and the interpretation of the waveform data, depend on this value.
You must register any new WAVE format categories. See
“Registering Multimedia Formats” in Chapter 1, “Overview of
Multimedia Specifications,” for information on registering WAVE
format categories.
“Wave Format Categories,” following this section, lists the currently
defined WAVE format categories.
wChannels The number of channels represented in the waveform data, such as 1
for mono or 2 for stereo.
dwSamplesPerSec The sampling rate (in samples per second) at which each channel
should be played.
should be played.
dwAvgBytesPerSec The average number of bytes per second at which the waveform data
should be transferred. Playback software can estimate the buffer size
using this value.
wBlockAlign The block alignment (in bytes) of the waveform data. Playback
software needs to process a multiple of wBlockAlign bytes of data at
a time, so the value of wBlockAlign can be used for buffer
alignment.
The format category of a WAVE file is specified by the value of the wFormatTag field of the
‘fmt’ chunk. The representation of data in <wave-data>, and the content of the
<format-specific-fields> of the ‘fmt’ chunk, depend on the format category.
The currently defined open non-proprietary WAVE format categories are as follows:
If the wFormatTag field of the <fmt-ck> is set to WAVE_FORMAT_PCM, then the waveform
data consists of samples represented in pulse code modulation (PCM) format. For PCM waveform
data, the <format-specific-fields> is defined as follows:
<PCM-format-specific> ➝
struct
{
WORD wBitsPerSample; // Sample size
}
The wBitsPerSample field specifies the number of bits of data used to represent each sample of
each channel. If there are multiple channels, the sample size is the same for each channel.
For PCM data, the wAvgBytesPerSec field of the ‘fmt’ chunk should be equal to the following
formula rounded up to the next whole number:
wBitsPerSample
wChannels x wBitsPerSecond x
8
The wBlockAlign field should be equal to the following formula, rounded to the next whole
number:
wBitsPerSample
wChannels x
8
In a single-channel WAVE file, samples are stored consecutively. For stereo WAVE files, channel
0 represents the left channel, and channel 1 represents the right channel. The speaker position
mapping for more than two channels is currently undefined. In multiple-channel WAVE files,
samples are interleaved.
The following diagrams show the data packing for a 8-bit mono and stereo WAVE files:
Sample 1 Sample 2
Channel 0 Channel 1 Channel 0 Channel 0
(left) (right) (left) (right)
The following diagrams show the data packing for 16-bit mono and stereo WAVE files:
Sample 1 Sample 2
Channel 0 Channel 0 Channel 0 Channel 0
Sample 1
Channel 0 Channel 0 Channel 1 Channel 1
(left) (left) (right) (right)
low-order byte high-order byte low-order byte high-order byte
Each sample is contained in an integer i. The size of i is the smallest number of bytes required to
contain the specified sample size. The least significant byte is stored first. The bits that represent
the sample amplitude are stored in the most significant bits of i, and the remaining bits are set to
zero.
For example, if the sample size (recorded in nBitsPerSample) is 12 bits, then each sample is
stored in a two-byte integer. The least significant four bits of the first (least significant) byte is set
to zero.
The data format and maximum and minimums values for PCM waveform samples of various sizes
are as follows:
For example, the maximum, minimum, and midpoint values for 8-bit and 16-bit PCM waveform
data are as follows:
Example of a PCM WAVE file with 11.025 kHz sampling rate, mono, 8 bits per sample:
Example of a PCM WAVE file with 22.05 kHz sampling rate, stereo, 8 bits per sample:
Example of a PCM WAVE file with 44.1 kHz sampling rate, mono, 20 bits per sample:
Note: The ‘slnt’ chunk represents silence, not necessarily a repeated zero volume or baseline
sample. In 16-bit PCM data, if the last sample value played before the silence section is a 10000,
then if data is still output to the D to A converter, it must maintain the 10000 value. If a zero value
is used, a click may be heard at the start and end of the silence section. If play begins at a silence
section, then a zero value might be used since no other information is available. A click might be
created if the data following the silent section starts with a nonzero value.
FACT Chunk
The <fact-ck> fact chunk stores important information about the contents of the WAVE file. This
chunk is defined as follows:
The “fact” chunk is required if the waveform data is contained in a “wavl” LIST chunk and for all
compressed audio formats. The chunk is not required for PCM files using the “data” chunk format.
The "fact" chunk will be expanded to include any other information required by future WAVE
formats. Added fields will appear following the <dwFileSize> field. Applications can use the
chunk size field to determine which fields are present.
Cue-Points Chunk
The <cue-ck> cue-points chunk identifies a series of positions in the waveform data stream. The
<cue-ck> is defined as follows:
<cue-point> ➝ struct {
DWORD dwName;
DWORD dwPosition;
FOURCC fccChunk;
DWORD dwChunkStart;
DWORD dwBlockStart;
DWORD dwSampleOffset;
}
Field Description
dwName Specifies the cue point name. Each <cue-point> record must have a
unique dwName field.
dwPosition Specifies the sample position of the cue point. This is the sequential
sample number within the play order. See “Playlist Chunk,” later in
this document, for a discussion of the play order.
fccChunk Specifies the name or chunk ID of the chunk containing the cue
point.
dwChunkStart Specifies the file position of the start of the chunk containing the cue
point. This is a byte offset relative to the start of the data section of
the ‘wavl’ LIST chunk.
dwBlockStart Specifies the file position of the start of the block containing the
position. This is a byte offset relative to the start of the data section
of the ‘wavl’ LIST chunk.
dwSampleOffset Specifies the sample offset of the cue point relative to the start of the
block.
Examples of File Position Values
The following table describes the <cue-point> field values for a WAVE file containing multiple
‘data’ and ‘slnt’ chunks enclosed in a ‘wavl’ LIST chunk:
The following table describes the <cue-point> field values for a WAVE file containing a single
‘data’ chunk:
Playlist Chunk
The <playlist-ck> playlist chunk specifies a play order for a series of cue points. The <playlist-
ck> is defined as follows:
<playlist-ck> ➝ plst(
<dwSegments:DWORD> // Count of play segments
<play-segment>... ) // Play-segment table
<play-segment> ➝ struct {
DWORD dwName;
DWORD dwLength;
DWORD dwLoops;
}
Field Description
dwName Specifies the cue point name. This value must match one of the
names listed in the <cue-ck> cue-point table.
dwLength Specifies the length of the section in samples.
dwLoops Specifies the number of times to play the section.
The <assoc-data-list> associated data list provides the ability to attach information like labels to
sections of the waveform data stream. The <assoc-data-list> is defined as follows:
The ‘labl’ and ‘note’ chunks have similar fields. The ‘labl’ chunk contains a label, or title, to
associate with a cue point. The ‘note’ chunk contains comment text for a cue point. The fields are
as follows:
Field Description
dwName Specifies the cue point name. This value must match one of the
names listed in the <cue-ck> cue-point table.
data Specifies a NULL-terminated string containing a text label (for the
‘labl’ chunk) or comment text (for the ‘note’ chunk).
The “ltxt” chunk contains text that is associated with a data segment of specific length. The chunk
fields are as follows:
Field Description
dwName Specifies the cue point name. This value must match one of the
names listed in the <cue-ck> cue-point table.
dwSampleLength Specifies the number of samples in the segment of waveform data.
dwPurpose Specifies the type or purpose of the text. For example, dwPurpose
can specify a FOURCC code like ‘scrp’ for script text or ‘capt’ for
close-caption text.
wCountry Specifies the country code for the text. See “Country Codes” in
Chapter 2, “Resource Interchange File Format,” for a current list of
country codes.
wLanguage, Specify the language and dialect codes for the text. See “Language
wDialect and Dialect Codes” in Chapter 2, “Resource Interchange File
Format,” for a current list of language and dialect codes.
wCodePage Specifies the code page for the text.
Embedded File Information
The ‘file’ chunk contains information described in other file formats (for example, an ‘RDIB’ file
or an ASCII text file). The chunk fields are as follows:
Field Description
dwName Specifies the cue point name. This value must match one of the
names listed in the <cue-ck> cue-point table.
dwMedType Specifies the file type contained in the fileData field. If the fileData
section contains a RIFF form, the dwMedType field is the same as
the RIFF form type for the file.
This field can contain a zero value.
fileData Contains the media file.
Chapter 4
The Media Control Interface (MCI) is a high-level command control interface to multimedia
devices and resource files. MCI provides applications with device-independent capabilities for
controlling audio and visual peripherals. Your application can use MCI to control any multimedia
device, including audio playback and recording, as well as videodisc and videotape players.
MCI provides a standard command set for playing and recording multimedia devices and resource
files. Developers creating multimedia applications are encouraged to use this high-level command
interface rather than the low-level functions specific to each platform. The MCI command set acts
as a platform-independent layer that sits between multimedia applications and the underlying
system software.
• Developers can incorporate new multimedia devices and file formats in the MCI command set
by creating new MCI drivers to interpret the commands.
• New commands and command options can be added to support special features or functions
required by new multimedia devices or file formats.
A set of basic commands is supported by all MCI devices. Developers can also define MCI
commands and command options specific to a particular multimedia device or file format. These
device-specific commands and command options are needed only when the basic command set
does not support a feature specific to the device or file format.
Example of MCI Command Use
The following example shows a series of MCI commands that play track 6 of an audio compact
disc:
open cdaudio
set cdaudio time format tmsf
play cdaudio from 6 to 7
close cdaudio
The next example shows a similar series of MCI commands that play the first 10,000 samples of a
waveform audio file:
• The same basic commands (open, play, and close) are used with both devices.
• The open command for the “waveaudio” device includes a filename specification. The
“waveaudio” device is a compound device (one associated with a media element), while the
“cdaudio” device is a simple device (one without an associated media element).
• The set commands both specify time formats, but the time format options for the “cdaudio”
device are different from those used with the “waveaudio” device.
• The parameters used with the from and to flags are appropriate to the respective device. For
the “cdaudio” device, the parameters specify a range of tracks; for the “waveaudio” device,
the parameters specify a range of samples.
• System commands are interpreted directly by MCI rather than being relayed to a device.
• Required commands are recognized by all MCI devices. If a device does not support a
required command, it can return “unsupported function” in response to the message.
• Basic commands are optional commands. If a device uses a basic command, it must respond
to all options for that command. If a device does not use a basic command, it can return
“unrecognized command” in response to the message.
• Extended commands are specific to a device type or device class; for example, videodisc
players. These commands contain both unique commands and extensions to the required and
basic commands.
Command Syntax Conventions
Convention Description
bold MCI command or flag keyword.
italics Command parameter to be replaced with a valid string, number, or rectangle
specification.
“quotes” Parameter text to be typed exactly as shown.
[ brackets ] Optional flags or parameters
System Commands
The following list summarizes the system commands. MCI supports these commands directly
rather than passing them to MCI devices.
Message Description
sound Play system sounds defined in a system setup file.
sysinfo Returns information about MCI devices.
Required Commands
The following list summarizes the required commands. All devices recognize these messages. If a
device does not support a required command, it can return “unsupported function” in response to
the message.
Message Description
capability Obtains the capabilities of a device.
close Closes the device.
info Obtains textual information from a device.
open Initializes the device.
status Returns various status information from the device.
Basic Commands
The following list summarizes the basic commands. MCI devices are not required to recognize
these commands. If the device does not recognize a basic command, it can return “unrecognized
command” in response to the message.
Message Description
load Recalls data from a disk file.
pause Stops playing.
play Starts transmitting output data.
record Starts recording input data.
resume Resumes playing or recording from a paused state.
save Saves data to a disk file.
seek Seeks forward or backward.
set Sets the operating state of the device.
status Obtains status information about the device. (The flags for this command
supplement the flags for the command in the required command group.)
stop Stops playing.
Extended Commands
MCI devices can have additional commands or extend the definition of the required and basic
commands. While some extended commands only apply to a specific device driver most of them
apply to all devices of a particular type. For example, the MIDI sequencer command set extends
the set command to add time formats needed by MIDI sequencers.You can find descriptions of
extended commands in the command tables in this chapter.
The following commands can be defined as extended commands. With the exception of the delete
command, they are not currently defined for any MCI devices.
Message Description
copy Copies data to the Clipboard. Parameters and flags for this message vary
according to the selected device.
cut Moves data from the MCI element to the Clipboard. Parameters and flags for
this message vary according to the selected device.
delete Removes data from the MCI element. Parameters and flags for this message
vary according to the selected device.
Creating a Command String
There are three components associated with each command string: the command, the name or ID
of the device receiving the command, and the command arguments. A command string has the
following form:
• The command includes a command from the system, required, basic, or extended command
set. Examples of commands include open, close, and play.
• The device_name designates the target of the command. MCI accepts the names of MCI
device types and names of media elements for the device_name. An example of a device
name is “cdAudio”.
• The arguments specify the flags and parameters used by the command. Flags are key words
recognized by the MCI command, and parameters are variables associated with the MCI
command or flag. Parameters specify variable data values such as filenames, track or frame
numbers, or speed values. You can use the following data types for the parameters in a string
command:
• Strings–String data types can be delimited by leading and trailing white space or by
matching quotation marks. If MCI encounters a single (unmatched) quotation mark, it
ignores the quotation mark. To embed a quote in string, use two quotes (""). To specify
an empty string, you can use double quotes ("") for the string.
• Signed long integers–Signed long integer data types are delimited by leading and trailing
white space. Unless otherwise specified, integers can be positive or negative. If using
negative integers, do not embed white space between the negative sign and the first digit.
• Rectangle–Rectangle data types are an ordered list of four signed integer values. White
space delimits this data type as well as separates each integer in the list.
For example, the play command uses the arguments “from position to position” to specify
starting and ending points for the playback. The from and to arguments are flags, and the two
position values are parameters.
For example, the following command string instructs the CD audio player “cdaudio” to play from
the start of the waveform to position 500:
Unspecified command arguments assume a default value. For example, if the flag from was
unspecified in the previous example, the audio player would start playing at the current position.
About MCI Device Types
Your application identifies an MCI device by specifying an MCI device type. A device type
indicates the physical type of device. The following table lists the currently defined MCI device
types:
If you have a particular device type installed more than once, the device type names in the system
setup file have integers appended to them. This creates unique names for each MCI device type
entry. For example, if the “cdaudio” device type is installed twice, the names “cdaudio1” and
“cdaudio2” are used to create unique names for each occurrence of the device type. Each name
usually refers to a different CD audio player in the system.
Opening a Device
Before using a device, you must initialize it with the open command. The number of devices you
can have open depends on the amount of available memory. The open command has the following
syntax:
Parameters Description
device_name Specifies the destination device or MCI element name (filename).
shareable Allows applications to share a common device or device element.
type device_type Specifies the device when the device_name refers to an MCI
element.
alias alias Specifies an alternate name for the device.
MCI classifies device drivers as compound and simple. Compound device drivers use a device
element–a media element associated with a device–during operation. For most compound device
drivers, the device element is the source or destination data file. For file elements, the element
name references a file and its path.
Simple device drivers do not require a device element for playback. For example, compact disc
audio device drivers are simple device drivers.
Simple devices require only the device_name for operation. You don't need to provide any
additional information (such as a name of a data file) to open these devices. For these devices,
substitute the name of a device type obtained from the system setup file. For example, you can
open a videodisc device with the following command:
open videodisc1
To determine the capabilities of a device, you can open a device by specifying only the device
type. When opened this way, most compound devices will let you determine their capabilities and
close them. For example, you can open the sequencer with the following command:
open sequencer
To associate a device element with a particular device, you must specify the element name and
device type. In the open command, substitute the element name for the device_name, add the type
flag, and substitute the name of the device you want to use for device_type. This combination lets
your application specify the MCI device it needs to use. For example, you can open a device
element of the waveaudio device with the following command:
To associate a default MCI device with a device element, you can specify just an element name. In
this case, MCI uses the filename extension of the element name to select the device type.
Using the Shareable Flag
The shareable flag lets multiple applications or tasks concurrently access the same device (or
element) and device instance.
If your application opens a device or device element without the shareable flag, no other
application can access it simultaneously. If your application opens a device or device element as
shareable, other applications can also access it by also opening it as shareable. The shared device
or device element gives each application the ability to change the parameters governing the
operating state of the device or device element. Each time that a device or device element is
opened as shareable, a unique device ID is returned (even though the device IDs refer to the same
instance)
If you make a device or device element shareable, your application should not make any
assumptions about the state of a device. When working with shared devices, your application
might need to compensate for changes made by other applications using the same services.
If a device can service only one application or task it will fail an open with the shareable flag.
While most compound device elements are not shareable, you can open multiple elements (where
each element is unique), or you can open a single element multiple times. If you open a single file
element multiple times, MCI creates an independent instance for each open device. Each file
element opened within a task must have a unique name. The alias flag described in the next
section lets you use a unique name for each element.
The alias flag specifies an alternate name for the given device. The alias provides a shorthand
notation for compound devices with lengthy pathnames. If your application creates a device alias,
it must use the alias rather than the device name for all subsequent references.
To create a new device element for a task such as capturing a sound using waveform recording,
specify new as a device_name. MCI does not save a new file element until you save it with the
save command. When creating a new file, you must include a device alias with the open
command. The following commands open a new waveaudio device element, start and stop
recording, save the file element, and close the device element:
Closing a Device
The close command releases access to a device or device element. To help MCI manage the
devices, your application must explicitly close each device or device element when it is finished
with it.
Shortcuts and Variations for MCI Commands
The MCI string interface lets you use several shortcuts when working with MCI devices.
You can specify all as a device_name for any command that does not return information. When
you specify all, the command is sent to all devices opened by your application. For example,
“close all” closes all open devices and “play all” starts playing all devices opened by the task.
Because MCI sends the commands to each device, there is a delay between when the first device
receives the command and when the last device receives the command.
You can eliminate the type flag in the open command if you combine the device type with the
device element name. MCI recognizes this combination when you use the following syntax:
device_type!element_name
The exclamation mark separates the device type from the element name. The following example
opens the right.wav element with the waveaudio device:
open waveaudio!right.wav
Automatic Open
If MCI cannot identify the device_name as an already open device, MCI tries to automatically
open the specified device. Automatic open does not let your application specify the type flag. If
the device type is not supplied, MCI determines the device type from the element (filename)
extensions listed in the system setup file. If you want to use a specific device, you can combine the
device type name with the device element name using the exclamation mark.
Only the command-string interface supports automatic open. Automatic open will fail for device-
specific commands. For example, a command to unlock the front panel of a videodisc player will
fail an automatic open because this capability is specific to the particular videodisc player.
A device that was opened using the automatic open feature will not respond to a command that
uses all as a device name.
Automatic Close
MCI automatically closes any device automatically opened using the command-string interface.
MCI closes a device when the command completes, when you abort the command, when you
request notification with a subsequent command, or when MCI detects a failure.
Using Wait and Notify Flags
Normally, MCI commands return to the user immediately, even if it takes several minutes to
complete the action initiated by the command. For example, after a VCR device receives a rewind
command, it returns before the tape has finished rewinding. You can use either of the following
required MCI flags to modify this default behavior:
Flag Description
notify Directs the device to send an MM_MCINOTIFY message to a
window when the requested action is complete.
wait Directs the device to wait until the requested action is complete
before returning to the application.
The notify flag directs the device to post an MM_MCINOTIFY message when the device
completes an action. Your application must have a window procedure to process the
MM_MCINOTIFY message for notification to have any effect. While the results of a notification
are application-dependent, the application's window procedure can act upon four possible
conditions associated with the notify message:
A successful notification occurs when the conditions required for initiating the callback are
satisfied and the command completed without interruption.
A notification is superseded when the device has a notification pending and you send it another
notify request. When a notification is superseded, MCI resets the callback conditions to
correspond to the notify request of the new command.
A notification is aborted when you send a new command that prevents the callback conditions set
by a previous command from being satisfied. For example, sending the stop command cancels a
notification pending for the “play to 500” command. If your command interrupts a command that
has a notification pending, and your command also requests notification, MCI will abort the first
notification immediately and respond to the second notification normally.
A notification fails if a device error occurs while a device is executing the MCI command. For
example, MCI posts this message when a hardware error occurs during a play command.
Obtaining Information From MCI Devices
Every device responds to the capability, status, and info commands. These commands obtain
information about the device. For example, your application can determine if a videodisc requires
a device element using the following command:
For most videodisc devices, this example would return false. The flags listed for the required and
basic commands provide a minimum amount of information about a device. Many devices
supplement the required and basic flags with extended flags to provide additional information
about the device.
When you request information with the capability, status, or info command, the argument list can
contain only one flag requesting information. The string interface can only return one string or
value in response to a capability, status, or info command.
The play command starts playing a device. Without any flags, the play command starts playing
from the current position and plays until the command is halted or until the end of the media or
file is reached. For example, “play cdaudio” starts playing an audio disc from the position where it
was stopped.
Most devices support the play command also support the from and to flags. These flags indicate
the position at which the device should start and stop playing. For example, “play cdaudio from 0”
plays the audio disc from the beginning of the first track. The units assigned to the position value
depend on the device. For example, the position is normally specified in frames for CAV
videodiscs, and milliseconds for digital audio.
As an extended command, devices add flags to use the capabilities of a particular device. For
example, the play command for videodisc players adds the flags fast, slow, reverse, and scan.
The stop command suspends the playing or recording of a device. Many devices include the basic
command pause, which also suspends these sessions. The difference between stop and pause
depends on the device. Usually pause suspends operation but leaves the device ready to resume
playing or recording immediately.
Using play or record to restart a device will reset the to and from positions specified before the
device was paused or stopped. Without the from flag, these commands reset the start position to
the current position. Without the to flag, they reset the end position to the end of the media. If you
want to continue playing or recording but want to stop at a position previously specified, use the
to flag with these commands and repeat the position value.
Some devices include the resume command to restart a paused device. This command does not
change the to and from positions specified with the play or record command, which preceded the
pause command.
MCI System Commands
The following commands are interpreted directly by MCI. The remaining command tables list
commands interpreted by the devices.
Command Description
sound The device name of this command specifies a sound defined in a system
setup file.. If it is not found, MCI uses a system default sound.
sysinfo item Obtains MCI system information. One of the following items modifies
sysinfo:
installname Returns the name used to install the device.
quantity Returns the number of MCI devices of the type
specified by the device-name field. The device-
name field must contain a standard MCI device
type. Any digits after the name are ignored. The
special device name all returns the total number of
MCI devices in the system.
quantity open Returns the number of open MCI devices of the
type specified by the device name. The device
name must be a standard MCI device type. Any
digits after the name are ignored. The special
device name all returns the total number of MCI
devices in the system that are open.
name index Returns the name of an MCI device. The index
ranges from 1 to the number of devices of that
type. If all is specified for the device name, index
ranges from 1 to the total number of devices in the
system.
name index open Returns the name of an open MCI device. The
index ranges from 1 to the number of devices of
that type. If all is specified for the device name,
index ranges from 1 to the total number of devices
in the system.
Required Commands for All Devices
The following commands are recognized by all devices. Extended commands can add other
options to these commands. A list of the errors common to all the commands follows the required
command table.
Command Description
capability item Requests information about a particular capability of a device. While other
capabilities are defined for specific devices and device types, the following
items are always available:
can eject Returns true if the device can eject the media.
can play Returns true if the device can play.
can record Returns true if the device supports recording.
can save Returns true if the device can save data.
compound device Returns true if the device requires an element
name.
device type Returns one of the following:
audio tape
cdaudio
digital audio tape
scanner
sequencer
videodisc
videotape
waveaudio
has audio Returns true if the device supports audio
playback.
has video Returns true if the device supports video.
uses files Returns true if the element of a compound device
is a file pathname.
close When sent to a simple device, closes the device. When sent to a compound
device element, closes the element and any resources associated with it.
MCI unloads a device when it is no longer being used.
info item Fills a user-supplied buffer with a NULL-terminated string containing
textual information. One of the following item modifies info:
product Returns a description of the hardware associated
with a device. This usually includes the
manufacturer and model information.
open items Initializes the device. The following optional items modify open:
alias device alias Specifies an alternate name for the given device. If
specified, it must be used for subsequent
references.
shareable Initializes the device or element as shareable.
Subsequent attempts to open it fail unless you
specify shareable in both the original and
subsequent open commands. MCI returns an error
if it is already open and not shareable.
if it is already open and not shareable.
type device type Specifies the compound device that controls a
device element. As an alternative to type, MCI can
use the filename extension entries to select the
device based on the extension used by the device
element.
status item Obtains status information for the device. One of the following items
modifies status:
mode Returns the current mode of the device.
Commonly supported standard modes are: not
ready, paused, playing, stopped, open,
recording, and seeking
ready Returns true if the device is ready.
Command Description
load item Load a device element from disk. The following optional item modifies
load:
filename Specifies the source path and file.
pause Pauses playing or recording.
play items Start playing the device. The following optional items modify play:
from position Specifies the position to start and stop playing.
to position If from is omitted, the play starts from the
current position; if to is omitted, the play
stops at the end of the media.
record items Start recording data. All data recorded after a file is opened is discarded
if the file is closed without saving it. The following optional items
modify record:
insert Specifies that new data is added to the device
element at the current position.
from position Specifies the positions to start and stop
to position recording. If from is omitted, the device starts
recording at the current position; if to is
omitted, the device records until a stop or
pause command is received.
overwrite Specifies that new data will replace data in the
device element.
The default recording mode (insert or overwrite) depends on the
specific device. Each device should define a default recording mode.
resume Resumes playing or recording following a pause.
save item Saves the MCI element. The following optional item modifies save:
filename Specifies the destination path and file.
seek item Moves to the specified position and stops. One of the following is
required for item :
to position Specifies the position to stop the seek.
to start Seeks to the start of the media or device
element.
to end Seeks to the end of the media or device
element.
set items Sets the various control items:
audio all off Enables or disables audio output
audio all on
audio left off Enables or disables output to the left audio
audio left on channel.
audio right off Enables or disables output to the right audio
audio right on channel.
door closed Loads the media and closes the door if
possible.
door open Opens the door and ejects the tray if possible.
time format Sets time format to milliseconds. All position
milliseconds information is this format after this command.
You can abbreviate milliseconds as ms.
video off Enables or disables video output.
video on
status item Obtains status information for the device. One of the following items
modifies status:
current track Returns the current track.
length Returns the total length of the segment.
length track Returns the length of the serial track specified
track_number by track_number.
number of tracks Returns the number of tracks on the media.
position Returns the current position.
position track Returns the position of the start of the track
track_number specified by track_number.
start position Returns the starting position of the media or
device element.
time format Returns the time format.
stop Stops the device.
CD Audio (Redbook) Commands
The CD audio command set provides a common method for playing CD audio sequencesCD audio
devices support the following core set of commands:
Command Description
capability item Requests information about the capabilities of the CD audio device.
One of the following items is required:
can eject Returns true if the CD audio device can eject
the media.
can play Returns true if the CD audio device can play
the media.
can record Returns false.
can save Returns false.
compound device Returns false.
device type Returns CDaudio.
has audio Returns true.
has video Returns false.
uses files Returns false..
close Closes the device.
info item Fills a user-supplied buffer with a NULL-terminated string containing
textual information. One of the following optional item modifies info:
product Returns the product name and model of the
current audio device.
open items Initializes the device. MCI reserves cdaudio for the compact disc audio
device type. The following optional items modify open:
alias device_ alias Specifies an alternate name for the given
device. If specified, it must also be used for
subsequent references.
shareable Initializes the device as shareable. Subsequent
attempts to open it fail unless you specify
shareable in both the original and subsequent
open commands. MCI returns an error if it is
already open and not shareable.
pause Pauses playing.
play items Starts playing audio. The following optional items modify play:
from position to Specifies the position to start and stop playing.
position
resume Resumes playing from a paused state.
seek item Moves to the specified location on the disc. If already playing or
recording, the device is stopped. One of the following items modifies
seek:
to position Specifies the destination position for the seek.
If it is greater than the length of the disc, an
out-of-range error is returned.
If it is greater than the length of the disc, an
out-of-range error is returned.
to start Specifies to seek to the start of the audio data
on the CD.
to end Specifies to seek to the end of the audio data
on the CD.
set items Sets the various control items:
audio all off Enables or disables audio output..
audio all on
audio left off Enables or disables output to the left audio
audio left on channel.
audio right off Enables or disables output to the right audio
audio right on channel.
door closed Retracts the tray and closes the door if
possible.
door open Opens the door and ejects the tray if possible.
time format Sets the time format to milliseconds. All
milliseconds position information is this format after this
command. You can abbreviate milliseconds as
ms.
time format msf Sets the time format to mm:ss:ff, where mm is
minutes, ss is seconds, and ff is frames. All
position information is in this format after this
command. On input, ff can be omitted if 0, and
ss can be omitted if both it and ff are 0. These
fields have the following maximum values:
Minutes 99
Seconds 59
Frames 74
time format tmsf Sets the time format to tt:mm:ss:ff where “tt”
is tracks, “mm” is minutes, “ss” is seconds,
and “ff” is frames. All position information is
in this format after this command. On input
“ff” can be omitted if 0, “ss” can be omitted if
both it and “ff” are 0, and “mm” can be
omitted if it, “ss” and “ff” are 0. These fields
have the following maximum values:
Tracks 99
Minutes 99
Seconds 59
Frames 74
status item Obtains status information for the device. One of the following items
modifies status:
current track Returns the current track.
length Returns the total length of the disc.
length track Returns the length of the track specified by
track_number track_number.
media present Returns true if the CD is inserted in the drive;
otherwise, it returns false.
mode Returns not ready, open, paused, playing,
seeking, or stopped for the current mode of
the drive.
number of tracks Returns the number of tracks on the CD.
position Returns the current position.
position track Returns the starting position of the track
track_no specified by track_no.
ready Returns true if the drive is ready.
start position Returns the starting position of the CD.
time format Returns the current time format.
stop Stops playing.
MIDI Sequencer Commands
The MIDI sequencer supports the following set of commands:
Command Description
capability item Requests additional information about the capabilities of the MIDI
sequencer. One of the following items is required:
can eject Returns false..
can play Returns true if the sequencer can play.
can record Returns true if the sequencer can record MIDI
data.
can save Returns true if the sequencer can save MIDI
data.
compound device Generally returns true; most sequencers are
compound devices..
device type Returns sequencer.
has audio Returns true.
has video Returns false.
uses files Returns true.
close Closes the sequencer element and the port and file associated with it.
info item Fills a user-supplied buffer with a NULL-terminated string containing
textual information. One of the following optional item modifies info:
product Returns the product name of the current MIDI
sequencer.
open items Initializes the sequencer. The following optional items modify open:
alias device_ alias Specifies an alternate name for the sequencer
element. If specified, it must also be used for
subsequent references.
shareable Initializes the sequencer element as shareable.
Subsequent attempts to open it fail unless you
specify shareable in both the original and
subsequent open commands. MCI returns an
invalid device error if it is already open and
not shareable.
type device_ type MCI reserves sequencer for the MIDI
sequencer device type. As an alternative to
type, MCI can use the element filename
extension entries to select the sequencer.
pause Pauses playing.
play items Starts playing the sequencer. The following optional items modify
play:
from position Specifies the positions to start and stop
to position playing. If from is omitted, play starts at the
current position; if to is omitted, play stops at
the end of the file.
the end of the file.
record items Starts recording MIDI data. All data recorded after a file is opened is
discarded if the file is closed without saving it. The following optional
items modify record:
insert Specifies that new data is added to the device
element.
from position Specifies the positions to start and stop
to position recording. If from is omitted, the device starts
recording at the current position; if to is
omitted, the device records until a stop or
pause command is received.
overwrite Specifies that new data will replace data in the
device element.
resume Resumes playing or recording following a pause.
save item Saves the MCI element. The following item modifies save:
filename The filename specifies the destination path
and file.
seek item Moves to the specified position in the file. One of the following items is
required:
to position Specifies the final position for the seek.
to start Specifies to seek to the start of the sequence.
to end Specifies to seek to the end of the sequence.
set items Sets the various control items:
audio all off Enables or disables audio output..
audio all on
audio left off Enables or disables output to the left audio
audio left on channel.
audio right off Enables or disables output to the right audio
audio right on channel.
master MIDI Sets the MIDI sequencer as the
synchronization source. Synchronization data
is sent in MIDI format.
master none Inhibits the sequencer from sending
synchronization data.
master SMPTE Sets the MIDI sequencer as the
synchronization source. Synchronization data
is sent in SMPTE format.
offset time Sets the SMPTE offset time in colon form
(hours:minutes:seconds:frames). The offset is
the beginning time of a SMPTE based
sequence.
port port_number Sets the MIDI port receiving the MIDI
messages. This command will fail if the port
you are trying to open is being used by
another application.
port mapper Sets the MIDI mapper as the port receiving
the MIDI messages. This command will fail if
the MIDI mapper or a port it needs is being
used by another application.
the MIDI mapper or a port it needs is being
used by another application.
port none Disables the sending of MIDI messages..
slave file Sets the MIDI sequencer to use file data as the
synchronization source. This is the default.
slave MIDI Sets the MIDI sequencer to use incoming data
MIDI for the synchronization source. The
sequencer recognizes synchronization data
with the MIDI format.
slave none Sets the MIDI sequencer to ignore
synchronization data.
slave SMPTE Sets the MIDI sequencer to use incoming
MIDI data for the synchronization source. The
sequencer recognizes synchronization data
with the SMPTE format.
tempo Sets the tempo of the sequence according to
tempo_value the current time format. For a ppqn-based file,
the integer is interpreted as beats per minute.
For a SMPTE-based file, the integer is
interpreted as frames per second.
time format Sets time format to milliseconds. All position
milliseconds information is specified as milliseconds
following this command. The sequence file
sets the default format to ppqn or SMPTE.
You can abbreviate milliseconds as ms.
time format song Sets time format to song pointer (sixteenth
pointer notes). This can only be performed for a
sequence of division type ppqn.
time format Sets time format to SMPTE 24 frame rate. All
SMPTE 24 position information is specified in SMPTE
format following this command. The sequence
file sets the default format to ppqn or SMPTE.
time format Sets time format to SMPTE 25 frame rate. All
SMPTE 25 position information is specified in SMPTE
format following this command. The sequence
file sets the default format to ppqn or SMPTE.
time format Sets time format to SMPTE 30 frame rate. All
SMPTE 30 position information is specified in SMPTE
format following this command. The sequence
file sets the default format to ppqn or SMPTE.
time format Sets time format to SMPTE 30 drop frame
SMPTE 30 drop rate. All position information is specified in
SMPTE format following this command. The
sequence file sets the default format to ppqn
or SMPTE.
status item Obtains status information for the MIDI sequencer. One of the
following items modifies status:
current track Returns the current track number.
division type Returns one of the following file division
type: PPQN, SMPTE 24 frame, SMPTE 25
frame, SMPTE 30 drop frame, or SMPTE 30
frame. Use this information to determine the
format of the MIDI file, and the meaning of
tempo and position information.
frame, SMPTE 30 drop frame, or SMPTE 30
frame. Use this information to determine the
format of the MIDI file, and the meaning of
tempo and position information.
length Returns the length of a sequence in the current
time format. For ppqn files, this will be song
pointer units. For SMPTE files, this will be in
colon form (hours:minutes:seconds:frames).
length track Returns the length of a sequence using the
track_number current time format. For ppqn files, this will
be song pointer units. For SMPTE files, this
will be in colon form
(hours:minutes:seconds:frames).
master Returns midi, none, or smpte depending on
the type of synchronization set.
media present The sequencer returns true.
mode Returns not ready, paused, playing, seeking,
or stopped.
number of tracks Returns the number of tracks.
offset Returns the offset of a SMPTE-based file. The
time is returned in colon form
(hours:minutes:seconds:frames). The offset is
the starting time of a SMPTE based sequence.
port Returns the MIDI port number assigned to the
sequence.
position Returns the current position of a sequence in
the current time format. For ppqn files, this
will be song pointer units. For SMPTE files,
this will be in colon form
(hours:minutes:seconds:frames).
position track Returns the current position of the track
track_number specified by track_number in the current time
format. For ppqn files, this will be song
pointer units. For SMPTE files, this will be in
colon form (hours:minutes:seconds:frames).
ready Returns true if the device is ready.
slave Returns file, midi, none, or smpte depending
on the type of synchronization set.
start position Returns the starting position of the media or
device element.
tempo Returns the current tempo of a sequence in the
current time format. For files with ppqn
format, the tempo is in beats per minute. For
files with SMPTE format, the tempo is in
frames per second.
time format Returns the time format.
stop Stops playing.
Videodisc Player Commands
Videodisc players support the following core set of commands:
Command Description
capability item Reports the capabilities of the device. The device should report
capabilities according to the type of disc (CAV or CLV) inserted in the
drive. If no disc is inserted, the device should assume CAV. One of the
following optional items modifies capability:
can eject Returns true if the device can eject the media.
can play Returns true if the device supports playing.
can record Returns true if the video device can record.
can reverse Returns true if the device can play in reverse,
false otherwise. This is always false if a CLV
disc is inserted.
can save Returns false.
compound device Returns false.
device type Returns videodisc.
fast play rate Returns the standard fast play rate of the
player in frames per second. Returns 0 if the
device cannot play fast.
has audio Returns true if the videodisc player has audio.
has video Returns true.
media type Returns CAV, CLV, or other, depending on
the type of videodisc.
normal play rate Returns the normal play rate in frames per
second. Returns 0 for CLV discs.
slow play rate Returns the standard slow play rate in frames
per second. Returns 0 if the device cannot
play slow.
uses files Returns false.
close Closes the device.
escape item Sends custom information to a device. The following item modifies
escape:
string Specifies the custom infomation sent to the
device.
info item Fills a user-supplied buffer with a NULL-terminated string containing
textual information. The following optional item modifies info:
product Returns the product name of the device that
the peripheral is controlling..
open items Initializes the device. MCI reserves video disc for the videodisc device
type. The following optional items modify open:
alias device_ alias Specifies an alternate name for the given
device. If specified, it must also be used for
subsequent references.
device. If specified, it must also be used for
subsequent references.
shareable Initializes the device as shareable. Subsequent
attempts to open it fail unless you specify
shareable in both the original and subsequent
open commands. MCI returns an invalid
device error if it is already open and not
shareable.
pause Stops playing. If a CAV disc is playing, it also freezes the video frame.
If a CLV disc is playing, the player is stopped.
play items Starts playing. The following optional items modify play:
fast Indicates that the device should play faster or
slow slower than normal. To determine the exact
speed on a particular player, use the status
speed command. To specify the speed more
precisely, use the fps flag. Slow applies only
to CAV discs.
from position Specifies the positions to start and stop
to position playing. Positions are in frames for CAV discs
and in seconds for CLV discs, unless chapter
is also used (in which case, the position is
given in chapters). If from is omitted, play
starts at the current position; if to is omitted,
the play stops at the end of the disc.
reverse Sets the play direction to backwards. This
applies only to CAV discs.
scan Indicates the play speed is as fast as possible,
possibly with audio disabled. This applies
only to CAV discs.
speed integer Specifies the rate of play. Currently supported
speed values are measured in frames per
second, which is the default. This applies only
to CAV discs.
resume Resumes playing.
seek item Searches using fast forward or fast reverse with video and audio off.
The following optional items modify seek:
reverse Indicates the seek direction on CAV discs is
backwards. This modifier is invalid if to is
specified.
to position Specifies the end position to stop the seek. If
to is not specified, the seek continues until the
end of the media is reached.
to start Specifies to seek to the start of the disc.
to end Specifies to seek to the end of the disc.
set items Sets the various control items:
audio all off Enables or disables audio output.
audio all on
audio left off Enables or disables output to the left audio
audio left on channel.
audio right off Enables or disables output to the right audio
audio right on channel.
door open Opens the door and ejects the tray, if possible.
door closed Retracts the tray and closes the door, if
possible.
time format Sets the position format to frames on CAV
frames discs. All position information is specified in
this format following this command. This is
the default for CAV discs.
time format hms Sets position format to h:mm:ss where h is
hours, mm is minutes, and ss is seconds. All
position information is specified in this format
following this command. On input, h may be
omitted if 0, and mm may be omitted if both it
and h are 0. This is the default for CLV discs.
time format Sets the position format to milliseconds. All
milliseconds position information is specified in this format
following this command. You can abbreviate
milliseconds as ms.
time format track Sets the position format to tracks (chapters).
All position information is specified in this
format following this command.
video on Turns the video on or off.
video off
spin item Starts the disc spinning or stops the disc from spinning. One of the
following items modifies status:
down Stops the disc from spinning.
up Starts the disc spinning.
status item Obtains status information for the device. One of the following items
modifies status:
current track Returns the current track (chapter) number.
disc size Returns either 8 or 12 to indicate the size of
the loaded disc in inches.
forward Returns true if the play direction is forward or
if the device is not playing; false if the play
direction is backward.
length Returns the total length of the segment.
length track Returns the length of the track (chapter)
track_number specified by track_number.
media present Returns true if a disc is inserted in the device,
false otherwise.
media type Returns either CAV, CLV, or other
depending on the type of videodisc.
mode Returns not ready, opened, paused, parked,
playing, scanning, seeking, or stopped.
number of tracks Returns the number of tracks (chapters) on the
media.
position Returns the current position.
position track Returns the position of the start of the track
track_number (chapter) specified by track_number.
ready Returns true if the device is ready.
side Returns 1 or 2 to indicate which side of the
disc is loaded.
speed Returns the speed in frames per second.
start position Returns the starting position of the disc.
time format Returns the time format.
step items Step the play one or more frames forward or backward. The default
action is to step one frame forward. The step command applies only to
CAV discs. The following items modifies step:
by frames Specifies the number of frames to step. If a
negative value is used, the reverse flag is
ignored.
reverse Step backward.
stop Stop playing.
Waveform Audio Commands
Waveform audio drivers must support the following core set of commands:
Command Description
capability item Requests additional information about the capabilities of the waveform
audio driver. One of the following items modify capability:
can eject Returns false.
can play Returns true if the device can play. The wave
audio device returns true if an output device is
available.
can record Returns true if the waveform driver can
record. The waveform audio device returns
true if an input device is available.
can save Returns true if the wave audio device can
save data.
compound device Generally returns true; most waveform audio
devices are compound devices.
device type Returns waveaudio.
has audio Returns true
has video Returns false.
inputs Returns the total number of input devices.
outputs Returns the total number of output devices.
uses files Returns true.
close Closes the device element and any resources associated with it.
cue item Prepares for playing or recording. The cue command does not have to
be issued prior to playing or recording. However, depending on the
device, it might reduce the delay associated with the play or record
command. This command fails if playing or recording is in progress.
The item is one of the following:
input Prepares for recording.
output Prepares for playing. This is the default.
delete items Deletes a data segment from the MCI element. The following optional
items modify delete:
from position Specifies the positions to start and stop
to position deleting data. If from is omitted, the deletion
starts at the current position; if to is omitted,
the deletion stops at the end of the file or
waveform.
info item Fills a user-supplied buffer with a NULL-terminated string containing
textual information. One of the following items modifies info:
file Returns the current filename.
product Returns the product name of the current audio
output device.
output device.
input Returns the product name of the current
waveform input device or none if no device is
set.
output Returns the product name of the current
waveform output device or none if no device
is set.
open items Initializes the device. The following items are optional:
alias device_ alias Specifies an alternate name for the given
device. If specified, it must also be used the
alias for references.
buffer buffer_size Sets the size in seconds of the buffer used by
the wave audio device. The default size of the
buffer is set when the wave audio device is
installed or configured. Typically, the buffer
size is set to 4 seconds.
shareable Initializes the device element as shareable.
Subsequent attempts to open it fail unless you
specify shareable in both the original and
subsequent open commands. MCI returns an
error if it is already open and not shareable.
type device_type Specifies the compound device used to control
a device element. MCI reserves waveaudio for
the waveform audio device type. As an
alternative to type, MCI can use the element
filename extension entries to select the
controlling device
pause Pauses playing or recording.
play items Starts playing audio. The following optional items modify play:
from position Specifies the positions to start and stop
to position playing. If from is omitted, play starts at the
current position; if to is omitted, play stops at
the end of the file or waveform.
record items Starts recording audio. All data recorded after a file is opened is
discarded if the file is closed without saving it. The following optional
items modify record:
insert Specifies that new data is added to the device
element.
from position Specifies the positions to start and stop
to position recording. If from is omitted, the device starts
recording at the current position; if to is
omitted, the device records until a stop or
pause command is received.
overwrite Specifies that new data will replace data in the
device element.
resume Resumes playing or recording following a pause.
save item Saves the MCI element in its current format. The following item
modifies save:
filename Specifies the file and pathname used to save
data.
data.
seek item Moves to the specified location in the file. Playback or recording is
stopped after the seek. One of the following items modify seek:
to position Specifies the stop position.
to start Specifies to seek to the first sample.
to end Specifies to seek to the last sample.
set items Sets the following control items:
alignment integer Sets the alignment of data blocks. The file is
saved in the new format.
any input Use any input that supports the current format
when recording. This is the default.
any output Use any output that supports the current
format when playing. This is the default.
audio all off Enables or disables audio output.
audio all on
audio left off Enables or disables output to the left audio
audio left on channel.
audio right off Enables or disables output to the right audio
audio right on channel.
bitspersample Sets the number of bits per sample played or
bit_count recorded. The file is saved in this format.
bytespersec Sets the average number of bytes per second
byte_rate played or recorded. The file is saved in this
format.
channels Sets the channel count for playing and
channel_count recording. The file is saved in this format.
format tag tag Sets the format type for playing and recording.
The file is saved in this format.
format tag pcm Sets the format type to PCM for playing and
recording. The file is saved in this format.
input integer Sets the audio channel used as the input.
output integer Sets the audio channel used as the output.
samplespersec Sets the sample rate for playing and recording.
integer The file is saved in this format.
time format bytes Sets the time format to bytes. All position
information is specified as bytes following
this command.
time format Sets the time format to milliseconds. All
milliseconds position information is specified as
milliseconds following this command. You
can abbreviate milliseconds as ms.
time format Sets the time format to samples. All position
samples information is specified as samples following
this command.
status item Obtains status information for the device. One of the following items
modifies status:
alignment Returns the block alignment of data in bytes.
bitspersample Returns the bits per sample.
bytespersec Returns the average number of bytes per
second played or recorded.
channels Returns the number of channels set (1 for
mono, 2 for stereo).
current track Returns the index of the current track.
format tag Returns the format tag.
input Returns the currently set input. If no input is
set, the error returned indicates that any device
can be used.
length Returns the total length of the waveform.
length track Returns the length of the waveform track.
track_number
level Returns the current audio sample value.
media present Returns true.
mode Returns not ready, paused, playing, stopped,
recording, or seeking.
number of tracks Returns the number of tracks (chapters).
output Returns the currently set output. If no output
is set, the error returned indicates that any
device can be used.
position Returns the current position.
position track Returns the position of the track specified by
track_number track_number.
ready Returns true if the device is ready.
samplespersec Returns the number of samples per second
played or recorded.
start position Returns the starting position of the waveform
data.
time format Returns the current time format.
stop Stops playing or recording.