home *** CD-ROM | disk | FTP | other *** search
/ Audio Version 4.94 / audioversion4.94knowledgemediaresourcelibraryoctober1994.iso / amiga / utils / exp_iv / dump.c < prev    next >
C/C++ Source or Header  |  1991-05-16  |  10KB  |  376 lines

  1. /* dump.c */
  2.  
  3. /* try out for the ``play routines''
  4.  */
  5.  
  6.  
  7. /* $Author: Espie $
  8.  * $Date: 91/05/16 15:04:51 $
  9.  * $Revision: 1.48 $
  10.  * $Log:    dump.c,v $
  11.  * Revision 1.48  91/05/16  15:04:51  Espie
  12.  * *** empty log message ***
  13.  * 
  14.  * Revision 1.47  91/05/12  19:57:22  Espie
  15.  * Corrected the loader's logic.
  16.  * Change of behavior: release the audio.device briefly when
  17.  * changing songs. That looks better after all (mixing albums, for
  18.  * instance).
  19.  * 
  20.  * Revision 1.46  91/05/12  15:56:25  Espie
  21.  * Tried to correct some snapshot problem, plus some more cleanup.
  22.  * 
  23.  * Revision 1.45  91/05/11  14:57:44  Espie
  24.  * *** empty log message ***
  25.  * 
  26.  * Revision 1.44  91/05/10  00:02:56  Espie
  27.  * Added albums, moved all iterator stuff to files.c
  28.  * 
  29.  * Revision 1.43  91/05/09  17:34:37  Espie
  30.  * Support for wb icons added, more coherent song loading.
  31.  * Default and specialized options added.
  32.  * 
  33.  * Revision 1.42  91/05/08  18:34:52  Espie
  34.  * 
  35.  * Details changed.
  36.  * 
  37.  * Revision 1.41  91/05/08  15:50:12  Espie
  38.  * Moved wb stuff to files.c (new iterator project...).
  39.  * 
  40.  * Revision 1.40  91/05/07  02:53:02  Espie
  41.  * Reads the cli defaults in player.config now.
  42.  * 
  43.  * Revision 1.39  91/05/06  23:33:08  Espie
  44.  * Added more workbench support,
  45.  * now supports tooltypes.
  46.  * The new requester call gives back a WBArg-like
  47.  * answer, everything gets simpler and simpler...
  48.  * 
  49.  * Revision 1.38  91/05/05  19:05:57  Espie
  50.  * *** empty log message ***
  51.  * 
  52.  * Revision 1.37  91/05/05  15:37:45  Espie
  53.  * Separated the play structure into a private/public parts...
  54.  * More to come !
  55.  * 
  56.  * Revision 1.36  91/05/05  04:00:21  Espie
  57.  * Added some support for workbench arguments.
  58.  * 
  59.  * Revision 1.35  91/05/03  02:48:39  Espie
  60.  * *** empty log message ***
  61.  * 
  62.  * Revision 1.34  91/05/02  23:32:02  Espie
  63.  * Simpler, more functional.
  64.  * 
  65.  * Revision 1.33  91/05/02  11:17:56  Espie
  66.  * Simplified again !
  67.  * Added test for loaded song, so that we don't request the audio hw for nothing.
  68.  * Added lockout to prevent loading two songs at once.
  69.  * Should ideally put a queue there, and handle wbargs for multiselects...
  70.  * 
  71.  * Revision 1.32  91/05/02  01:28:40  Espie
  72.  * Dump is simpler than ever !
  73.  * Does not try to handle the number of replays correctly...
  74.  * 
  75.  * Revision 1.31  91/05/01  00:50:06  Espie
  76.  * Small bug fix: display->new_title.
  77.  * 
  78.  * Revision 1.30  91/04/30  16:51:35  Espie
  79.  * New interface for changing titles (new titles erases the old one).
  80.  * Suppressed every IO.
  81.  * 
  82.  * Revision 1.29  91/04/30  01:48:35  Espie
  83.  * Cleaned up a bit what is still alive :-).
  84.  * 
  85.  * Revision 1.28  91/04/30  00:36:22  Espie
  86.  * Stable version III.
  87.  * 
  88.  * Revision 1.27  91/04/30  00:23:11  Espie
  89.  * Added more control for the file requester (now works from workbench).
  90.  * 
  91.  * Revision 1.26  91/04/29  23:53:28  Espie
  92.  * New loader ``on the fly''.
  93.  * Now, load.c needs some modifications.
  94.  * 
  95.  * Revision 1.25  91/04/29  15:05:58  Espie
  96.  * ...still vanishing !
  97.  * 
  98.  * Revision 1.24  91/04/29  13:03:43  Espie
  99.  * Interfaced to new audio_soft.
  100.  * 
  101.  * Revision 1.23  91/04/29  03:53:13  Espie
  102.  * Vanishing program.
  103.  * 
  104.  * Revision 1.22  91/04/29  02:21:53  Espie
  105.  * First attempt at an interface.
  106.  * 
  107.  * Revision 1.21  91/04/28  22:53:05  Espie
  108.  * transpose added.
  109.  * 
  110.  * Revision 1.20  91/04/28  20:35:26  Espie
  111.  * Small bug corrected (reset tempo at start of piece).
  112.  * Looks more and more like a kludge, real player coming soon.
  113.  * 
  114.  * Revision 1.19  91/04/27  20:48:53  Espie
  115.  * *** empty log message ***
  116.  * 
  117.  * Revision 1.18  91/04/27  16:45:38  Espie
  118.  * Added crude priority control for tests.
  119.  * 
  120.  * Revision 1.17  91/04/27  04:02:16  Espie
  121.  * Added auto-timing code, suppressed fastest speed
  122.  * --> need to get more control on the speed
  123.  * (one timing for the new_notes, another for the effects).
  124.  * 
  125.  * Revision 1.16  91/04/27  00:25:47  Espie
  126.  * *** empty log message ***
  127.  * 
  128.  * Revision 1.15  91/04/26  16:29:54  Espie
  129.  * See interrupt.c for changes indication.
  130.  * 
  131.  * Revision 1.14  91/04/24  16:10:19  Espie
  132.  * Small changes, (missed a goto loop...)
  133.  * 
  134.  * Revision 1.13  91/04/24  15:24:58  Espie
  135.  * Now dump works with lots of signal: from audio_soft, the player and the user.
  136.  * Will write a real interface soon.
  137.  * 
  138.  * Revision 1.12  91/04/24  13:58:01  Espie
  139.  * Added automatic version check.
  140.  * 
  141.  * Revision 1.11  91/04/23  21:27:58  Espie
  142.  * Almost completely new logic. Demonstrates most commands of play.c,
  143.  * uses new interrupts.
  144.  * 
  145.  * Revision 1.10  91/04/21  20:05:09  Espie
  146.  * *** empty log message ***
  147.  * 
  148.  * Revision 1.9  91/04/21  12:11:35  Espie
  149.  * Stable version, known as bunch II.
  150.  * Also features ``right'' log description.
  151.  * 
  152.  * Revision 1.8  91/04/21  11:15:30  Espie
  153.  * Added more comprehensive command line options 1/2:-)
  154.  *
  155.  * Revision 1.7  91/04/20  18:14:19  Espie
  156.  *
  157.  * Revision 1.6  91/04/19  13:21:56  Espie
  158.  * Prototype for a real player, which waits for events,
  159.  * and processes them.
  160.  *
  161.  * Revision 1.5  91/04/19  02:19:44  Espie
  162.  * Simplified dump. Plays, and wait for ^C/^D.
  163.  *
  164.  * Revision 1.4  91/04/18  20:22:44  Espie
  165.  * no big change in this file.
  166.  *
  167.  * Revision 1.3  91/04/18  02:25:51  Espie
  168.  * bunch I.
  169.  *
  170.  * Revision 1.2  91/04/18  02:17:54  Espie
  171.  * this version plays a module.
  172.  * No commands implemented, just notes.
  173.  * No interrupts, just sequence.
  174.  *
  175.  * Revision 1.1  91/04/17  18:51:13  Espie
  176.  * Initial revision
  177.  *
  178.  */
  179.  
  180. #include <exec/types.h>
  181. #include <dos/dos.h>
  182. #include <workbench/startup.h>
  183. #include <workbench/workbench.h>
  184. #include <string.h>
  185. #include <stddef.h>
  186. #include <custom/cleanup.h>
  187. #include <proto/exec.h>
  188. #include <proto/icon.h>
  189. #include <stdio.h>
  190.  
  191. #include "song.h"
  192. #include "public_play.h"
  193. #include "proto.h"
  194.  
  195. LONG _Stack = 4000;
  196. char *_procname = "Experiment IV player";
  197. LONG _priority = 0;
  198. LONG _BackGroundIO = 0;
  199.  
  200.  
  201. struct pub_play *play;
  202.  
  203. #define tstclr(mask, val) ( (mask) & (val) ? ( (mask) &= ~(val), TRUE) : FALSE)
  204.  
  205. /* quick and dirty... */
  206.  
  207. struct song *the_song;
  208.  
  209. int counter;
  210.  
  211.  
  212. struct iterator *it;
  213.  
  214. /* to wade through several identifiers at once */
  215.  
  216. char *get_song_args(BOOL req)
  217.     {
  218.     char *result;
  219.         while ((result = next_song(&it, req)) && is_info(result));
  220.         return result;
  221.     }
  222.     
  223. int def_volume, def_transpose, def_speed, def_mode, def_repeat;
  224.  
  225. char *mode_names[] = { "STD", "OLD", "NEW", NULL};
  226. char *speed_names[] = {"PAL", "NTSC", "FAST", "SCAN", "SLOW", "NULL"};
  227. char *file_names[] = {"UNKNOWN", "ALBUM"};
  228.  
  229. LOCAL void setup_the_song(struct song *new)
  230.     {
  231.         song_available(FALSE);
  232.         unload_song(the_song);
  233.         the_song = new;
  234.         if (new)
  235.             {
  236.                 new_title(0, the_song->info->length, the_song->title);
  237.                 setup_song(new);
  238.                 song_available(TRUE);
  239.             }
  240.         else
  241.             no_title();
  242.     }
  243.  
  244. LOCAL void change_song(char *arg, struct song *new)
  245.     {
  246.     char **tools;
  247.     int speed, mode, transpose /*, volume, repeat */;
  248.         tools = grab_tooltypes(it, arg);
  249. /*        volume = get_arg(tools, "VOLUME", def_volume);
  250.  */
  251.         speed = map_arg(tools, "SPEED", speed_names, def_speed);
  252.         mode = map_arg(tools, "MODE", mode_names, def_mode);
  253.         transpose = get_arg(tools, "TRANSPOSE", def_transpose);
  254. /*        repeat = get_arg(tools, "REPEAT", def_repeat);
  255.  */
  256.             /* modified repeat to def_repeat there */
  257.         play->oneshot = def_repeat == 1;
  258.         counter = def_repeat;
  259.         play->signaled &= ~ON_END;
  260. /*        pref_volume(volume);
  261.  */
  262.         pref_speed(speed);
  263.         pref_mode(mode);
  264.         play->transpose = transpose;
  265.         (void)safe_unload_song();
  266.         setup_the_song(new);
  267.         launch_play(0);
  268.     }
  269.  
  270.     
  271. BOOL safe_unload_song(void)
  272.     {
  273.         if (the_song)
  274.             {
  275.                 setup_the_song(NULL);
  276.                 return TRUE;
  277.             }
  278.         else
  279.             return FALSE;
  280.     }
  281.     
  282. BOOL safe_load_song(char *arg)
  283.     {
  284.     struct song *new;    
  285.         new = load_song(arg);
  286.         if (new)
  287.             change_song(arg, new);
  288.         else
  289.             {
  290.                 if (load_error() < 0 && the_song)
  291.                     {
  292.                         safe_unload_song();
  293.                         new = load_song(arg);
  294.                         if (new)
  295.                             change_song(arg, new);
  296.                         else        
  297.                             return FALSE;
  298.                     }
  299.                 else
  300.                     return FALSE;
  301.             }
  302.         return TRUE;
  303.     }
  304.     
  305. main(int argc, char *argv[])
  306.     {
  307.     int pri, xoffset, yoffset;
  308.     char *arg;
  309.         SetUpCleanUp(NIL);
  310.         open_libraries();
  311.         onbreak(nobreak);
  312.         it = setup_arguments(argc, argv);
  313.         
  314.         pri = do_get_arg("PRIORITY", 0);
  315.         def_repeat = do_get_arg("REPEAT", 0);
  316.         xoffset = do_get_arg("X", 0);
  317.         yoffset = do_get_arg("Y", 1);
  318.         def_volume = do_get_arg("VOLUME", 100);
  319.         def_transpose = do_get_arg("TRANSPOSE", 0);
  320.         def_speed = do_map_arg("SPEED", speed_names, 0);
  321.         def_mode = do_map_arg("MODE", mode_names, 0);        
  322.         play = init_events(pri, xoffset, yoffset);
  323.         pref_volume(def_volume);
  324.         pref_speed(def_speed);
  325.         pref_mode(def_mode);
  326.         play->transpose = def_transpose;
  327.         while (arg = get_song_args(FALSE))
  328.             if (safe_load_song(arg))
  329.                 break;
  330.         play->on_signal = ON_END|ON_COMMAND|ON_PATTERN|ON_PROBLEM|ON_BLIP;
  331.         
  332.         forever
  333.             wait_abort();
  334.     }
  335.  
  336. /* due to the file requester and check_abort, 
  337.  * we might just invoke try_change_song() recursively.
  338.  * lock_out insures that one invocation only can succeed.
  339.  */
  340.  
  341.              
  342. void try_change_song(void)
  343.     {
  344.     static BOOL lock_out = FALSE;
  345.     char *arg;
  346.         if (lock_out)
  347.             return;
  348.         lock_out = TRUE;
  349.         do {
  350.             if (!(arg = get_song_args(TRUE)))
  351.                 break;
  352.             } while (!safe_load_song(arg));    
  353.         lock_out = FALSE;
  354.     }    
  355.  
  356.  
  357. void add_some_songs(struct AppMessage *msg)
  358.     {
  359.         insert_args(&it, msg);
  360.         try_change_song();
  361.     }
  362.     
  363. void handle_player()
  364.     {
  365.         if (counter == 1)
  366.             play->oneshot = TRUE;
  367.         if tstclr(play->signaled, ON_PATTERN)
  368.             update_title(play->pattern, the_song->info->length, the_song->title);
  369.         if (tstclr(play->signaled, ON_END))
  370.             {
  371.                 counter--;
  372.                 if (counter == 0)
  373.                     try_change_song();
  374.             }
  375.     }
  376.