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

#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;
}