Интерфейс управления устройствами MCI (Media Control Interface)

ОГЛАВЛЕНИЕ

mciSendCommand() и CD-ROM

Помимо функции mciSendString(), мы упоминали функцию mciSendCommand(). И сейчас ею конкретно займемся. Этот проект будет достаточно насыщенный, так что держитесь. Устройство выберем самое распространенное - CD-ROM.

Первым делом, прежде чем воспользоваться устройством, нам надо его открыть (это логично), т.е. узнать его ID. Нам понадобится для этого структура MCI_OPEN_PARMS:

typedef struct {
DWORD dwCallback;
MCIDEVICEID wDeviceID;
LPCTSTR lpstrDeviceType;
LPCTSTR lpstrElementName;
LPCTSTR lpstrAlias;
} MCI_OPEN_PARMS;

где:

  • dwCallback - для функции "возврата"
  • wDeviceID - возвращаемый идентификатор устройства
  • lpstrDeviceType - указатель на имя устройства
  • lpstrElementName - обычно путь до файла
  • lpstrAlias - указатель на буфер, содержащий alias устройство

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

typedef struct {
DWORD dwCallback;
DWORD dwReturn;
DWORD dwItem;
DWORD dwTrack;
} MCI_STATUS_PARMS;

где:

  • dwCallback - смотрите выше
  • dwReturn - возвращаемая информация
  • dwItem - опрашиваемое свойство
  • dwTrack - параметр трека

Эта структура используется довольно часто. Скоро Вы в этом убедитесь.

Далее мы будем собирать информацию о диске. Для начала узнаем сколько треков на нем содержится, потом длину каждого трека (это нам понадобиться, чтобы определить его длительность в минутах и секундах) и, естественно, проверить тип трека, т.е. какую информацию он несет: цифровую или аудио. И в заключение определить длительность каждого трека.

Начнем с первого пункта. Открываем наше устройство:

// Объявляем структуру
MCI_OPEN_PARMS mciOpenParms;

// Присваиваем значение типа устройства
mciOpenParms.lpstrDeviceType = "cdaudio";

// Устанавливаем флаги, которые укажут интерфейсу, как нужно
// интерпретировать информацию в структуре mciOpenParms.
// В данном случае мы сообщаем MCI о том, что передаем ему тип
// устройства.

DWORD flags = MCI_OPEN_TYPE;

// Давайте рассмотрим, как эта функция будет использовать ту
// информацию, которую мы заложили. Начнем с первого параметра - 0.
// Так как мы не знаем еще идентификатор нашего устройства, поэтому
// просто устанавливаем его в 0. Второй параметр говорит MCI, что мы
// хотим открыть устройство, имя которого она извлечет из структуры
// mciOpenParms. По поводу третьего параметра смотрите выше. И,
// наконец, последним параметром нашей функции будет указатель на
// структуру из которой она извлечет необходимые ей данные. В данном
// случае, как я уже говорил, имя устройства.


DWORD resume = mciSendCommand(0, MCI_OPEN, flags,
(DWORD) (LPVOID)& mciOpenParms);

// Если все было в порядке, получаем идентификатор устройства
if (resume == 0)
wDeviceID = mciOpenParms.wDeviceID;

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

// Т.к. мы опрашиваем устройство, то заполняем соответствующий
// элемент структуры MCI_STATUS_PARMS - dwItem. Флаг
// MCI_STATUS_READY как раз и определяет устройство на готовность.

mciStatusParms.dwItem = MCI_STATUS_READY;

// В качестве первого параметра передаем идентификатор устройства.
// Второй параметр - это команда, которая связана со структурой
// MCI_STATUS_PARMS и которая извлекает информацию об устройстве.
// Третий параметр, даже не знаю как сказать...подтверждает то,
// что информация, которой мы заполнили структуру, относиться
// только к свойствам устройства. Ну и последним параметром мы
// передаем указатель на структуру MCI_STATUS_PARMS.

mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM,
(DWORD)& mciStatusParms);

Если устройство у нас готово, то переходим к третьему пункту. Узнаем количество треков. Код я приводить не буду, т.к. далее все идет по аналогии. Опять мы хотим получить интересующую нас информацию. По этому будем продолжать использовать структуру MCI_STATUS_PARMS, только команда у нас поменяется и станет MCI_STATUS_NUMBER_OF_TRACKS, которую мы отправим в dwItem.

Теперь давайте определим длину каждого трека. Как я уже говорил это нам нужно, что бы узнать время проигрывания трека. Для того, что бы определить длину ,к примеру n-ого трека, нам следует обратиться по номеру этого трека. Как Вы уже догадались этот номер мы поместим в dwTrack структуры MCI_STATUS_PARMS, а команду определения длинны трека -MCI_STATUS_LENGTH в dwItem. Здесь мы уже начали работать непосредственно с треками, и я прошу акцентировать ваше внимание на третьем пераметре функции mciSendCommand(). В этом случае необходимо к флагу MCI_STATUS_ITEM добавить еще и флаг MCI_TRACK. Это очень важно.

Проверим информацию о типе трека. Записываем номер трека в dwTrack, а в dwItam команду проверки трека - MCI_CDA_STATUS_TYPE_TRACK. После извлекаем из структуры результат, который храниться в dwReturn и сравниваем с MCI_CDA_TRACK_AUDIO. Если значения равны, то трек к которому мы обратились несет аудио информацию.

И последнее, что нам осталось - это определить время проигрывания треков. Для этого воспользуемся функциями MCI_MSF_MINUTE() и MCI_MSF_SECOND(). Передаваемым значением является длинна трека.

Читайте также:
  • Работа с СУБД Oracle через интерфейс OCCI
    Принятые именования объектов Environment* env;Connection* conn;Statement* stmt;ResultSet* rs;SQLException &sqlExcp; Давайте рассмотрим пример небольшой тестовой программы использующей интерфейс OCCI:#include #include "occi.h"  using namespace std;using namespace oracle::occi;#defi...
  • Задача Майхилла для Microsoft Visual C++
    Алгоритм поведения и автоматная модель стрелка На первый окрик: "Кто идет?" - он стал шутить,На выстрел в воздух закричал: "Кончай дурить!"Я чуть замешкался и, не вступая в спор,Чинарик выплюнул - и выстрелил в упор.В. Высоцкий В задаче Майхилла необходимо определить, как нужно...
  • Использование ODBC в Visual C++
    Установка соединения Для работы необходимо включить описание функций, которые находятся в файле afxdb.h: // пример#include "afxdb.h" Для начала работы необходимо используя класс создать тект используя конструктор. В конструктор нет необходимости передавать параметры. После создания обье...
  • Создание простого приложения с плагинами
    Динамически подключаемые модули (DLL) - это модули, которые содержат функции и данные. Эти модули загружаются во время выполнения программы, использующей эти модули (хоста). В ОС Windows модули содержат внутренние и экспортируемые функции (в UNIX подобных системах все функции являются экспортируе...
  • Работа с 1C Предприятие из Visual C++
    1С Предприятие предоставляем пользователям механизм OLE DB. Если Вам вдруг захотелось использовать какие либо данные из 1С Предприятия в вашей программе – вы можете воспользоваться этим механизмом. Совсем просто это делается в таких языках, как Visual Basic или Delphi. В них вся работа с O...