|
|
|||||||||||||||||||||||||||||
|
Интерфейс управления устройствами MCI (Media Control Interface)Источник: cyberguru форум visual c++
Интерфейс управления устройствами MCI (Media Control Interface) позволяет программам для Windows работать с различными устройствами мультимедиа которые включают в себя CD-ROM, звуковую карту, проигрыватель видеодисков, даже видеомагнитофон и т.д. При помощи функций MCI мы можем управлять выше перечисленными устройствами, посылая им специальные команды такие как: воспроизведение, остановка, воспроизведение с заданной позиции и т.д. Конкретный набор команд соответствует каждому устройству свой. Эту команду мы передаем в функцию интерфейса MCI. Все функции интерфейса MCI начинаются с префикса mci и делятся на три группы:
Две функции высокого уровня - mciSendCommand() и mciSendString() выполняют одну и туже функцию. Отличие между ними заключается в способе подачи команд. Первую функцию, которую мы рассмотрим будет mciSendCommand(). Она описывается следующим образом: DWORD mciSendCommand(MCIDEVICEID IDDevice, где:
Если функция возвращает 0, то все в полном порядке. В случае ошибки функция возвращает код ошибки. Сам код ошибки находится в младшем байте слова, а в старшем, где должен был бы находится код нашего устройства, будет 0. Следует акцентировать Ваше внимание на четвертом параметре этой функции. Различные команды пользуются различными наборами исходных данных. Перед тем как вызвать функцию, мы должны заполнить структуру данными, необходимыми для выполнения только одной нужной нам команды. Что же представляет из себя функция mciSendString() ? DWORD mciSendString(LPTSTR lpszCommand, где:
Итак, функция возвращает 0 в случае удачи и, соответственно, код ошибки в противном лучае. С помощью кода ошибки можно получить дополнительную информацию. Это относится и к mciSendCommand()! Не путайте это с параметром lpszReturnString, он просто хранит информацию о том, какую работу выполняет данная функция. Вот маленький примерчик: воспроизведение wave-файла. #include "stdafx.h" Необходимо добавить библиотеку winmm.lib !!! Иначе "пролетите"! Обработка ошибокКак уже было сказано, функции MCI возвращают код ошибки при неудачном их выполнении. И тутже возникает вопрос: "а куда, собственно, девать этот код?". Здесь нам на помощь приходит другая функция - mciGetErrorString(), которая по коду ошибки выводит ее текстовое описание. Вот как она выглядит: BOOL mciGetErrorString(DWORD fdwError, где:
Как и большинство функций, она тоже возвращает результат своей деятельности. Если она вернула TRUE, то можно расслабиться и посмотреть, что же натворила функция находящаяся перед ней. Иначе (FALSE) придется поднопрячь извилины, потому что наша функция не смогла определить причину возникновения ошибки. Давайте рассмотрим конкретный пример, где все встанет на свои места. #include "stdafx.h" Я специально указал неверный путь до файла, чтобы сработала наша функция. Все очень просто...правда? Рассмотрим некоторые возможности функции mciSendString() в работе с устройствами. Для примера возьмем CD-ROM и опять вернемся к команде play. Как раньше я говорил, командную строку можно разделить на три под команды: сама команда, устройство, которое будем использовать и параметры. Т.к. мы используем команду play, то ей характерны, только для CD-ROM'а, два параметра: from position и to position. Под position подразумевается передаваемое значение, в данном случае, для нашего устройства, это будут минуты.секунды. При помощи этих значений можно воспроизводить трек с любого временного интервала. Параметр from задает начало воспроизведения, а to, соответственно, его конец. Итак, рассмотрим пример. Допустим трек будет проигрываться 7 минут 22 секунды, как увертюра "The Magic Flute" у Моцарта. А нам надо, что бы проигрывался его кусочек: скажем с 4 минут до 5 минут. #include "stdafx.h" Следует немного поэкспериментировать, чтобы понять "принцип работы" этих параметров. digitalvideoПродолжаем использовать команду play ! На этот раз мы будем работать с видео. Все, наверное, знают такую программу, как универсальный проигрыватель. Вы можете посмотреть сколько форматов она может воспроизводить, это впечатляет, а также впечатляет то, что все эти форматы реализованы в самой ОС, и Вы можете этим воспользоваться! Как уже вы догадались речь пойдет о digitalvideo - цифровое видео. Вот список реализованных параметров:
Код программы я приводить не буду, т.к. за основу Вы можете взять программку из mciSendCommand() и CD-ROMПомимо функции mciSendString(), мы упоминали функцию mciSendCommand(). И сейчас ею конкретно займемся. Этот проект будет достаточно насыщенный, так что держитесь. Устройство выберем самое распространенное - CD-ROM. Первым делом, прежде чем воспользоваться устройством, нам надо его открыть (это логично), т.е. узнать его ID. Нам понадобится для этого структура MCI_OPEN_PARMS: typedef struct { где:
После того, как мы узнали идентификатор устройства следующим действием следует проверить его на готовность. Для этого мы используем структуру MCI_STATUS_PARMS: typedef struct { где:
Эта структура используется довольно часто. Скоро Вы в этом убедитесь. Далее мы будем собирать информацию о диске. Для начала узнаем сколько треков на нем содержится, потом длину каждого трека (это нам понадобиться, чтобы определить его длительность в минутах и секундах) и, естественно, проверить тип трека, т.е. какую информацию он несет: цифровую или аудио. И в заключение определить длительность каждого трека. Начнем с первого пункта. Открываем наше устройство: // Объявляем структуру Следующее, что мы должны сделать по списку, это проверить устройство на готовность: // Т.к. мы опрашиваем устройство, то заполняем соответствующий Если устройство у нас готово, то переходим к третьему пункту. Узнаем количество треков. Код я приводить не буду, т.к. далее все идет по аналогии. Опять мы хотим получить интересующую нас информацию. По этому будем продолжать использовать структуру 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(). Передаваемым значением является длинна трека. "Исполнение желаний" команда MCI_SETПродолжаем мучать наш CD-ROM. Теперь он будет непосредственно выполнять наши команды. Команды эти самые различные такие как пауза, проигрывание, остановка, открытие и закрытие, запись и переход на другой трек. А начнем мы естественно с самого примитивного - открытия и закрытия. Для установки управления устройства используется команда MCI_SET с принадлежащей ей структурой MCI_SET_PARMS. Эта команда сообщает MCI, что устройство должно выполнить какое-то действие, а что оно должно выполнить сообщается третьему параметру функции. В приведенном примере выполняется команда открытия CD, а чтобы его закрыть нужно поменять MCI_SET_DOOR_OPEN на MCI_SET_DOOR_CLOSED. Пример: mciSendCommand(wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, Попробуйте теперь это совместить с предыдущим проектом (CDPlayer). MCI Play&StopРассмотрим пример воспроизведения CD-треков. mciSetParms.dwTimeFormat = MCI_FORMAT_TMSF; Первым делом устанавливаем формат времени. Используем уже знакомую структуру - MCI_SET_PARMS, в которой устанавливаем параметр MCI_FORMAT_TMSF. Он говорит о том, что формат времени устанавливается в треках, минутах, секундах и фреймах. В качестве флага передаем флаг параметра времени - MCI_SET_TIME_FORMAT. Ну, а дальше запускаем нашу функцию. Для того, чтобы воспроизвести трек необходимо воспользоваться командой MCI_PLAY, которая зависит от структуры MCI_PLAY_PARMS. Вот ее описание: typedef struct { Где
После того когда мы установили формат времени, в котором будет воспроизводиться трек, следующее что нам надо узнать, это длину трека по которому в дальнейшем мы определим начало и конец воспроизведения. Вот пример кода: // Определяем длину трека через уже "готовую" При использовании флагов MCI_FROM и MCI_TO необходимо устанавливать формат времени, как мы это сделали в начале этого упражнения. Теперь пора рассмотреть другую команду - MCI_STOP (комментариев я думаю не надо). Действуем по аналогии с командами открытия и закрытия CD. mciSendCommand(wDeviceID, MCI_STOP, 0, (DWORD)& mciGenericParms); Это все, что нужно сделать. Проигрывание WAV файла из памяти> Hello ig, Увы, вынужден разочаровать, в таком виде ничего не получится. В принципе, PlaySound действительно может проигрывать wav-ы из памяти, но при этом подразумевается, что изображение звука в памяти имеет правильный формат (т.е. снабжено заголовком с указанием формата, затем следует собственно блок данных и т.д.). То-есть если ты прочитаешь wav-файл в память ЦЕЛИКОМ, то он честно проиграется командой: PlaySound( pbuf, NULL, SND_MEMORY ); но если в буфере находится лишь часть файла, функция выдаст ошибку, поскольку эта часть имеет "неправильный" формат. Одно из решений - использование MCI функций. В качестве примера приведу работающий кусок из программы (я его несколько упростил для примера): MCIERROR mciError; Где:
Ссылки по теме
|
|