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. Bild

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! :shock:

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 ?