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

         

Приложение DRVLIST


Приложение DRVLIST (листинг 2.13) поможет вам исследовать конфигурацию драйверов устройств мультимедиа, установленных в системе. Это приложение формирует в текущем каталоге текстовый файл с именем drvlist.txt и записывает в него конфигурацию драйверов.

Листинг 2.13 Файл drvlist\drvlist.cpp

// ---------------------------------------- // Просмотр параметров драйверов // для системы мультимедиа // ----------------------------------------

#define STRICT #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <string.h>

// =========================================== // Функция WinMain // ===========================================

#pragma argsused int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { FILE *out; // файл для вывода int i; // рабочий счетчик char buf[512]; // рабочий буфер

UINT nMMSystemVersion;

UINT nNumInDevs, nNumOutDevs; UINT nNumAuxDevs; UINT nNumMidiInDevs, nNumMidiOutDevs; UINT nNumJoyDevs;

WAVEOUTCAPS wcapsOutCaps; WAVEINCAPS wcapsInCaps; AUXCAPS auxcaps; MIDIINCAPS midicapsInCaps; MIDIOUTCAPS midicapsOutCaps; JOYCAPS joycaps; TIMECAPS timecaps;

DWORD dwFmt, dwSup; UINT wTech;

// Открываем выходной файл для вывода // текста потоком if ((out = fopen("drvlist.txt", "wt")) == NULL) { MessageBox(NULL, "Не могу открыть файл drvlist.txt", "Ошибка", MB_OK | MB_ICONSTOP); return 1; }

// Выводим заголовок файла fputs("* ================================= *\n", out); fputs("* DRVLIST, (C) Frolov A.V., 1994 *\n", out); fputs("* ================================= *\n", out);

nMMSystemVersion = mmsystemGetVersion(); wsprintf(buf, "\nВерсия mmsystem.dll: %d.%d\n\n", HIBYTE(nMMSystemVersion), LOBYTE(nMMSystemVersion));

// Выводим строку в файл fputs(buf, out);

nNumInDevs = waveInGetNumDevs(); nNumOutDevs = waveOutGetNumDevs(); nNumAuxDevs = auxGetNumDevs(); nNumMidiInDevs = midiInGetNumDevs(); nNumMidiOutDevs = midiOutGetNumDevs(); nNumJoyDevs = joyGetNumDevs();




for(i=0; i<nNumOutDevs; i++) { waveOutGetDevCaps(i, &wcapsOutCaps, sizeof(WAVEOUTCAPS));

wsprintf(buf, "\n%s, v. %X, " "wMid=%d, wPid=%d, wChannels=%d\n", (LPSTR)wcapsOutCaps.szPname, wcapsOutCaps.vDriverVersion, wcapsOutCaps.wMid, wcapsOutCaps.wPid, wcapsOutCaps.wChannels);

dwFmt = wcapsOutCaps.dwFormats; dwSup = wcapsOutCaps.dwSupport;

if(dwFmt & WAVE_FORMAT_1M08) strcat(buf, " 11025 КГц, моно,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_1S08) strcat(buf, "11025 КГц, стерео,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_1M16) strcat(buf, "11025 КГц, моно,\t16 бит\n"); if(dwFmt & WAVE_FORMAT_1S16) strcat(buf, "11025 КГц, стерео,\t16 бит\n");

if(dwFmt & WAVE_FORMAT_2M08) strcat(buf, "22050 КГц, моно,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_2S08) strcat(buf, "22050 КГц, стерео,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_2M16) strcat(buf, "22050 КГц, моно,\t16 бит\n"); if(dwFmt & WAVE_FORMAT_2S16) strcat(buf, "22050 КГц, стерео,\t16 бит\n");

if(dwFmt & WAVE_FORMAT_4M08) strcat(buf, "44100 КГц, моно,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_4S08) strcat(buf, "44100 КГц, стерео,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_4M16) strcat(buf, "44100 КГц, моно,\t16 бит\n"); if(dwFmt & WAVE_FORMAT_4S16) strcat(buf, "44100 КГц, стерео,\t16 бит\n");

if(dwSup & WAVECAPS_PITCH) strcat(buf, "Регулировка высоты тона\n"); if(dwSup & WAVECAPS_PLAYBACKRATE) strcat(buf, "Регулировка скорости воспроизведения\n"); if(dwSup & WAVECAPS_SYNC) strcat(buf, "Синхронный драйвер\n"); if(dwSup & WAVECAPS_VOLUME) strcat(buf, "Регулировка громкости\n"); if(dwSup & WAVECAPS_LRVOLUME) strcat(buf, "Раздельная регулировка громкости\n");

// Выводим строку в файл fputs(buf, out); }

for(i=0; i<nNumInDevs; i++) { waveInGetDevCaps(i, &wcapsInCaps, sizeof(WAVEINCAPS)); wsprintf(buf, "\n%s, v. %X, " "wMid=%d, wPid=%d, wChannels=%d\n", (LPSTR)wcapsInCaps.szPname, wcapsInCaps.vDriverVersion, wcapsInCaps.wMid, wcapsInCaps.wPid, wcapsInCaps.wChannels);



dwFmt = wcapsInCaps.dwFormats;

if(dwFmt & WAVE_FORMAT_1M08) strcat(buf, "11025 КГц, моно,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_1S08) strcat(buf, "11025 КГц, стерео,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_1M16) strcat(buf, "11025 КГц, моно,\t16 бит\n"); if(dwFmt & WAVE_FORMAT_1S16) strcat(buf, "11025 КГц, стерео,\t16 бит\n");

if(dwFmt & WAVE_FORMAT_2M08) strcat(buf, "22050 КГц, моно,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_2S08) strcat(buf, "22050 КГц, стерео,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_2M16) strcat(buf, "22050 КГц, моно,\t16 бит\n"); if(dwFmt & WAVE_FORMAT_2S16) strcat(buf, "22050 КГц, стерео,\t16 бит\n");

if(dwFmt & WAVE_FORMAT_4M08) strcat(buf, "44100 КГц, моно,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_4S08) strcat(buf, "44100 КГц, стерео,\t8 бит\n"); if(dwFmt & WAVE_FORMAT_4M16) strcat(buf, "44100 КГц, моно,\t16 бит\n"); if(dwFmt & WAVE_FORMAT_4S16) strcat(buf, "44100 КГц, стерео,\t16 бит\n");

// Выводим строку в файл fputs(buf, out); }

for(i=0; i<nNumAuxDevs; i++) { auxGetDevCaps(i, &auxcaps, sizeof(AUXCAPS));

wsprintf(buf, "\n%s, v. %X, wMid=%d, wPid=%d\n", (LPSTR)auxcaps.szPname, auxcaps.vDriverVersion, auxcaps.wMid, auxcaps.wPid);

wTech = auxcaps.wTechnology; dwSup = auxcaps.dwSupport;

if(wTech & AUXCAPS_CDAUDIO) strcat(buf, " Звуковой выход для внутреннего CD-ROM\n"); if(wTech & AUXCAPS_AUXIN) strcat(buf, "Ввод с линии\n");

if(dwSup & AUXCAPS_VOLUME) strcat(buf, "Регулировка громкости\n"); if(dwSup & AUXCAPS_LRVOLUME) strcat(buf, "Раздельная регулировка громкости\n");

// Выводим строку в файл fputs(buf, out); }

for(i=0; i<nNumMidiInDevs; i++) { midiInGetDevCaps(i, &midicapsInCaps, sizeof(MIDIINCAPS));

wsprintf(buf, "\n%s, v. %X, wMid=%d, wPid=%d\n", (LPSTR)midicapsInCaps.szPname, midicapsInCaps.vDriverVersion, midicapsInCaps.wMid, midicapsInCaps.wPid);



// Выводим строку в файл fputs(buf, out); }

for(i=0; i<nNumMidiOutDevs; i++) { midiOutGetDevCaps(i, &midicapsOutCaps, sizeof(MIDIOUTCAPS));

wsprintf(buf, "\n%s, v. %X, wMid=%d, wPid=%d\n", (LPSTR)midicapsOutCaps.szPname, midicapsOutCaps.vDriverVersion, midicapsOutCaps.wMid, midicapsOutCaps.wPid);

// Выводим строку в файл fputs(buf, out); }

for(i=0; i<nNumJoyDevs; i++) { joyGetDevCaps(i, &joycaps, sizeof(JOYCAPS));

wsprintf(buf, "\n%s, wMid=%d, wPid=%d\n", (LPSTR)joycaps.szPname, joycaps.wMid, joycaps.wPid);

// Выводим строку в файл fputs(buf, out); }

timeGetDevCaps(&timecaps, sizeof(TIMECAPS));

wsprintf(buf, "\nТаймер: wPeriodMin=%u, wPeriodMax=%u\n", (UINT)timecaps.wPeriodMin, (UINT)timecaps.wPeriodMax);

// Выводим строку в файл fputs(buf, out);

// Закрываем файл fclose(out);

MessageBox(NULL, "Список драйверов записан " "в файл drvlist.txt", "DRVLIST", MB_OK);

return 0; }

Приложение создает выходной файл и открывает его на запись с помощью стандартной функции fopen.

Затем вызывается функция mmsystemGetVersion, не имеющая параметров. Она возвращает слово, содержащее версию библиотеки mmsystem.dll. Старший байт этого слова содержит верхний (major) номер версии, младший - нижний (minor). Определенный с помощью этой функции номер версии библиотеки mmsystem.dll преобразуется в текстовую строку (при помощи функции wsprintf) и записывается в выходной файл функцией fputs.

Далее приложение определяет количество устройств мультимедиа, вызывая функции waveInGetNumDevs, waveOutGetNumDevs, auxGetNumDevs, midiInGetNumDevs, midiOutGetNumDevs. Приложение вызывает также функцию joyGetNumDevs , которая возвращает количество джойстиков, установленных в системе.

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

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


Для этого вызывается функция timeGetDevCaps . Соответствующая структура TIMECAPS и указатели на нее определены в файле mmsystem.h следующим образом:

typedef struct timecaps_tag { UINT wPeriodMin; UINT wPeriodMax; } TIMECAPS; typedef TIMECAPS *PTIMECAPS; typedef TIMECAPS NEAR *NPTIMECAPS; typedef TIMECAPS FAR *LPTIMECAPS;

Поле wPeriodMin определяет минимальное значение периода, которое может использовать таймер, поле wPeriodMax - максимальное значение периода таймера (в миллисекундах). Эти параметры таймера могут быть различными не только для различных систем, но и для различных режимов работы операционной системы Windows (стандартном или расширенном).

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

Листинг 2.14. Файл drvlist\drvlist.rc

APPICON ICON "drvlist.ico"

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

Листинг 2.15. Файл drvlist\drvlist.def

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

Приведем образец выходного файла, полученный с помощью приложения DRVLIST, запущенного на компьютере, оснащенном аппаратурой Sound Galaxy NX-Pro мультимедиа Upgrade Kit:

* ================================= * * DRVLIST, (C) Frolov A.V., 1994 * * ================================= * Версия mmsystem.dll: 1.1

Galaxy Wave-Out, v. 204, wMid=2, wPid=103, wChannels=2 11025 КГц, моно, 8 бит 11025 КГц, стерео, 8 бит 22050 КГц, моно, 8 бит 22050 КГц, стерео, 8 бит 44100 КГц, моно, 8 бит Регулировка громкости Раздельная регулировка громкости

Galaxy Wave-In, v. 204, wMid=2, wPid=3, wChannels=2 11025 КГц, моно, 8 бит 11025 КГц, стерео, 8 бит 22050 КГц, моно, 8 бит 22050 КГц, стерео, 8 бит 44100 КГц, моно, 8 бит

Sound Galaxy CD Audio, v. 101, wMid=2, wPid=401 Звуковой выход для внутреннего CD-ROM Регулировка громкости Раздельная регулировка громкости

Sound Galaxy Line In, v. 101, wMid=2, wPid=402 Ввод с линии Регулировка громкости Раздельная регулировка громкости



Sound Galaxy Microphone, v. 101, wMid=2, wPid=403 Регулировка громкости

Galaxy MIDI-In Port, v. 204, wMid=2, wPid=202 Sound Galaxy OPL3 FM, v. 100, wMid=7, wPid=32 Galaxy MIDI-Out Port, v. 204, wMid=2, wPid=201 Sound Galaxy NX-Pro FM Synth, v. 101, wMid=2, wPid=250 Sound Galaxy OPL3 FM, v. 100, wMid=7, wPid=32 Таймер: wPeriodMin=1, wPeriodMax=65535

Из содержимого файла видно, что в операционной системе Windows используется библиотека mmsystem.dll версии 1.1.

Для вывода звука, записанного с помощью импульсно-кодовой модуляции, используется устройство Galaxy Wave-Out, которое может работать со стандартными частотами дискретизации 11025, 22050 и 44100 Кгц (в действительности устройство Sound Galaxy NX-Pro может работать и с нестандартными значениями частоты дискретизации, однако функция waveOutGetDevCaps на дает возможности определить это). Устройство вывода имеет два канала (то есть способно выводить стереофонический сигнал), причем возможна раздельная регулировка громкости в каждом канале. Для представления одной выборки сигнала используется 8 бит.

В системе установлен также драйвер устройства ввода звуковой информации Galaxy Wave-In, который также является 8-битовым стереофоническим устройством.

Непосредственно на плате звукового адаптера Sound Galaxy NX-Pro имеется интерфейс устройства чтения компакт дисков. В системе установлен драйвер Sound Galaxy CD Audio, позволяющий проигрывать звуковые компакт-диски, а также драйверы других устройств, таких, как устройство ввода сигнала с линии, микрофона и музыкального синтезатора.


Содержание раздела