[Win32] Microfoon volume veranderen *

Pagina: 1
Acties:

  • alter88
  • Registratie: Januari 2002
  • Laatst online: 10-02 15:40
Ik ben een dll in C aan het schrijven die geluid van de microfoon opneemt. De bestandsnaam wordt doorgegeven vanuit Java dmv een JNI brug.

Ik werk met Microsoft Visual C 6.0 in Windows XP pro

Ik weet dat je de volume van de output kan veranderen met

C++:
1
waveOutSetVolume(NULL, 0xFFFFFFFF);


Maar nu wil ik dat de microfoon volume op max wordt gezet. Nu bestaat er dus niet zoiets als MicSetVolume of waveMicInSetVolume.

Welke code werkt wel?

[ Voor 40% gewijzigd door alter88 op 10-06-2004 11:43 . Reden: Nu wel volgens de regels hoop ik ;) ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

* curry684 trekt glazen bol uit de kast.... welk OS zit je uberhaupt mee te werken?

P&W FAQ - De "quickstart"

Professionele website nodig?


  • Asperientje
  • Registratie: Juni 2004
  • Laatst online: 07-03-2015
uhmz, volgens mij kun je:
eerst met auxGetDevCapsA de microfoon shit opvragen (de deviceID)
in VB(dat hebben we hier alleen op school):
auxGetDevCaps (ByVal uDeviceID As Long, lpCaps As AUXCAPS, ByVal uSize As Long) As Long
de AUXCAPS structure is dan:
Type AUXCAPS
wMid As Integer
wPid As Integer
vDriverVersion As Long
szPname As String * MAXPNAMELEN
wTechnology As Integer
dwSupport As Long
End Type

waarbij in wTechnology ingesteld moet op AUXCAPS_AUXIN, dan heb je de microfoon volgens mij te pakken

vervolgens kun je dan met:

auxSetVolume (ByVal uDeviceID As Long, ByVal dwVolume As Long) As Long (VB)

het volume aanpassen

Everything's got a meaning


  • alter88
  • Registratie: Januari 2002
  • Laatst online: 10-02 15:40
Asperientje schreef op 10 juni 2004 @ 12:13:
uhmz, volgens mij kun je:
eerst met auxGetDevCapsA de microfoon shit opvragen (de deviceID)
in VB(dat hebben we hier alleen op school):
Visual Basic:
1
auxGetDevCaps (ByVal uDeviceID As Long, lpCaps As AUXCAPS, ByVal uSize As Long) As Long

de AUXCAPS structure is dan:
Visual Basic:
1
2
3
4
5
6
7
8
Type AUXCAPS
        wMid As Integer
        wPid As Integer
        vDriverVersion As Long
        szPname As String * MAXPNAMELEN
        wTechnology As Integer
        dwSupport As Long
End Type

waarbij in wTechnology ingesteld moet op AUXCAPS_AUXIN, dan heb je de microfoon volgens mij te pakken

vervolgens kun je dan met:
Visual Basic:
1
auxSetVolume (ByVal uDeviceID As Long, ByVal dwVolume As Long) As Long (VB)

het volume aanpassen
Ik wil het liever toch in C hebben, en auxGetDevCapsA is niet te vinden voor C...

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

alter88 schreef op 10 juni 2004 @ 12:40:
[...]


Ik wil het liever toch in C hebben, en auxGetDevCapsA is niet te vinden voor C...
Tis een functie uit de Win32 API, dus ervan uitgaande dat je op Windows werkt (wat we nog steeds niet zeker weten) kun je hem in C, C++, Perl, PHP, Fortran, Lisp en wat je maar wilt gebruiken. Documentatie as always in MSDN Library Online te vinden.

De originele naam van die functie is trouwens auxGetDevCaps, wat een macro is voor auxGetDevCapsA in geval van een 'normale' build, en auxGetDevCapsW in geval van een Unicode applicatie.

Professionele website nodig?


  • alter88
  • Registratie: Januari 2002
  • Laatst online: 10-02 15:40
curry684 schreef op 10 juni 2004 @ 12:53:
[...]

Tis een functie uit de Win32 API, dus ervan uitgaande dat je op Windows werkt (wat we nog steeds niet zeker weten)
dr staat windows XP Pro ;). Ik ga eens kijken, alvast bedankt

  • alter88
  • Registratie: Januari 2002
  • Laatst online: 10-02 15:40
Hmm, ik snap er nog niet veel van, heb niet zoveel verstand van VB of hoe ik zo'n API omzet naar C...

[ Voor 6% gewijzigd door alter88 op 10-06-2004 14:27 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat heeft VB ermee te maken :? Je kunt het toch gewoon opzoeken in de MSDN, zoals curry al zei? Je moet gewoon even zelf kijken hoe de functies auxGetDevCaps, auxGetNumDevs en auxSetVolume werken, en je niet blind staren op de tekst die Asperientje getikt heeft

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

alter88 schreef op 10 juni 2004 @ 14:26:
Hmm, ik snap er nog niet veel van, heb niet zoveel verstand van VB of hoe ik zo'n API omzet naar C...
De API is C.

Professionele website nodig?


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Volgens mij is het gewoon:
[code]
waveInSetVolume(NULL, 0xFFFFFFFF);
[/code]Maar dan ipv NULL je mic id. Ik zal eens kijken in m'n delphi app.


Ow WaveInSetVolume bestaat dus niet en met aux werkt et ook niet.

[ Voor 25% gewijzigd door eghie op 10-06-2004 14:53 ]


  • alter88
  • Registratie: Januari 2002
  • Laatst online: 10-02 15:40
eghie schreef op 10 juni 2004 @ 14:45:
Volgens mij is het gewoon:
[code]
waveInSetVolume(NULL, 0xFFFFFFFF);
[/code]Maar dan ipv NULL je mic id. Ik zal eens kijken in m'n delphi app.


Ow WaveInSetVolume bestaat dus niet en met aux werkt et ook niet.
Nope, daar was ik ook al achter..., toch bedankt :)

  • alter88
  • Registratie: Januari 2002
  • Laatst online: 10-02 15:40
Wel ik ben eens aan het proberen geweest en heb nu de volgende code:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void main (void)
{
    typedef struct AUXCAPS 
    {
        unsigned int    wMid;
        unsigned int    wPid;
        unsigned int    vDriverVersion;
        char            szPname[MAXPNAMELEN];
        unsigned int    wTechnology;
        DWORD           dwSupport;
    };

    
    UINT_PTR            uDeviceID;
    LPAUXCAPS           lpCaps;
    unsigned int        cbCaps;

    auxGetDevCaps(uDeviceID, lpCaps, cbCaps);

}


Nu moet ik dus zorgen dat wTechnology op AUXCAPS_AUXIN komt, maar dat lukt me niet...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom declareer je die struct? Waarom include je niet gewoon windows.h, zoals in de MSDN staat? En link je wel met winmm.lib, zoals ook in de MSDN staat?
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Mmsystem.h; include Windows.h.
Library: Use Winmm.lib.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • alter88
  • Registratie: Januari 2002
  • Laatst online: 10-02 15:40
.oisyn schreef op 10 juni 2004 @ 15:47:
Waarom declareer je die struct? Waarom include je niet gewoon windows.h, zoals in de MSDN staat? En link je wel met winmm.lib, zoals ook in de MSDN staat?


[...]
Heb ik allebei gedaan, ik zie nu dat die struct niet nodig was, maar het wil nog steeds niet vlotten |:(

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Hier heb ik een functie in delphi die het kan, maybe kun je hem gebruiken, want het is bijna hetzelfde als c alleen de syntax is anders.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
uses 
  MMSystem; 

// Setzt die Lautstärke für das Mikrofon 
// Set the volume for the microphone 

function SetMicrophoneVolume(bValue: Word): Boolean; 
var                          {0..65535} 
  hMix: HMIXER; 
  mxlc: MIXERLINECONTROLS; 
  mxcd: TMIXERCONTROLDETAILS; 
  vol: TMIXERCONTROLDETAILS_UNSIGNED; 
  mxc: MIXERCONTROL; 
  mxl: TMixerLine; 
  intRet: Integer; 
  nMixerDevs: Integer; 
begin 
  // Check if Mixer is available 
  // Überprüfen, ob ein Mixer vorhanden 
  nMixerDevs := mixerGetNumDevs(); 
  if (nMixerDevs < 1) then 
  begin 
    Exit; 
  end; 

  // open the mixer 
  intRet := mixerOpen(@hMix, 0, 0, 0, 0); 
  if intRet = MMSYSERR_NOERROR then 
  begin 
    mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE; 
    mxl.cbStruct := SizeOf(mxl); 

    // get line info 
    intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); 

    if intRet = MMSYSERR_NOERROR then 
    begin 
      ZeroMemory(@mxlc, SizeOf(mxlc)); 
      mxlc.cbStruct := SizeOf(mxlc); 
      mxlc.dwLineID := mxl.dwLineID; 
      mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME; 
      mxlc.cControls := 1; 
      mxlc.cbmxctrl := SizeOf(mxc); 

      mxlc.pamxctrl := @mxc; 
      intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); 

      if intRet = MMSYSERR_NOERROR then 
      begin 
      { 
       // Microphone Name 
          Label1.Caption := mxlc.pamxctrl.szName; 

        // Min/Max Volume 
        Label2.Caption := IntToStr(mxc.Bounds.dwMinimum) + '->' + IntToStr(mxc.Bounds.dwMaximum); 
      } 
        ZeroMemory(@mxcd, SizeOf(mxcd)); 
        mxcd.dwControlID := mxc.dwControlID; 
        mxcd.cbStruct := SizeOf(mxcd); 
        mxcd.cMultipleItems := 0; 
        mxcd.cbDetails := SizeOf(Vol); 
        mxcd.paDetails := @vol; 
        mxcd.cChannels := 1; 

        // vol.dwValue := mxlc.pamxctrl.Bounds.lMinimum; Set min. Volume / Minimum setzen 
        // vol.dwValue := mxlc.pamxctrl.Bounds.lMaximum; Set max. Volume / Maximum setzen 
        vol.dwValue := bValue; 

        intRet := mixerSetControlDetails(hMix, @mxcd, 
          MIXER_SETCONTROLDETAILSF_VALUE); 
        if intRet <> MMSYSERR_NOERROR then 
          ShowMessage('SetControlDetails Error'); 
      end 
      else 
        ShowMessage('GetLineInfo Error'); 
    end; 
    intRet := mixerClose(hMix); 
  end; 
end; 


Geript van: http://www.swissdelphicenter.ch/en/showcode.php?id=1204

Als ik die code zo bekijk dan zie ik:
code:
1
vol.dwValue:= bValue;

en vol is TMIXERCONTROLDETAILS_UNSIGNED en dat is een record (in c struct). Dus daarmee moet je iets mee doen.

[ Voor 5% gewijzigd door eghie op 10-06-2004 16:05 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

alter88 schreef op 10 juni 2004 @ 15:52:
[...]


Heb ik allebei gedaan, ik zie nu dat die struct niet nodig was, maar het wil nog steeds niet vlotten |:(
Vind je het gek, je moet lezen wat in de documentatie staat. Dit is jouw code:

C++:
1
2
3
4
5
    UINT_PTR            uDeviceID; 
    LPAUXCAPS            lpCaps; 
    unsigned int        cbCaps; 

    auxGetDevCaps(uDeviceID, lpCaps, cbCaps); 


Hoe denk jij dat een functie in hemelsnaam gaat werken als je 'm bepaalde parameters mee moet geven, terwijl jij die parameters niet eens initialiseert
C:
1
2
3
4
5
MMRESULT auxGetDevCaps(
  UINT_PTR  uDeviceID, 
  LPAUXCAPS lpCaps,    
  UINT      cbCaps     
);


uDeviceID
Identifier of the auxiliary output device to be queried. Specify a valid device identifier (see the following comments section)

lpCaps
Pointer to an AUXCAPS structure to be filled with information about the capabilities of the device.

cbCaps
Size, in bytes, of the AUXCAPS structure.
Jouw lpCaps wijst niet naar een structure, jij hebt gewoon een onginitialiseerde pointer gedefinieerd. De cbCaps waarde heeft ook geen zinnige waarde. Ik krijg een beetje het idee dat je C++ eigenlijk nog helemaal niet snapt, en dat wij je maar een beetje je handje moeten vasthouden en je de preciese code moeten geven die je moet gebruiken

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • alter88
  • Registratie: Januari 2002
  • Laatst online: 10-02 15:40
Klopt, ik ben net 7 weken bezig met C++, op school wordt dus van ons verwacht dat we in 7 weken alles van C++ weten, en dat lukt gewoon niet en daarom vraag ik het hier. Maar blijkbaar mag dat ook niet...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

alter88 schreef op 10 juni 2004 @ 17:59:
Klopt, ik ben net 7 weken bezig met C++
Waarom begin je dan niet gewoon bij het begin, ipv gelijk ingewikkelde dingen proberen te doen? (Overigens is dit allesbehalve ingewikkeld, de MSDN is vrij duidelijk imho)
Maar blijkbaar mag dat ook niet...
GoT is geen forum voor beginners, maar voor de gevorderde computergebruiker. Vandaar Gathering of Tweakers. Dat betekent overigens niet dat beginners hier niet mogen komen, maar we verwachten wel inzet, en die inzet mis ik een beetje bij jou, vandaar dat ik wat geirriteerd overkom... Wellicht passen fora als Beginnersweb, Computer!Totaal of TweakZone beter bij jou?

[ Voor 5% gewijzigd door .oisyn op 10-06-2004 19:54 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op 10 juni 2004 @ 16:04:
[...]
Ik krijg een beetje het idee dat je C++ eigenlijk nog helemaal niet snapt, en dat wij je maar een beetje je handje moeten vasthouden en je de preciese code moeten geven die je moet gebruiken
Gelukkig is de winAPI c-code heb je dus geen C++ kennis nodig ;)

  • alter88
  • Registratie: Januari 2002
  • Laatst online: 10-02 15:40
Waarom begin je dan niet gewoon bij het begin, ipv gelijk ingewikkelde dingen proberen te doen? (Overigens is dit allesbehalve ingewikkeld, de MSDN is vrij duidelijk imho)
Omdat het een opdracht is voor school
GoT is geen forum voor beginners, maar voor de gevorderde computergebruiker. Vandaar Gathering of Tweakers. Dat betekent overigens niet dat beginners hier niet mogen komen, maar we verwachten wel inzet, en die inzet mis ik een beetje bij jou, vandaar dat ik wat geirriteerd overkom... Wellicht passen fora als Beginnersweb, Computer!Totaal of TweakZone beter bij jou?
Ik zal voortaan is op die fora kijken, toch bedankt allemaal

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

alter88 schreef op 11 juni 2004 @ 07:24:
Omdat het een opdracht is voor school
Dan kunnen ze je op school vast ook wel helpen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1