Witam, widzialam niedawno u znajomego, ktory uzywa systemu Windows Vista - na laptopie, takie cudo, ze kiedy zmieniana byla glosnosc dzwieku -> ort!, to wyswietlalo sie okno w ktorym byla pokazana skala natezenia dzwieku itp, chce napisac sobie taki programik pod windowsa xp, uzywajac standardowego TrackBar'a. Znalazlam tylko informacje o tym jak zmienic glosnosc plikow WAV, mi chodzi o poglasnianie i przyciszanie "calego dzwieku", czyli w windowsowym Regulatorze dzwieku pierwsza kolumna "regulacja glosnosci". Generalnie to chodzi mi o mozliwosc zmiany glosnosci w tym programie oraz "wylapanie" zmiany glosnosci (ort!), chocby uzywajac Timer'a, nie wiem tylko do jakich funkcji mam sie odwolac, tak wiec prosze o pomoc.
http://msdn.microsoft.com/en-us/library/ms713762.aspx
http://msdn.microsoft.com/en-us/library/ms713752.aspx
WAVE_MAPPER - to domyślnie ustawione urządzenie(1 parametr)
@down jutro
kurcze, kompletnie nie wiem jak mam tego uzyc, moglby mi ktos napisac malego -> brzydko to brzmi... gotowca? tzn jak podpiac WaveOutSetVolume pod TrackBar jak i rowniez WaveOutGetVolume pod tego TrackBara
juz ktorys dzien z kolei sie z tym mecze... dla kogos kto jest obeznany w temacie to pewnie tylko kilkadziesiat sekund... prosze o pomoc
HWAVEOUT hWaveOut;
HGLOBAL hWaveHdr;
WAVEFORMAT *pFormat;
waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER,(LPWAVEFORMATEX)pFormat, 0, 0L, NULL);
waveOutSetVolume((HWAVEOUT)WAVE_MAPPER,0xFFFF);
...
waveOutClose(hWaveOut);
Nie zapomnij o bibliotece Winmm.lib i nagłówku windows.h
Oh, jestes jedyna osoba ktora wie jak to zrobic i o tym napisala, dziekuje bardzo... ale mam jeszcze malenkie pytanko... jak mozna np do labela podlaczyc zeby podczas zmiany dzwieku w labelu byla pokazana wartosc (ona pewnie jest wartoscia Int wiec moze byc IntToStr ;] o cos takiego mi chodzi)
waveOutSetVolume((HWAVEOUT)WAVE_MAPPER,0xFFFF);
Za głośność odpowiada ostatni parametr (czyli w powyższej linijce 0xFFFF). 0xFFFF to wartość maksymalna, 0x0 to minimalna. A do zamiany liczby na String użyj funkcji itoa(liczba)
Pozdrawiam.
Tak, wiem, ale nie wiem jak mam ta wartosc odczytac i wrzucic do labela, bo ustawic to wiem...
mam namysli np. Label1->Caption=glosnosc;
Afish napisał(a)
HWAVEOUT hWaveOut;
HGLOBAL hWaveHdr;
WAVEFORMAT *pFormat;
waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER,(LPWAVEFORMATEX)pFormat, 0, 0L, NULL);
waveOutSetVolume((HWAVEOUT)WAVE_MAPPER,0xFFFF);
...
waveOutClose(hWaveOut);
Nie zapomnij o bibliotece Winmm.lib i nagłówku windows.h
No nie do końca, pewnie kierowałeś się moimi błędnymi słowami, jak zwykle źle powiedziałem :>
W ogóle to już na początku wyprowadziłem w błąd, nie doczytałem, że chodzi o główną regulację, to reguluje wyjście wave, a autorowi nie o to chodzi...
Do modyfikacji poszczególnych wyjść audio pewnie będzie trzeba użyć tej część API: http://msdn.microsoft.com/en-us/library/ms923403.aspx , ale nigdy z tego nie korzystałem, także nic więcej na ten temat nie powiem...
a sam kod Afisha też nie jest poprawny, także z mojej winy, pewnie kolega kierował się tym co napisałem wcześniej, a to też nie jest tak z tym parametrem, przepraszam z wprowadzenie w błąd, poprawnie to powinno być jakoś tak:
HWAVEOUT hWaveOut;
WAVEFORMATEX Format;//to jest wejście, to my określamy jakiego formatu dane będą dostarczane do device'a
Format.wFormatTag=WAVE_FORMAT_PCM;
Format.nChannels=1;//mono
Format. nSamplesPerSec=22050;//próbkowanie 22,05 KHz
Format.nAvgBytesPerSec=22050;
Format.nBlockAlign=1;
Format.wBitsPerSample=8;//próbka 8-bitowa
Format.cbSize=0;
//zakładamy, że device obsługuje dany format dźwięku, trzeba utworzyć sobie fikcyjny format, żeby otworzyć sobie urządzenie
waveOutOpen(&hWaveOut, WAVE_MAPPER,&Format,0,0,CALLBACK_NULL);
short left_channel=0xff;//natężenie lewego kanału, od 0 do 0xff
short right_channel=0xff;//natężenie prawego kanału
waveOutSetVolume(hWaveOut,MAKELONG(left_channel,right_channel));//tutaj źle powiedziałem, jako I parametr otwarte urządzenie, nie WAVE_MAPPER
waveOutClose(hWaveOut);//pamiętajmy o zamykaniu urządzenia, otworzenie dużej ilości urządzeń może doprowadzić o błędu sterownika => czyt. Blue Death Of Screen, przynajmniej na mojej karcie
to chyba tyle
o ho ho dziekuje Wam Panowie za pomoc i poswiecenie chwilki czasu... ale jeszcze jedno male pytanko... jak z tym odczytem wartosci do labela?
@crayze
Rzeczywiście kierowałem się Twoimi słowami i nie za bardzo przejmowałem się "merytoryczną" częścią kodu :) Zerknąłem do dokumentacji, napisałem pierwszy lepszy kod, który u mnie działał i napisałem posta :)
kurde, w projekcie dodane jest windows.h i winmm.lib ale nie dziala... Undefined symbol 'HWAVEOUT'
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWAVEOUT hWaveOut;
WAVEFORMATEX Format;//to jest wejście, to my określamy jakiego formatu dane będą dostarczane do device'a
Format.wFormatTag=WAVE_FORMAT_PCM;
Format.nChannels=1;//mono
Format. nSamplesPerSec=22050;//próbkowanie 22,05 KHz
Format.nAvgBytesPerSec=22050;
Format.nBlockAlign=1;
Format.wBitsPerSample=8;//próbka 8-bitowa
Format.cbSize=0;
//zakładamy, że device obsługuje dany format dźwięku, trzeba utworzyć sobie fikcyjny format, żeby otworzyć sobie urządzenie
waveOutOpen(&hWaveOut, WAVE_MAPPER,&Format,0,0,CALLBACK_NULL);
short left_channel=0xff;//natężenie lewego kanału, od 0 do 0xff
short right_channel=0xff;//natężenie prawego kanału
waveOutSetVolume(hWaveOut,MAKELONG(left_channel,right_channel));//tutaj źle powiedziałem, jako I parametr otwarte urządzenie, nie WAVE_MAPPER
waveOutClose(hWaveOut);//pamiętajmy o zamykaniu urządzenia, otworzenie dużej ilości urządzeń może doprowadzić o błędu sterownika => czyt. Blue Death Of Screen, przynajmniej na mojej karcie
}
//---------------------------------------------------------------------------
dodaj mmsystem.h
kurde nie wiem czy testowaliscie ten kod, ale... niestety on nie przycisza dzwieku calego tylko nadal jedynie WAVE...
zacytuje to co napisałem w jednym z poprzednich postów:
crayze napisał(a)
W ogóle to już na początku wyprowadziłem w błąd, nie doczytałem, że chodzi o główną regulację, to reguluje wyjście wave, a autorowi nie o to chodzi...
Do modyfikacji poszczególnych wyjść audio pewnie będzie trzeba użyć tej część API: http://msdn.microsoft.com/en-us/library/ms923403.aspx , ale nigdy z tego nie korzystałem, także nic więcej na ten temat nie powiem...
Witam:) wiem ze temat jest juz bardzo stary jednak też poszukiwałem tego co koleżanka:) Kolega dobrze tutaj nakierował na Hardware Mixer:) ponieważ znalazłem gotowy kod za pomocą którego mozna sterowac głównym kanałem głośności wkleje go tutaj aby komus kto jeszcze by szukał znalazł swoja odp:)
//---------------------------------------------------------------------------
BOOL __fastcall SetVolume(DWORD compType, DWORD cVolume)
{
MMRESULT result;
HMIXER hMixer;
result = mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);
MIXERLINE ml = {0};
ml.cbStruct = sizeof(MIXERLINE);
ml.dwComponentType = compType; // typ sterownika, któremu regulujemy dźwięk
result = mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE);
MIXERLINECONTROLS mlc = {0};
MIXERCONTROL mc = {0};
mc.cbStruct = sizeof(MIXERCONTROL);
mlc.cbStruct = sizeof(MIXERLINECONTROLS);
mlc.dwLineID = ml.dwLineID;
mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mlc.cControls = 1;
mlc.pamxctrl = &mc;
mlc.cbmxctrl = sizeof(MIXERCONTROL);
result = mixerGetLineControls((HMIXEROBJ) hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
MIXERCONTROLDETAILS mcd = {0};
MIXERCONTROLDETAILS_UNSIGNED mcdu = {0};
mcdu.dwValue = cVolume; // siła dźwięku zawiera się pomiędzy 0 i 65535
mcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mcd.hwndOwner = 0;
mcd.dwControlID = mc.dwControlID;
mcd.paDetails = &mcdu;
mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mcd.cChannels = 1;
result = mixerSetControlDetails((HMIXEROBJ)hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);
return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, 30000); // głośność główna
}
MIXERLINE_COMPONENTTYPE_DST_SPEAKERS-odpowiada za główny kanał
a druga wartosc funkcji SetVolume to oczywiscie głosnosc z zakresu 0-65355 nie jestem pewien ale wpisanie 66000 da nam MAXa:)