home *** CD-ROM | disk | FTP | other *** search
/ Audio Version 4.94 / audioversion4.94knowledgemediaresourcelibraryoctober1994.iso / amiga / utils / exp_iv / audiohrd.c next >
C/C++ Source or Header  |  1991-05-20  |  5KB  |  199 lines

  1. /* audio_hard.c */
  2. /* access to the audio hardware */
  3.  
  4. /* $Author: Espie $
  5.  * $Date: 91/05/20 22:44:23 $
  6.  * $Revision: 1.24 $
  7.  * $Log:    audio_hard.c,v $
  8.  * Revision 1.24  91/05/20  22:44:23  Espie
  9.  * *** empty log message ***
  10.  * 
  11.  * Revision 1.23  91/05/16  15:04:17  Espie
  12.  * Modified stuff for more compatibility with other compilers.
  13.  * 
  14.  * Revision 1.22  91/05/12  22:38:42  Espie
  15.  * Included right prototypes.
  16.  *
  17.  * Revision 1.21  91/05/05  19:06:56  Espie
  18.  * *** empty log message ***
  19.  *
  20.  * Revision 1.20  91/05/05  15:39:36  Espie
  21.  * Got rid of local variables. Enforcer hits free.
  22.  *
  23.  * Revision 1.19  91/05/02  23:32:37  Espie
  24.  * *** empty log message ***
  25.  *
  26.  * Revision 1.18  91/04/30  00:36:12  Espie
  27.  * Stable version III.
  28.  *
  29.  * Revision 1.17  91/04/29  15:07:15  Espie
  30.  * Cleaned-up.
  31.  *
  32.  * Revision 1.16  91/04/27  20:48:06  Espie
  33.  * Doesn't need to suppress the interrupts, finally.
  34.  *
  35.  * Revision 1.15  91/04/27  16:44:04  Espie
  36.  * Moved interrupts disabling from audio_soft.
  37.  *
  38.  * Revision 1.14  91/04/27  04:00:22  Espie
  39.  * saved the mask for a channel (gain ????).
  40.  *
  41.  * Revision 1.13  91/04/26  16:30:11  Espie
  42.  * added turn_on_dma().
  43.  * between() is now obsolescent.
  44.  *
  45.  * Revision 1.12  91/04/26  01:29:45  Espie
  46.  * Fixed trivial bug with filter_restore()
  47.  * (was restoring the OPPOSITE state).
  48.  *
  49.  * Revision 1.11  91/04/25  02:06:30  Espie
  50.  * There was a bug with the filter on command.
  51.  * There is now a bug with the automatic recovery
  52.  * of the filter state. Doesn't work as it should.
  53.  *
  54.  * Revision 1.10  91/04/23  21:32:44  Espie
  55.  * New function: restart_dma().
  56.  *
  57.  * Revision 1.1  91/04/23  21:31:43  Espie
  58.  * Initial revision
  59.  *
  60.  * Revision 1.9  91/04/21  12:10:58  Espie
  61.  * Stable version, known as bunch II.
  62.  * Also features ``right'' log description.
  63.  *
  64.  * Revision 1.8  91/04/21  11:16:01  Espie
  65.  *
  66.  * Revision 1.7  91/04/20  18:14:34  Espie
  67.  * New audio routines, they do only what they have to do.
  68.  * Symbolic constants everywhere.
  69.  * Added audio filter control.
  70.  *
  71.  * Revision 1.6  91/04/19  13:22:32  Espie
  72.  *
  73.  * Revision 1.5  91/04/19  02:18:00  Espie
  74.  * simplified audio.c, since we can change period/volume on the run
  75.  * without more care.
  76.  *
  77.  * Revision 1.4  91/04/18  20:23:07  Espie
  78.  * no big change in this file.
  79.  *
  80.  * Revision 1.3  91/04/18  02:26:00  Espie
  81.  * bunch I.
  82.  * Revision 1.2  91/04/18  02:18:25  Espie
  83.  * First ``real'' interface with the hardware.
  84.  *
  85.  * Revision 1.1  91/04/17  18:51:36 Espie
  86.  * Initial revision
  87.  *
  88.  */
  89.  
  90. #include <exec/types.h>
  91. #include <hardware/custom.h>
  92. #include <hardware/cia.h>
  93. #include <hardware/intbits.h>
  94. #include <hardware/dmabits.h>
  95. #include <dos/dos.h>
  96. #include <custom/cleanup.h>
  97. #include "song.h"
  98. #include "player.h"
  99. #include "proto.h"
  100. #include "lproto.h"
  101.  
  102. BOOL saved_filter;
  103.  
  104. #ifdef LATTICE
  105. #define FAR_SUPPORT __far
  106. #else
  107. #error
  108. #endif
  109. extern volatile struct Custom FAR_SUPPORT custom;
  110. extern volatile struct CIA FAR_SUPPORT ciaa;
  111.  
  112. void init_audio_hard(struct priv_play *private)
  113.         {
  114.                 private->channel_mask[0] = DMAF_AUD0;
  115.                 private->channel_mask[1] = DMAF_AUD1;
  116.                 private->channel_mask[2] = DMAF_AUD2;
  117.                 private->channel_mask[3] = DMAF_AUD3;
  118.                 private->mask = 0;
  119.         }
  120.  
  121. void clear_mask(struct priv_play *private)
  122.         {
  123.                 private->mask = 0;
  124.         }
  125.  
  126. void turn_on_dma(struct priv_play *private)
  127.         {
  128.                 custom.dmacon = private->mask | DMAF_SETCLR | DMAF_MASTER;
  129.         }
  130.  
  131. void set_note(struct priv_play *private,
  132.                 struct sample_info *i, int channel, int period)
  133.         {
  134.                 custom.dmacon = private->channel_mask[channel];
  135.                 private->mask |= private->channel_mask[channel];
  136.                 custom.aud[channel].ac_ptr = i->start;
  137.                 custom.aud[channel].ac_len = i->length;
  138.                 custom.aud[channel].ac_per = period;
  139.         }
  140.  
  141. void change_volume(struct priv_play *private, int channel, int volume)
  142.         {
  143.                 custom.aud[channel].ac_vol = volume;
  144.         }
  145.  
  146. void change_period(struct priv_play *private, int channel, int period)
  147.         {
  148.                 custom.aud[channel].ac_per = period;
  149.         }
  150.  
  151. void set_replay(struct priv_play *private, struct sample_info *i, int channel)
  152.         {
  153.                 private->mask |= private->channel_mask[channel];
  154.                 custom.aud[channel].ac_ptr = i->rp_start;
  155.                 custom.aud[channel].ac_len = i->rp_length;
  156.         }
  157.  
  158. void reset_audio(void)
  159.         {
  160.                 custom.aud[0].ac_vol = 0;
  161.                 custom.aud[1].ac_vol = 0;
  162.                 custom.aud[2].ac_vol = 0;
  163.                 custom.aud[3].ac_vol = 0;
  164.                         /* turn off every channel and audio dma */
  165.                 custom.dmacon = DMAF_AUDIO;
  166.         }
  167.  
  168. /***
  169.  *
  170.  *              Management of the audio filter
  171.  *
  172.  ***/
  173.  
  174. /* The LED and the filter are driven by the same bit
  175.  */
  176.  
  177. void save_filter(void)
  178.         {
  179.                 saved_filter = ciaa.ciapra & CIAF_LED;
  180.         }
  181.  
  182. void restore_filter(void)
  183.         {
  184.                 if (saved_filter)
  185.                         filter_off();
  186.                 else
  187.                         filter_on();
  188.         }
  189.  
  190. void filter_on(void)
  191.         {
  192.                 ciaa.ciapra &= ~CIAF_LED;
  193.         }
  194.  
  195. void filter_off(void)
  196.         {
  197.                 ciaa.ciapra |= CIAF_LED;
  198.         }
  199.