// // Copyright 2020 Electronic Arts Inc. // // TiberianDawn.DLL and RedAlert.dll and corresponding source code is free // software: you can redistribute it and/or modify it under the terms of // the GNU General Public License as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed // in the hope that it will be useful, but with permitted additional restrictions // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT // distributed with this program. You should have received a copy of the // GNU General Public License along with permitted additional restrictions // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection /**************************************************************************** * * FILE * MCI.cpp * * DESCRIPTION * * PROGRAMMER * Denzil E. Long, Jr. * * DATE * 6/22/98 * ****************************************************************************/ #include "function.h" #ifdef MCIMPEG #include "mci.h" /**************************************************************************** * * NAME * GetDeviceCount() * * DESCRIPTION * * INPUTS * NONE * * RESULT * Count - Number of MCI device entries * ****************************************************************************/ unsigned int MCI::GetDeviceCount(void) { MCIERROR rc; MCI_SYSINFO_PARMS sysInfo; unsigned int count; memset(&sysInfo, 0, sizeof(sysInfo)); sysInfo.lpstrReturn = (LPSTR)&count; sysInfo.dwRetSize = sizeof(count); rc = mciSendCommand(MCI_ALL_DEVICE_ID, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_QUANTITY, (DWORD)&sysInfo); if (rc) return 0; return count; } /**************************************************************************** * * NAME * GetDeviceName(entry, name) * * DESCRIPTION * * INPUTS * Entry - Entry number to get name for. * Name - On return; device entry name * * RESULT * Success - Success / Failure flag * ****************************************************************************/ bool MCI::GetDeviceName(unsigned int item, char* buffer) { MCIERROR rc; MCI_SYSINFO_PARMS sysInfo; // Get device name memset(&sysInfo, 0, sizeof(sysInfo)); sysInfo.lpstrReturn = (LPSTR)buffer; sysInfo.dwRetSize = 63; sysInfo.dwNumber = item; rc = mciSendCommand(MCI_ALL_DEVICE_ID, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_NAME, (DWORD)&sysInfo); if (rc) return false; return true; } /**************************************************************************** * * NAME * * DESCRIPTION * * INPUTS * * RESULT * ****************************************************************************/ bool MCI::GetProductName(MCIDEVICEID id, char* buffer) { MCIERROR rc; MCI_INFO_PARMS info; // Get device product name memset(&info, 0, sizeof(info)); info.lpstrReturn = (LPSTR)buffer; info.dwRetSize = 63; rc = mciSendCommand(id, MCI_INFO, MCI_WAIT | MCI_INFO_PRODUCT, (DWORD)&info); if (rc) return false; return true; } /**************************************************************************** * * NAME * OpenDevice(name) * * DESCRIPTION * * INPUTS * Name - Device name to open * * RESULT * DeviceID - ID of opened device, 0 if error. * ****************************************************************************/ MCIDEVICEID MCI::OpenDevice(const char* name) { MCIERROR rc; MCI_OPEN_PARMS open; memset(&open, 0, sizeof(open)); open.lpstrDeviceType = name; rc = mciSendCommand(0, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE, (DWORD)&open); if (rc) return 0; return (open.wDeviceID); } void MCI::CloseDevice(MCIDEVICEID id) { MCI_GENERIC_PARMS close; close.dwCallback = (DWORD)NULL; if (id) mciSendCommand(id, MCI_CLOSE, MCI_WAIT, (DWORD)&close); } /**************************************************************************** * * NAME * GetDeviceDescription * * DESCRIPTION * * INPUTS * * RESULT * ****************************************************************************/ bool MCI::GetDeviceDescription(const char* name, MCIDevice* caps) { MCIDEVICEID id; unsigned long result; // Copy the name strncpy(caps->name, name, 63); if ((id = OpenDevice(name)) == 0) return false; // Get device product name GetProductName(id, caps->description); // Get device type if (GetCapability(id, MCI_GETDEVCAPS_DEVICE_TYPE, &result)) caps->type = result; if (GetCapability(id, MCI_GETDEVCAPS_CAN_EJECT, &result)) caps->canEject = ((result) ? true : false); if (GetCapability(id, MCI_GETDEVCAPS_CAN_PLAY, &result)) caps->canPlay = ((result) ? true : false); if (GetCapability(id, MCI_GETDEVCAPS_CAN_RECORD, &result)) caps->canRecord = ((result) ? true : false); if (GetCapability(id, MCI_GETDEVCAPS_CAN_SAVE, &result)) caps->canSave = ((result) ? true : false); if (GetCapability(id, MCI_GETDEVCAPS_COMPOUND_DEVICE, &result)) caps->usesDevElem = ((result) ? true : false); if (GetCapability(id, MCI_GETDEVCAPS_HAS_AUDIO, &result)) caps->hasAudio = ((result) ? true : false); if (GetCapability(id, MCI_GETDEVCAPS_HAS_VIDEO, &result)) caps->hasVideo = ((result) ? true : false); if (GetCapability(id, MCI_GETDEVCAPS_USES_FILES, &result)) caps->reqElemFile = ((result) ? true : false); CloseDevice(id); return true; } /**************************************************************************** * * NAME * * DESCRIPTION * * INPUTS * * RESULT * ****************************************************************************/ bool MCI::GetCapability(MCIDEVICEID id, unsigned long capItem, unsigned long* result) { MCIERROR rc; MCI_GETDEVCAPS_PARMS devCaps; memset(&devCaps, 0, sizeof(devCaps)); devCaps.dwItem = capItem; rc = mciSendCommand(id, MCI_GETDEVCAPS, MCI_WAIT|MCI_GETDEVCAPS_ITEM, (DWORD)&devCaps); if (rc) return false; *result = devCaps.dwReturn; return true; } /**************************************************************************** * * NAME * * DESCRIPTION * * INPUTS * * RESULT * ****************************************************************************/ const char* MCI::GetDeviceTypeName(unsigned long type) { static struct _DeviceType {unsigned long typeID; const char* typeName;} _deviceTypeNames[] = { {MCI_DEVTYPE_ANIMATION, "Animation"}, {MCI_DEVTYPE_CD_AUDIO, "CD Audio"}, {MCI_DEVTYPE_DAT, "DAT"}, {MCI_DEVTYPE_DIGITAL_VIDEO, "Digital Video"}, {MCI_DEVTYPE_OTHER, "Other"}, {MCI_DEVTYPE_OVERLAY, "Overlay"}, {MCI_DEVTYPE_SCANNER, "Scanner"}, {MCI_DEVTYPE_SEQUENCER, "MIDI Sequencer"}, {MCI_DEVTYPE_VCR, "VCR"}, {MCI_DEVTYPE_VIDEODISC, "VideoDisc"}, {MCI_DEVTYPE_WAVEFORM_AUDIO, "Wave Audio"}, {0, NULL}, }; int i = 0; while (_deviceTypeNames[i].typeID != 0) { if (_deviceTypeNames[i].typeID == type) return _deviceTypeNames[i].typeName; i++; } return NULL; } /**************************************************************************** * * NAME * MCIEnumerate(callack, context) * * DESCRIPTION * * INPUTS * Callback - * Context - * * RESULT * Success - Success / Failure flag * ****************************************************************************/ bool MCI::EnumerateDevices(MCIEnumCB* callback, void* context) { DWORD count; DWORD i; char name[64]; MCIDevice device; // Get the number of devices count = GetDeviceCount(); // Do for each device for (i = 1; i <= count; i++) { GetDeviceName(i, name); memset(&device, 0, sizeof(device)); if (GetDeviceDescription(name, &device)) { if (!callback(&device, context)) break; } } return true; } #endif // MCIMPEG