Поделиться через


Открытие устройства

Перед использованием устройства его необходимо инициализировать с помощью команды open (MCI_OPEN). Эта команда загружает драйвер в память (если он еще не загружен) и извлекает идентификатор устройства, который будет использоваться для идентификации устройства в последующих командах MCI. Перед использованием нового идентификатора устройства необходимо проверка возвращаемое значение функции mciSendString или mciSendCommand, чтобы убедиться, что этот идентификатор является допустимым. (Идентификатор устройства можно также получить с помощью функции mciGetDeviceID .)

Как и все сообщения команд MCI, MCI_OPEN имеет связанную структуру. Эти структуры иногда называют блоками параметров. Структура по умолчанию для MCI_OPENMCI_OPEN_PARMS. Некоторые устройства (например , волновая форма и наложение) имеют расширенные структуры (например , MCI_WAVE_OPEN_PARMS и MCI_OVLY_OPEN_PARMS) для размещения дополнительных необязательных параметров. Если вам не нужно использовать эти дополнительные параметры, можно использовать структуру MCI_OPEN_PARMS с любым устройством MCI.

Количество открытых устройств ограничено только объемом доступной памяти.

Использование псевдонима

При открытии устройства можно использовать флаг псевдонима, чтобы указать идентификатор устройства. Этот флаг позволяет назначить короткий идентификатор устройства для составных устройств с длинными именами файлов и открывать несколько экземпляров одного и того же файла или устройства.

Например, следующая команда присваивает идентификатор устройства birdcall длинному имени файла C:\NABIRDS\SOUNDS\MOCKMTNG. WAV:

mciSendString(
    "open c:\nabirds\sounds\mockmtng.wav type waveaudio alias birdcall", 
    lpszReturnString, lstrlen(lpszReturnString), NULL);

В интерфейсе командного сообщения псевдоним указывается с помощью элемента lpstrAlias структуры MCI_OPEN_PARMS .

Указание типа устройства

При открытии устройства можно использовать флаг "тип", чтобы ссылаться на тип устройства, а не на конкретный драйвер устройства. В следующем примере открывается файл waveform-audio C:\WINDOWS\CHIMES. WAV (использует флаг "type" для указания типа устройства waveaudio ) и назначает псевдоним "chimes":

mciSendString(
    "open c:\windows\chimes.wav type waveaudio alias chimes", 
    lpszReturnString, lstrlen(lpszReturnString), NULL);

В интерфейсе командной строки функциональность флага type предоставляется элементом lpstrDeviceType структуры MCI_OPEN_PARMS .

Простые и составные устройства

MCI классифицирует драйверы устройств как составные или простые. Драйверам для составных устройств требуется имя файла данных для воспроизведения; драйверы для простых устройств не делают.

Простые устройства включают устройства cdaudio и videodisc . Открыть простые устройства можно двумя способами.

  • Укажите указатель на строку, завершающуюся null, которая содержит имя устройства из реестра или файла SYSTEM.INI.

    Например, вы можете открыть видеодиска с помощью следующей команды:

    mciSendString("open videodisc", lpszReturnString, 
        lstrlen(lpszReturnString), NULL);

В этом случае videodisc — это имя устройства из реестра или раздела [mci] SYSTEM.INI.

  • Укажите фактическое имя драйвера устройства. Однако открытие устройства с помощью имени файла драйвера устройства делает приложение зависящим от устройства и может помешать запуску приложения при изменении конфигурации системы. Если используется имя файла, указывать полный путь или расширение имени файла не требуется; MCI предполагает, что драйверы находятся в системном каталоге и имеют . Расширение имени файла DRV.

Составные устройства включают устройства waveaudio и sequencer . Данные для составного устройства иногда называют элементом устройства. Однако в этом документе эти данные обычно называются файлом, хотя в некоторых случаях данные могут не храниться в виде файла.

Существует три способа открыть составное устройство:

  • Укажите только имя устройства. Это позволяет открыть составное устройство без связывания имени файла. Большинство составных устройств обрабатывают только команды возможности (MCI_GETDEVCAPS) и закрывают (MCI_CLOSE) при открытии таким образом.
  • Укажите только имя файла. Имя устройства определяется на основе связей в реестре.
  • Укажите имя файла и имя устройства. MCI игнорирует записи в реестре и открывает указанное имя устройства.

Чтобы связать файл данных с определенным устройством, можно указать имя файла и имя устройства. Например, следующая команда открывает устройство waveaudio с именем файла MYVOICE. SND:

mciSendString("open myvoice.snd type waveaudio", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);

В интерфейсе командной строки можно также сократить спецификацию имени устройства, используя альтернативный формат восклицательных знаков, как описано в команде open .

Открытие устройства с помощью расширения имени файла

Если команда open (MCI_OPEN) указывает только имя файла, MCI использует расширение имени файла, чтобы выбрать соответствующее устройство из списка в реестре или разделе [расширения mci] файла SYSTEM.INI. Записи в разделе [расширения mci] используют следующую форму:

= filename_extension device_name

MCI неявно использует device_name , если расширение найдено, и если имя устройства не указано в открытой команде.

В следующем примере показан типичный раздел [расширения mci]:

[mci extensions]
wav=waveaudio
mid=sequencer
rmi=sequencer

Используя эти определения, MCI открывает устройство waveaudio , если выполняется следующая команда:

mciSendString("open train.wav", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);

Новые файлы данных

Чтобы создать новый файл данных, просто укажите пустое имя файла. MCI не сохраняет новый файл, пока вы не сохраните его с помощью команды сохранить (MCI_SAVE). При создании файла необходимо включить псевдоним устройства с помощью команды open (MCI_OPEN).

В следующем примере открывается новый файл waveaudio , запускается и прекращается запись, а затем сохраняется и закрывается файл:

mciSendString("open new type waveaudio alias capture", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);
mciSendString("record capture", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);
mciSendString("stop capture", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);
mciSendString("save capture orca.wav", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);
mciSendString("close capture", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);

Общие устройства

Флаг sharable (MCI_OPEN_SHAREABLE) команды open (MCI_OPEN) позволяет нескольким приложениям одновременно получать доступ к одному и тому же устройству (или файлу) и экземпляру устройства. Если ваше приложение открывает устройство или файл в качестве общих, другие приложения также могут получить к ним доступ, открыв их как доступ к совместному доступу. Общее устройство или файл дает каждому приложению возможность изменять параметры, определяющие его рабочее состояние. Каждый раз, когда устройство или файл открываются как общие, MCI возвращает уникальный идентификатор устройства, даже если идентификаторы ссылаются на один и тот же экземпляр.

Если приложение открывает устройство или файл, не указывая, что они доступны для общего доступа, другое приложение не сможет получить к ним доступ, пока приложение не закроет его. Кроме того, если устройство поддерживает только один открытый экземпляр, команда open завершится ошибкой, если указать флаг общего доступа.

Если приложение открывает устройство и указывает, что оно доступно для общего доступа, приложение не должно делать никаких предположений о состоянии этого устройства. Возможно, приложению потребуется компенсировать изменения, внесенные другими приложениями, обращаюющимися к устройству.

Большинство составных файлов не являются совместно используемыми; однако можно открыть несколько файлов или один файл несколько раз. Если вы открываете один файл несколько раз, MCI создает для каждого из них независимый экземпляр, при этом каждый экземпляр имеет уникальное состояние работы.

При открытии нескольких экземпляров файла каждому из них необходимо назначить уникальный идентификатор устройства. Для присвоения уникального имени каждому файлу можно использовать псевдоним, как описано в следующем разделе.