
  Что это, доктор?

  Миксер для uniaud, который работает через то же api, что и vio unimix.exe
в MMOS2, но делает это чуть более удобно ;)
  Основное назначение и причина появления: кривизна отдачи юниаудом контролов
в IOCTL90 mixer api (его же PM миксер, LBMix).
  Поскольку фантазия миксерописателей описанию не поддаётся, весь процесс
чтения/установки значений делается через скрипт. Т.е. процесс работы с uniaud
выглядит так:    миксер <-> скрипт <-> uniaud. Соотв. скрипт, как может,
сглаживает несоотвествие полей/контролов между хардварным миксером и гуёвой
картинкой. По этой же причине каждому типу карты/хардварного миксера требуется
свой скрипт (которые легко делаются по аналогии ;)

  Запуск:
  - выбор миксера: umix /setup
  - /min      - запуск минимизированным
    /xxxx=50  - установить значения контролов при запуске (значение в процентах).
                 Значения xxxx: Main, Wave, CD, Mic, Line, Midi, Space, Center,
                 CustomA, CustomB, CustomC, CustomD, RecCD, RecMic, RecLine,
                 RecMidi

  Фичи и баги:
  - проверяет наличие второй копии при запуске (т.е., если на старте тишина,
    значит где-то повисла старая копия ;)), это можно выключить в ini)
  - нет режима постоянной установки в миксер
  - два режима работы:
     - только чтение значений из карты каждые x ms
     - тоже самое, но если с момента прошлого чтения значение контрола
       сменилось более, чем на 25% (Threshold в ini), возвращаем предыдущее
       значение.
       Позволяет игнорировать mute после проигрывания wav, но регулировать
       громкость в других миксерах/софте.

  Как добавить свой миксер:

  1. в umix.ini делаем новую секцию по аналогии с теми, что есть:
     [new_card]
     Controls=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
     script=data\new_card.scr

  2. добавляем в секцию [Configs] по аналогии:
     [Configs]
     Audigy SE=SB Audigy SE
     Demo    =Demo empty script
     new_card=Our new card

  3. пишем файл скрипта (data\new_card.scr).

     int detect() - определение карты, обычно там сравнение имени миксера 
         или самой карты

     int unimix_show_controls(int card_id, int ctl_id), которая оттуда 
         вызывается - сопоставление названия контролов панелям и чек.кнопкам

     На простых картах всё линейно (volume/switch), на картах с фантазией,
     типа SB - могут быть переключатели, итп - тут и нужен скрипт.

     Все тексты для сpавнения беpем из vio ?:\MMOS2\UNIMIX.EXE:
      UNIMIX.EXE -card     - имя каpты / миксеpа
      UNIMIX.EXE -names    - названия контpолов миксеpа
      UNIMIX.EXE -list     - полный список контpолов (скpипт печатает его же
                             в лог, но в более полном виде)

   4. после написания скрипта: 
     umix /setup - будет выбор, на нашей строчке либо ругнётся на ошибку 
     в коде либо скажет ok.

   5. наведение красоты:
     [new_card]
     Controls=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
     script=data\new_card.scr

     ; альтернативное имя и текст тултипа для CustomB
     CustomB=#SPDIF,S/PDIF Playback Volume,S/PDIF Playback Switch

     ; кнопка Mute на клавиатуре влияет на CustomA (Main по умолчанию)
     Key.Mute=CustomA

     ; кнопки volume +/- меняют уровень Wave (Main по умолчанию)
     Key.Volume=Wave

   6. замечания по отдельным картам (см. .eng ;))

   7. баги: umix /setup часто падает на стаpте - когда-ньть пофикшу ;) Hу 
      не я аффтоp паpсеpа, что поделать ;)

     Усё :)
