amiga-news 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:
Original von MaikG:
Hast du das beispiel mal in C Compilert? Gibts da ein Hit?


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

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Answer - Quote - Direct link - ]

2006-07-18, 20:24 h

whose
Posts: 2156
User
Zitat:
Original von Holger:
...
z.B.
POKEW(InputIO&+IORequestio_Command%), IND_SETMTYPE&

Gibt es wirklich IND_SETMTYPE& ?
Die anderen Variablen sind alle zwei-byte Integer und ausgerechnet da, wo wirklich zwei byte Integer benötigt wird, ist die Konstante plötzlich vier bytes?


Ja, das macht mich auch etwas stutzig...

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Answer - Quote - Direct link - ]

2006-07-18, 21:28 h

Holger
Posts: 8116
User
Zitat:
Original von MaikG:
basic code:
portI& = CreatePort&(NULL&, NULL&)
IF portI& THEN
InputIO&=CreateExtIO&(port&,IOStdReq_sizeof%)


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:
Original von MaikG:
Wie jetzt, ich rück doch ein.

Die Betonung lag auf konsistent.
Zitat:
Ja, weil ich den "Maus wieder aktivieren" code später hinzugefügt
habe musste ich das CloseDevice ans Ende setzten...

Das befreit Dich nicht davon, ein device nur dann zu nutzen, wenn es vorher erfolgreich geöffnet werden konnte.
Zitat:
>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.

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:
Original von MaikG:
Was heisst das? Beständig?

Wenn Du mal
code:
IF bla THEN
   foo
  ELSE bar
END IF

und dann
code:
IF bla THEN
foo
ELSE bar
ENDIF

schreibst, nennt man das inkonsistent.
Zitat:
Ich nehme den Code meistens aus den Beispielen und passe die nur
an.


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:
Original von MaikG:
>Na dann spricht ja auch nix dagegen die Beispiele an AOS2.0 oder
>neuer anzupassen

Nur Zeitmangel...


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:
Original von MaikG:
Erstmal müsste ich genau wissen wie, andererseits funktioniert
es ja so.


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:
Original von MaikG:
Ah, verstehe, das ist das was in der Execsupport steht.
Sind die neuen Funktionen denn auch schneller?


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