Seite 1 von 2
Lautstärke bei CDAudio
Verfasst: 06.01.2008 20:11
von KinkMike
Hallo, ich hätt da nochmal ne Frage zu dem Thema CDAudio:
Und zwar wollte ich wissen, wie man bei PB 3.30 die Lautstärke der CD einstellen kann, die man gerade abspielt.
Für Movies gibts ja MovieAudio, aber für CD habe ich jetzt noch nichts gefunden.
Wäre echt gut wenn mir jemand helfen könnte

Verfasst: 07.01.2008 00:17
von KinkMike
Kann mir bei meinem Problem keiner helfen ? Gibts vielleicht ne andere Möglichkeit AudioCDs abzuspielen ohne PlayCDAudio() , so dass man die Lautstärke einstellen kann ?
Verfasst: 07.01.2008 00:21
von Fluid Byte
Das geht nicht mit PB Onboard-Mitteln. Die Lautstärke stellt der Endbenutzer normalerweise über den Mixer ein. Es geht sicher mit API, aber heute nicht mehr.

Verfasst: 07.01.2008 00:35
von KinkMike
Mhh API könnte sein, ich hab da aber nur etwas mit AUX, MIDI und Wave gefunden

Nur CDAudio habe ich bis jetzt noch nicht gesehen

Verfasst: 07.01.2008 10:36
von Shardik
Zwei PB 4 API-Beispiele, um über den Mixer die Lautstärke zu ändern (wahrscheinlich müssen einige der in PB 4 schon vordefinierten Mixer-Strukturen in PB 3.3 noch definiert werden, die Konstante für CD-Audio heißt #MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC und hat den Wert 4101):
http://www.purebasic.fr/german/viewtopic.php?t=11600
http://www.purebasic.fr/english/viewtop ... 56&start=1
Verfasst: 07.01.2008 12:15
von KinkMike
Ja, also erst mal Danke für dene schnelle antwort, nur kann ich irgentwie mit der Konstanten nichts anfangen, ich habe mir auch schon die 2 Beispiele durchgelesen, aber verstehen kann ich es nicht.
Gibts da nicht ne API Funktion, mit der man, wenn man die Konstante eingibt und dann noch die Lautstärke die man haben möchte die CD Volume verändern kann ?
Verfasst: 07.01.2008 14:57
von Shardik
Ich habe versucht, das Beispiel von Remi anzupassen. Unter PB 4 kann ich damit die Lautstärke des CDAudio-Device abändern. Ich habe versucht, alle benutzten Strukturen und Konstanten für PB 3.3 zu definieren. Für PB 4 müssen daher die ersten 29 Zeilen auskommentiert werden, da sie in PB 4 schon automatisch vordefiniert sind.
Code: Alles auswählen
#MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC = 4101
#MIXERCONTROL_CONTROLTYPE_VOLUME = 1342373889
#MIXER_GETLINECONTROLSF_ONEBYTYPE = 2
#MIXER_GETLINEINFOF_COMPONENTTYPE = 3
#MIXER_SETCONTROLDETAILSF_VALUE = 0
#MIXER_LONG_NAME_CHARS = 64
#MIXER_SHORT_NAME_CHARS = 16
#MMSYSERR_NOERROR = 0
Structure MIXERCONTROLDETAILS
cbStruct.l
dwControlID.l
cChannels.l
item.l
cbDetails.l
paDetails.l
EndStructure
Structure MIXERLINECONTROLS
cbStruct.l
dwLineID.l
StructureUnion
dwControlID.l
dwControlType.l
EndStructureUnion
cControls.l
cbmxctrl.l
pamxctrl.l
EndStructure
Structure MIXERCONTROL
cbStruct.l
dwControlID.l
dwControlType.l
fdwControl.l
cMultipleItems.l
szShortName.s{#MIXER_SHORT_NAME_CHARS}
szName.s{#MIXER_LONG_NAME_CHARS}
lMinimum.l
lMaximum.l
dwReserved.l[10]
EndStructure
Procedure GetVolumeControl(hmixer.l, componentType.l, ctrlType.l, *mxc.MIXERCONTROL)
Protected mxlc.MIXERLINECONTROLS, mxl.MIXERLINE
Protected hmem.l, rc.l, ret.l
mxl\cbStruct = SizeOf(mxl)
mxl\dwComponentType = componentType
rc = mixerGetLineInfo_(hmixer, mxl, #MIXER_GETLINEINFOF_COMPONENTTYPE)
If #MMSYSERR_NOERROR = rc
mxlc\cbStruct = SizeOf(mxlc)
mxlc\dwLineID = mxl\dwLineID
mxlc\dwControlType = ctrlType
mxlc\cControls = 1
mxlc\cbmxctrl = SizeOf(MIXERCONTROL)
hmem = GlobalAlloc_($40, SizeOf(MIXERCONTROL))
mxlc\pamxctrl = GlobalLock_(hmem)
*mxc\cbStruct = SizeOf(MIXERCONTROL) ; oder sizeof)*mxc( ??
rc = mixerGetLineControls_(hmixer, @mxlc, #MIXER_GETLINECONTROLSF_ONEBYTYPE)
If rc = #MMSYSERR_NOERROR
ret = #True
CopyMemory(mxlc\pamxctrl, *mxc, SizeOf(MIXERCONTROL))
Else
ret = #False
EndIf
GlobalFree_(hmem)
ProcedureReturn ret
EndIf
ProcedureReturn #False
EndProcedure
Procedure SetVolumeControl(hmixer.l, *mxc.MIXERCONTROL, volume.l)
Protected mxcd.MIXERCONTROLDETAILS
Protected vol.MIXERCONTROLDETAILS_UNSIGNED
Protected hmem.l, rc.l
mxcd\item = 0
mxcd\dwControlID = *mxc\dwControlID
mxcd\cbStruct = SizeOf(mxcd)
mxcd\cbDetails = SizeOf(vol)
hmem = GlobalAlloc_($40, SizeOf(vol))
mxcd\paDetails = GlobalLock_(hmem)
mxcd\cChannels = 1
vol\dwValue = volume
CopyMemory(@vol, mxcd\paDetails, SizeOf(vol))
rc = mixerSetControlDetails_(hmixer, @mxcd, #MIXER_SETCONTROLDETAILSF_VALUE)
GlobalFree_(hmem)
If #MMSYSERR_NOERROR = rc
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Global hmixer.l, CDAudioCtrl.MIXERCONTROL
Global rc.l, ok.l
rc = mixerOpen_(@hmixer, 0, 0, 0, 0)
If rc <> #MMSYSERR_NOERROR
MessageRequester("shit", "Could not open the mixer!")
End
EndIf
If GetVolumeControl(hmixer, #MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC, #MIXERCONTROL_CONTROLTYPE_VOLUME, @CDAudioCtrl)
Debug "# "+CDAudioCtrl\szName+":"
Debug "Minimum: " + Str(CDAudioCtrl\lMinimum)
Debug "Maximum: " + Str(CDAudioCtrl\lMaximum)
EndIf
If SetVolumeControl(hmixer, CDAudioCtrl, 20)
Debug "Set to 20"
EndIf
Verfasst: 07.01.2008 17:05
von KinkMike
Hi, danke für deine Antwort, nur zeigt PB bei mir immer an, dass die Struktur in Zeile 10 schon "declared" sein, und das er die struktur mixerline nicht findet, und Garbage to the end of the line in Zeile 38. Bei SizeOf() kommt immer , dass er eine Struktur erwartet.
Verfasst: 07.01.2008 17:11
von Fluid Byte
Junge, Junge du bist ganz schön faul!
Was bedeuted denn "schon declared"? Richtig, gibts schon, also raus löschen. Die fehlende Struktur gibts hier:
Code: Alles auswählen
Structure MIXERLINE
cbStruct.l
dwDestination.l
dwSource.l
dwLineID.l
fdwLine.l
dwUser.l
dwComponentType.l
cChannels.l
cConnections.l
cControls.l
szShortName.c[16]
szName.c[64]
Target.MIXERLINE_TARGET
EndStructure
Verfasst: 07.01.2008 19:14
von KinkMike
Mhh, geht irgentwie immer noch nicht wirklich
Gibts da nicht was einfacheres ? Vielleicht nen Code, der ca. 1-10 Zeilen hat ?