CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Regulacja dźwięku

Regulacja dźwięku

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Regulacja dźwięku

Nowy postprzez shycat » niedziela, 16 listopada 2008, 23:49

Witam, widzialam niedawno u znajomego, ktory uzywa systemu Windows Vista - na laptopie, takie cudo, ze kiedy zmieniana byla glosnosc dzwieku -> pokredelkiem, 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 (pokredelkiem), chocby uzywajac Timer'a, nie wiem tylko do jakich funkcji mam sie odwolac, tak wiec prosze o pomoc.
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez Witold » poniedziałek, 17 listopada 2008, 20:24

Szukałem chwilkę i znalazłem:
mixerOpen z CALLBACK_WINDOW – powinno wystarczyć do wyłapania zmian. http://msdn.microsoft.com/en-us/library/ms932053.aspx

I kod do zmiany głośności (ja go nie testowałem): http://komputery.katalogi.pl/pliki_kar-t46421.html

Sam się chyba kiedyś tym pobawię ….
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez shycat » środa, 19 listopada 2008, 18:07

Witam nie wiem co mam zrobic z tym kodem, jestem raczej laikiem... na innym forum dostalam takie linki:

http://msdn.microsoft.com/en-us/library/ms713762.aspx
http://msdn.microsoft.com/en-us/library/ms713752.aspx

ale 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
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez Cyfrowy Baron » środa, 19 listopada 2008, 20:42

Jeżeli chcesz uzyskać precyzyjną odpowiedź to musisz bardziej sprecyzować swoje pytanie, na takie pytania ogólne niewiele osób będzie zwracało uwagę.

Co do funkcji waveOutSetVolume to przykład użycia tej funkcji w połączeniu z TrackBar znajdziesz w serwisie Cyfrowy Baron w dziale: porady | audio - video -> regulowanie głośności plików wav.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez shycat » środa, 19 listopada 2008, 21:24

Ok, to jeszcze raz...

chce napisac program, ktory bedzie mial trackbar ktorym bedzie mozna regulowac glosnosc, ale nie glosnosc wave ale ogolna glosnosc 'komputera' to pierwsze zadanie programu, drugie: jezeli zostanie zmieniona glosnosc (czy to w programie windowsowskim "Regulacja glosnosci" czy poprzez pokredelko -> jak w przypadku laptopow) to trackbar bedzie wykrywal cos w rodzaju OnChange-> glosnosci i zmienial swoja wartosc... nie wiem jak prosciej mam to opisac, wydaje mi sie, ze juz za pierwszym razem wszystko opisane bylo w sposob prosty.

ps. Cyfrowy Baronie, zanim pojawil sie moj post na forum dokladnie zostal przegladniety przeze mnie dzial z poradami wiec i ta znam, ale nie rozwiazuje ona mojego problemu.
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez Cyfrowy Baron » czwartek, 20 listopada 2008, 09:59

Pisząc o konkretach, chodziło mi raczej o to, że przytoczysz jakiś fragment kodu, z którym sobie nie radzisz, lub podasz funkcję, której nie wiesz jak użyć.

Co do regulacji głośności za pomocą jakiegoś "pokrętełka" to nie bardzo rozumiem o co chodzi. Jeżeli takie pokrętło znajduje się na klawiaturze, to za sterowanie tym pokrętłem odpowiada sterownik klawiatury, a nie karty dźwiękowej i takie pokrętło powinno działać bez żadnych dodatkowych programów.

Przypuszczam, że chcesz w swoim programie mieć coś takiego, że gdy poruszasz tym pokrętłem na klawiaturze, to oprócz tego, że reguluje ono głośność to dodatkowo zmieni ono np. pozycję TrackBar w Twoim programie. Takie zadanie realizuje się w ten sposób, że program (Twój) po prostu sprawdza okresowo, pozycję regulatora dźwięku, czyli pokrętło nie jest w żaden sposób podłączone z Twoim programem, gdyż tego nie da się zrealizować, wymagałoby to dokonania zmian w sterowniku klawiatury, tak by łączył się właśnie z Twoim programem, co przyznasz jest raczej trudne do realizacji, zważywszy, że nie masz kodu tegoż sterownika.

We wszystkich programach jest to realizowane w ten sposób, że pozostają one na nasłuchu oczekując na komunikaty systemowe. Wywołanie jakiegokolwiek zdarzenia w systemie wiąże się z wysłaniem jakiegoś komunikatu z programu do systemu, odbywa się to oczywiście w obrębie systemu. Program po prostu przechwytują takie komunikaty, czyli trzeba by zamontować w programie mechanizm przechwytywania haków systemowych.

Co do komunikatu systemowego związanego z regulacją dźwięku, to nie wiem, jaki jest, nigdy mnie ta tematyka nie interesowała, podobnie jak regulacja dźwięku za pomocą własnego programu. Gdy znajdę wolną chwilę to się trochę zagłębię w ten temat, a tymczasem powinieneś sam pokombinować i jeżeli będziesz miał jakiś kod lub funkcję, której nie wiesz jak użyć, to wtedy ewentualnie pomogę.

Twój problem jest bardzo złożony, chcąc udzielić odpowiedzi na ten post koniecznym byłoby napisanie całego programu, którego potrzebujesz, gdyż problem nie dotyczy tylko samej regulacji dźwięku, ale również przechwytywania komunikatów systemowych.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez shycat » czwartek, 20 listopada 2008, 16:49

po prostu sprawdza okresowo, pozycję regulatora dźwięku


dokladnie o to chodzi
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez shycat » niedziela, 23 listopada 2008, 16:06

oto kod ktory mam:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
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
}
//---------------------------------------------------------------------------


jednak on przycisza jedynie nadal dzwiek WAVE, a nie caly...
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez Cyfrowy Baron » poniedziałek, 24 listopada 2008, 17:04

Znalazłeś ten kod gdzieś na forum i nie wiesz co z nim zrobić?!

Niżej przedstawiam funkcję SetVolume służącą do regulacji różnych sterowników karty dźwiękowej:

KOD cpp:     UKRYJ  
#include "mmsystem.h"

//---------------------------------------------------------------------------
void __fastcall SetVolume(DWORD cType, DWORD sVolume)
{
MMRESULT result;
 HMIXER hMixer;
 result = mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);

 MIXERLINE ml = {0};
 ml.cbStruct = sizeof(MIXERLINE);
 ml.dwComponentType = cType; // typ sterownika, któremu regulujemy dźwięk
 result = mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE);

 MIXERLINECONTROLS mlc = {0};
 MIXERCONTROL mc = {0};
 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 = sVolume; // 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);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   SetVolume(MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE, 32767);
}
//---------------------------------------------------------------------------
 


Definicje sterowników:

Odtwarzanie:
   MIXERLINE_COMPONENTTYPE_DST_SPEAKERS - Play Control - głośność główna
   MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_DST_DIGITAL - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_DST_HEADPHONES - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_DST_LINE - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_DST_MONITOR - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_DST_TELEPHONE - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_DST_UNDEFINED - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_DST_VOICEIN - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_SRC_DIGITAL - Wave/Mp3
   MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER - MIDI Synthe
   MIXERLINE_COMPONENTTYPE_SRC_ANALOG - PC Speaker
   MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC - CD Audio
   MIXERLINE_COMPONENTTYPE_SRC_LINE - Line-In
   MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE - Microphone
   MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE - TAD-In

Nagrywanie:
   MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED - Wave/Mp3

Te definicje odnoszą się do konkretnych sterowników karty dźwiękowej i mogą być różne w odniesieniu do różnych kart, poza tym nie wiem jak to się ma do kart HD.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez shycat » wtorek, 25 listopada 2008, 13:34

Witam, dzieki Cyfrowy Baronie, wszystko dziala oczywiscie okej, mam jeszcze jedno pytanko... jak napisac dodatkowa funkcje typu GetVolume, czyli do pobierania wartosci dzwieku w int (0 - 65535) i czy do "obserwowania" wartosci takiej funkcji nalezy uzyc timera czy jest jakis inny sposob, aby kazda zmiana byla odrazu "wylapywana"? - generalnie druga czesc pytania czyli "wylapywanie" nie jest dla mnie tak bardzo wazne, timer wystarczy
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez Cyfrowy Baron » wtorek, 25 listopada 2008, 15:52

Byłem przekonany, że mając ten kod z pobieraniem wartości dźwięku już sobie poradzisz, gdyż w zasadzie wystarczy zastąpić funkcję mixerSetControlDetails funkcją mixerGetControlDetails, cała reszta pozostaje prawie bez zmian:

KOD cpp:     UKRYJ  
#include <mmsystem.h>

//---------------------------------------------------------------------------
DWORD GetVolume(DWORD cType)
{
MMRESULT result;
 HMIXER hMixer;
 result = mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);

 MIXERLINE ml = {0};
 ml.cbStruct = sizeof(MIXERLINE);
 ml.dwComponentType = cType; // typ sterownika, któremu regulujemy dźwięk
 result = mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE);

 MIXERLINECONTROLS mlc = {0};
 MIXERCONTROL mc = {0};
 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};

 mcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
 mcd.hwndOwner = 0;
 mcd.dwControlID = mc.dwControlID;
 mcd.paDetails = &mcdu;
 mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
 mcd.cChannels = 1;

 mixerGetControlDetails((HMIXEROBJ)hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);

 return mcdu.dwValue;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   int Volume = GetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS);
   Label1->Caption = "Siła dźwięku: " + (String)Volume;
}
//---------------------------------------------------------------------------


Jeżeli chodzi o sprawdzanie siły dźwięku na bieżąco, to można posłużyć się oczywiście Timer'em, ale ja sugeruję raczej zamontować hak systemowy, gdyż to nie obciąża procesora, wiadomo zegar sobie tyka z określoną częstotliwością, a hak systemowy tylko nasłuchuje komunikatów:

Przykład sprawdzanie siły główne głośności z wykorzystaniem haka systemowego:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "mmsystem.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;


HHOOK g_hLogHook       = NULL;
HWND g_hLastFocus      = NULL;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
DWORD GetVolume(DWORD cType) // Funkcja sprawdzająca siłę dźwięku
{
MMRESULT result;
 HMIXER hMixer;
 result = mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);

 MIXERLINE ml = {0};
 ml.cbStruct = sizeof(MIXERLINE);
 ml.dwComponentType = cType; // typ sterownika, któremu regulujemy dźwięk
 result = mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE);

 MIXERLINECONTROLS mlc = {0};
 MIXERCONTROL mc = {0};
 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};

 mcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
 mcd.hwndOwner = 0;
 mcd.dwControlID = mc.dwControlID;
 mcd.paDetails = &mcdu;
 mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
 mcd.cChannels = 1;

 mixerGetControlDetails((HMIXEROBJ)hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);

 return mcdu.dwValue;
}
//---------------------------------------------------------------------------
HOOKPROC ConnectHook(int iCode, WPARAM wParam, LPARAM lParam) // hak systemowy przechwytujący komunikaty
{
 if(iCode < 0) return (HOOKPROC)CallNextHookEx(g_hLogHook, iCode, wParam, lParam);

 int Volume = GetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS); // pobranie siły dźwięku
 Form1->Label1->Caption = "Siła dźwięku: " + (String)Volume; // wyświetlenie siły dźwięku - zwracam uwagę na adresowanie Form1->...

 return (HOOKPROC)CallNextHookEx (g_hLogHook, iCode, wParam, lParam);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) // Zamontowanie haka systemowego
{
 if(g_hLogHook == NULL)
  g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD, (HOOKPROC)ConnectHook, HInstance,0); 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) // od montowanie haka systemowego
{
if(g_hLogHook != NULL)
 {
  UnhookWindowsHookEx(g_hLogHook);
  g_hLogHook = NULL;
 }     
}
//---------------------------------------------------------------------------


W powyższym przykładzie przechwytywanie komunikatów nie następuje od razu po uruchomieniu programu, gdyż hak nie jest jeszcze zamontowany. Montowanie haka odbywa się w zdarzeniu OnClick przycisku Button1, nie należy jednak w żadnym razie montować haka w zdarzeniu OnShow czy też OnCreate formularza, jeżeli chcemy zamontować hak razem z uruchomieniem programu to należy skorzystać z Timer'a w celu opóźnienia montowania haka, czyli umieszczamy Timer na formularzu, ustawiamy jego właściwość Enabled na false, a Interval na 1000 i w zdarzeniu OnTimer umieszczamy taki kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 static int x = 0;
 x++;
 if(x >= 2)
 {
  if(g_hLogHook == NULL)
   g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD, (HOOKPROC)ConnectHook, HInstance,0);
   Timer1->Enabled = false;
 }
}

a w zdarzeniu OnShow formularza umieszczamy taki kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormShow(TObject *Sender)
{
 Timer1->Enabled = true;

 Volume = GetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS);

 Label1->Caption = "Siła dźwięku: " + (String)Volume;
}
Testowanie tak montowanego haka powinno odbywać się poza IDE środowiska BCB, gdyż program uruchomiony z poziomu BCB może spowodować zawieszenie systemu.

Trzeba też pamiętać o od montowaniu haka przy zamknięciu programu, można to zrobić w zdarzeniu OnClose dla formularza:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 if(g_hLogHook != NULL)
 {
  UnhookWindowsHookEx(g_hLogHook);
  g_hLogHook = NULL;
 }
}



Sprawdzanie siły głosu odbywa się wewnątrz funkcji haka, dlatego każde odwołanie do elementu formularza musi odbywać się poprzez adresowanie na formularz, czyli odwołanie do obiektu lub zmiennej powinno zawsze byc poprzedzone nazwą formularza, np. Form1->Label1->Caption = ...
Zmienne, które chcemy wykorzystać wewnątrz haka i jednocześnie programu powinny być deklarowane w pliku nagłówkowym w sekcji public jako zmienne globalne tak by funkcja haka miała do nich dostęp:

Plik nagłówkowy (np. Unit1.h)
KOD cpp:     UKRYJ  
public:         // User declarations
 int Volume;
        __fastcall TForm1(TComponent* Owner);


Plik źródłowy (np. Unit1.cpp)
KOD cpp:     UKRYJ  
HOOKPROC ConnectHook(int iCode, WPARAM wParam, LPARAM lParam)
{
 if(iCode < 0) return (HOOKPROC)CallNextHookEx(g_hLogHook, iCode, wParam, lParam);

 Form1->Volume = GetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS);

 Form1->Label1->Caption = "Siła dźwięku: " + (String)Form1->Volume;

 return (HOOKPROC)CallNextHookEx (g_hLogHook, iCode, wParam, lParam);
}
W załączniku znajdziesz przykładowy program testowy i pliki Unit1.cpp i Unit1.h. Nie zamieszczam całego projektu, gdyż tworzę w BDS 2006, więc pewnie i tak byś go nie uruchomił.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez shycat » wtorek, 25 listopada 2008, 19:52

Cyfrowy Baronie, dziekuje Ci bardzo za obszerna odpowiedz i dokladne wyjasnienie tematu... mam jednak znow maly problem, mianowicie: program dziala ok, wszystko dziala jak powinno, zmieniam w TrackBarze wartosc, to odpowiednio zmienia sie dzwiek, znow kiedy zmieniam skale w Windowsowskim Regulatorze Glosnosci TrackBar zmienia swoja wartosc, (ponizej moj kod), jednak kiedy uzywam poketla, do regulacji dzwieku w moim laptopie, ktore zmienia dzwiek "ogolny", czyli zakladka "regulacja glosnosci" (w windowsowskim...) to program sie zawiesza...

Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "mmsystem.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

HHOOK g_hLogHook  = NULL;
HWND g_hLastFocus = NULL;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall SetVolume(DWORD sVolume)
{
HMIXER hMixer;
mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);

MIXERLINE ml = {0};
ml.cbStruct = sizeof(MIXERLINE);
ml.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; // typ sterownika
mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_SETCONTROLDETAILSF_VALUE);

MIXERLINECONTROLS mlc = {0};
MIXERCONTROL mc = {0};
mlc.cbStruct = sizeof(MIXERLINECONTROLS);
mlc.dwLineID = ml.dwLineID;
mlc.dwControlType =  MIXERCONTROL_CONTROLTYPE_VOLUME;
mlc.cControls = 1;
mlc.pamxctrl = &mc;
mlc.cbmxctrl = sizeof(MIXERCONTROL);
mixerGetLineControls((HMIXEROBJ) hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);

MIXERCONTROLDETAILS mcd = {0};
MIXERCONTROLDETAILS_UNSIGNED mcdu = {0};
mcdu.dwValue = sVolume; // 0 / 65535

mcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mcd.hwndOwner = 0;
mcd.dwControlID = mc.dwControlID;
mcd.paDetails = &mcdu;
mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mcd.cChannels = 1;
mixerSetControlDetails((HMIXEROBJ) hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);
}
//---------------------------------------------------------------------------
DWORD GetVolume()
{
HMIXER hMixer;
mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);

MIXERLINE ml = {0};
ml.cbStruct = sizeof(MIXERLINE);
ml.dwComponentType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mixerGetLineInfo((HMIXEROBJ) hMixer, &ml, MIXER_SETCONTROLDETAILSF_VALUE);

MIXERLINECONTROLS mlc = {0};
MIXERCONTROL mc = {0};
mlc.cbStruct = sizeof(MIXERLINECONTROLS);
mlc.dwLineID = ml.dwLineID;
mlc.dwControlType =  MIXERCONTROL_CONTROLTYPE_VOLUME;
mlc.cControls = 1;
mlc.pamxctrl = &mc;
mlc.cbmxctrl = sizeof(MIXERCONTROL);
mixerGetLineControls((HMIXEROBJ) hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);

MIXERCONTROLDETAILS mcd = {0};
MIXERCONTROLDETAILS_UNSIGNED mcdu = {0};

mcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mcd.hwndOwner = 0;
mcd.dwControlID = mc.dwControlID;
mcd.paDetails = &mcdu;
mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mcd.cChannels = 1;

mixerGetControlDetails((HMIXEROBJ)hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);

return mcdu.dwValue;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
  int wartosc,procenty,i;
  AnsiString str,odw,got;

  wartosc=(TrackBar1->Position-65535)*-1;

  procenty=(wartosc*10000)/65535;

  //------------------------------------------

    if (procenty!=10000)
    {
      if (procenty!=0)
      {
        str=IntToStr(procenty);
        odw=strrev(str.c_str());
        odw.Insert(",",3);
        got=strrev(odw.c_str());

        if (StrLen(got.c_str())<4)
        {
          got="0"+got;
        }

        got=got+"%";
      }
      else
      {
        got="0%";
      }
    }
    else
    {
      got="100%";
    }


    Label2->Caption=got;

  //------------------------------------------

  SetVolume(wartosc);
  Label1->Caption=procenty;
}
//---------------------------------------------------------------------------
HOOKPROC ConnectHook(int iCode, WPARAM wParam, LPARAM lParam)
{
if(iCode < 0) return (HOOKPROC)CallNextHookEx(g_hLogHook, iCode, wParam, lParam);

int Volume = GetVolume();
Form1->Label3->Caption = "Siła dźwięku: " + (String)Volume;

return (HOOKPROC)CallNextHookEx (g_hLogHook, iCode, wParam, lParam);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if(g_hLogHook == NULL)
  {
    g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD, (HOOKPROC)ConnectHook, HInstance,0);
  }         
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  if(g_hLogHook != NULL)
  {
    UnhookWindowsHookEx(g_hLogHook);
    g_hLogHook = NULL;
  }
}
//---------------------------------------------------------------------------
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez Cyfrowy Baron » wtorek, 25 listopada 2008, 21:11

Sprawdziłem Twój kod i u mnie działa on prawidłowo, mam na klawiaturze przyciski (nie pokrętło) do zmiany głośności i działają ono prawidłowo, gdy używam tych przycisków w programie zmienia się pozycja TrackBar'a. Nie wiem jak to jest z tym pokrętłem, gdyż nie wiem z czym tak naprawdę mam do czynienia, możliwe jest, ze to pokrętło nie zmienia siły głównej głośności programowo, lecz jest sprzęgnięte za kartą dźwiękową i zmiana pozycji następuje bezpośrednio poprzez sterowanie kartą. W takiej sytuacji hak systemowy może blokować program prowadząc do jego zawieszenia. Niczego już tutaj nie mogę poradzić poza rezygnacją z montowania haka systemowego na rzecz np. Timer'a.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Regulacja dźwięku

Nowy postprzez shycat » wtorek, 25 listopada 2008, 23:41

Tak tez zrobilam, uzylam timera i wszystko jest ok... dziekuje bardzo za pomoc, mam nadzieje, ze ten temat pomoze rowniez innym osobom, ktore beda mialy podobny problem.
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron