Seite 1 von 1
Im Mixer die aufnahme umstellen?
Verfasst: 05.08.2006 00:12
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:
von Mikrofon auf Stereo Mix zu switchen per WINAPI befehl?
Verfasst: 11.08.2006 23:44
von Lulabi
*PUSH*
Verfasst: 14.08.2006 11:02
von bobobo
Das ist wohl nicht genau was Du suchst
aber
sndvol32 /record
ruft Dir den Mixer für die Aufnahmequellen auf
Verfasst: 17.08.2006 02:33
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

. Das wäre dann die russische Variante das zu machen was du willst

Verfasst: 17.08.2006 11:34
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.
Verfasst: 22.08.2006 21:01
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

Verfasst: 23.08.2006 12:20
von bobobo
nochmal meine Lösung (pb4)
Damit ist m.M.n. mit mässig Aufwand und dann relativ
wenigen Klicken das erreicht, was Du brauchst.
Beschäftige mich auch gerade mit dem Mixer API.....
Verfasst: 25.08.2006 00:03
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?
Es geht .. aber nicht automatisch.....
Verfasst: 25.08.2006 05:07
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