Im Mixer die aufnahme umstellen?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Lulabi
Beiträge: 6
Registriert: 29.06.2005 17:09

Im Mixer die aufnahme umstellen?

Beitrag von Lulabi »

Hi, ich wollte fragen ob es möglich ist mithilfe der Windowsapi, die aufnahmequelle eines Mixers umzustellen oder zu Muten, ich habe zwar ein Beispiel gefunden und es ein bisschen umgebastelt, doch das hilft nur für die mikrofonwiedergabe, ich danke schonmal im vorraus

Ich habe etwas bei google gesucht und habe rausgefunden dass es nicht möglich ist Aufnahmequellen zu muten, weiss jemand wie ich wenigstens die Aufnahmequelle vertausche:

Bild

von Mikrofon auf Stereo Mix zu switchen per WINAPI befehl?
Lulabi
Beiträge: 6
Registriert: 29.06.2005 17:09

Beitrag von Lulabi »

*PUSH*
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

Das ist wohl nicht genau was Du suchst
aber
sndvol32 /record
ruft Dir den Mixer für die Aufnahmequellen auf
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Dann Hookst du einfach das Fenster, setzt dann die Checkbox auf 1 und die andere auf 0 und dann machste das Fenster wieder zu :lol: . Das wäre dann die russische Variante das zu machen was du willst =)
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

Das Checkbox setzen ist aber nicht trivial da der AufnahmeMixer
konfigurierbar ist. Funktioniert dann wohl nur sicher bei "bekannten"
Konfigurationen, also vermutlich den selbsteingestellten. Dafür lohnt sich
dann der Programmieraufwand allerdings wiederum kaum. Warum etwas
programmieren was der AufnahmeMixer (wenn auch nicht automatisch)
schon macht.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Lulabi
Beiträge: 6
Registriert: 29.06.2005 17:09

Beitrag von Lulabi »

Um genau zu sein geht es um ein Problem meines Headsets, da andere in meiner voicetool-konferenz ein starkes rauschen hören, dies kann ich nur durch ein "ausgameswitch-inaufnahmestellumaufstereomixunddannwiederaufmikro" fixen :/
Damit wäre es evtl. möglich, hab auch schon ein bisschen damit rumprobiert, das muten und entmuten hilft gegen das rauschen auch, doch das ist lediglich nur für die wiedergabe geschrieben. Hab auch schon bisschen bei Google rumgeforscht doch nichts gutes gefunden und bei der MSDN verzweifel ich :freak:
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

nochmal meine Lösung (pb4)

Code: Alles auswählen

RunProgram("sndvol32.exe","/record",#NULL$)
Damit ist m.M.n. mit mässig Aufwand und dann relativ
wenigen Klicken das erreicht, was Du brauchst.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
prs
Beiträge: 14
Registriert: 24.08.2006 23:13
Kontaktdaten:

Beschäftige mich auch gerade mit dem Mixer API.....

Beitrag von prs »

Mein erstes Posting hier, also zuerst mal Hallo

Du kannst eine Aufnahmequelle nicht muten, weil nur eine Aufnahmequelle gleichzeitig nutzbar ist. resp alle nicht aktiven sind "gemuted". Innerhalb einer Schlaufe musst du alle multipleItems
abarbeiten.

Arbeite gerade daran...
Habe das ganze jedenfalls schon mal mit einer anderen Sprache gemacht ... Irgend ein Haken war dabei, ist aber lösbar.... hmm .. komme dann dahinter bei der Umsetzung in Purebasic.

Habe gerade folgendes Problem:


Wie übersetze ich folgende Struktur in Purebasic ?

Code: Alles auswählen

typedef struct { 
    DWORD cbStruct; 
    DWORD dwControlID; 
    DWORD dwControlType; 
    DWORD fdwControl; 
    DWORD cMultipleItems; 
    CHAR  szShortName[MIXER_SHORT_NAME_CHARS]; 
    CHAR  szName[MIXER_LONG_NAME_CHARS]; 
    union { 
        struct { 
            LONG lMinimum; 
            LONG lMaximum; 
        }; 
        struct { 
            DWORD dwMinimum; 
            DWORD dwMaximum; 
        }; 
        DWORD dwReserved[6]; 
    } Bounds; 
    union { 
        DWORD cSteps; 
        DWORD cbCustomData; 
        DWORD dwReserved[6]; 
    } Metrics; 
} MIXERCONTROL,
Einzelne Unions sind ja kein Problem in Purebasic, diese hier ist aber wiederum strukturiert.

Code: Alles auswählen

Structure MIXERCONTROL 
  cbStruct.l 
  dwControlID.l 
  dwControlType.l 
  fdwControl.l 
  cMultipleItems.l 
  szShortName.b[#MIXER_SHORT_NAME_CHARS] 
  szName.b[#MIXER_LONG_NAME_CHARS] 
  StructureUnion ;Bounds
    lMinimum.l 
    lMaximum.l 
    dwMinimum.l 
    dwMaximum.l 
    Reserved.l[6] 
  EndStructureUnion
  StructureUnion ; Metric
    cSteps.l 
    cbCustomData.l; 
    dwReserved.l[6];
  EndStructureUnion 
EndStructure
Wie strukturiere ich jetzt
lMinimum.l
lMaximum.l

dwMinimum.l
dwMaximum.l

innerhalb der Union?
prs
Beiträge: 14
Registriert: 24.08.2006 23:13
Kontaktdaten:

Es geht .. aber nicht automatisch.....

Beitrag von prs »

Folgendes ist das Problem: Alle Schalter um den Aufnahmechannel des Mixers auszuwählen sind innerhalb eines Arrays definiert. (Also quasi horizontal auf dem Mixer). Via Auflistung (multibleItems) findet man zwar das gesetzte Flag und den Channelnamen dazu, allerdings hat der Name absolut keinen Standard. Es gibt leider keine fest definierten Konstanten auf der Aufnahmeseite des Mixers und man kann die vertikale Zugehörigkeit nicht feststellen. Jedenfalls ich kann das nicht :-)
Es gibt also nur eine Lösung: Alle Channels auflisten (ein ganzer Mixer halt) und den User auswählen lassen. Der weiss anhand des Namens das Mikrofon Mikrofon bedeutet. Es könnte aber auch Mic oder Microphon oder was auch immer in irgend einer Sprache heissen. Ist in meinen Augen eine grober Überlegungsfehler seitens MS.

Folgender Code demonstriert das Auslesen des Flags. Umschalten würde man mittels setzen des Flags mit mixerSetControlDetails.

Code: Alles auswählen

#MAXPNAMELEN = 32

Structure hMIXERLINE 
  cbStruct.l 
  dwDestination.l 
  dwSource.l 
  dwLineID.l; 
  fdwLine.l; 
  dwUser.l; 
  dwComponentType.l; 
  cChannels.l; 
  cConnections.l; 
  cControls.l; 
  szShortName.b[#MIXER_SHORT_NAME_CHARS] 
  szName.b[#MIXER_LONG_NAME_CHARS] 
  
EndStructure

  Structure helpMixerline Extends hMixerline
    dwType.l 
    dwDeviceID.l
    wMid.w 
    wPid.w 
    vDriverVersion.l 
    szPname.b[#MAXPNAMELEN]
  EndStructure
 
Structure MIXERCONTROL 
  cbStruct.l 
  dwControlID.l 
  dwControlType.l 
  fdwControl.l 
  cMultipleItems.l 
  szShortName.b[#MIXER_SHORT_NAME_CHARS] 
  szName.b[#MIXER_LONG_NAME_CHARS]; 
  
    lMinimum.l 
    lMaximum.l 
    
    dwMinimum.l 
    dwMaximum.l 
    
    Reserved.l[6]; 
  
  
    cSteps.l 
    cbCustomData.l; 
    dwReserved.l[6];
  
EndStructure 


Structure MIXERCONTROLDETAILSUNSIGNED 
  dwValue.l 
EndStructure

Structure MIXERCONTROLDETAILS_LISTTEXT 
    dwParam1.l
    dwParam2.l 
    szName.b[#MIXER_LONG_NAME_CHARS]; 
EndStructure
;****************************************************************************** 
Procedure ZeroMemory(adr,len) 
  For i=0 To len-1 
    PokeB(adr+i,0) 
  Next 
EndProcedure 
;****************************************************************************** 
Procedure ASL_ERR(err.l,source.s)
  Select err
      Case #MMSYSERR_NOERROR 
        ProcedureReturn 1
      Case #MIXERR_INVALLINE 
        msg.s = "The audio line reference is invalid."
      Case #MMSYSERR_BADDEVICEID 
        msg.s = "The hmxobj parameter specifies an invalid device identifier."
      Case #MMSYSERR_INVALFLAG 
        msg.s = "One Or more flags are invalid." 
      Case #MMSYSERR_INVALHANDLE 
      msg.s = "The hmxobj parameter specifies an invalid handle." 
      Case #MMSYSERR_INVALPARAM 
        msg.s = "One Or more parameters are invalid." 
      Case #MMSYSERR_NODRIVER 
        msg.s = "No mixer device is available For the object specified by hmxobj." 
      Default
       msg = "Unknown"
  EndSelect
 MessageRequester(source, msg, #PB_MessageRequester_Ok | #MB_ICONHAND)
 ProcedureReturn 0  
EndProcedure 
;******************************************************************************  
  
Procedure DebugMixerLine(*mxl.helpMIXERLINE)
  Debug "--------MIXERLINE----------"
  Debug "dwDestination: "+Str(*mxl\dwDestination )+ "   Out Audiostreams 0 = 1"
  Debug "dwSource: "+Str(*mxl\dwSource ) + "   In Audiostreams 0 = 1"
  Debug "dwLine: " + Str(*mxl\dwLineID ) + "   use this ID for later Infos and Settings"
  Debug "fdwLine: "+Str(*mxl\fdwLine )
  Debug "dwUSer: "+ Str(*mxl\dwUser )
  Debug "dwComponentType: "+Str(*mxl\dwComponentType )
  Debug "cChannels: " + Str(*mxl\cChannels.l )
  Debug "cConnections: "+ Str(*mxl\cConnections )
  Debug "cControls: "+Str(*mxl\cControls )+ "   = Faders, Pan, Mute And so on"
  Debug "dwType: "+Str(*mxl\dwType)
  Debug "dwDeviceID: "+Str(*mxl\dwDeviceID)
  Debug "wMid: "+Str(*mxl\wMid)
  Debug "wPid: "+Str(*mxl\wPid)
  Debug "vDriverVersion: "+ Str(*mxl\vDriverVersion)
  For i = 0 To #MIXER_SHORT_NAME_CHARS-1 
    s$ =  s$+Chr(PeekB(@*mxl\szShortName[i]))
  Next
  Debug "szShortName: "+ s$
  s$ = "";
    For i = 0 To #MIXER_LONG_NAME_CHARS-1
    s$ =  s$+Chr(PeekB(@*mxl\szName[i]))
  Next
  Debug "szLongName: "+s$
  Debug "-------End MIXERLINE---------"
  Debug""
EndProcedure
;******************************************************************************

Procedure DebugMixerControl(*mxctrl.MIXERCONTROL)
Debug "--------MIXERCONTROL-----------"
Debug "dwControlID: " + Str(*mxctrl\dwControlID)
Debug "dwControlType: " + Str(*mxctrl\dwControlType)
Debug "cMultipleItems: " + Str(*mxctrl\cMultipleItems)
  For i = 0 To #MIXER_SHORT_NAME_CHARS-1 
    s$ =  s$+Chr(PeekB(@*mxctrl\szShortName[i]))
  Next
Debug "szShortName: "+ s$
    s$ = "";
  For i = 0 To #MIXER_LONG_NAME_CHARS-1
    s$ =  s$+Chr(PeekB(@*mxctrl\szName[i]))
  Next
Debug "szLongName: "+s$

Debug "lMinimum: " + Str(*mxctrl\lMinimum)
Debug "lMaximum: " + Str(*mxctrl\lMaximum)
Debug "dwMinimum: " + Str(*mxctrl\dwMinimum)
Debug "dwMaximum: " + Str(*mxctrl\dwMaximum)
Debug "cSteps: " + Str(*mxctrl\cSteps)
Debug "-------End MIXERCONTROL--------"
Debug ""   
EndProcedure
;****************************************************************************** 
Procedure ASL_MixerGetRecordChannel(mixerID,*ChannelNumber.l)

  ZeroMemory(mxl.MIXERLINE, SizeOf(MIXERLINE)) 
  mxl\cbStruct = SizeOf(MIXERLINE) 
  mxl\dwComponentType = #MIXERLINE_COMPONENTTYPE_DST_WAVEIN

Result = mixerGetLineInfo_(mixerID,mxl,#MIXER_GETLINEINFOF_COMPONENTTYPE)
  If Not ASL_ERR(Result,"API: MixerGetLineInfo")
    ProcedureReturn = 0
  EndIf 
  
DebugMixerLine(mxl)
  
    ZeroMemory(mxlctrls.MIXERLINECONTROLS, SizeOf(MIXERLINECONTROLS)); 
    mxlctrls\cbStruct = SizeOf(MIXERLINECONTROLS); 
    mxlctrls\dwLineID = mxl\dwLineID; 
    mxlctrls\cControls = mxl\cControls; 
    mxlctrls\dwControlType = #MIXERCONTROL_CONTROLTYPE_MUX; #MIXERCONTROL_CONTROLTYPE_VOLUME,#MIXERCONTROL_CONTROLTYPE_PAN,#MIXERCONTROL_CONTROLTYPE_MUTE
    mxlctrls\cbmxctrl = SizeOf(MIXERCONTROL); 
    
    Bytes = (SizeOf(MIXERCONTROL)* mxlctrls\cControls) ; Bytes(SizeOF Structur[X])
    *control = AllocateMemory(Bytes) ; Allocate Memory for Structur Array
    mxlctrls\pamxctrl = *control ; Pointer 
    ;---- second... Call MixerGetLineControls -> mxlctrl.MixerLineControls
Result = mixerGetLineControls_(mixerID,mxlctrls,#MIXER_GETLINECONTROLSF_ONEBYTYPE) 
   If Not ASL_ERR(Result,"API: MixerGetLineControls")
     ProcedureReturn = 0
   EndIf 
  
  CopyMemory(*Control,ctrl.Mixercontrol,SizeOf(Mixercontrol))
  For i = o To mxl\cControls -1
    CopyMemory(*Control+(i*SizeOf(Mixercontrol)),ctrl.Mixercontrol,SizeOf(Mixercontrol))
    DebugMixerControl(@ctrl)
  Next
If ctrl\dwControlType = #MIXERCONTROL_CONTROLTYPE_MUX
    ZeroMemory(mcd.MIXERCONTROLDETAILS, SizeOf(MIXERCONTROLDETAILS)); 
    mcd\cbStruct = SizeOf(MIXERCONTROLDETAILS); 
    
    mcd\dwControlID =  ctrl\dwControlID
    mcd\cChannels = 1;

    PokeL(mcd+12,ctrl\cMultipleItems)
   
    mcd\cbDetails = SizeOf(MIXERCONTROLDETAILS_BOOLEAN)

    *lv = AllocateMemory(mcd\cChannels * ctrl\cMultipleItems * mcd\cbDetails )
    mcd\paDetails = *lv
    ZeroMemory(*lv, MemorySize(*lv)); 
        
Result = mixerGetControlDetails_(mixer,mcd,#MIXER_GETCONTROLDETAILSF_VALUE)
    If Not ASL_ERR(Result,"API: MixerGetControlDetails")
      ProcedureReturn = 0
    EndIf 
    
    For i = 0 To ctrl\cMultipleItems-1  
          
      If PeekL(*lv+i*4) = 1
        NumberSelect = i
      EndIf
    Next
  
    ZeroMemory(mcd.MIXERCONTROLDETAILS, SizeOf(MIXERCONTROLDETAILS)); 
    mcd\cbStruct = SizeOf(MIXERCONTROLDETAILS); 
    mcd\dwControlID =  ctrl\dwControlID
    mcd\cChannels = 1;
    PokeL(mcd+12,ctrl\cMultipleItems)
    mcd\cbDetails = SizeOf(MIXERCONTROLDETAILS_LISTTEXT)
    *fl = AllocateMemory(SizeOf(MIXERCONTROLDETAILS_LISTTEXT)*mcd\cChannels * ctrl\cMultipleItems * mcd\cbDetails)
    mcd\paDetails = *fl
    
Result = mixerGetControlDetails_(mixer,mcd,#MIXER_GETCONTROLDETAILSF_LISTTEXT)
      If Not ASL_ERR(Result,"API: MixerGetControlDetails")
        ProcedureReturn = 0
      EndIf 

         *Text = AllocateMemory(#MIXER_LONG_NAME_CHARS)
         For i = 0 To ctrl\cMultipleItems -1
            CopyMemory(*fl+(i*SizeOf(MIXERCONTROLDETAILS_LISTTEXT)+8),*Text,64)
               s$ = "";
                For y = 0 To #MIXER_LONG_NAME_CHARS-1
                  s$ =  s$+Chr(PeekB(*Text+y))
                Next
                Debug "Channels = "+s$
                If NumberSelect = i
                  NameSelect.s = s$ 
                EndIf
         Next

PokeL(*ChannelNumber,NumberSelect)


Debug "*****************************"
Debug "Number: "+Str(NumberSelect)+" "+NameSelect +" selected"
Debug "*****************************"
ProcedureReturn 1
EndIf ; If ctrl\dwControlType = #MIXERCONTROL_CONTROLTYPE_MUX
ProcedureReturn 0
EndProcedure
;****************************************************************************** 
  
mixerID = 0
ASL_MixerGetRecordChannel(mixerID,@ChannelNumber.l)

Debug ChannelNumber

Antworten