Seite 1 von 1

[PB4.10-Beta3] Bugs in der neuen Module-Library

Verfasst: 22.08.2007 09:51
von PureLust
Moin zusammen, ...

ich hatte vor einigen Tagen mal ein wenig mit der neuen MOD-Library herum experimentiert.
Hierbei ist mir aufgefallen, dass sie in der jetztigen Form um Grunde nicht wirklich zu gebrauchen ist.

1. Bei Verwendung von SetModulePosition() scheint sich der Module-Player sehr häufig zu verschlucken (hierzu einfach mal das angefügte Testprogramm starten und ein paar mal klicken).

2. GetModulePosition() und GetModuleRow() geben nicht die tätsächlich abgespielte Position zurück.
Ich nehme mal an, dass der Player die Wave-Form für eine bestimmte Anzahl von Rows vorberechnet und diese dann Abspielt.
Dann setzt er die Zeiger für GetModulePosition() und GetModuleRow() auf die nächste Position, die er noch nicht vorberechnet hat.
Dies hat natürlich zur Folge, dass GetModulePosition() und GetModuleRow() nicht die tatsächlich aktuelle sondern eine nicht genau vorhersagbare 'zukünftige' Position angeben.
Wenn man also durch GetModulePosition() z.B. das Ende des Moduls abfragen möchte (Position = 255), so ist GetModulePosition() bereits bei 255 obwohl das Modul noch am spielen ist.
Mann kann also nicht genau erkennen wann ein Modul an welcher Stelle ist (z.B. am Ende).
Dies ist besonders tragisch in Kombination mit SetModulePosition() (siehe Punkt 3 und 5).

3. Wenn man SetModulePosition() ausführt, so wird scheinbar sofort die Wave-Form für die angegebene neue Position berechnen und die Zeiger für GetModulePosition() und GetModuleRow() wie pei Punkt 2 beschrieben "in die Zukunft" gesetzen - auch wenn das Modul momentan garnicht abgespielt wird.
PlayModule() macht jedoch exakt das gleiche nochmal: Es berechnet eine neue Wave-Form von der Position an, die durch GetModulePosition() und GetModuleRow() abgefragt werden kann.
Wenn man nun also erst SetModulePosition() und anschließend PlayModule() ausführt, so startet das Modul nicht an der durch SetModulePosition() definierten Stelle beginnt, sondern erst etwas später.

4. PlayModule() setzt einen Song nicht genau an der Stelle fort, wo man ihn gestoppt hat, sondern erst wieder an der Stelle auf sie GetModulePosition() und GetModuleRow() zeigen.
Wenn beim StopModule() die bereits vorberechnete Wave-Form verworfen wurde ist das natürlich verständlich.
An sonsten wäre es schöner wenn PlayModule() einfach die Wave-Form an der stelle weiter abspoielen würde und somit an exakt der gleichen Stelle weiter macht wo man gestoppt hat.
(Ist halt die Frage ob das mit dem verwendeten Player überhaupt möglich ist).

5. Nochmal etwas zu Punkt 2 und 3:
Dadurch das GetModulePosition() und GetModuleRow() ja eine nicht genau definierbare Position in der Zukunft wiedergeben, SetModulePosition() jedoch einen sofortige Sprung zu einer Position einleitet, kann man im Grunde nicht auf eine Position warten und dann an eine andere Position springen, da die Get- und Set-Befehle nicht syncron zueinander funktionieren.
Da GetModulePosition() und GetModuleRow() ja nicht die aktuelle Position sondern im Grunde die NÄCHSTE Position wieder geben sollten sie vielleicht eher heissen:
GetNEXTModulePosition() und GetNEXTModuleRow().
SetModulePosition() bricht ja im Gegensatz dazu die aktuelle Wave-Form ab und setzt SOFORT eine neue Position.

Analog zu GetNEXTModulePosition() und GetNEXTModuleRow() fehlen im Grunde dann die Befehle um auch die NÄCHSTE Position zu SETZEN.
Wenn es also Befehle wie SetNEXTModulePosition() und SetNEXTModuleRow() geben würde, so könnte man mit GetNEXTModulePosition() und GetNEXTModuleRow() die nächste Position abfragen und eben genau diese dann auch setzen.

Um nochmal das Beispiel mit dem Modulende anzuführen:
Mann könnte auf 'GetNEXTModulePosition(0) = 255' warten und dann mit SetNEXTModulePosition(0,0) den Zeiger für die NÄCHSTE Wave-Form-Berechnung auf den Anfang des Moduls setzen.
Durch die SOFORTIGE Ausführung von SetModulePosition() ist dies momentan ja so nicht möglich.

6. Es fehlen im Grunde auch noch so Befehle wie "IsModule(0)", "IsModulePlaying(0)" oder auch "RepeatModule(0, Anz)"

War dieser Roman nun so einigermassen verständlich? :freak: :oops: :?


Um Euch das Testen der Module-Library so einfach wie möglich zu machen hab ich Euch mal ein kleines Testprogramm dazu geschrieben, bei dem Ihr im Grunde alle oben beschriebenen Probleme nachvollziegen könnt:
(Das Testprogramm beinhaltet bereits ein extra kurzes Modul zum Testen.)

Code: Alles auswählen

Procedure ModPlaying(State)
	Shared ModPlaying
	If ModPlaying = #False And State = #True
		ModPlaying = State
		DisableGadget(4, #True)
		DisableGadget(6, #True)
		DisableGadget(8, #True)
		DisableGadget(10, #True)
		DisableGadget(12, #False)
	ElseIf ModPlaying = #True And State = #False
		ModPlaying = State
		DisableGadget(4, #False)
		DisableGadget(6, #False)
		DisableGadget(8, #False)
		DisableGadget(10, #False)
		DisableGadget(12, #True)
		SetGadgetState(11,#False)
	EndIf
EndProcedure

Procedure ExtractFileFromCatchBinData(FileName.s, CatchBinDataAdress)
	Protected Size.l, Compress.b
	Protected OrigSize = PeekL(CatchBinDataAdress -5)
	If PeekB(CatchBinDataAdress - 1) = 1
		*Mem = AllocateMemory(OrigSize)
		If *Mem
			If UnpackMemory(CatchBinDataAdress, *Mem) = OrigSize
				If OpenFile(0, FileName)
					WriteData(0,*Mem,OrigSize)
					CloseFile(0)
				EndIf
			EndIf
			FreeMemory(*Mem)
		EndIf
	EndIf
EndProcedure

If FileSize("BS1.MOD") < 3000 :  ExtractFileFromCatchBinData("BS1.MOD", ?BS1_MOD_Start) : EndIf

Text0.s = "Der neue Modul-Player scheint sich bei Verwendung von SetModulePosition() sehr häufig zu 'verschlucken'."+#CR$
Text0   + "Wenn dies der Fall sein sollte, das Modul einfach stoppen und nochmal neu versuchen."
Text1.s = "Hier wird das Modul ganz normal per 'PlayModule()' gestartet, wobei erst 'PlayModule()' "
Text1   + "und anschließend sofort 'SetModulePosition(0,0)' ausgeführt wird."
Text2.s = "Hier wird das Modul auch per 'PlayModule()' gestartet, wobei jedoch ZUERST 'SetModulePosition(0,0)' "
Text2   + "und anschließend 'PlayModule()' ausgeführt wird."+ #CR$+"Als Ergebnis beginnt der Song nicht von "
Text2   + "Anfang an"+#CR$+"(siehe ModuleRow-Anzeige, beginnent bei 17 o. 23)."
Text3.s = "Hier wird versucht, das Modul endlos abspielen zu lassen. Dazu wird abgefragt ob "
Text3   + "'GetModulePosition()' = 255 ist"+#CR$+"und daraufhin dann 'SetModulePosition(0,0)' ausgeführt "
Text3   + "um die ModulPosition auf den Anfang zu setzen. "+#CR$+#CR$+"Da 'GetModulePosition()' jedoch nicht "
Text3   + "die tatsächlich abgespielte Position anzeigt wird das Ende des Moduls zu früh erkannt und somit auch zu früh neu gestartet."
Text3   + #CR$+#CR$+"(Um den Test zu verkürzen wird das Modul erst kurz vor dem Ende gestartet.)"
Text4.s = "Einfaches 'PlayModule()' um ein Modul dort fortzusetzen, wo es mit 'StopModule()' gestoppt wurde"+#CR$
Text4   + "Hierbei merkt man, dass das Modul nich an exakt der gleichen Stelle fortgesetzt wird, sondern erst etwas später wieder anfängt."
If Not (InitSound() And LoadModule(0,"BS1.MOD")) : End : EndIf
If OpenWindow(0,0,0,300,700,"Test für die neue PB MOD-Library", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
	TextGadget(0,10,10,280,55,Text0,#PB_Text_Center)
	TextGadget(1,10,GadgetY(0)+GadgetHeight(0)+15,135,19,"",#PB_Text_Center | #PB_Text_Border)
	TextGadget(2,155,GadgetY(0)+GadgetHeight(0)+15,135,19,"",#PB_Text_Center | #PB_Text_Border)
	TextGadget(3,10,GadgetY(1)+GadgetHeight(1)+20,280,45,Text1,#PB_Text_Center | #PB_Text_Border)
	ButtonGadget(4,20,GadgetY(3)+GadgetHeight(3)+5,260,20,"PlayModule() + SetModulePosition(0,0)")
	TextGadget(5,10,GadgetY(4)+GadgetHeight(4)+5,280,75,Text2,#PB_Text_Center | #PB_Text_Border)
	ButtonGadget(6,20,GadgetY(5)+GadgetHeight(5)+5,260,20,"SetModulePosition(0,0) + PlayModule()")
	TextGadget(7,10,GadgetY(6)+GadgetHeight(6)+5,280,155,Text3,#PB_Text_Center | #PB_Text_Border)
	ButtonGadget(8,20,GadgetY(7)+GadgetHeight(7)+5,260,20,"PlayModule() + SetModulePosition(0,4) + Play-Endlos")
	TextGadget(9,10,GadgetY(8)+GadgetHeight(8)+5,280,70,Text4,#PB_Text_Center | #PB_Text_Border)
	ButtonGadget(10,20,GadgetY(9)+GadgetHeight(9)+5,260,20,"Einfaches PlayModule() zum Fortsetzen des Modules")
	CheckBoxGadget(11,20,GadgetY(10)+GadgetHeight(10)+10,260,18,"Beginne von Vorne, wenn Module-Position = 255")
	ButtonGadget(12,20,GadgetY(11)+GadgetHeight(11)+10,260,20,"Stop Module")
	ResizeWindow(0, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetY(12)+GadgetHeight(12)+10)
	SetGadgetColor(0,#PB_Gadget_FrontColor,$ff)
	DisableGadget(12, #True)
	Repeat
		Event = WaitWindowEvent(10)
		If Event = #PB_Event_Gadget
			Select EventGadget()
				Case 4
					ModPlaying(#True)
					PlayModule(0)
 					SetModulePosition(0,0)
				Case 6
					ModPlaying(#True)
					SetModulePosition(0,0)
					PlayModule(0)
				Case 8
					ModPlaying(#True)
					PlayModule(0)
					SetModulePosition(0,4)
					SetGadgetState(11,#True)
				Case 10
					ModPlaying(#True)
					PlayModule(0)
				Case 12
					ModPlaying(#False)
					StopModule(0)
			EndSelect
		ElseIf Event = 0
			SetGadgetText(1,"ActModulePosition: "+Str(GetModulePosition(0)))
			SetGadgetText(2,"ActModuleRow: "+Str(GetModuleRow(0)))
			If GetModulePosition(0) = 255 And ModPlaying
				If GetGadgetState(11)
					SetModulePosition(0,0)
				Else
; 					StopModule(0)
; 					ModPlaying(#False)
				EndIf
			EndIf
		EndIf
	Until Event = #PB_Event_CloseWindow
	StopModule(0)
EndIf

;{  Data-Bereich für das Modul: "BS1.MOD"
DataSection
  Data.l 3584 ; original filesize
  Data.b 1 ; compressed with JCalg1
  BS1_MOD_Start: ; startlabel
  Data.l 234898250,-2136539136,-289974535,-927653668,1458047789,-1554930978,-2096020203,-2121203696,206471825,-1488780728
  Data.l 1745880134,-1047942829,-1029674002,1815762564,1612017736,-2137911297,-2079203196,-1995341545,-1911454063,-1584297071
  Data.l -1070559087,1750380433,-1033303232,932923964,143535657,-881260106,492585474,102187009,-1761181309,22429884
  Data.l -1543239402,-858756600,1154324640,1083415570,-1993109050,-1122438490,-1999352342,-1530548934,484463816,1080364579
  Data.l 448925893,405115960,-644550052,1908955789,80620153,1369806986,345141895,-869000793,1619669634,925370888
  Data.l -303758139,-846179310,-1271903094,-1794708440,36234341,1540182252,-1565517787,21747792,564276485,1293951499
  Data.l 1076499601,843085880,446714048,-530970350,236003414,188758460,1128756002,-1427072902,371352119,690772497
  Data.l -1423159278,532235719,1653179827,1068126277,1111663937,1309165741,512779460,977753305,-1044000574,1954567988
  Data.l -343913080,1409263630,-709852000,-1678224367,761465859,424217416,489335745,740198946,1514391493,1714065222
  Data.l -1985854575,274849909,302920117,1362866574,593730096,135883220,441756430,1724648795,-1043951506,130852262
  Data.l 2009648515,-1711939936,-722080986,-1264407707,-1792640585,-1466223709,-969154318,1824936209,1155844226,140048577
  Data.l -1098443482,943188621,1381192650,1723609950,-1816764189,-1068784473,1223221108,-2134717616,-1875404204,577283169
  Data.l -1542979431,488796170,1464664501,1852760255,361965856,684567045,-871013310,-380616686,-1533464376,-1437834854
  Data.l 228082245,90608293,438508198,-427874170,728286850,-1937204763,1532005519,760255750,760339282,178409242
  Data.l 1229627735,1776207385,315382246,-1269288829,-1094461293,820238774,2093771846,1094044206,-1792752339,1661944681
  Data.l -179713374,1198123208,1434588755,952355429,962888984,-1255453267,-1549871452,-1049981667,1861716369,-1229770395
  Data.l 1353169757,-739092829,-2055838554,-1067166566,1318570357,-738986918,-1795408737,-1638992131,1974238461,-271067341
  Data.l 1654378211,-870044899,-866500196,-2059144664,756490001,630393234,514035401,1571772917,-1098425420,-546178900
  Data.l 1053775796,-436880963,519010245,-564626818,-575760441,-2051471301,1939377959,-421799831,1416227869,-859413075
  Data.l -1849224183,-1194567386,1381082001,1227647129,815592018,1956294239,-1218228504,-1361609390,454800603,1744092190
  Data.l 1993053645,-554714451,773811130,1334376476,194124674,-580058874,493239739,-1563445573,964471631,596666227
  Data.l -949770673,-1960327278,-506900443,400263876,-445751056,741725666,1319089497,1357437637,-588887388,-1706290215
  Data.l -2144309451,-1849046708,2135014616,-378153742,1790943697,1554979493,774596278,441260012,1908351384,2042453707
  Data.l 1740104306,2174639,-1362633233,-840674563,465392545,1470427448,-1298553149,318754918,-596833194,629045690
  Data.l 1230214779,701806753,738306388,-1482827163,-1412002919,-83017900,1790405525,2002490063,-75539410,-256326166
  Data.l 722976992,-1851294642,13470825,-866415485,-1942073192,-2084482408,-533783799,-995159360,1832182959,1815453708
  Data.l -1963084583,-772748627,1379229653,233522452,-567764932,2029788089,923598962,-736811268,-77194132,1722824055
  Data.l -2001914125,1033440613,-211655001,1037060773,-309610550,1244192414,-1239692948,866977894,2021379607,1595138035
  Data.l -1134682834,-1955695757,1472425014,873076457,1901418344,-445018614,-51993642,-2134897911,2004965195,1890879942
  Data.l 2105451739,1998849274,1335603518,829881999,-1364996384,-799290627,-859151715,-831552362,1310085129,1799370074
  Data.l -1689455247,1230183479,-392988939,-1636859438,751232553,1774515706,-179231953,-519380564,-201689956,1430542249
  Data.l 1737962686,-66148131,-1496146823,-77691097,916678068,-344643218,-748187176,-1395848294,1840509879,1441453739
  Data.l -1554128918,-398088826,-308961574,51220448,-1864446850,427665957,1784934009,-537983133,-316243008,1941878010
  Data.l 1480272613,-1386030803,-353051178,2055845839,1802943225,-1681593599,1703543557,978135500,1337945525,-1938778461
  Data.l -603600274,-2101840966,-267600065,1437753556,-986555221,-1277405653,-67256431,-1982665351,-109199625,1859052785
  Data.l -652801603,-1241914433,992861924,415239526,-888112969,1232886830,595892203,1863800255,-1124153888,2110141111
  Data.l 133306157,2005688243,529766691,-1304969701,924041314,-1932084002,-709716429,-36282767,-1209894965,-1303971965
  Data.l 182324061,196358215,-945196667,819472775,1324204645,-2135188386,-926835667,1056146498,-1640674346,1620733640
  Data.l -1826057541,-1765962711,-393576633,393254848,-1459036111,-1766037320,1496996718,59095426,232975923,209632732
  Data.l -1541852520,322657042,1718653379,-1716741433,-673490820,528574882,-285680157,-419576614,-1931138091,157384890
  Data.l 576844912,385601068,-1534758375,296945537,-1689350195,-122545700,408667314,-209881085,-276498902,847755614
  Data.l -2100236554,-969724155,-1100679656,-1310387831,-201749147,1285452518,589151374,492311710,1268615106,1324204051
  Data.l -706617606,-882673110,1548833383,211398328,656837702,-2027324378,864909069,814125104,-1499093150,-782896777
  Data.l -1186070464,174105658,-822699827,799472382,731159564,696734827,1601134656,-1233458782,1530411170,-369302258
  Data.l 203138329,-2123678758,1086801536,505219088,-506825730,-1672675264,-1743725168,-901971709,-1934747069,-1827628896
  Data.l 2008239910,-2017312262,-1799968141,-469630244,-1845715570,1449658859,1091049568,1616671680,-76149040,-426604814
  Data.l -832066864,-1480205687,-2141847641,-2141977592,-2660160,-1154160861,-1555377250,-1196491690,-1481699326,-64657441
  Data.l -805240064,-1174441414,-259841370,757445242,2098050849,325867824,-867935899,1478301728,-1096679229,-1234997184
  Data.l -621408764,29904435,1668052420,537305863,995754578,861229052,672838912,922461643,111239087,-890804781
  Data.l -1657720431,193983770,-226869857,-1623734558,463822206,2103875073,-2017292149,570721060,-1984667259,582198002
  Data.l -1061358355,537160536,-1923522538,1718815507,-159362869,16808412,1759614596,1731154750,-458036010,1848743369
  Data.l 212080892,-1987974325,874785008,2042317281,921413257,-949887698,727014814,580235095,-207119679,-73223403
  Data.l 50982262,-1129538074,-1040545852,-2113061732,-1696468371,-956183566,-2059916334,-1163909759,-606748667,21713
  Data.b 0,-16
  BS1_MOD_End: ; endlabel
EndDataSection
;}
Ich hoffe Ihr könnt was damit anfangen und in etwa nachvollziehen was ich damit meine.

Schönen Gruß, PL.

@ Fred & Fr3ak:
Sorry dass ich das hier im deutschen Forum in deutscher Sprache poste (da Fred ja vermutlich kein Deutsch versteht), aber meine Englischkenntnisse reichen nicht aus um eine solch komplexe Angelegenheit so in englischer Sprache zu formulieren, dass es andere dann auch noch verstehen können. Sowas verständlich rüber zu bringen ist in Deutsch ja schon schwierig genug. :oops: