home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / MIDNIGHT.LZH / MIDNIGHT / SOURCE / SOUND.C < prev    next >
C/C++ Source or Header  |  1993-02-06  |  5KB  |  166 lines

  1.  
  2. #include <vdi.h>
  3. #include <tos.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <portab.h>
  8.  
  9. #include "midnight.h"    /* ACC_str + MOD_str + defines für Module + ACC */
  10.  
  11. extern MOD_str    MOD_struct;
  12. #define Ms MOD_struct
  13.  
  14. Value    Values[3]=
  15.     {    T_EDIT,0,60000L,"Frequenz (0=INF nehmen)",
  16.         T_BUTTON,0,(long)"DMA-Format","\0",
  17.         T_TITEL|T_END,0,0,"V1.1, HzN 1.93 (Dudeldi)"
  18.     };
  19.  
  20. Value    *Value_s = Values;        /* zeigt auf eine Liste von Pointern    */
  21.  
  22.  
  23. /*
  24.     GRUNDLEGENDES !
  25.     Da die Module ab und zu einmal aufgerufen werden und eben nicht 
  26.     kontinuierlich die Kontrolle über die Register haben, kann es bei
  27.     Benutzung einer Variablen über mehrere Programmteile (M_INIT,M_SWITCH...)
  28.     zu Problemen kommen, da ja inzwischen wieder 'Sonstwer' in den Registern
  29.     'rumgespielt hat. Deshalb sind solche Variablen als 'static' zu deklarieren,
  30.     im Notfall (wenn's nicht klappt) auch als Volatile.
  31.     Sicher ist sicher...
  32. */
  33.  
  34.  
  35.  
  36. int        pxy[10];
  37. volatile static int handle;        /* darf nicht im Register stehn            */
  38.  
  39. void pop_note( int x,int y,int w );
  40.  
  41.  
  42. ULONG MOD_main( int Mode, ACC_str *As )
  43. {
  44.     int        dim,y;
  45.     long    x,length;
  46.     static    UBYTE *snd= NULL;
  47.     static    SND_str krach = { NULL,NULL,NULL,7000,0x0000 };
  48.     int        file;
  49.     char    stri[100];
  50.  
  51.     switch( Mode )
  52.     {    case M_INIT:
  53.             MOD_struct.U.b = 0x003f;
  54.             v_opnvwk( As->work_in,&handle,As->work_out );
  55.             if( !handle ) return( 0 );    /* Workstation öffnen, wenn's geht    */
  56.             dim= strlen(MOD_struct.MyName);    /* Eigenen Namen bearbeiten        */
  57.             strcpy( &MOD_struct.MyName[dim-3],"INF" );    /* und zu INF machen*/
  58.             file= Fopen( MOD_struct.MyName,0 );    /* INF Datei öffnen            */
  59.             if( file<0 ) return( 0 );
  60.             dim= Fread( file,99,stri );            /* und einlesen                */
  61.             Fclose( file );
  62.             if( dim<0 ) return( 0 );            /* das ging daneben            */
  63.  
  64.             x= atoi(stri);                        /* Am Anfang stehen die Hz    */
  65.             if( x<20 ) x= 7000;                    /* 7000Hz, wenn Wert < 20Hz    */
  66.  
  67.             if( Ms.Werte[1] ) krach.SND_repeat|=0x8000L;
  68.                                                 /* DMA-Abspielformat setzen    */
  69.  
  70.             if( Ms.Werte[0] ) x= Ms.Werte[0];    /* Vorgegebene Frequenz ?    */
  71.             krach.SND_Hz= x;
  72.  
  73.             x=0;
  74.             if( *stri!=' ' )                    /* Anfang des Pfades suchen    */
  75.             {    for( x=0;stri[x] && (stri[x]!=' ');x++ );
  76.                 x++;
  77.             }
  78.             stri[dim]='\0';
  79.             file= Fopen( stri+x,0 );            /* Der Rest ist der Pfad    */
  80.             if( file<0 ) return( 0 );            /* einer SND Datei: öffnen    */
  81.  
  82.             length= Fseek( 0,file,2 );            /* Dateilänge ermitteln        */
  83.             Fseek( 0,file,0 );
  84.  
  85.                     /* Da der Speicherbereich für einen Sound, der über    */
  86.                     /* DMA abgespielt werden soll (ab STE), im ST-RAM    */
  87.                     /* liegen MUSS (!), wird hier auf Mxalloc geprüft.    */
  88.             x= krach.SND_Hz;
  89.  
  90.                     /* wenn DMA-Fraquenz gewählt und Mxalloc vorhanden:    */
  91.             if( ((x==6258L) || (x==12517L) || (x==25033L) || (x==50066L)) &&
  92.                 ( Mxalloc(-1,0) != -32L ) )
  93.             {    snd= (UBYTE*)Mxalloc( length,0 );    /* Mxalloc existiert.    */
  94.                 if( !snd )                            /* Wenn kein ST-RAM da,    */
  95.                 {    krach.SND_Hz++;                    /* DMA-Frequenz weg und    */
  96.                     snd= (UBYTE*)Malloc( length );    /* mit normalem Malloc.    */
  97.                 }
  98.             }
  99.             else
  100.                 snd= (UBYTE*)Malloc( length );        /* ST-RAM mit Malloc    */
  101.  
  102.             if( !snd ) return( 0 );        /* Kein Speicher frei, tschü₧...    */
  103.  
  104.             Fread( file,length,snd );    /* Speicher holen und SND einlesen    */
  105.             Fclose( file );
  106.             krach.SND_start= snd;        /* Die Pointer auf Anfang und Ende    */
  107.             krach.SND_end= snd+length;    /* des Sounds setzen.                */
  108.  
  109.             pxy[0]=As->x;                /* jetzt nur noch clippen...        */
  110.             pxy[1]=As->y;
  111.             pxy[2]=As->x+As->w;
  112.             pxy[3]=As->y+As->h;
  113.             vs_clip( handle,1,pxy );
  114.             break;
  115.         case M_SWITCH:
  116.             v_bar( handle,pxy );        /* nur schwarz machen                */
  117.             break;
  118.         case M_DO_IT:
  119.             vsf_interior( handle,2 );
  120.             vsf_perimeter( handle,0 );
  121.  
  122.             Sound( &krach );            /* nun endloses spielen des Sounds.    */
  123.  
  124.             x= 0;
  125.             y= 0;
  126.             dim= 1;
  127.             do
  128.             {    vsf_style( handle,8 );
  129.                 vsf_color( handle,1 );
  130.                 pop_note( x,y,dim );    /* alte Note löschen.                */
  131.  
  132.                 if( As->planes!=1 ) vsf_color( handle,Random()%(1<<As->planes) );
  133.                 else vsf_style( handle,Random()&7 );
  134.                                         /* Entsprechend den Farben setzen.    */
  135.  
  136.                 x= As->x+Random()%As->w;    /* neue Position und Grö₧e.        */
  137.                 y= As->y+Random()%As->h;
  138.                 dim= (As->w*((Random()&7)+2))>>7;
  139.                 pop_note( x,y,dim );    /* neue Note setzen.                */
  140.             } while( !EVNT_ask(Random()&255+100) );/* Warten, warten,warten.*/
  141.  
  142.             Sound( NULL );                /* Sounds abbrechen.                */
  143.             break;
  144.         case M_EXIT:
  145.             if( snd ) Mfree( snd );        /* Speicher freigeben und            */
  146.             if( handle ) v_clsvwk( handle );    /* Workstation schlie₧en    */
  147.             break;
  148.     }
  149.  
  150.     return( 1 );    /* Und Tschü₧...    */
  151. }
  152.  
  153.  
  154. void pop_note( int x,int y,int w )
  155. {
  156.     int m;
  157.  
  158.     m= 3*w/2;                            /* Verhältnis x- zu y-Radius.        */
  159.     v_ellipse( handle,x,y,m,w );        /* Note zeichenen,                    */
  160.     pxy[0]= x+m-(w>>3);
  161.     pxy[2]= x+m;
  162.     pxy[1]= y-(w*3);
  163.     pxy[3]= y;
  164.     v_bar( handle,pxy );                /* und den Hals der Note.            */
  165. }
  166.