Изменение громкости

Тема в разделе "WASM.WIN32", создана пользователем pluton, 7 апр 2007.

  1. pluton

    pluton New Member

    Публикаций:
    0
    Привет всем!
    Как получить каналы (Master Volume, Aux, MIDI, ...) для изменения их громкости? Надо юзать функции mixer*. Но чё-то не шибко ясно как; в MSDN примера нету.
    Пробовал так (код на си, не пинайте ногами плиз, могу и на асме, но разбираться быстрее на c++ builder):
    Код (Text):
    1.     mmres = mixerOpen(&hMixer, 0, 0, 0, 0);
    2.     //   открыть девайс, тоесть саундкарту
    3.     mmres = mixerOpen(&hMixer, 0, 0, 0, 0);
    4.     mlc.cbStruct = sizeof mlc;
    5.     mlc.cControls = 1;
    6.     mlc.cbmxctrl = sizeof mc;
    7.     mlc.pamxctrl = &mc;
    8.     mlc.dwControlID = 0;
    9.     while (TRUE)
    10.     {
    11.         mmres = mixerGetLineControls(hMixer, &mlc,
    12.             MIXER_GETLINECONTROLSF_ONEBYID);
    13.         if (mmres != MMSYSERR_NOERROR) break;
    14.         ListBox2->Items->Add(mlc.pamxctrl->szName);
    15.         mlc.dwControlID++;
    16.     }
    17.     mmres = mixerClose(hMixer);
    Выводит слишком много всего.
    Пробовал константу MIXER_GETLINECONTROLSF_ONEBYTYPE:
    Код (Text):
    1.     mmres = mixerOpen(&hMixer, 0, 0, 0, 0);
    2.     mlc.cbStruct = sizeof mlc;
    3.     mlc.cControls = 1;
    4.     mlc.cbmxctrl = sizeof mc;
    5.     mlc.pamxctrl = &mc;
    6.     mlc.dwControlID = 0;
    7.     mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
    8.     mlc.dwLineID = 0;
    9.     while (TRUE)
    10.     {
    11.         mmres = mixerGetLineControls(hMixer, &mlc,
    12.             MIXER_GETLINECONTROLSF_ONEBYTYPE);
    13.         if (mmres != MMSYSERR_NOERROR) break;
    14.         ListBox2->Items->Add(mlc.pamxctrl->szName);
    15.         mlc.dwControlID++;
    16.     }
    17.     mmres = mixerClose(hMixer);
    Выводит одну строчку: Volume.
    Ктото знает чё надо написать шобы правильно было? Может цикл неправильный?
    Спасибо
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    \masm32\examples\bcraven\mvolume
     
  3. GMax

    GMax Member

    Публикаций:
    0
    Для Volume Control:
    Код (Text):
    1. GetMasterVolume proc
    2.  
    3.         invoke  mixerOpen,ADDR MixerHandle,0,hWnd,0,CALLBACK_WINDOW
    4.         .if eax == MMSYSERR_NOERROR
    5.             mov mxlc.cbStruct,SIZEOF mxlc
    6.             mov mxlc.dwLineID,SPEAKEROUTLINEID
    7.             mov mxlc.dwControlType,MIXERCONTROL_CONTROLTYPE_VOLUME
    8.             mov mxlc.cControls,1
    9.             mov mxlc.cbmxctrl,SIZEOF mxc
    10.             mov mxlc.pamxctrl,OFFSET mxc
    11.             invoke  mixerGetLineControls,MixerHandle,ADDR mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE
    12.             mov eax,mxc.dwControlID
    13.             mov VolCtlIDMtr,eax
    14.             mov mxcdVol.dwValue,1
    15.             mov mxcd.cbStruct,SIZEOF mxcd
    16.             mov eax,VolCtlIDMtr
    17.             mov mxcd.dwControlID,eax
    18.             mov mxcd.cChannels,1
    19.             mov mxcd.cMultipleItems,0
    20.             mov mxcd.cbDetails,SIZEOF mxcdVol
    21.             mov mxcd.paDetails,OFFSET mxcdVol
    22.             invoke mixerGetControlDetails,MixerHandle,ADDR mxcd,MIXER_GETCONTROLDETAILSF_VALUE
    23.             mov eax,mxcdVol[0].dwValue
    24.         .else
    25.             mov eax,MIXER_ERROR
    26.         .endif
    27. ret
    28. GetMasterVolume endp
     
  4. pluton

    pluton New Member

    Публикаций:
    0
    To Y_Mur и GMax:
    это я видел. там изменяется громкость Master Volume. А мне надо перечислить каналы (Master Volume, Aux, MIDI, ...)
     
  5. GMax

    GMax Member

    Публикаций:
    0
    Есть RIP.
    Делал давно, все руки никак не дойдут доделать.

    Выкладываю экзешник, т.к. исходник выглядит также как код в отладчике.

    http://rapidshare.com/files/24916179/Mixer.exe.html

    P.S. Если действительно надо то можно разобратся.
     
  6. pluton

    pluton New Member

    Публикаций:
    0
    to GMax:
    спасибо
     
  7. pluton

    pluton New Member

    Публикаций:
    0
    Разобрался с прогой. Было немного непривычно - нету ebp-фреймов в функциях. Это ты сам так писал, или компилятор хитрый попался?
    Если кому надо, выкладываю архив: в нём exe, idb (для IDA) и asm (сгенереный идой с моими комментами).
    http://rs87.rapidshare.com/files/25565108/mixer.rar
     
  8. GMax

    GMax Member

    Публикаций:
    0
    Рад что помогло!
    Компилятор у проги был VС++ 6, он иногда такое делает. Типа оптимизация, использует ebp для своих нужд.