DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > 2.+3.Joystikknopf Signale | [ - Search - New posts - Register - Login - ] |
First 1 2 3 4 5 -6- | [ - Post reply - ] |
2006-07-17, 23:49 h MaikG Posts: 5172 User |
Würde das Programm funktionieren wenn eine Variable nicht stimmt? CONST IND_SETMTYPE& = &hF& von input.bc die sind schon richtig. Hast du das beispiel mal in C Compilert? Gibts da ein Hit? [ - Answer - Quote - Direct link - ] |
2006-07-18, 11:04 h Holger Posts: 8116 User |
Zitat: Glaubst Du, ich poste ungetesteten code? Habe aber keinen Enforcer hier zu laufen, aber das Programm macht, was es soll, daran zu erkennen, dass die Maus wieder funktioniert. Aber mir ist das jetzt zu blöd, ein Ratespiel daraus zu machen. Wenn Du Dein Programm nicht posten willst, wirst Du den Fehler alleine suchen müssen. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2006-07-18, 18:20 h MaikG Posts: 5172 User |
>Glaubst Du, ich poste ungetesteten code? Habe aber keinen Enforcer >hier zu laufen, aber das Programm macht, was es soll, daran zu >erkennen, dass die Maus wieder funktioniert. Die Maus funktioniert bei mir doch auch wieder, es kommt nur dieser Enforcer Hit. >Aber mir ist das jetzt zu blöd, ein Ratespiel daraus zu machen. >Wenn Du Dein Programm nicht posten willst, wirst Du den Fehler >alleine suchen müssen. Ich glaub der Fehler müsste schon am Beispiel liegen. Aber okay: code:DEFINT A-Z '$INCLUDE Blib/ExecSupport.bas '$include input.bc '$include gameport.bc '$include potgo.bh OUTRY&=1&<<15 DATRY&=1&<<14 OUTRX&=1&<<13 DATRX&=1&<<12 OUTRYM&=1&<<11 DATRYM&=1&<<10 OUTRXM&=1&<<9 DATRXM&=1&<<8 CONST ID_CHAN& = &h4248414E CONST PAL_CLOCK& = 3546895& CONST AIOCNT = 2 REM CONST MAXSAMPLE&= &h25000& CONST MAXSAMPLE&= &h185000& 'Set up the audio I/O block for channel allocation ' SUB OpenAudio DIM SHARED devopened, port& STATIC k STATIC device& SHARED tclock& IF devopened THEN EXIT SUB tclock&=PAL_CLOCK& DIM SHARED aio&(AIOCNT) ' 'Create a reply port so the audio device can reply to our commands ' port& = CreatePort&(NULL&, 0) IF port& THEN FOR k=0 TO AIOCNT-1 aio&(k)=CreateExtIO&(port&,IOAudio_sizeof) IF aio&(k)=0 THEN CALL CloseAudio: EXIT SUB NEXT k STATIC ioreq&, whichannel& ioreq& = aio&(0) + ioa_Request POKEL ioreq& + IORequestio_Message + mn_ReplyPort, port& ' the address of a reply port POKEB ioreq& + IORequestio_Message + mn_Node + ln_Pri, 0 ' neutral priority POKEW ioreq& + IORequestio_Command, ADCMD_ALLOCATE& ' allocate the channels POKEB ioreq& + IORequestio_Flags, ADIOF_NOWAIT& POKEW aio&(0) + ioa_AllocKey, 0 whichannel& = &h01020408 ' channel allocation POKEL aio&(0) + ioa_Data, VARPTR(whichannel&) POKEL aio&(0) + ioa_Length, 4 device& = OpenDevice&(SADD("audio.device" + CHR$(0)), 0, aio&(0), 0) ' Clone the flags, channel allocation, etc. into other IOAudio requests FOR k=1 TO AIOCNT-1 CopyMem aio&(0),aio&(k),IOaudio_sizeof NEXT k END IF IF device&=0 THEN devopened=-1 ELSE CALL CloseAudio END SUB ' ' Close audio device as opened by OpenAudio, null out pointers ' SUB CloseAudio STATIC k SHARED devopened,port& ' Note - we know we have no outstanding audio requests */ IF devopened THEN CloseDevice aio&(0) devopened = 0 END IF FOR k=0 TO AIOCNT-1 IF aio&(k) THEN DeleteExtIO aio&(k) aio&(k) = NULL& END IF NEXT k IF port& THEN DeletePort port& port& = NULL& END IF END SUB FUNCTION LoadSBody(BYVAL iff&,BYVAL vhdr&) SHARED sbytes& SHARED sample& STATIC memtype& STATIC cn& LoadSBody=0 cn&=CurrentChunk(iff&) sbytes& = PEEKL(cn&+cn_Size) - PEEK(cn&+cn_Scan) memtype&= MEMF_Chip& sample&=AllocMem(sbytes&,memtype&) IF sample&=0 THEN PRINT "Not enough memory" EXIT FUNCTION END IF IF ReadChunkBytes(iff&,sample&,sbytes&)<>sbytes& THEN PRINT "Can't read whole sample" EXIT FUNCTION END IF LoadSBody=-1 END FUNCTION SUB UnloadSBody SHARED sample&, sbytes& IF sample& THEN FreeMem sample&,sbytes& sample&=0 END IF sbytes&=0 END SUB ' 'The main play sample routine ' SUB PlaySample(BYVAL vhdr&) SHARED aio&(1),tclock& SHARED sbytes&,sample& STATIC ioreq&,a&,junk& STATIC period,volume STATIC req ' the index of the Audio Request that is currently playing STATIC reqn ' the index of the next request that we are creating STATIC sampleptr& ' where we are playing from STATIC bytesleft& ' bytes still to play period= tclock&/PEEKW(vhdr&+vh_samplespersec) volume=MAX(PEEKL(vhdr&+vh_volume)*64/&h10000,64) sampleptr&=sample& bytesleft&=sbytes& a&=aio&(0) ioreq&=a&+ioa_Request POKEW ioreq& + IORequestio_Command , CMD_WRITE& POKEB ioreq& + IORequestio_Flags , ADIOF_PERVOL& POKEL a& + ioa_Data , sampleptr& POKEL a& + ioa_Length , MIN(bytesleft&, MAXSAMPLE&) POKEW a& + ioa_Period , period POKEW a& + ioa_Volume , volume POKEW a& + ioa_Cycles , 1 ' Send the command to start a sound using BeginIO() BEGINIO a& req=0 ' the first one is now playing DO bytesleft&=bytesleft&-MAXSAMPLE& IF bytesleft&<=0 THEN EXIT LOOP sampleptr&=sampleptr&+MAXSAMPLE& reqn = req XOR 1 ' alternate IO Blocks 0 and 1 a&=aio&(reqn) ioreq&=a&+ ioa_Request POKEW ioreq& + IORequestio_Command , CMD_WRITE& POKEB ioreq& + IORequestio_Flags , ADIOF_PERVOL& POKEL a& + ioa_Data , sampleptr& POKEL a& + ioa_Length , MIN(bytesleft&,MAXSAMPLE&) POKEW a& + ioa_Period , period POKEW a& + ioa_Volume , volume POKEW a& + ioa_Cycles , 1 BEGINIO a& junk&= WaitIO(aio&(req)) ' wait for the previous request to finish req =reqn ' the one we've just started is now playing LOOP ' wait for the final (or only!) io request to finish junk&= WaitIO(aio&(req)) END SUB SUB PlayFile (filename$) STATIC iff&, stream&, junk&, sp&, vhdr&, camg&, bm&, screenptr&, w, h, depth SHARED sbytes& iff& = AllocIFF& IF iff& THEN stream& = xOpen&(SADD(filename$ + CHR$(0)), MODE_OLDFILE&) IF stream& THEN POKEL iff& + iff_Stream, stream& 'connect the DOS stream 'fall back for 1.3 (if you have 1.3 iffparse.library) InitIFFasDos iff& IF OpenIFF&(iff&, IFFF_READ&) = 0 THEN IF PropChunk&(iff&, ID_8SVX&, ID_VHDR&) = 0 AND _ StopChunk&(iff&, ID_8SVX&, ID_BODY&) = 0 AND _ ParseIFF(iff&, IFFPARSE_SCAN&) = 0 THEN 'look for a VHDR stored property sp& = FindProp&(iff&, ID_8SVX&, ID_VHDR&) vhdr& = 0 IF sp& THEN vhdr& = PEEKL(sp& + sp_Data) IF vhdr& THEN IF LoadSBody(iff&,vhdr&) THEN PlaySample vhdr& END IF UnLoadSBody ' we must call this even if we failed to load END IF ELSE PRINT "No VHDR" END IF ELSE PRINT "Can't find VHDR and/or BODY" END IF CloseIFF iff& junk& = xClose(PEEKL(iff& + iff_Stream)) FreeIFF iff& END IF ELSE PRINT filename$;" not found" END IF END SUB ' ' Start the main program ' LIBRARY OPEN "dos.library" LIBRARY OPEN "graphics.library" LIBRARY OPEN "iffparse.library" LIBRARY OPEN "exec.library" OpenAudio IF devopened=0 THEN PRINT "Can't open audio":STOP ' we have a command line - play the file TIMER ON type&=GPCT_NOCONTROLLER& portI& = CreatePort&(NULL&, NULL&) IF portI& THEN InputIO&=CreateExtIO&(port&,IOStdReq_sizeof%) IF InputIO& THEN deviceI& = OpenDevice&(SADD("input.device" + CHR$(0)), NULL&, InputIO&, NULL&) IF deviceI&=0 THEN POKEW(InputIO&+IORequestio_Command%), IND_SETMTYPE& POKEL(InputIO&+IOStdReqio_Data%), VARPTR(type&)+3 POKEL(InputIO&+IOStdReqio_Length%),1& IF DoIO&(InputIO&) THEN PRINT "Fehler4 DOIO" ELSE PRINT "can't open input.device" END IF LIBRARY VARPTR "potgo.resource", OpenResource&(SADD("potgo.resource" + CHR$(0))) IF LIBRARY("potgo.resource") = NULL& THEN PRINT "Cannot open potgo.resource" ELSE potbits&=AllocPotBits(OUTRYM& OR DATRYM& OR OUTRXM& OR DATRXM&) IF potbits&=(OUTRYM& OR DATRYM& OR OUTRXM& OR DATRXM&) THEN WritePotgo &hFFFFFFFF&,potbits& Alarmcode... 1109 CALL CloseAudio IF logging%=1 THEN CLOSE #1 ELSE PRINT "Pot bits are already allocated!";potbits&:GOTO 1111 END IF FreePotBits potbits& END IF 1111 REM Mausfunktion wieder herstellen type&=GPCT_MOUSE& POKEW(InputIO&+IORequestio_Command%), IND_SETMTYPE& POKEL(InputIO&+IOStdReqio_Data%), VARPTR(type&)+3 POKEL(InputIO&+IOStdReqio_Length%),1& POKEB(InputIO&+IOStdReqio_Flags%), IOF_QUICK& IF DoIO&(InputIO&) THEN PRINT "Fehler4 DOIO" IF deviceI&=0 THEN CloseDevice InputIO&:PRINT "Device geschlossen" DeleteExtIO InputIO& ELSE PRINT "cant create IO" END IF DeletePort portI& ELSE PRINT "can't open port" END IF LIBRARY VARPTR "potgo.resource", NULL& REM wichtig MB versucht sonst zu schliessen! END Sonstige Librarys sind in einer vorcompilierten Datei. [ - Answer - Quote - Direct link - ] |
2006-07-18, 20:18 h whose Posts: 2156 User |
@MaikG: Es wäre unter den Umständen auch nicht schlecht, wenn man den Hit mal sehen könnte. Nachher stammt der aus einer ganz anderen Ecke Deines Programms... Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Answer - Quote - Direct link - ] |
2006-07-18, 20:24 h whose Posts: 2156 User |
Zitat: Ja, das macht mich auch etwas stutzig... Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Answer - Quote - Direct link - ] |
2006-07-18, 21:28 h Holger Posts: 8116 User |
Zitat:Da fällt mir schon mal auf, daß Du hier die falsche Port-Variable benutzt. Auch wenn das bei DoIO keine so große Rolle spielt. Außerdem irritiert mich, daß die Variablen wie IORequestio_ ... mal mit Prozentzeichen am Ende benutzt werden und mal ohne. Ist das dem Basic egal? Man sollte sich trotzdem eine konsistene Schreibweise angewöhnen. Wie auch Einrückungen, etc. Manchmal muß es ja doch mal jemand anderes lesen Und da kommen außerdem sonst Sachen raus, wie: basic code:POKEW(InputIO&+IORequestio_Command%), IND_SETMTYPE& POKEL(InputIO&+IOStdReqio_Data%), VARPTR(type&)+3 POKEL(InputIO&+IOStdReqio_Length%),1& POKEB(InputIO&+IOStdReqio_Flags%), IOF_QUICK& IF DoIO&(InputIO&) THEN PRINT "Fehler4 DOIO" IF deviceI&=0 THEN CloseDevice InputIO&:PRINT "Device geschlossen" Du benutzt das device, um den Typ auf Maus zu stellen und danach, für das Schließen, überprüfst Du, ob das device überhaupt geöffnet werden konnte... mfg PS: benutz doch lieber CreateMsgPort&() statt CreatePort&(NULL&, 0) das reduziert den code und somit auch potentielle Fehlerquellen. [ Dieser Beitrag wurde von Holger am 18.07.2006 um 21:28 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2006-07-19, 09:45 h MaikG Posts: 5172 User |
>Da fällt mir schon mal auf, daß Du hier die falsche Port-Variable >benutzt. Auch wenn das bei DoIO keine so große Rolle spielt. Oje, da bin ich doch mit Suchen/Ersetzen drübergegangen. >Außerdem irritiert mich, daß die Variablen wie IORequestio_ ... mal >mit Prozentzeichen am Ende benutzt werden und mal ohne. Ist das dem >Basic egal? Jaein, wenn Defint a-z angegeben ist ist a identisch a%. Ist Defint nicht angegeben Funktioniert das nicht. Ich gebe % immer an, das ist "sauberer", aber ich habe teile eines Beispiels zur Tonausgabe von Maxonbasic verwendet. >Man sollte sich trotzdem eine konsistene Schreibweise angewöhnen. >Wie auch Einrückungen, etc. Manchmal muß es ja doch mal jemand >anderes lesen Wie jetzt, ich rück doch ein. >Du benutzt das device, um den Typ auf Maus zu stellen und danach, >für das Schließen, überprüfst Du, ob das device überhaupt geöffnet >werden konnte... Ja, weil ich den "Maus wieder aktivieren" code später hinzugefügt habe musste ich das CloseDevice ans Ende setzten... >PS: benutz doch lieber CreateMsgPort&() statt CreatePort&(NULL&, 0) >das reduziert den code und somit auch potentielle Fehlerquellen. Wo ist der Unterschied? Ich kenne mich noch nicht mit allen Systembefehlen aus. [ - Answer - Quote - Direct link - ] |
2006-07-19, 12:09 h Holger Posts: 8116 User |
Zitat:Die Betonung lag auf konsistent. Zitat:Das befreit Dich nicht davon, ein device nur dann zu nutzen, wenn es vorher erfolgreich geöffnet werden konnte. Zitat:CreateMsgPort&() ist eine exec-Funktion, die seit OS2.0 vorhanden ist. CreatePort&(...) ist eine Hilfsfunktion mit zusätzlichen code, die in C aus der amiga.lib zum Programm gelinkt wird, und in Basic entweder in den includes definiert ist oder auch irgendwie zum Programm gelinkt wird. Eine OS-Funktion aufzurufen macht in jedem Fall Dein Programm kleiner als eine zusätzliche Funktion zu linken. Außerdem spart man, wo keine Parameter sind, auch das Auswerten selbiger. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2006-07-19, 18:18 h MaikG Posts: 5172 User |
>Die Betonung lag auf konsistent. Was heisst das? Beständig? >Das befreit Dich nicht davon, ein device nur dann zu nutzen, wenn >es vorher erfolgreich geöffnet werden konnte. Obwohl das beim Input.device kaum passieren kann, ists jetzt korrekt. Und es lag an Port/PortI, wie konnte ich das Übersehen, stundenlang angesehen sogar in Ausgedruckter form... >CreateMsgPort&() ist eine exec-Funktion, die seit OS2.0 vorhanden >ist. CreatePort&(...) ist eine Hilfsfunktion mit zusätzlichen code, >die in C aus der amiga.lib zum Programm gelinkt wird, und in Basic >entweder in den includes definiert ist oder auch irgendwie zum >Programm gelinkt wird. Ich nehme den Code meistens aus den Beispielen und passe die nur an. Es lag ja nicht an den befehlen sondern am fehlenden I. Danke nochmal. [ - Answer - Quote - Direct link - ] |
2006-07-19, 20:05 h Holger Posts: 8116 User |
Zitat:Wenn Du mal code:und dannIF bla THEN foo ELSE bar END IF code:schreibst, nennt man das inkonsistent.IF bla THEN foo ELSE bar ENDIF Zitat: Na dann spricht ja auch nix dagegen die Beispiele an AOS2.0 oder neuer anzupassen mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2006-07-20, 10:09 h MaikG Posts: 5172 User |
>schreibst, nennt man das inkonsistent. Okay. >Na dann spricht ja auch nix dagegen die Beispiele an AOS2.0 oder >neuer anzupassen Nur Zeitmangel... [ - Answer - Quote - Direct link - ] |
2006-07-20, 12:02 h NoImag Posts: 1050 User |
Zitat: Wir reden hier von insgesamt ca. 30 Zeichen, die du Löschen bzw. Einfügen musst. Tschüß [ - Answer - Quote - Direct link - ] |
2006-07-20, 15:30 h MaikG Posts: 5172 User |
>Wir reden hier von insgesamt ca. 30 Zeichen, die du Löschen bzw. >Einfügen musst. Erstmal müsste ich genau wissen wie, andererseits funktioniert es ja so. [ - Answer - Quote - Direct link - ] |
2006-07-20, 21:55 h NoImag Posts: 1050 User |
Zitat: Du musst CreatePort() durch CreateMsgPort() ersetzen und die Argumente ersatzlos streichen. Du musst DeletePort() durch DeleteMsgPort() ersetzen, das Argument bleibt wie es ist. Außerdem musst du CreateExtIO() durch CreateIORequest() und DeleteExtIO() durch DeleteIORequest() ersetzen. Die Argumente bleiben so wie sie sind. Die neuen Funktionen machen genau dasselbe wie die alten, nur das die alten in amiga.lib definiert sind und die neuen von der exec.library zur Verfügung gestellt werden. Wo der Vorteil liegt, hat Holger ja bereits erklärt. Tschüß [ - Answer - Quote - Direct link - ] |
2006-07-21, 09:47 h MaikG Posts: 5172 User |
Ah, verstehe, das ist das was in der Execsupport steht. Sind die neuen Funktionen denn auch schneller? [ - Answer - Quote - Direct link - ] |
2006-07-21, 12:36 h Holger Posts: 8116 User |
Zitat: Irgendwo unterhalb der Messbarkeitsschwelle, ja. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
First 1 2 3 4 5 -6- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > 2.+3.Joystikknopf Signale | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |