VU-Meter auch für FMOD.dll?

  • Hi,

    ich nutze ein modifiziertes UDF von UEZ für die FMOD.dll um Chip Musiken wieder zu geben. Das funktioniert auch tadellos für meine Zwecke,
    allerdings würde ich gerne den jeweiligen VU Peak auslesen, um diesen optisch darzustellen. Mit der BASS.dll hat @eukalyptus das ja bereits
    super umgesetzt:

    Audio Meter (Peak, VU, Stereoscope und Korrelationsgradmesser)

    Nur schaffe ich es dort nicht, die besagten MOD / IT / S3M Dateien abzuspielen.

    Vielleicht hat ja jemand von Euch eine Idee?

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

    Einmal editiert, zuletzt von Cape-City (28. November 2016 um 12:33)

  • Hier ein kleine Erweiterung der FMOD Memory UDF:

    AutoIt
    Func FSOUND_GetCurrentLevels($F_Channel = 2)
    	Local $tLeft = DllStructCreate("float l"), $tRight = DllStructCreate("float r")
    	Local $F_RetValue = MemoryDllCall($F_DLL, "int", "_FSOUND_GetCurrentLevels@12", _
    				              "int", $F_Channel, _
    				              "struct*", $tLeft, _
    				              "struct*", $tRight)
    	If Not $F_RetValue[0] Then Return SetError(1, 0, 0)
    	Local $F_LEVELS[2] = [$tLeft.l, $tRight.r]
    	Return $F_LEVELS
    EndFunc

    Kleiner Flimmer Beispiel als Anhang.


    Ich sehe, dass du auch "Demo / Intro" begeistert bist. :thumbup:

  • Danke @UEZ,

    genau das habe ich gesucht ;) Meine ersten Versuche sehen gut aus :party: Ich mache den OK-Button zum VU-Meter.

    Den Part "_FSOUND_GetCurrentLevels@12" in der DLL hatte ich auch bereits im Internet gefunden, wusste aber nicht, wie ich das entsprechend aufrufen muss.

    Ich stricke mir da mal was zusammen - Demo Update folgt!

    Demo / Intro (= Dentro) :rock:

    Ich habe sie auf allen Rechnern geliebt (C16/C64/C128/Atari/Amiga), wobei meine größte Sammlung habe ich auf dem Atari, wo meine ersten "Gehversuche" auch
    auf irgendwelchen MOD-CDs zu finden sind.

    @All - Ist die Verwendung der BASS.dll denn vorzuziehen, auch wenn man mit der FMOD.dll auch klar kommt? Mein Ziel ist es ja auch eine ONEinALL EXE im Anschluss zu haben, welche nichts (auch nicht nur temporär) von Platte nachladen muss.

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

  • Den Part "_FSOUND_GetCurrentLevels@12" in der DLL hatte ich auch bereits im Internet gefunden, wusste aber nicht, wie ich das entsprechend aufrufen muss.

    Mal das Help File zu FMOD im Anhang.

    Und hier die Funktionen:

    Happy Intro Coding. :D

  • @UEZ

    Sieht Super aus. Du veränderst mit zunehmenden Pegel die Farbe von grün nach rot etwas eleganter als ich in meiner Demo :D
    Mal schauen wie ich das übernehmen kann. Auch das die Binary-Datei gepackt vorliegen, finde ich interessant. Bringt das denn
    nachher etwas beim Compilieren oder ist die EXE deswegen auch nicht viel kleiner, wenn der UPX drüber gelaufen ist?

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

  • Bringt das denn
    nachher etwas beim Compilieren oder ist die EXE deswegen auch nicht viel kleiner, wenn der UPX drüber gelaufen ist?

    Da der Code intern die Daten als Strings speichert, bläht sich natürlich der Code auf. Ideal wäre es, wenn man die Exe so klein wie möglich halten will, die Dateien als Ressourcen in die Exe anhängt. Um zu testen, müsste man aber den Code immer kompilieren.

    Wie schon alpines schrieb, reagieren die AV Programme sehr sensible gegen UPX gepackte AutoIt Executables. Die Exe wird zwar kleiner, aber die AV Programme werden dadurch eher nur angetriggert.

    Mir persönlich ist mittlerweile die Exe Größe egal.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hi @UEZ

    ich komme hier nicht weiter:

    Code
    Func _FMUSIC_GetName($F_SongHandle)
    	$F_RetValue = _MemoryDllCall($F_DLL, "constchar*", "_FMUSIC_GetName@4", _
    				 "long", $F_SongHandle)
    	If @error Then Return SetError(1, 0, 0)
    	Return $F_RetValue
    EndFunc


    Es gibt entweder 0 zurück oder aber ein 0x Wert oder nur eine mehrstellige Zahl. Ich weiß nicht wo mein Fehler liegt...

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

  • Eher so:

    AutoIt
    Func _FMUSIC_GetName($F_SongHandle)
    	Local $F_RetValue = MemoryDllCall($F_DLL, "str", "_FMUSIC_GetName@4", "ptr", $F_SongHandle)
    	If @error Then Return SetError(1, 0, 0)
    	Return $F_RetValue[0]
    EndFunc

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Danke!

    Funktioniert wie erwartet :) Ich muss noch eine Menge lernen.
    Das mit dem "int", "long", "struct", ... bei den DLL Aufrufen ist mir noch nicht ganz klar.
    Aus der Hilfedatei oder Programmbeispielen im Internet unter C++ konnte ich auch nicht schlauer werden.

    Im Internet spricht man auch davon, man müsse die Länge des Namens übergeben.

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2