home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 3 / CD_Magazyn_EXEC_nr_3.iso / Recent / game / wb / Klotz.lha / Klotz / src / AudioUtils.asm < prev    next >
Assembly Source File  |  1998-02-18  |  6KB  |  319 lines

  1. *
  2. * $VER: AudioUtils.asm    0.2 (4.1.97) BeginIO mit Quick-Flag
  3. *            0.1 (1.1.97)
  4. *            0.0 (30.12.96)
  5. *
  6. *
  7. * introducing AUDIO PRO SFX to your AMIGA system
  8. *
  9.  include "exec/errors.i"
  10. * include "exec/execbase.i"
  11. ex_EClockFrequency  equ 568
  12.  include "devices/audio.i"
  13.  loc.l AudioPort
  14.  loc.l AudioIO
  15.  loc.l AudioClock
  16.  loc.l AudioPool
  17.  
  18.  
  19. *Notes       dc.b "ABHC1D2EF3G4abhc5d6ef7g8",0
  20. AudioName dc.b "audio.device",0
  21.     even
  22. InitAudio
  23.     push    a6
  24.     CSYS    CreateMsgPort
  25.     tst.l    d0
  26.     beq    .whatthefk
  27.  
  28.     reloc.l d0,AudioPort
  29.     move.l    d0,a0
  30.     moveq    #ioa_SIZEOF,d0
  31.     CALL    CreateIORequest
  32.     tst.l    d0
  33.     beq    .whatthefk
  34.     reloc.l  d0,AudioIO
  35.     move.l    d0,a1
  36. *     move.b  #NT_UNKNOWN,LN_TYPE(a1)
  37.     lea    AudioName(pc),a0
  38.     moveq    #0,d0
  39.     move.l    d0,d1
  40.     CALL    OpenDevice
  41.     tst.l    d0
  42.     beq    .ok
  43.     cmpi.l    #IOERR_OPENFAIL,d0
  44.     beq    .whatthefk
  45. .ok
  46.     move.l    ex_EClockFrequency(a6),d0
  47.     move.l    d0,d1
  48.     add.l    d0,d0
  49.     add.l    d0,d0
  50.     add.l    d1,d0
  51. *     addq.l  #1,d0
  52. *     lsr.l     #1,d0
  53.     reloc.l d0,AudioClock            ; Fünffache des EClock-Takts ( Hälfte des System-Takts)
  54. *     move.l  d0,-(sp)
  55. *     bsr     LongOut
  56. ; Init memory pool for samples
  57.     moveq    #MEMF_CHIP!MEMF_PUBLIC,d0
  58.     move.l    #8000,d1
  59.     move.l    d1,d2
  60.     CALL    CreatePool
  61.     tst.l    d0
  62.     beq    .whatthefk
  63.     reloc.l d0,AudioPool
  64.     moveq    #0,d0
  65. .exit
  66.     pop    a6
  67.     rts
  68. .whatthefk
  69.     moveq    #-1,d0
  70.     bra    .exit
  71.  
  72. ExitAudio
  73.     push    a2/a6
  74.     copy.l    AudioPool,d0
  75.     beq    .freeio
  76.     move.l    d0,a0
  77.     CSYS    DeletePool
  78. .freeio
  79.     copy.l    AudioIO,a2
  80.     move.l    a2,d0
  81.     beq    .freeport
  82. *     move.l  a2,a1        Fatal, wenn nicht benutzt
  83. *     CSYS     CheckIO
  84. *     tst.l     d0
  85. *     bne     .ok
  86. *     move.l  a2,a1
  87. *     CALL     AbortIO
  88. *     move.l  a2,a1
  89. *     CALL     WaitIO
  90. *.loop     copy.l  AudioPort,a0
  91. *     CALL     GetMsg
  92. *     tst.l     d0
  93. *     beq     .ok
  94. *     move.l  d0,a1
  95. *     CALL     ReplyMsg
  96. *     bra     .loop
  97. .ok
  98.     move.l    a2,a1
  99.     CALL    CloseDevice
  100.     move.l    a2,a0
  101.     CALL    DeleteIORequest
  102. .freeport
  103.     copy.l    AudioPort,a0
  104.     CSYS    DeleteMsgPort
  105.     pop    a2/a6
  106.     rts
  107. LoadSample:
  108. ; => a0 : Name
  109. ;    a1 : ^ struct smp
  110. ; 8-bit signed roh-Daten
  111.     push    d2-d4/a2/a3/a6
  112.     move.l    a1,a3
  113.     move.l    a0,d1
  114.     move.l    #MODE_OLDFILE,d2
  115.     CDOS    Open
  116.     tst.l    d0
  117.     beq    .nofile
  118.     move.l    d0,d4
  119. ; Länge bestimmen
  120.     move.l    d0,d1
  121.     moveq    #0,d2
  122.     move.l    #OFFSET_END,d3
  123.     CALL    Seek
  124.     move.l    d4,d1
  125.     move.l    #OFFSET_BEGINNING,d3
  126.     CALL    Seek
  127.     move.l    d0,smp_Length(a3)
  128.     move.l    d0,d3
  129.     copy.l    AudioPool,a0
  130.     CSYS    AllocPooled
  131.     tst.l    d0
  132.     beq    .nomem
  133.     move.l    d0,smp_Data(a3)
  134.     move.w    #$100,smp_Period(a3)
  135.     move.l    d0,d2
  136.     move.l    d4,d1
  137.     CDOS    Read
  138.     bsr    .CheckIFF
  139. .nomem
  140.     move.l    d4,d1
  141.     CDOS    Close
  142. .nofile
  143.     CALL    IoErr
  144.     pop    d2-d4/a2/a3/a6
  145.     rts
  146. .CheckIFF
  147. ; => a3: ^ struct smp
  148.     move.l  smp_Data(a3),a0
  149.     move.l  smp_Length(a3),d3
  150.     cmpi.l  #'VHDR',12(a0)
  151.     bne     .fertig
  152.     cmpi.w  #$0100,34(a0)           ; one octave, no compression
  153.     bne     .searchbody
  154.     moveq   #0,d1
  155.     move.l  20(a0),d0               ; OneShotHiSamples
  156.     bne     .ok
  157.     move.l  24(a0),d0               ; repeatHiSamples ( falls mit Loop )
  158. .ok
  159.     move.l  d0,smp_Length(a3)
  160.     move.w  32(a0),d1               ; SamplesPerSec
  161.     copy.l  AudioClock,d0
  162.     bsr     LDiv
  163.     move.w  d0,smp_Period(a3)
  164. .searchbody                ; man könnte Chunk-Struktur ausnutzen
  165.     move.l  smp_Data(a3),a0
  166.     lea     40(a0),a0
  167.     lsr.l   #1,d3
  168. .loop
  169.     cmpi.w  #'BO',(a0)+
  170.     beq     .maybe
  171.     dbra    d3,.loop
  172.     bra     .fertig
  173. .maybe
  174.     cmpi.w  #'DY',(a0)+
  175.     bne     .loop
  176.     lea     4(a0),a0
  177.     move.l  a0,smp_Data(a3)
  178. .fertig
  179.     rts
  180.  ifne 0
  181. FreqDurToPerCyc
  182.  rts
  183. NoteToPer
  184. ; =>    d0 : Note
  185. ;    d1 : SampleLänge
  186. ; braucht FixedMath
  187.     lea    Notes(pc),a0
  188.     moveq    #-1,d7
  189. .loop
  190.     addq.w    #1,d7
  191.     move.b    (a0)+,d1
  192.     beq    .nomatch
  193.     cmp.b    d1,d0
  194.     bne    .loop
  195. .nomatch
  196. .weiter
  197.     move.l    d7,d1
  198.     moveq    #110,d2
  199.     add.w    d2,d2
  200.     add.w    d2,d2
  201.     add.w    d2,d2
  202.     cmpi.w    #12,d1
  203.     blt    .lower
  204.     add.w    d2,d2
  205.     subi.w    #12,d1
  206. .lower
  207.     move.l    #$00010f39,d0 ; 12te Wurzel aus Zwo
  208.     bsr    FixedPow
  209.     move.l    d2,d1
  210.     swap    d1
  211.     bsr    FixedMul      ; Frequenz
  212. ; Period=Clock/(samplesize*frequency)
  213. ;  ...
  214.  endc
  215. channelsR dc.b 2,4,1,8
  216. *channelsL dc.b 1,8,2,4
  217.  
  218. ; DOES NOT SAVE A6 !!!( 3 hs of debugging ... )
  219. BEGIN_IO macro
  220.     move.l    IO_DEVICE(a1),a6
  221.     jsr    -30(a6)
  222.     endm
  223. ClearIO
  224. ; => a2 : IORequest
  225. ; <= a6 : SysBase
  226.     push    d2
  227.     move.l    a2,a1
  228.     CSYS    CheckIO         Ton noch an ?
  229.     bne    .ok
  230.     move.l    a2,a1
  231.     CALL    AbortIO
  232.     move.l    a2,a1
  233.     CALL    WaitIO
  234.     moveq    #0,d0
  235.     moveq    #0,d1
  236.     CALL    SetSignal        ; ist Audiosignal noch gesetzt ?
  237.     copy.l    AudioPort,a0
  238.     move.b    MP_SIGBIT(a0),d1
  239.     moveq    #1,d2
  240.     lsl.l    d1,d2
  241.     or.l    d2,d0
  242.     beq    .ok            ; Signal löschen
  243.     move.l    d2,d0
  244.     CALL    Wait
  245.     copy.l    AudioPort,a0
  246.     CALL    GetMsg
  247. .ok
  248.     pop    d2
  249.     rts
  250. PlayAudio
  251. ; => a0 : ^struct Smp
  252. ;
  253.     tst.l    smp_Length(a0)
  254.     beq    .goodbye
  255.  
  256.     push    a2/a3/a6
  257.     link    a5,#0
  258.     move.l    a0,a3
  259. ;    Sound Kanal kriegen ...
  260.     lea    channelsR(pc),a0
  261. *jump_in
  262.     copy.l    AudioIO,a2
  263.     tst.l    IO_UNIT(a2)
  264.     bne    .sound
  265.  
  266.     move.l    a2,a1
  267.     move.w    #ADCMD_ALLOCATE,IO_COMMAND(a1)
  268.     move.b    #ADIOF_NOWAIT!IOF_QUICK,IO_FLAGS(a1)
  269.     move.b    #30,LN_PRI(a1)
  270.     moveq    #4,d0
  271.     move.l    a0,ioa_Data(a1)
  272.     move.l    d0,ioa_Length(a1)
  273.     BEGIN_IO
  274.     move.l    a2,a1
  275.     CSYS    WaitIO
  276.     tst.l    IO_UNIT(a2)
  277.     bne    .sound
  278. .bye
  279.     unlk    a5
  280.     pop    a2/a3/a6
  281. .goodbye
  282.     rts
  283. .sound
  284.     bsr    ClearIO
  285.     move.l    a2,a1
  286.     move.w    #CMD_WRITE,IO_COMMAND(a1)
  287.     move.b    #ADIOF_PERVOL,IO_FLAGS(a1)
  288.     move.l    smp_Data(a3),ioa_Data(a1)
  289.     move.l    smp_Length(a3),ioa_Length(a1)
  290.     moveq    #32,d0
  291.     move.w    d0,ioa_Volume(a1)
  292.     moveq    #1,d0
  293.     move.w    d0,ioa_Cycles(a1)
  294.     move.w    smp_Period(a3),ioa_Period(a1)
  295.     BEGIN_IO
  296. *     move.l  a2,a1
  297. *     CSYS     WaitIO
  298.     bra    .bye
  299. FreeAudio
  300.     push    a0-a2/d0-d1/a6
  301.     copy.l    AudioIO,a2
  302.     tst.l    IO_UNIT(a2)
  303.     beq    .exit
  304. *     copy.l  AudioPort,a0
  305. *     CSYS     WaitPort
  306.     bsr    ClearIO
  307.     copy.l    AudioPort,a0
  308.     CALL    GetMsg
  309.  
  310.     move.l    a2,a1
  311.     move.w    #ADCMD_FREE,IO_COMMAND(a1)
  312. *     BEGIN_IO
  313. *     move.l  a2,a1
  314. *     CSYS     WaitIO
  315.     CALL    DoIO
  316. .exit
  317.     pop    a0-a2/d0-d1/a6
  318.     rts
  319.