Привет всем! Как получить каналы (Master Volume, Aux, MIDI, ...) для изменения их громкости? Надо юзать функции mixer*. Но чё-то не шибко ясно как; в MSDN примера нету. Пробовал так (код на си, не пинайте ногами плиз, могу и на асме, но разбираться быстрее на c++ builder): Код (Text): mmres = mixerOpen(&hMixer, 0, 0, 0, 0); // открыть девайс, тоесть саундкарту mmres = mixerOpen(&hMixer, 0, 0, 0, 0); mlc.cbStruct = sizeof mlc; mlc.cControls = 1; mlc.cbmxctrl = sizeof mc; mlc.pamxctrl = &mc; mlc.dwControlID = 0; while (TRUE) { mmres = mixerGetLineControls(hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYID); if (mmres != MMSYSERR_NOERROR) break; ListBox2->Items->Add(mlc.pamxctrl->szName); mlc.dwControlID++; } mmres = mixerClose(hMixer); Выводит слишком много всего. Пробовал константу MIXER_GETLINECONTROLSF_ONEBYTYPE: Код (Text): mmres = mixerOpen(&hMixer, 0, 0, 0, 0); mlc.cbStruct = sizeof mlc; mlc.cControls = 1; mlc.cbmxctrl = sizeof mc; mlc.pamxctrl = &mc; mlc.dwControlID = 0; mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME; mlc.dwLineID = 0; while (TRUE) { mmres = mixerGetLineControls(hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if (mmres != MMSYSERR_NOERROR) break; ListBox2->Items->Add(mlc.pamxctrl->szName); mlc.dwControlID++; } mmres = mixerClose(hMixer); Выводит одну строчку: Volume. Ктото знает чё надо написать шобы правильно было? Может цикл неправильный? Спасибо
Для Volume Control: Код (Text): GetMasterVolume proc invoke mixerOpen,ADDR MixerHandle,0,hWnd,0,CALLBACK_WINDOW .if eax == MMSYSERR_NOERROR mov mxlc.cbStruct,SIZEOF mxlc mov mxlc.dwLineID,SPEAKEROUTLINEID mov mxlc.dwControlType,MIXERCONTROL_CONTROLTYPE_VOLUME mov mxlc.cControls,1 mov mxlc.cbmxctrl,SIZEOF mxc mov mxlc.pamxctrl,OFFSET mxc invoke mixerGetLineControls,MixerHandle,ADDR mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE mov eax,mxc.dwControlID mov VolCtlIDMtr,eax mov mxcdVol.dwValue,1 mov mxcd.cbStruct,SIZEOF mxcd mov eax,VolCtlIDMtr mov mxcd.dwControlID,eax mov mxcd.cChannels,1 mov mxcd.cMultipleItems,0 mov mxcd.cbDetails,SIZEOF mxcdVol mov mxcd.paDetails,OFFSET mxcdVol invoke mixerGetControlDetails,MixerHandle,ADDR mxcd,MIXER_GETCONTROLDETAILSF_VALUE mov eax,mxcdVol[0].dwValue .else mov eax,MIXER_ERROR .endif ret GetMasterVolume endp
To Y_Mur и GMax: это я видел. там изменяется громкость Master Volume. А мне надо перечислить каналы (Master Volume, Aux, MIDI, ...)
Есть RIP. Делал давно, все руки никак не дойдут доделать. Выкладываю экзешник, т.к. исходник выглядит также как код в отладчике. http://rapidshare.com/files/24916179/Mixer.exe.html P.S. Если действительно надо то можно разобратся.
Разобрался с прогой. Было немного непривычно - нету ebp-фреймов в функциях. Это ты сам так писал, или компилятор хитрый попался? Если кому надо, выкладываю архив: в нём exe, idb (для IDA) и asm (сгенереный идой с моими комментами). http://rs87.rapidshare.com/files/25565108/mixer.rar
Рад что помогло! Компилятор у проги был VС++ 6, он иногда такое делает. Типа оптимизация, использует ebp для своих нужд.