Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Мультимедиа для Windows

© Александр Фролов, Григорий Фролов
Том 15, М.: Диалог-МИФИ, 1994, 284 стр.

[Назад] [Содеожание] [Дальше]

2.2. Интерфейс управляющих строк MCI

MCI представляет собой универсальный, независимый от особенностей аппаратного обеспечения интерфейс, предназначенный для управления устройствами мультимедиа, такими как звуковые и видеоадаптеры, устройства чтения (проигрывания) звуковых компакт-дисков и лазерных видеодисков. В большинстве случаев возможности, предоставляемые этим интерфейсом, удовлетворят потребности любого приложения мультимедиа, предназначенного для записи и воспроизведения звуковой или видеоинформации. Если же приложение должно обрабатывать данные на низком уровне или в реальном времени (задачи редактирования и преобразования wav-файлов, распознавания речи, образов, преобразования речи в реальном времени), оно может воспользоваться низкоуровневым интерфейсом, который мы рассмотрим позже.

Все функции интерфейса MCI экспортируются библиотекой mmsystem.dll . Эти функции обращаются непосредственно к драйверам устройств ввода/вывода, а также к функциям более низкого уровня, определенным в библиотеке mmsystem.dll.

Приложения могут использовать два типа программного интерфейса MCI .

Первый тип называется интерфейс управляющих строк (Command-String Interface ). Он основан на использовании текстовых команд (таких, как open, play, close).

Второй тип - это интерфейс управляющих сообщений (Command-Message Interface ). Для управления устройствам посылаются сообщения, коды которых определены в файле mmsystem.h через символические константы (например, MCI_OPEN, MCI_PLAY, MCI_CLOSE).

Интерфейс управляющих строк удобен для использования в системах программирования высокого уровня, так как позволяет быстро получить необходимый результат. Например, для проигрывания звукового файла ding.wav достаточно передать звуковому адаптеру следующую последовательность управляющих строк:

open ding.wav type waveaudio alias snd wait
play snd wait
close snd

Не намного сложнее выглядят управляющие строки (команды) для записи звукового фрагмента в wav-файл или для проигрывания видеофрагмента из avi-файла.

Для передачи команд используется функция mciSendString , которой в качестве первого параметра передается указатель на строку команды.

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

Мы рассмотрим основные приемы использования обоих типов интерфейса MCI на примере работы со звуковым адаптером и wav-файлами. В дальнейшем, при описании работы с устройствами других типов, мы ограничимся только особенностями команд MCI этих устройств.

Использование интерфейса управляющих строк

Работа с устройствами ввода/вывода системы мультимедиа напоминает работу с обычными файлами в том смысле, что вначале вы открываете устройство, затем выполняете с ним те или иные операции, затем закрываете устройство.

Прежде чем работать с устройством средствами MCI, его следует открыть при помощи команды open. Далее при необходимости можно задать режим работы устройства, послав ему команду set с параметрами. Для включения режима проигрывания или записи используются, соответственно, команды play и record . В любой момент времени можно узнать состояние устройства, если послать ему команду status . После использования устройства его необходимо закрыть при помощи команды close .

Команды MCI

Какие бывают команды?

Все команды можно разделить на четыре группы : системные (System), обязательные (Required), базовые (Basic) и расширенные (Extended).

Системные команды не передаются драйверу устройства, они обрабатываются непосредственно системой MCI.

Обязательные команды поддерживаются любыми устройствами. Примером таких команд могут послужить строки open и close .

Некоторые из базовых команд могут не поддерживаться устройством. Например, устройство может только проигрывать дорожки звукового компакт-диска, но не записывать их.

И, наконец, расширенные команды, которые дополняют возможности базовых команд, могут поддерживаться только некоторыми типами устройств.

Приведем список команд, которые используются для управления звуковым адаптером.

Команда Тип Описание
break Системная Назначение виртуального кода клавиши, с помощью которой можно прервать работу устройства.
sysinfo - Получение системной информации об устройстве (в виде текстовой строки)
capability Обязательная Определение возможностей устройства
close - Закрывание устройства
info - Получение текстовой информации об устройстве
open - Открывание устройства
status - Определение состояния устройства
load Базовая Загрузка данных из файла
pause - Пауза при проигрывании
play - Включение режима проигрывания
record - Включение режима записи
resume - Продолжение проигрывания после паузы
save - Сохранение данных в файле
seek - Позиционирование
set - Установка режима работы устройства
stop - Останов проигрывания
cue Расширенная Подготовка устройства для проигрывания или записи
delete - Удаление фрагмента данных

Далее мы расскажем об использовании этих команд применительно к звуковому адаптеру. Особенности других устройств мультимедиа будут рассмотрены позже.

Функция mciSendString

Как передать устройству управляющую строку?

Очень просто - для этого можно воспользоваться функцией mciSendString . Прототип функции mciSendString находится в файле mmsystem.h:

Функция mciSendString

DWORD mciSendString(
  LPCSTR lpstrCommand,     // управляющая строка
  LPSTR lpstrReturnString, // буфер для результата
  UINT wReturnLength,      // размер буфера
  HANDLE hCallback)        // идентификатор окна извещения

Параметры функции:

lpstrCommand

Дальний указатель на текстовую управляющую строку

lpstrReturnString

Указатель на буфер, в который будет записан результат выполнения команды (в текстовом виде). Этот параметр можно указать как NULL, если приложение не интересуется результатом выполнения команды

wReturnLength

Размер буфера для записи результата выполнения команды

hCallback

Идентификатор окна, которое получит извещение (сообщение MM_MCINOTIFY) после того как устройство завершит операцию. Этот параметр можно указать как NULL, если извещение не используется

Возвращаемое значение:

Нуль при успешном завершении или код ошибки (в младшем слове возвращаемого значения):

MCIERR_BAD_CONSTANT 

Указана константа, неправильная для данной команды

MCIERR_BAD_INTEGER 

Указано значение, неправильное для данной команды

MCIERR_DUPLICATE_FLAGS 

Двойное определение параметра или значения

MCIERR_MISSING_COMMAND_STRING 

Не указана управляющая строка

MCIERR_MISSING_DEVICE_NAME 

Не указано имя устройства, драйвера, файла или алиас

MCIERR_MISSING_STRING_ARGUMENT 

Не указан обязательный параметр команды

MCIERR_NEW_REQUIRED_ALIAS 

При использовании параметра new следует указать алиас

MCIERR_NO_CLOSING_QUOTE 

В команде отсутствуют закрывающие двойные кавычки

MCIERR_NOTIFY_ON_AUTO_OPEN 

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

MCIERR_PARAM_OVERFLOW 

Строка параметров не помещается в буфер. Необходимо увеличить размер буфера

MCIERR_PARSER_INTERNAL 

Ошибка в драйвере устройства. Следует заменить драйвер на новый, более поздней версии

MCIERR_UNRECOGNIZED_KEYWORD 

Драйвер не распознал параметр управляющей строки

Например, для проигрывания wav-файла вы можете использовать следующую последовательность вызовов функции mciSendString :

mciSendString(
  (LPSTR)"open ding.wav type waveaudio alias snd wait",
  (LPSTR)szBuf, 256, NULL);
mciSendString((LPSTR)"play snd wait", (LPSTR)szBuf, 256, NULL);
mciSendString((LPSTR)"close snd", (LPSTR)szBuf, 256, NULL);

Для преобразования кода ошибки, полученного от функции mciSendString, в текстовую строку, можно воспользоваться функцией mciGetErrorString , которой необходимо передать двойное слово кода ошибки.

Функция mciGetErrorString

UINT mciGetErrorString(
   DWORD dwError,      // код ошибки
   LPSTR lpstrBuffer,  // буфер для записи текстовой строки
   UINT  wLength);     // размер буфера

Параметры функции:

dwError

Код ошибки, полученный от функции mciSendString или mciSendCommand (функция mciSendCommand предназначена для передачи управляющих сообщений, она будет рассмотрена позже)

lpstrBuffer

Буфер, в который будет записано текстовое описание ошибки

wLength

Размер буфера в байтах

Возвращаемое значение:

TRUE при успешном завершении или FALSE, если переданному коду ошибки не соответствует ни одно текстовое описание

Сообщение MM_MCINOTIFY

Немного о сообщении MM_MCINOTIFY .

Как мы уже говорили, приложение может передать функции mciSendString через последний параметр идентификатор окна. Если команда MCI выдана с параметром notify, после ее завершения функция окна получит сообщение MM_MCINOTIFY. Это сообщение - извещение о завершении (удачном или нет) процесса выполнения команды.

Через параметр wParam сообщения MM_MCINOTIFY функция окна получает код извещения, по которому можно судить о результатах выполнения команды. Возможны следующие значения (описанные в файле mmsystem.h):

Значение Описание
MCI_NOTIFY_ABORTED Устройство получило такую команду, в результате которой не будет получено извещение о завершении выполнения предыдущей команды. Если новая команда прерывает выполнение текущей команды и также требует извещения, функция окна получит сообщение MCI_NOTIFY_ABORTED (но не MCI_NOTIFY_SUPERSEDED)
MCI_NOTIFY_SUCCESSFUL Успешное завершение команды
MCI_NOTIFY_SUPERSEDED Устройство получило еще одну команду, так же требующую извещения, в результате чего извещение от первой команды не будет получено
MCI_NOTIFY_FAILURE В устройстве произошла ошибка во время выполнения команды

Параметр lParam содержит идентификатор устройства, приславшего извещение.

В случае успешного завершения обработчик сообщения MM_MCINOTIFY должен вернуть нулевое значение, при ошибке - соответствующий код ошибки MCI.

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

Команды инициализации и завершения работы

В этой группе всего две команды - open и close, предназначенные, соответственно, для открытия и закрытия устройства ввода/вывода звука.

open

Управляющая строка open посылается перед началом работы для открытия устройства. Эта строка имеет следующий формат:

open device [type device_name] [alias alias] [buffer size] [notify] [wait]

Параметры, указанные в квадратных скобках, необязательные.

В качестве параметра device можно указывать имя драйвера устройства, имя самого устройства или имя звукового файла (можно также указать полный путь к файлу). Так как имя драйвера зависит от устройства, лучше пользоваться именем устройства или именем файла. Для звукового адаптера можно указать устройство waveaudio :

open waveaudio

Это устройство обслуживается драйвером mciwave.drv, входящим в состав операционной системы Windows 3.1. Интерфейс управляющих строк MCI непригоден для работы с драйвером Sound Driver for PC Speaker , поэтому, если в системе установлен только такой драйвер, пользуйтесь функциями MessageBeep или sndPlaySound, рассмотренными нами ранее.

Если при открытии устройства указывается путь к файлу, тип устройства определяется по расширению имени с использованием раздела [mci extensions] файла win.ini:

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

Поэтому следующая командная строка приведет к открытию устройства waveaudio:

open c:\wave\bye.wav

Если через параметр device передается имя файла, можно указать тип устройства при помощи параметра type device_name. Например:

open c:\wave\bye.wav type waveaudio

Это позволит использовать имена файлов с нестандартными расширениями. Например, вы можете переименовать файл bye.wav в файл bye.snd, при этом несмотря на то, что в разделе [mci extensions] файла win.ini расширение snd не описано, результат выполнения следующей команды будет правильный:

open c:\wave\bye.snd type waveaudio

Вы можете также указать алиас (альтернативное имя) для работы с устройством, использовав параметр alias:

open c:\wave\bye.wav alias sound

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

Если указан параметр notify, и при передаче строки в последнем параметре функции mciSendString был указан идентификатор окна для оповещения, после того как устройство будет открыто, функция этого окна получит сообщение MM_MCINOTIFY.

С помощью команды open можно открыть устройство не только на воспроизведение, но и на запись. При этом в качестве параметра device нужно указать строку new. Следует также указать алиас. В качестве примера приведем последовательность команд, выполняющих запись:

open new type waveaudio alias nsound wait
record nsound

Для остановки записи следует выдать команду stop. Для сохранения записанного фрагмента в wav-файле нужно использовать команду save (команда close закрывает устройство, она будет описана ниже):

stop nsound wait
save nsound newsound.wav wait
close nsound

Если указан параметр wait, функция mciSendString вернет управление только после завершения операции. Заметим, что параметры notify и wait используются практически со всеми управляющими строками.

close

Команда close закрывает устройство и освобождает все связанные с ним ресурсы. Формат команды:

close device_id [notify] [wait]

Необходимо указать идентификатор устройства device_id, использованный при открытии устройства командой open.

Например, для того чтобы закрыть устройство с алиасом nsound, вы можете использовать следующую управляющую строку:

close nsound

Справочные команды

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

sysinfo

Команда sysinfo предназначена для получения системной информации об MCI-устройстве:

sysinfo device_id parameter [notify] [wait]

В качестве параметра parameter можно указывать одну из следующих строк:

installname

Имя, использованное в файле system.ini при установке драйвера устройства

quantity

Количество MCI-устройств типа device_id, установленных в системе и указанных в файле system.ini. Если в качестве device_id указать строку all, будет подсчитано общее количество установленных в системе MCI-драйверов

quantity open

Количество открытых MCI-устройств типа device_id, установленных в системе и указанных в файле system.ini

name index

Имя устройства MCI, номер которого задан строкой index. Первому устройству соответствует строка 1

name index open

Имя открытого устройства MCI, номер которого задан строкой index

info

С помощью команды info можно получить информацию об MCI-устройстве:

info device_id parameter [notify] [wait]

В качестве параметра parameter можно указывать одну из следующих строк:

product

Текстовое описание звукового адаптера

input

Текстовое описание устройства ввода звуковой информации

output

Текстовое описание устройства вывода звуковой информации

file

Имя текущего wav-файла

capability

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

capability device_id parameter [notify] [wait]

В качестве параметра parameter можно указывать одну из следующих строк:

can play

Если драйвер звукового адаптера может проигрывать wav-файлы, в ответ на эту строку он возвратит строку true, а если нет - то false

can record

Если устройство может записывать, возвращается true, в противном случае - false

can save

Используется для определения возможности сохранения записанного звукового фрагмента в wav-файле. Если такая возможность есть, возвращается строка true, в противном случае - false

compound device

Все MCI-устройства можно разделить на простые и составные (compound). Простые устройства, такие как проигрыватель звуковых компакт-дисков или лазерных видеодисков, не работают с файлами. Составные, такие как звуковой адаптер, используют файлы. Поэтому в ответ на эту строку, переданную драйверу звукового адаптера, приложение получит строку true

device type

Для звукового адаптера возвращается строка waveaudio

has audio

Для звукового адаптера возвращается строка true

inputs

Общее количество устройств ввода

outputs

Общее количество устройств вывода

uses files

Для звукового адаптера возвращается строка true, так как он работает с wav-файлами

status

Команда status позволяет определить текущее состояние устройства.

status device_id parameter [notify] [wait]

В качестве параметра parameter можно указывать одну из следующих строк:

alignment

Выравнивание блока данных в байтах

bitspersample

Количество байт на одну выборку сигнала

bytespersec

Скорость проигрывания или записи, байт в секунду

channels

Количество каналов, 1 - моно, 2 - стерео

current track

Номер текущей дорожки. Для звукового адаптера всегда равно 1

format tag

Тег формата

input

Устройство ввода

length

Общая длина звукового фрагмента

length track track_number

Длина фрагмента, соответствующая заданной дорожке

level

Текущий уровень звукового сигнала

media present

Признак присутствия носителя (среды). Для звукового адаптера всегда равно true

mode

Текущий режим работы: not ready (не готов), playing (проигрывание), stopped (останов), recording (запись), seeking (позиционирование)

number of tracks

Количество дорожек. Для звукового адаптера всегда равно 1

output

Устройство вывода

position

Текущая позиция

position track track_number

Текущая позиция на заданной дорожке. Для звукового адаптера всегда равно 0

ready

Если устройство готово, возвращается строка true

samplespersec

Количество выборок сигнала в секунду при проигрывании или записи (частота дискретизации)

start position

Начальная позиция

time format

Текущий формат времени

Команды установки режима работы

В этой группе есть две команды - set и break.

set

Команда set в зависимости от параметров позволяет выполнять установку различных режимов работы.

set device_id parameter [notify] [wait] 

В качестве параметра parameter можно указывать одну из следующих строк (за один раз можно указывать сразу несколько параметров):

alignment int

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

any input

Использование любого устройства ввода, поддерживающего текущий формат при записи. Этот режим включен по умолчанию

any output

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

audio all off

Отключение звукового выхода

audio all on

Включение звукового выхода

audio left off

Отключение левого канала

audio left on

Включение левого канала

audio right off

Отключение правого канала

audio right on

Включение правого канала

bitspersample bit_count

Установка количества бит для представления выборки сигнала. Параметр bit_count задает количество бит (8 или 16)

bytespersec byte_rate

Установка частоты дискретизации при записи или воспроизведении. Параметр byte_rate задает частоту (байты в секунду)

channels channel_count

Установка количества каналов для записи или воспроизведения (1 - монофонический режим, 2 - стереофонический режим)

format tag tag

Установка типа формата

format tag pcm

Установка формата PCM (импульсно-кодовая модуляция)

input int

Выбор канала для ввода

output int

Выбор канала для вывода

samplepersec int

Установка скорости записи или воспроизведения

time format bytes

В качестве единицы измерения при позиционировании используются байты блока звуковых данных

time format milliseconds

В качестве единицы измерения при позиционировании используются миллисекунды. Строку milliseconds можно также указывать как ms

time format samples

В качестве единицы измерения при позиционировании используются выборки сигнала

break

Команда break позволяет определить код виртуальной клавиши, предназначенной для прерывания (по умолчанию используется комбинация клавиш <Control+Break>):

break device_id parameter [notify] [wait] 

В качестве параметра parameter можно указывать одну из следующих строк:

on virt_key

Для прерывания будет использована клавиша с виртуальным кодом virt_key

off

Действие клавиши прерывания отменяется

Если команда выдана с параметром wait, функция mciSendString вернет управление только после завершения операции. Если пользователь не желает дожидаться завершения длительной операции, он может нажать клавишу, прерывающую выполнение команды.

Команды для воспроизведения, записи и позиционирования

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

play

Команда play предназначена для запуска процесса воспроизведения. Она имеет следующий формат:

play device_id [from position [to position]] [notify] [wait] 

Идентификатор устройства device_id создается при открытии устройства командой open. Например, если для открытия устройства была использована строка

open c:\windows\ding.wav alias ding

то в качестве параметра device_id можно использовать алиас ding:

play ding

Если не указан параметр from position, проигрывание начинается с текущей позиции. Сразу после открытия текущая позиция устанавливается в начало файла. Параметр to position позволяет указать конечную позицию, при достижении которой проигрывание прекращается. Перед использованием параметров from и to необходимо установить формат для позиционирования при помощи команды set (см. ниже).

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

Указав параметр wait, можно установить псевдосинхронный режим воспроизведения. В этом случае функция mciSendString вернет управление только после завершения операции, однако работа других приложений Windows будет продолжаться во время воспроизведения. Если же этот параметр не указан, функция mciSendString запустит процесс в асинхронном режиме и немедленно вернет управление.

record

Эта команда запускает запись звукового фрагмента.

В качестве необязательного параметра parameter можно указывать одну из следующих строк:

insert

Новые данные будут добавлены к ранее записанным

from position

Определение начальной позиции для записи. Если начальная позиция не задана, данные будут вставлены начиная с текущей позиции. Если используются параметры from или to, необходимо задать формат времени командой set time format

to position

Определение конечной позиции при записи. Если конечная позиция не задана, запись будет продолжаться до тех пор, пока не будет выдана команда stop или pause

overwrite

Новые данные должны заместить записанные ранее

save

Сохранение записанного звукового фрагмента в файле

save device_id [filename] [notify] [wait] 

Параметр filename задает путь к файлу, в который должен быть записан звуковой фрагмент

pause

Временный останов при воспроизведении или записи (пауза)

pause device_id

resume

Продолжение воспроизведения или записи после временного останова по команде pause.

resume device_id [notify] [wait] 

seek

Позиционирование с последующим остановом. Перед использованием этой команды необходимо задать формат времени командой set time format.

seek device_id parameter [notify] [wait] 

В качестве необязательного параметра parameter можно указывать одну из следующих строк:

to position

Позиционирование в указанное место фрагмента

to start

Позиционирование в начало

to end

Позиционирование в конец

cue

Подготовка для записи или воспроизведения. После выполнения такой подготовки устройство будет готово быстро приступить к выполнению требуемой операции. Эту команду нельзя выдавать во время записи или воспроизведения.

В качестве параметра parameter можно указывать одну из следующих строк:

input

Подготовка для записи

output

Подготовка для воспроизведения

delete

Удаление сегмента из фрагмента звуковых данных

delete device_id from position [to position] [notify] [wait] 

Для этой команды можно указать либо оба параметра (from и to), либо только параметр from.

Приложение MCISTRVW

Приложение MCISTRVW (листинг 2.4) демонстрирует использование строчного интерфейса MCI для воспроизведения звукового файла с именем kaas.wav, расположенного в текущем каталоге (файл kaas.wav есть в каталоге mcistrvw на дискете, которая продается вместе с книгой). Это простейшее приложение не создает ни одного окна и, следовательно, не обрабатывает сообщения.


Листинг 2.4. Файл mcistrvw\mcistrvw.cpp


// -----------------------------------------------------
// Приложение MCISTRVW
// Демонстрирует использование командных строк MCI
// -----------------------------------------------------
#define STRICT
#include <windows.h>
#include <mmsystem.h>

void mciwioError(DWORD dwrc);

#pragma argsused
int PASCAL
WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance,
        LPSTR     lpszCmdLine, 
        int       nCmdShow)
{
  DWORD dwrc;
  BYTE szBuf[256], szBuf1[256];

  // Открываем файл kaas.wav
  dwrc = mciSendString(
    (LPSTR)"open kaas.wav type waveaudio alias patr wait",
    (LPSTR)szBuf, 256, NULL);
  if(dwrc) mciwioError(dwrc);

  // Получаем имя устройства, под которым оно установлено
  // в файле system.ini
  dwrc = mciSendString((LPSTR)"sysinfo patr installname wait",
    (LPSTR)szBuf, 256, NULL);
  if(dwrc) mciwioError(dwrc);

  lstrcat(szBuf, (LPSTR)"\n");

  // Добавляем к нему текстовое описание аппаратуры
  dwrc = mciSendString((LPSTR)"info patr product wait",
    (LPSTR)szBuf1, 256, NULL);
  if(dwrc) mciwioError(dwrc);
  lstrcat(szBuf, szBuf1);

  // Выводим на экран полученную информацию об устройстве
  MessageBox(NULL, szBuf, "MCISTRWV", MB_ICONINFORMATION);

  // Запускаем проигрывание в синхронном режиме
  dwrc = mciSendString((LPSTR)"play patr wait",
    (LPSTR)szBuf, 256, NULL);
  if(dwrc) mciwioError(dwrc);

  // После завершения проигрывания закрываем устройство 
  dwrc = mciSendString((LPSTR)"close patr",
    (LPSTR)szBuf, 256, NULL);
  if(dwrc) mciwioError(dwrc);

  return 0;
}

// -----------------------------------------------------
// Функция mciwioError
// Выводит текстовое описание ошибки
// -----------------------------------------------------
void mciwioError(DWORD dwrc)
{
  BYTE szBuf[MAXERRORLENGTH];

  // Если коду ошибки, переданному через параметр dwrc
  // соответствует текстовое описание, выводим его на экран 
  if(mciGetErrorString(dwrc, (LPSTR)szBuf, MAXERRORLENGTH))
    MessageBox(NULL, szBuf, "MCISTRVW Error",
      MB_ICONEXCLAMATION);

  // В противном случае выводим сообщение о том, что это
  // неизвестная ошибка
  else
    MessageBox(NULL, "Неизвестная ошибка", "MCISTRVW Error",
      MB_ICONEXCLAMATION);
}

Сразу после запуска приложение открывает устройство waveaudio с файлом kaas.wav, передавая ему следующую команду:

open kaas.wav type waveaudio alias patr wait

При этом устройству назначается алиас patr. Так как задан параметр wait, работа приложения будет продолжена только после завершения процесса открытия.

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

Для проигрывания выдается следующая команда (используется алиас, назначенный при открытии устройства):

play patr wait

Работа приложения MCISTRVW приостанавливается до завершения процесса воспроизведения, однако при этом другие приложения могут работать.

Перед завершением своей работы приложение закрывает устройство:

close patr

Каждый раз после выдачи команды приложение проверяет код возврата функции mciSendString. Если он не равен нулю, вызывается обработчик ошибок (функция mciwioError), задача которого заключается в выводе текстового описания ошибки на экран. Для преобразования кода ошибки в текстовое сообщение используется функция mciGetErrorString.

Файл ресурсов приложения MCISTRVW приведен в листинге 2.5.


Листинг 2.5. Файл mcistrvw\mcistrvw.def


APPICON ICON "mcistrwv.ico"

Файл определения модуля вы сможете найти в листинге 2.6.


Листинг 2.6. Файл mcistrvw\mcistrvw.def


NAME        MCISTRVW
DESCRIPTION 'Приложение MCISTRVW, (C) 1994, Frolov A.V.'
EXETYPE     windows
STUB        'winstub.exe'
STACKSIZE   8120
HEAPSIZE    1024
CODE        preload moveable discardable
DATA        preload moveable multiple

Приложение MCITEST

В составе системы разработки приложений Microsoft SDK в качестве примера поставляются исходные тексты приложения MCITEST (загрузочный модуль этого приложения есть в каталоге SDK\MCITEST на дискете, которая продается вместе с книгой). Приложение MCITEST (рис. 2.1) удобно использовать для изучения строчного интерфейса MCI и для отладки последовательностей строчных команд MCI.

Рис. 2.1. Главное окно приложения MCITEST

Окно, расположенное в верхней части экрана, предназначено для ввода командных строк. Это окно представляет собой многострочный редактор текста, поэтому вы можете вводить сразу несколько строк. Введенные команды можно выполнять по отдельности, нажимая клавишу <Enter> или кнопку "Step", или все вместе (при помощи кнопки "Go!").

В окне "MCI Output" отображается результат выполнения операции. Если произошла ошибка, ее текстовое описание появляется в окне "Error".

Если в качестве одного из параметров команды была указана строка notyfy, в окне "Notification" отображается результат, переданный с сообщением MM_MCINOTIFY.

С помощью меню "File" вы можете сохранять и загружать последовательности команд MCI, проверяя их в работе.

[Назад] [Содеожание] [Дальше]