Returning Information in the MCI Data Structure

When you use an MCI data structure to return integer information that also has a string equivalent, MCI needs the string ID to find it in the resource table. The high-order word of the return field is set to the string ID. The low-order word of the return field is set to the return value. You can use the MAKEMCIRESOURCE macro to combine these values. For example, the follow statement assigns information for the songpointer format to the return field:

lpStatus->dwReturn = MAKEMCIRESOURCE (MCI_SEQ_FORMAT_SONGPTR,

MCI_SEQ_FORMAT_SONGPTR_S);

Many of the return values defined in MMSYSTEM.H also have a string resource ID defined in MMDDK.H. Identifiers which are only used for return values and are not input parameters will normally have only one version (they do not have a resource identifier with the _S suffix). The following string resource IDs are defined by MMDDK.H:

String Resource ID MCI Constant

MCI_FORMAT_MILLISECONDS_S MCI_FORMAT_MILLISECONDS
MCI_FORMAT_HMS_S MCI_FORMAT_HMS
MCI_FORMAT_MSF_S MCI_FORMAT_MSF
MCI_FORMAT_FRAMES_S MCI_FORMAT_FRAMES
MCI_FORMAT_SMPTE_24_S MCI_FORMAT_SMPTE_24
MCI_FORMAT_SMPTE_25_S MCI_FORMAT_SMPTE_25
MCI_FORMAT_SMPTE_30_S MCI_FORMAT_SMPTE_30
MCI_FORMAT_SMPTE_30DROP_S MCI_FORMAT_SMPTE_30DROP
MCI_FORMAT_BYTES_S MCI_FORMAT_BYTES
MCI_FORMAT_SAMPLES_S MCI_FORMAT_SAMPLES
MCI_FORMAT_TMSF_S MCI_FORMAT_TMSF
MCI_VD_FORMAT_TRACK_S MCI_VD_FORMAT_TRACK
WAVE_FORMAT_PCM_S WAVE_FORMAT_PCM
WAVE_MAPPER_S WAVE_MAPPER
MCI_SEQ_MAPPER_S MCI_SEQ_MAPPER
MCI_SEQ_FILE_S MCI_SEQ_FILE
MCI_SEQ_MIDI_S MCI_SEQ_MIDI
MCI_SEQ_SMPTE_S MCI_SEQ_SMPTE
MCI_SEQ_FORMAT_SONGPTR_S MCI_SEQ_FORMAT_SONGPTR
MCI_SEQ_NONE_S MCI_SEQ_NONE
MIDIMAPPER_S MIDIMAPPER

MCI uses the high-order word of the DriverProc return value to instruct mciSendString on how to convert the information returned in the MCI data structure into string form. (The mciSendString function translates the string interface used by an application to the command interface used by your device driver.) The following flags are defined for the high-order word of the DriverProc return value:

Flag Meaning

MCI_RESOURCE_RETURNED Specifies that the high-order word of the value in the return field is a string resource ID. This ID is translated by mciSendString by loading the specified resource.
MCI_RESOURCE_DRIVER Specifies that the high-order word of the value in the return field is a string resource ID defined by the device driver. This flag requires MCI_RESOURCE_RETURNED.
MCI_COLONIZED3_RETURN MCI_COLONIZED4_RETURN Specifies that when the DWORD value in the return field is converted into a string, its individual bytes should be separated by colons.
MCI_INTEGER_RETURNED Specifies that the value in a data structure that allows either integer or string returns is an integer value.

Integer return values which have resource string equivalents are indicated by setting the MCI_RESOURCE_RETURNED bit in the error return. This indicates that the high-order word of the value in the return field is a string ID to load. An application that uses mciSendCommand to call your driver will not see the high-order word of the return value when you return MCI_RESOURCE_RETURNED. When this flag is set, MCI will clear the high-order word of the return field before it returns to the application. Using the high-order word for resource data restricts the integer return value to the 16-bits of the low-order word. The following fragment sets the MCI_RESOURCE_RETURNED bit for the DriverProc return value:

lpStatus-dwReturn = MAKEMCIRESOURCE (MCI_SEQ_FORMAT_SONGPTR,

MCI_SEQ_FORMAT_SONGPTR_S);

return MCI_RESOURCE_RETURNED;

If your device driver defines the resource string, use the MCI_RESOURCE_DRIVER flag with the MCI_RESOURCE_RETURNED flag.

If your device driver returns information in the return field that should be separated by colons when it is displayed, use the MCI_COLONIZED3_RETURN or MCI_COLONIZED4_RETURN flag. For example, 0x01020304 is “colonized” as “4:3:2” for MCI_COLONIZED3_RETURN or “4:3:2:1” for MCI_COLONIZED4_RETURN.

If the return field of the data structure can return either integer or string values, and your device driver is returning an integer value, use the MCI_INTEGER_RETURNED flag in the DriverProc return value. For example, the sysinfo command can return both string and integer data. When this flag is set, the returned integer is converted into a string equivalent by mciSendString.

Data structures that return string data or RECT data do not require that you set any flags in the return value for DriverProc.