LibZPlay Ich weiss nicht weiter....

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Torr
Beiträge: 21
Registriert: 20.08.2014 12:06

LibZPlay Ich weiss nicht weiter....

Beitrag von Torr »

:oops:
Hallo liebe Foren Mitglieder !
Eines vorweg, ich bin im PureBasic Programmieren noch ein Anfänger !
Könnte sich bitte einer mal von Euch mein Programm ansehen.

Was ich gerne möchte, ist das ich im Explorergadget ein MP3 File auswähle und über die LibZ abspiele.
Das File wird wohl geladen (Änderung der Bitrate wird angezeigt) aber alles andere nicht bzw. das Stück wird nicht abgespielt.
Ich habe das Programm von TS-Soft (Original Programm funktioniert Klasse von Thomas) für mich umgeschrieben.
Aber nun geht gar nichts mehr...

Code: Alles auswählen

EnableExplicit

XIncludeFile "E:\purebasic\libzplay_include.pbi"


Define hZPlay, File.s,eventid,bpm
Define ID3.TID3InfoExW
Define TSI.TStreamInfo
Define links,rechts,amplilinks
Define Event,bpm_f,rea_bpm,nLeftAmp,nrightAmp,fase
OpenWindow(0, #PB_Ignore, #PB_Ignore, 1024, 768,"Demo ZPlay Lib." , #PB_Window_SystemMenu)
ButtonGadget(12,800,345,80,20,"FFT_Area_Line")
ButtonGadget(20,800,365,80,20,"FFT_Area_Bar")
TextGadget(0, 5, 10, 190, 20, "Album:" + #TAB$ + ID3\Genre)
TextGadget(1, 5, 30, 210, 20, "" );+ #TAB$ + TSI\BitRate)
TextGadget(2, 5, 50, 300, 20, "Title:" + #TAB$ + ID3\Title)
TextGadget(3, 5, 70, 20, 12, "")
TextGadget(4, 5, 92, 20, 12, "")
TextGadget(8,5,550,100,20,"")
        TextGadget(9,5,570,100,20,"")
        TextGadget(10,120,550,100,20,"")
ProgressBarGadget(6,40,70,500,25,0,100,#PB_ProgressBar_Smooth)
SetGadgetColor(6, #PB_Gadget_FrontColor,RGB($00,$FF,$00))
SetGadgetColor(6, #PB_Gadget_BackColor,RGB($10,$77,$00))
ProgressBarGadget(7,40,95,500,25,0,100,#PB_ProgressBar_Smooth)
ProgressBarGadget(9,40,550,300,20,0,400,#PB_ProgressBar_Smooth)
SetGadgetColor(7, #PB_Gadget_FrontColor,RGB($66,$cc,$33))
SetGadgetColor(7, #PB_Gadget_BackColor,RGB($00,$FF,$00))
ExplorerTreeGadget(30, 600, 10, 280, 280, "*.mp3;*.mp3")
 hZPlay = zplay_CreateZPlay()
Repeat 
  EventID = WaitWindowEvent()
  File= GetGadgetText(30)
    
 
  
  If hzplay
   
    zplay_OpenFile(hZPlay, File, #sfMp3)
    zplay_Play(hZPlay)
    zplay_LoadID3W(hZPlay, #id3Version2, @ID3 ) 
    zplay_GetStreamInfo(hZPlay,@TSI)
    
   ; EndIf
    AddWindowTimer(0, 1, 90)
    zplay_SetFFTGraphParam(hZPlay, #gpGraphType, #gtarealeftontop)
    zplay_SetFFTGraphParam(hZPlay, #gpcolor1, RGB($00,$33,$33))
    zplay_SetFFTGraphParam(hZPlay, #gpFFTPoints, 512)
    zplay_SetFFTGraphParam(hZPlay, #gpHorizontalScale, #gsLinear)
    zplay_SetFFTGraphParam(hzplay, #gpTransparency,10)
    zplay_SetFFTGraphParam(hZPlay, #gpWindow, #FWHann)
    zplay_setplayervolume(hzplay,100,100) ; Ändern für Balance einstellung.. wäre ne Idee
      
    
  EndIf
 
    bpm= zplay_DetectFileBpm(hzplay,File,#sfmp3,#dmAutoCorrelation )
    zplay_DrawFFTGraphOnHWND(hZPlay, WindowID(0), 5, 145, 400, 150)
              zplay_GetVUData(hzplay,@links,@rechts)
              zplay_SetFFTGraphParam(hzplay, #gpTransparency,20)
              SetGadgetText(3,""+ Str(links))
              SetGadgetText(4,"" + Str(rechts))
              SetGadgetState(6, links)
              SetGadgetState(7, rechts)
              SetGadgetText(1,"Bitrate : "+ #TAB$ + TSI\BitRate+" kbps")
              SetGadgetText(8,"Mouse x " +Str(WindowMouseX(0)))
              SetGadgetText(9,"Mouse y " + File)
              SetGadgetText(10,"BPM " +Str(bpm))
    ;EndIf
    Select EventGadget()
          
      Case 12
              zplay_SetFFTGraphParam(hZPlay, #gpGraphType, #gtarealeftontop)
            Case 20
             zplay_SetFFTGraphParam(hZPlay, #gpGraphType, #gtBarsleftontop) 
                            
          EndSelect
   
 Until EventID=#PB_Event_CloseWindow 

 zplay_Close(hZPlay)
    zplay_DestroyZPlay(hZPlay)


Hat vielleicht einer eine Idee ?

Vielen Dank :)
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: LibZPlay Ich weiss nicht weiter....

Beitrag von Vera »

Hallo Torr,
noch ein Willkommen im Forum :-)

Es wär schön, wenn Du das Orginal von TS-Soft verlinkt hättest, damit man eine Vergleichsmöglichkeit hätte, und sieht, wie es ursprünglich gemeint war.

Ich kann Dir ad hoc nicht helfen, aber beim Durchlesen Deines Codes ist mir aufgefallen, dass dort in der Repeatschleife permanent

Code: Alles auswählen

File= GetGadgetText(30)
zugewiesen wird.

Dieser Befehl müßte aber erst bei einem ButtonClick erfolgen, damit dann auch der aktuell markierte Eintrag ermittelt und übergeben wird.

Auch

Code: Alles auswählen

zplay_Close(hZPlay)
zplay_DestroyZPlay(hZPlay)
hinter der Repeatschleife, wird vielleicht gar nicht ausgeführt. - Zumindest hab' ich sowas bislang nicht gesehen.

Soweit auf die Schnelle ... Gruß ~ Vera
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: LibZPlay Ich weiss nicht weiter....

Beitrag von ts-soft »

Kein Wunder, was soll da noch funktionieren :wink:
Du hast wirklich jeden müll ins eventloop gepackt, ohne ereignis.

Guck Dir nochmal das Original an und schmeiß ins eventloop nur Dinge, die ein Ereignis haben.

Code: Alles auswählen

        Repeat
          Select WaitWindowEvent()
            Case #PB_Event_CloseWindow : Break
            Case #PB_Event_Timer
              zplay_DrawFFTGraphOnHWND(hZPlay, WindowID(0), 5, 5, 190, 100)
          EndSelect
        ForEver
Zum Vergleich nochmal Dein EventLoop:

Code: Alles auswählen

Repeat
  EventID = WaitWindowEvent()
  File= GetGadgetText(30)
   
 
 
  If hzplay
   
    zplay_OpenFile(hZPlay, File, #sfMp3)
    zplay_Play(hZPlay)
    zplay_LoadID3W(hZPlay, #id3Version2, @ID3 )
    zplay_GetStreamInfo(hZPlay,@TSI)
   
   ; EndIf
    AddWindowTimer(0, 1, 90)
    zplay_SetFFTGraphParam(hZPlay, #gpGraphType, #gtarealeftontop)
    zplay_SetFFTGraphParam(hZPlay, #gpcolor1, RGB($00,$33,$33))
    zplay_SetFFTGraphParam(hZPlay, #gpFFTPoints, 512)
    zplay_SetFFTGraphParam(hZPlay, #gpHorizontalScale, #gsLinear)
    zplay_SetFFTGraphParam(hzplay, #gpTransparency,10)
    zplay_SetFFTGraphParam(hZPlay, #gpWindow, #FWHann)
    zplay_setplayervolume(hzplay,100,100) ; Ändern für Balance einstellung.. wäre ne Idee
     
   
  EndIf
 
    bpm= zplay_DetectFileBpm(hzplay,File,#sfmp3,#dmAutoCorrelation )
    zplay_DrawFFTGraphOnHWND(hZPlay, WindowID(0), 5, 145, 400, 150)
              zplay_GetVUData(hzplay,@links,@rechts)
              zplay_SetFFTGraphParam(hzplay, #gpTransparency,20)
              SetGadgetText(3,""+ Str(links))
              SetGadgetText(4,"" + Str(rechts))
              SetGadgetState(6, links)
              SetGadgetState(7, rechts)
              SetGadgetText(1,"Bitrate : "+ #TAB$ + TSI\BitRate+" kbps")
              SetGadgetText(8,"Mouse x " +Str(WindowMouseX(0)))
              SetGadgetText(9,"Mouse y " + File)
              SetGadgetText(10,"BPM " +Str(bpm))
    ;EndIf
    Select EventGadget()
         
      Case 12
              zplay_SetFFTGraphParam(hZPlay, #gpGraphType, #gtarealeftontop)
            Case 20
             zplay_SetFFTGraphParam(hZPlay, #gpGraphType, #gtBarsleftontop)
                           
          EndSelect
   
 Until EventID=#PB_Event_CloseWindow 
Was soll das werden :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: LibZPlay Ich weiss nicht weiter....

Beitrag von Vera »

wow ~ das scheint ja ein geheimnissvoller Code zu sein.

Wie gehabt, muß ich immer alles selber suchen.
Für alle die auf diesen Thread stoßen und sich für LibZPlay interessieren, schauen besser zuerst in folgenden Threads nach:
- Wie LibZPlay Multimedia-DLL mit PB verwenden ?
- libZPlay include + header (windows 32-bit only)

und besorgen sich alle notwendigen externen DLLs u. Infos und finden dort auch verwendbare Includes und Beispiele.

Das hier referenzierte Beispiel ist jedoch nicht dabei ... und ich durchforsche jetzt auch nicht noch das englische Forum, wo es wohl auch noch was gibt.

... und nachdem, was ich da alles gesehen habe, ist es eh' far beyond me, dazu mal eben eine bequeme AuswahlMaske zu erstellen, geschweige denn, zu identifizieren, was im Eröffnungscode alles gewünscht ist.

Code: Alles auswählen

Repeat : Gruß ~ Vera : If Not Until = Forever
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: LibZPlay Ich weiss nicht weiter....

Beitrag von ts-soft »

Torr hat ja weniger ein Problem mit dem Wrapper, als mit dem EventLoop allgemein. Ich denke mal,
er sollte erstmal ein wenig mehr über ereignisorientierte Programmierung lernen, bevor er da weitermacht.

Der Programmierstil der 80-er wirkt nicht mehr, Spaghetti ist nicht ereignisorientiert.

In einem EventLoop sollte nur Code ausgeführt werden, der einem Ereignis folgt. Das andauernde
neubestücken ohne ereignis ist nicht Zielführend und bringt höchsten die CPU zum kochen, aber den
Code nicht zum laufen.

Also, mein lieber Torr, guck Dir noch ein paar Beispiele in der Hilfe an, bzw. hier im Forum und wenn
dann der Code nicht läuft, bei korrektem EventLoop, bin ich gerne bereit zu gucken.

So, wie im moment macht das wenig sinn.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten