home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 097.lha / Ic.Source / sound.c < prev   
C/C++ Source or Header  |  1986-11-20  |  5KB  |  193 lines

  1. /*
  2.  
  3. InvaderCraft von J.Hertel
  4. (C) CW-Publikationen
  5.  
  6.   "sound.c"
  7.  
  8.  
  9.     Wenn keine Soundfiles verfuegbar sind, kann dieser Programmteil
  10.                   vollstaendig weggelassen werden !
  11.  
  12.  
  13. Kompilieren mit Aztec C Version 3.20a.
  14.  
  15. Im Include-Directory muss sich das Header-File "invadercraft1.h" befinden!
  16.  
  17. Aufruf:  cc sound -a
  18.          as sound
  19.  
  20. Linken:  siehe invadercraft.c
  21.  
  22. */
  23.  
  24. #include <libraries/dos.h>
  25. #include <devices/audio.h>
  26. #include <exec/memory.h>
  27.  
  28. /* Vor Compiler-Aufruf unbedingt "invadercraft1.h" in include/ -
  29. Directory kopieren! */
  30.  
  31. #include <invadercraft1.h>
  32.  
  33. extern struct FileInfoBlock *fib;
  34. extern struct Lock *lock,*Lock();
  35. extern struct FileHandle *fh,*Open();
  36. extern long Read(),Examine();
  37. extern UBYTE *AllocMem();
  38.  
  39. struct MsgPort *port[5],*CreatePort();
  40. struct IOAudio *ioa[5],CreateExtIO();
  41. long OpenDevice(),deverror=1;
  42.  
  43. UBYTE alloc[]={0xf};
  44.  
  45. /* Fuer jeden Sound sind hier der Name, die Rate, die Anzahl an
  46. Wiederholungen und die Lautstaerke einzutragen (in dieser Reihenfolge).
  47.  
  48. Name: Unter diesem Namen ist der Sound auf Diskette zu finden.
  49.       Wird eine 0 (ohne Anfuehrungszeichen) eingetragen, so gilt der
  50.       Sound als nicht verfuegbar, die uebrigen Eintraege koennen entfallen.
  51.  
  52. Rate: Frequenzbestimmend, in der Regel etwa 90...1000 (alle bekannten
  53.       Digitizer messen die Frequenz in dieser Einheit)
  54.  
  55. Wiederholungen: >= 0, 0 entspricht dauernder Wiederholung
  56.  
  57. Lautstaerke:  0...64, 64 entspricht maximaler Lautstaerke
  58.  
  59. Laengenangabe ist nicht erforderlich.
  60. Die folgende Eintraege sind fuer die Sound-Daten auf der Leserservice-
  61. Diskette zurechtgeschnitten und dienen als Beispiel fuer eigene Kreationen.
  62. */
  63.  
  64. struct format sdata[ANZSOUNDS]={      /* Nr. Bedeutung          */
  65. {"ic.data:sound/0",400,1,50},         /* 0   Schuss abgefeuert  */
  66. {"ic.data:sound/1",400,1,64},         /* 1   Panzer abgeschossen */
  67. {0},                                  /* 2   Panzer bewegen */
  68. {"ic.data:sound/3",400,1,64},         /* 3   Panzer ueberollt */
  69. {"ic.data:sound/4",350,1,50},         /* 4   Missile abgefeuert */
  70. {"ic.data:sound/5",450,1,64},         /* 5   Invader abgeschossen */
  71. {"ic.data:sound/6",300,1,64},         /* 6   Invader bewegt sich */
  72. {"ic.data:sound/7",400,1,64},         /* 7   Bunker getroffen */
  73. {"ic.data:sound/8",400,1,64},         /* 8   Missile getroffen */
  74. {"ic.data:sound/9",400,1,64},         /* 9   Mutterschiff abgeschossen */
  75. {"ic.data:sound/10",1300,1,45},       /* 10  Mutterschiff bewegt sich */
  76. {"ic.data:sound/11",480,1,64},        /* 11  "Get Ready" */
  77. {"ic.data:sound/12",490,1,64},        /* 12  "Game Over" */
  78. {"ic.data:sound/13",500,1,64},        /* 13  zus. Sound zu "Get Ready" */
  79. {"ic.data:sound/14",200,1,35},        /* 14  zus. Sound zu "Game Over" */
  80.  
  81. /* Die folgenden Eintraege an Wiederholungen und Lautstaerke sind
  82. ausnahmsweise mit 0 zu fuellen (Keinen One-Shot-Sound verwenden) */
  83.  
  84. {"ic.data:sound/menusound",300,0,0},  /* 15  Sound waehrend der Menus */
  85. {"ic.data:sound/titelsound",240,0,0}, /* 16  Titelsound waehrend des Ladens */
  86. };
  87.  
  88. soundladen(i)
  89. int i;
  90.  
  91. /* Erkennen der Laenge der Sounds, Speicher reservieren und File laden
  92. i gibt die Nummer des Files an */
  93.  
  94. {
  95.    if(sdata[i].name==0)
  96.       return();
  97.    if((fib=(struct FileInfoBlock *)AllocMem((long)sizeof(struct
  98.     FileInfoBlock),MEMF_PUBLIC))==0)
  99.       closeall(1);
  100.    if((lock=Lock(sdata[i].name,ACCESS_READ))==0) {
  101.       printf("Sound-Datei %s existiert nicht!\n",sdata[i].name);
  102.       closeall(0);
  103.    }
  104.    if(Examine(lock,fib)==0) {
  105.       printf("Examine() bei Sound-Datei %s erfolglos!\n",sdata[i].name);
  106.       closeall(0);
  107.    }
  108.    sdata[i].len=fib->fib_Size;
  109.    UnLock(lock); lock=0;
  110.    FreeMem(fib,(long)sizeof(struct FileInfoBlock)); fib=0;
  111.  
  112.    if((sdata[i].buffer=(UBYTE *)AllocMem(sdata[i].len,MEMF_CHIP))==0) {
  113.       printf("Kein Speicher verfuegbar fuer Sound-Datei %s !\n",
  114.        sdata[i].name);
  115.       closeall(0);
  116.    }
  117.    if((fh=Open(sdata[i].name,MODE_OLDFILE))==0) {
  118.       printf("Open() bei Sound-Datei %s erfolglos!\n",sdata[i].name);
  119.       closeall(0);
  120.    }
  121.    if(Read(fh,sdata[i].buffer,sdata[i].len)!=sdata[i].len) {
  122.       printf("Lesefehler in Sound-Datei %s !\n",sdata[i].name);
  123.       closeall(0);
  124.    }
  125.    Close(fh); fh=0;
  126. }
  127.  
  128. titelsladen()
  129.  
  130. /* Titelsound laden und sanft einblenden */
  131.  
  132. {
  133.    int j;
  134.  
  135.    soundladen(16);
  136.    sound(16,0,3);
  137.    sound(16,0,4);
  138.    for(j=0;j<33;j++) {
  139.       sync();
  140.       soundvol(16,j*2,3);
  141.       sync();
  142.       soundvol(16,j*2,4);
  143.    }
  144. }
  145.  
  146. frees()
  147.  
  148. /* Audio-Device, Ports und IORequests schliessen */
  149.  
  150. {
  151.    int i;
  152.    if(!deverror) {
  153.       CloseDevice(ioa[0]);
  154.    }
  155.    for(i=0;i<5;i++)
  156.       if(ioa[i])
  157.          DeleteExtIO(ioa[i]);
  158.  
  159.    for(i=0;i<5;i++)
  160.       if(port[i])
  161.          DeletePort(port[i]);
  162. }
  163.  
  164. salloc()
  165.  
  166. /* Audio-Device eroeffnen, Ports und IORequest initialisieren */
  167.  
  168. {
  169.    int i;
  170.    for(i=0;i<5;i++) {
  171.       if((port[i]=CreatePort(0L,0L))==0) {
  172.          closeall(1);
  173.       }
  174.    }
  175.    for(i=0;i<5;i++) {
  176.       if((ioa[i]=CreateExtIO(port[i],(long)sizeof(struct IOAudio)))==0){
  177.          closeall(1);
  178.       }
  179.       ioa[i]->ioa_Request.io_Message.mn_Node.ln_Pri=20;
  180.    }
  181.    ioa[0]->ioa_Length=sizeof(alloc);
  182.    ioa[0]->ioa_Data=alloc;
  183.    if(deverror=OpenDevice(AUDIONAME,0L,ioa[0],0L)) {
  184.       printf("OpenDevice() (AudioDevice) erfolglos\n");
  185.       closeall(0);
  186.    }
  187.    for(i=1;i<5;i++) {
  188.       *ioa[i]=*ioa[0];
  189.       ioa[i]->ioa_Request.io_Message.mn_ReplyPort=port[i];
  190.       ioa[i]->ioa_Request.io_Unit=(struct Unit *)(1L<<(i-1));
  191.    }
  192. }
  193.