[PB4.10-Beta3] Bugs in der neuen Module-Library
Verfasst: 22.08.2007 09:51
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?

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.)
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.
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?



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
;}
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.
