Regulacja dźwięku

0

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.

0

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

0

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

0

juz ktorys dzien z kolei sie z tym mecze... dla kogos kto jest obeznany w temacie to pewnie tylko kilkadziesiat sekund... prosze o pomoc

0
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

0

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)

0

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.

0

Tak, wiem, ale nie wiem jak mam ta wartosc odczytac i wrzucic do labela, bo ustawic to wiem...

mam namysli np. Label1->Caption=glosnosc;

0
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

0

o ho ho dziekuje Wam Panowie za pomoc i poswiecenie chwilki czasu... ale jeszcze jedno male pytanko... jak z tym odczytem wartosci do labela?

0

@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 :)

0

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
}
//---------------------------------------------------------------------------
0

dodaj mmsystem.h

0

kurde nie wiem czy testowaliscie ten kod, ale... niestety on nie przycisza dzwieku calego tylko nadal jedynie WAVE...

0

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...

0

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:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1