Проблема с контролем громкости звука

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Аватара пользователя
timself
Сообщения: 16
Зарегистрирован: 15 мар 2007, 01:28

Не могу сделать вроде бы простую вещь: есть 2 кнопки "+" и "--" при нажатии на которые должна изменяться громкость проигрывания Audio-CD диска.

Я подключил winmm.lib и winmm.inc , пробовал использовать waveOutSetVolume и mixerSetControlDetails, но что-то упускаю - ничего не выходит. Смог добиться только того, что при нажатии на "--" громкость waveout обнуляется. Чтение Multimedia Reference оказалось также информативно, как чтение японской поэзии.

Подскажите как сделать, или подбросьте исходник на masm если есть.
tim-soft.narod.ru
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Код проги в студию, и желательно вместе с winmm.inc
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
timself
Сообщения: 16
Зарегистрирован: 15 мар 2007, 01:28

Смысл проги прост: регулировать громкость во время проигрывания Audio-CD.
Я делал так:

Код: Выделить всё

...
hMixer       dd  0
mxdc    MIXERCAPS                    <?>
mxl     MIXERLINE                    <?>
mxlc    MIXERLINECONTROLS            <?>
mxc     MIXERCONTROL                 <?>
mxcd    MIXERCONTROLDETAILS          <?>
mxcdVol MIXERCONTROLDETAILS_UNSIGNED <?>
...
WndProc proc ...
 ...
 .IF eax==WM_CREATE
          INVOKE     mixerOpen, addr hMixer, 0, 0, 0, 0  ; открываем mixer
 ...
 .ELSEIF eax==WM_DESTROY
          INVOKE     mixerClose, addr hMixer  ; закрываем mixer
 ...
 .ELSEIF eax==WM_LBUTTONDOWN
  .IF eax==BUTTON_PLUS   ; кнопка "+" , этот код не работает
  mov     mxlc.dwControlType, MIXERCONTROL_CONTROLTYPE_VOLUME
  mov     mxcd.cbDetails, sizeof mxcdVol
  mov     mxcd.paDetails, offset mxcdVol
  INVOKE     mixerSetControlDetails, hMixer, addr mxlc,  MIXER_GETCONTROLDETAILSF_VALUE
 .ELSEIF eax==BUTTON_MINUS   ; кнопка "--" 
  ;  то же самое - не работает
...
Вот часть winmm.inc реализующая миксер:

Код: Выделить всё

 
IFNDEF WINMM_INC
WINMM_INC equ <1>
...
mixerClose PROTO :D WORD
mixerGetControlDetailsA PROTO :D WORD, :D WORD, :D WORD
mixerGetControlDetails equ <mixerGetControlDetailsA>
mixerGetControlDetailsW PROTO :D WORD, :D WORD, :D WORD
mixerGetDevCapsA PROTO :D WORD, :D WORD, :D WORD
mixerGetDevCaps equ <mixerGetDevCapsA>
mixerGetDevCapsW PROTO :D WORD, :D WORD, :D WORD
mixerGetID PROTO :D WORD, :D WORD, :D WORD
mixerGetLineControlsA PROTO :D WORD, :D WORD, :D WORD
mixerGetLineControls equ <mixerGetLineControlsA>
mixerGetLineControlsW PROTO :D WORD, :D WORD, :D WORD
mixerGetLineInfoA PROTO :D WORD, :D WORD, :D WORD
mixerGetLineInfo equ <mixerGetLineInfoA>
mixerGetLineInfoW PROTO :D WORD, :D WORD, :D WORD
mixerGetNumDevs PROTO 
mixerMessage PROTO :D WORD, :D WORD, :D WORD, :D WORD
mixerOpen PROTO :D WORD, :D WORD, :D WORD, :D WORD, :D WORD
mixerSetControlDetails PROTO :D WORD, :D WORD, :D WORD
...
ELSE
echo -----------------------------------------
echo WARNING Duplicate include file winmm.inc
echo -----------------------------------------
ENDIF
tim-soft.narod.ru
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):mixerSetControlDetails, hMixer, addr mxlc, MIXER_GETCONTROLDETAILSF_VALUE
Что-то ты намудрил, тебе надо кинуть смещение структуры MIXERCONTROLDETAILS, т.е. в твоем случае Mxcd. И зачем тебе MIXER_GETCONTROLDETAILSF_VALUE, может наоборот - MIXER_SETCONTROLDETAILSF_VALUE?

Код: Выделить всё

INVOKE     mixerSetControlDetails, hMixer, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE
Вообще желательно заполнять все поля структур, либо получать их через mixerGetControlDetails а потом менять нужные.
It's a long way to the top if you wanna rock'n'roll
Ответить