Results 1 to 3 of 3

Thread: WaveOutGetVolume

  1. #1

    WaveOutGetVolume

    Hoewel ik reeds meerdere succesvolle programma's schreef in Delphi, ben ik op sommige terreinen nog een absolute leek.
    Voor een bepaald programma heb ik gegevens nodig over het ingestelde geluidsvolume.Daarvoor gebruik ik als een der variabelen PDW: Integer of DWord.
    Wanneer ik in de hierna volgend code @ weglaat krijg ik een foutmelding en loopt of compileert het niet.
    Wanneer het er wel staat krijg ik een waarschuwing: unsafe code operator, maar het werkt wel.

    waveOutGetVolume(0,@PDW);
    GetVolLeft:= LoWord(PDW);
    GetVolRight:= HiWord(PDW);
    Vol.Caption:= IntToStr(GetVolLeft) + ' ' + IntToStr(GetVolRight); {dit is slechts ter controle};

    Ik krijg steeds een bepaalde positieve waarde van GetVolLeft, afhankelijk van het ingestelde volume, maar GetVolRight blijft altijd 0.
    Ik doe waarschijnlijk iets verkeerd, maar wat?
    Indien gewenst geef ik de volledige code, het gaat nog altijd over een Gehoortest waar ik reeds lang aan werk. Voor de rest werkt het goed.

    Wie helpt?

  2. #2
    Sowieso moet je PDW een DWord zijn. Dit is de declaratie van waveOutGetVolume:
    Code:
    function waveOutGetVolume(hwo: HWAVEOUT; lpdwVolume: PDWORD): MMRESULT; stdcall;
    Verder:
    If a device does not support both left and right volume control, the low-order word of dwVolume specifies the volume level, and the high-order word is ignored.
    Tevens behoor je natuurlijk te controleren of waveOutGetVolume niet terugkeert met een foutmelding:
    Code:
      if waveOutGetVolume(0,@PDW) = MMSYSERR_NOERROR then
      begin
        GetVolLeft:= LoWord(PDW);
        GetVolRight:= HiWord(PDW);
        Vol.Caption:= IntToStr(GetVolLeft) + ' ' + IntToStr(GetVolRight); {dit is slechts ter controle};
      end
      else
        Vol.Caption:= 'Error in getting volume.';
    Heb je deze paar regels in een "kaal" nieuw programmaatje getest? Wellicht doe je voordat je bij deze functie aankomt al iets met waveOutSetVolume.

    Bij mij (zonder maar iets te doen met de volume) geeft hij "65535 65535" wat de maximale volume is t.o.v. de Master-setting.

  3. #3
    Overigens hadden we hier al een complete functie gegeven die je kunt gebruiken:
    http://www.nldelphi.com/showthread.p...l=1#post343528
    Delphi Code:
    1. function GetWaveVolume(var LVol: DWORD; var RVol: DWORD): Boolean;
    2. var
    3.   WaveOutCaps: TWAVEOUTCAPS;
    4.   Volume: DWORD;
    5. begin
    6.   Result := False;
    7.   if WaveOutGetDevCaps(WAVE_MAPPER, @WaveOutCaps, SizeOf(WaveOutCaps)) = MMSYSERR_NOERROR then
    8.     if WaveOutCaps.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then
    9.     begin
    10.       Result := WaveOutGetVolume(WAVE_MAPPER, @Volume) = MMSYSERR_NOERROR;
    11.       LVol := LoWord(Volume);
    12.       RVol := HiWord(Volume);
    13.     end;
    14. end;
    15.  
    16. procedure TForm1.Button1Click(Sender: TObject);
    17. var
    18.   LVol, RVol: DWORD;
    19. begin
    20.   if GetWaveVolume(LVol, RVol) then
    21.   begin
    22.     Showmessage(format('Rechts = %d, Links = %d', [LVol, RVol]));
    23.   end;
    24. end;

    Verder zag ik daar een functie-aanroep:
    Delphi Code:
    1. WaveOutSetVolume(NumDev, LongInt((Volume.Position) * 4369) * 65536 + 0);
    (en nog wat van die aanroepen in SetVol)

    Ik heb dan ook het sterk vermoeden dat je, voordat je bij deze genoemde code aankomt, de volume voor rechts al op 0 gezet hebt.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •