BASS dll verwenden (AndyTR)

  • AndyTR: dafür sollte ein neuer Thread her ;)
    Um die Lautstärke mit der BASS.dll zu regeln, musst du auch die Lieder mit dieser DLL abspielen. Ich habe dir mal die Funktoinen zusammengestellt:

    Spoiler anzeigen
    [autoit]

    #include<BASS.au3>
    Func _BASS_ChannelSetVolume($hChannel, $nVol)
    ; Author: Prog@ndy
    Local $ret = _BASS_ChannelSetAttribute($hChannel,$BASS_ATTRIB_VOL,$nVol)
    Return SetError(@error,@extended,$ret)
    EndFunc
    Func _BASS_ChannelGetVolume($hChannel)
    ; Author: Prog@ndy
    Local $ret = _BASS_ChannelGetAttribute($hChannel,$BASS_ATTRIB_VOL)
    Return SetError(@error,@extended,$ret)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Startup($gsModulesDir & "\bass.dll")
    _BASS_Init(0, -1, 44100, $hGui);

    [/autoit] [autoit][/autoit] [autoit]

    ; Datei laden
    $hPlayHandle = _BASS_StreamCreateFile(0, $sSoundPath, 0, 0, 0)
    ; abspielen
    _BASS_ChannelPlay($hPlayHandle, 0)
    ; Lautstärke setzen:
    _BASS_ChannelSetVolume($hPlayHandle, $nVol) (0 = still, 1=volle Lautstärke, 0.5=halbe Lautstärke ...)
    ; Lautstärke lesen:
    $vol = _BASS_ChannelGetVolume($hPlayHandle)
    ; pause
    _BASS_ChannelPause($hPlayHandle)
    ; stop
    _BASS_ChannelStop($hPlayHandle)
    ; Datei schließen
    _BASS_StreamFree($hPlayHandle)

    [/autoit] [autoit][/autoit] [autoit]

    ;bass beenden
    _BASS_Free()

    [/autoit]
  • Kann es sein, dass in diesem Paket: http://www.autoitscript.com/forum/index.php?showtopic=83481
    seit dem Update der Bass.au3 die anderen UDF's nichtmehr richtig funktionieren?


    Arbeitet jemand mit der neusten Version der BASS UDF's?
    Diese scheinen mir ziemlich fehlerhaft. z.B. BassEnc.au3 -> Zeile 108 WARNING: $bassenc_dll: possibly used before declaration.

    edit \ Noch was ist mir aufgefallen: zu den BassEnc.au3 Funktionen wir auch die _BASS_ErrorGetCode() aufgerufen.
    Diese Funktion erfordert aber mit der neusten Bass.au3 keinen Parameter mehr.
    Harmoniert noch nicht wirklich miteinander :(

  • Kann es sein, dass in diesem Paket: http://www.autoitscript.com/forum/index.php?showtopic=83481
    seit dem Update der Bass.au3 die anderen UDF's nichtmehr richtig funktionieren?


    Die extra UDFs sind noch nicht wirklich aktualisiert. weder das StartUp noch die Fehlerbehandlung wurden an das neue Format angepasst, das fehlt noch. Wenn du willst, kannst du es ja machen (nimm als Beispiel die BASS.au3)

    Also etwa folgende Änderungen (ja nach Funktion auch andere Rückgabewerte als Fehler)

    [autoit]

    Func _BASS_Encode_SetPaused($handle, $paused)
    $BASSENC_ret_ = DllCall($bassenc_dll, "int", "BASS_Encode_SetPaused", "dword", $handle, "int", $paused)
    $error = _BASS_ErrorGetCode($bass_dll)
    If $error <> 0 Then
    Return SetError($error, "", 0)
    Else
    Return SetError(0, "", $BASSENC_ret_[0])
    EndIf
    EndFunc ;==>_BASS_Encode_SetPaused

    [/autoit]


    wird zu

    [autoit]


    Func _BASS_Encode_SetPaused($handle, $paused)
    Local $BASSENC_ret_ = DllCall($_ghBassENCDll, "int", "BASS_Encode_SetPaused", "dword", $handle, "int", $paused)
    If @error Then Return SetError(1,1,0)
    If $BASSENC_ret_[0] = 0 Then Return SetError(_BASS_ErrorGetCode(),0,0)
    Return $BASSENC_ret_[0]
    EndFunc ;==>_BASS_Encode_SetPaused

    [/autoit]
  • AndyTR: dafür sollte ein neuer Thread her ;)

    Das stimmt natürlich, hatte ich leider gar nicht dran gedacht... Is ja schließlich Oscar sein Thread :)

    Also bisher hab ich die beiden Funktionen "_BASS_ChannelSetVolume($hChannel, $nVol)" und "_BASS_ChannelGetVolume($hChannel)" in die Bass.au3 eingefügt, die nun im AutoIT Includes-Ordner liegt (zusammen mit der BassConstants.au3 und der bass.dll)

    Und wenn ich das richtig verstanden habe, sollte der Code dann bisher so aussehen und abspielen hab ich auch schonmal hinbekommen:

    [autoit]

    #include <Bass.au3>
    _BASS_Startup(@ScriptDir & '\bass\BASS.dll')
    _BASS_Init(0, -1, 44100, 0)
    $hPlayHandle = _BASS_StreamCreateFile(0, "C:[...].mp3", 0, 0, 0)
    _BASS_ChannelPlay($hPlayHandle, 0)

    [/autoit]

    Ich habe probiert "_BASS_Startup..." wegzulassen, funktioniert dann aber nicht... Wie erreiche ich, dass die Bass.dll net mehr im Script-Verzeichnis liegen muss?

    Dann hab ich auch schon das hier probiert, aber leider keine Veränderung in der Lautstärke bis darauf, wenn der Wert "0" ist, dass das Lied stumm/aus ist und mit nem neuen "SetVolume" auch net mehr hörbar wird:

    [autoit]

    _BASS_ChannelSetVolume($hPlayHandle, X)

    [/autoit]

    Danke für den neuen Thread ;)


    Beste Grüße... Andy :)

  • Edit:

    Ich Dummerchen :D Hatte Zahlen von 0 bis 100 benutzt und mir fällt grade auf, dass der Wert ja zwischen 0 und 1 betragen muss... hatte das vorher noch von nem anderen Lösungansatz im Kopf :) Alos das funktioniert auch schonmal super...

    Nun is da jetzt aber noch das "Problem" mit dem Pfad zur Bass.dll... Und dann is das alles schön... Muss nur noch leider alles von _Sound... auf _Bass_... umschreiben; hoffe mal, dass das ganz gut klappt :o


    Aber schonmal vielen Dank für Deine Hilfe progandy :) Wie schnell das ging und super Lösungsansatz von Dir...

    Andy...

  • Wenn du willst, kannst du es ja machen (nimm als Beispiel die BASS.au3)
    [/autoit]

    Sieht so aus als müsste doch etwas mehr gemacht werden, z.B. ein Parameter für die Errorfunktion der Bass.au3, da auch andere Bass UDF's darauf zugreifen (wozu die dll übergeben werden müsste) .
    Ich schaus mir mal an, möchte aber niemand reinpfuschen.

  • AndyTR: beim _BASS_Startup kannst du doch angeben, wo die DLL-DAtei liegen soll ;) Wenn im gesamten %PATH% gesucht werden soll, nur den DLL-Namen angeben.

    nuts: Du musst nicht einen extra Parameter machen. Die DLL ist wird bei _BASS_Startup in einer globalen Variablen gepseichert, sodass man nur noch die Funktion aufrufen muss, ohne die DLL anzugeben.

  • Ja das mit der .dll is jetzt auch wunderbar nur ich wusste net genau was machen, da ich noch nie mit .dll's was gemacht hatte... :)
    So jetzt hab ich mittlerweile auch schon nen Slider um die Lautstärke zu verändern und das klappt auch wunderbar...

    Und jetzt gehts nur noch ans Anpassen. Leider weiß ich nur nicht mit den Funktionen umzugehen, brauch aber halt Funktionen, die ähnlich der _Sound-Funktionen arbeiten... Wär nett, wenn Du mir das vllt noch auflisten könntest und mit welchen Parametern ich die Funktion füttern muss, progandy... oder natürlich auf wer, anders, falls da noch jemand so Ahnung hat :)

    - _SoundOpen($Path) --> _BASS_StreamCreateFile(0, $Path, 0, 0, 0)
    - _SoundPlay($Handle) --> _BASS_ChannelPlay($Path, 0)
    - _SoundClose($Handle) --> ?
    - _SoundPos($Handle, 1) --> ? (soll in hh:mm:ss ausgegeben werden)
    - _SoundLength($Handle, 1) --> ? (soll in hh:mm:ss ausgegeben werden)
    - _SoundStatus($Handle) --> ? (wie sind die Statusbezeichnungen?)
    - _SoundPause($Handle) --> ?
    - _SoundResume($Handle) --> ?

    Hoffe auf Hilfe :)


    der AndyTR ;)

  • Bitte, das ist die Auflistung:

    Spoiler anzeigen
    [autoit]

    $handle = _SoundOpen($Path) --> $hPlayHandle = _BASS_StreamCreateFile(0, $Path, 0, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    _SoundPlay($Handle) --> _BASS_ChannelPlay($hPlayHandle, 1) ; 1 = Start vom Anfang

    [/autoit] [autoit][/autoit] [autoit]

    _SoundClose($Handle) --> _BASS_StreamFree($hPlayHandle)

    [/autoit] [autoit][/autoit] [autoit]

    _SoundPos($Handle, 1) --> $iSoundPosBytes = _BASS_ChannelGetPosition($hPlayHandle, $BASS_POS_BYTE)
    $iSoundPos = _BASS_ChannelBytes2Seconds($hPlayHandle, $iSoundPosBytes) ;dann noch Sekunden umwandlen
    $iSoundPosTime = _SecsToTime($iSoundPos)

    [/autoit] [autoit][/autoit] [autoit]

    _SoundLength($Handle, 1) --> $iSoundLenghtBytes = _BASS_ChannelGetLength($hPlayHandle, $BASS_POS_BYTE)
    $iSoundLength = _BASS_ChannelBytes2Seconds($hPlayHandle, $iSoundLenghtBytes) ;dann noch Sekunden umwandlen
    $iSoundLengthTime = _SecsToTime($iSoundLength)

    [/autoit] [autoit][/autoit] [autoit]

    _SoundStatus($Handle) --> _BASS_ChannelIsActive($hPlayHandle)
    ;Werte:
    ;$BASS_ACTIVE_STOPPED The channel is not active, or handle is not a valid channel.
    ;$BASS_ACTIVE_PLAYING The channel is playing (or recording). ;
    ;$BASS_ACTIVE_PAUSED The channel is paused. ;
    ;$BASS_ACTIVE_STALLED Playback of the stream has been stalled due to a lack of sample data. The playback will automatically resume once there is sufficient data to do so.

    [/autoit] [autoit][/autoit] [autoit]

    _SoundPause($Handle) --> _BASS_ChannelPause($hPlayHandle)
    _SoundResume($Handle) --> _BASS_ChannelPlay($hPlayHandle, 0) ; 0 = Start von letzter Position (nach pause)

    [/autoit] [autoit][/autoit] [autoit]

    ; Sekunden in [hh:]mm:ss umwandeln:
    Func _SecsToTime($sID3Duration, $bHours=True)
    If $bHours Then Return StringFormat("%02d:%02d:%02d", Floor($sID3Duration/3600), Mod(Floor($sID3Duration/60),60), Mod($sID3Duration,60))
    Return StringFormat("%02d:%02d", Floor($sID3Duration/60), Mod($sID3Duration,60))
    EndFunc

    [/autoit]
  • Oh das is nett von Dir progandy... Damit werde ich keine Schwierigkeiten mehr haben den Code dementsprechend umzuwandeln :) Also denke ich...
    Dann will ich mich mal dranmachen, aber dürfte eig net mehr schwierig sein durch Deine klasse Auslistung... :)

    Dankeschön für die Hilfe


    MfG AndyTR :)