home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 10 / AU_CD10.iso / Archived / Updates / Flash / writeflash / !MakeFlash / c / sound < prev   
Text File  |  2000-06-04  |  4KB  |  156 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. //
  5. #include "proto.h"
  6. #include "bucket.h"
  7. #include "main.h"
  8. #include "flash.h"
  9.  
  10. #include "sound.h"
  11.  
  12.  
  13. static int write_file(char *file);
  14.  
  15.  
  16. int sound_create(SOUND **sound) {
  17.  
  18.   *sound = malloc(sizeof(SOUND));
  19.   if (!*sound)               return 1;
  20.   memset(*sound, 0, sizeof(SOUND));
  21.  
  22.   return 0;
  23. }
  24.  
  25.  
  26. int sound_write(SOUND *sound) {
  27.  
  28.   int filesize;
  29.   U32 ptr, ptr2;
  30.   U8 *buf;
  31.  
  32.   if (flush_bucket())                             return 1;
  33.   ptr = read_position(NULL);
  34.   if (write_ushort(0))                            return 1;
  35.   if (write_ushort(sound->id))                    return 1;
  36.  
  37.   if ((sound->format == SOUNDFORMAT_LIN8) ||
  38.       (sound->format == SOUNDFORMAT_LIN16)) {
  39.     if (write_ubits(4, 0))                        return 1;
  40.   } else
  41.     if (write_ubits(4, 1))                        return 1;
  42.  
  43.   switch (sound->freq) {
  44.   case 5:
  45.     if (write_ubits(2, 0))                        return 1;
  46.     break;
  47.   case 11:
  48.     if (write_ubits(2, 1))                        return 1;
  49.     break;
  50.   case 22:
  51.     if (write_ubits(2, 2))                        return 1;
  52.     break;
  53.   case 44:
  54.     if (write_ubits(2, 3))                        return 1;
  55.     break;
  56.   default:
  57.     if (write_ubits(2, 2))                        return 1;
  58.     break;
  59.   }
  60.  
  61.   if (sound->format == SOUNDFORMAT_LIN8) {
  62.     if (write_ubits(2, 0))                        return 1;
  63.   } else {
  64.     if (write_ubits(2, 1))                        return 1;
  65.   }
  66.  
  67.   if (sound->stereo) {
  68.     if (write_ubits(2, 1))                        return 1;
  69.   } else {
  70.     if (write_ubits(2, 0))                        return 1;
  71.   }
  72.  
  73.   if (flush_bucket())                             return 1;
  74.   ptr2 = read_position(&buf);
  75.   if (write_uint(0))                              return 1;
  76.  
  77.   filesize = write_file(sound->file);
  78.   if (filesize <= 0)                              return 1;
  79.  
  80.   filesize *= 8;    // bits
  81.   switch (sound->format) {
  82.   case SOUNDFORMAT_LIN8:
  83.     filesize /= 8;
  84.     break;
  85.   case SOUNDFORMAT_LIN16:
  86.     filesize /= 16;
  87.     break;
  88.   case SOUNDFORMAT_ADPCM2:
  89.     filesize = (filesize - 24)/2;
  90.     break;
  91.   case SOUNDFORMAT_ADPCM3:
  92.     filesize = (filesize - 24)/3;
  93.     break;
  94.   case SOUNDFORMAT_ADPCM4:
  95.     filesize = (filesize - 24)/4;
  96.     break;
  97.   case SOUNDFORMAT_ADPCM5:
  98.     filesize = (filesize - 24)/5;
  99.     break;
  100.   }
  101.   if (sound->stereo)  filesize /= 2;
  102.  
  103.   buf[ptr2+0] = filesize       & 0xff;
  104.   buf[ptr2+1] = (filesize>> 8) & 0xff;
  105.   buf[ptr2+2] = (filesize>>16) & 0xff;
  106.   buf[ptr2+3] = (filesize>>24) & 0xff;
  107.  
  108.   return update_record_header(stagDefineSound, ptr);
  109. }
  110.  
  111.  
  112. int write_play_sound(PLAYSOUND *play) {
  113.  
  114.   U32 ptr;
  115.  
  116.   if (flush_bucket())                             return 1;
  117.   ptr = read_position(NULL);
  118.   if (write_ushort(0))                            return 1;
  119.  
  120.   if (write_ushort(play->id))                     return 1;
  121.   if (write_ubits(4, 0))                          return 1;
  122.   if (write_ubits(1, 0))                          return 1;
  123.   if (play->loops > 1) {
  124.     if (write_ubits(1, 1))                        return 1;
  125.   } else {
  126.     if (write_ubits(1, 0))                        return 1;
  127.   }
  128.   if (write_ubits(1, 0))                          return 1;
  129.   if (write_ubits(1, 0))                          return 1;
  130.   if (play->loops > 1) {
  131.     if (write_ushort(play->loops))                return 1;
  132.   }
  133.  
  134.   return update_record_header(stagStartSound, ptr);
  135. }
  136.  
  137. // ----------------------------------------------------
  138.  
  139. int write_file(char *file) {
  140.  
  141.   FILE *fh;
  142.   U32 i, filesize;
  143.  
  144.   fh = fopen(file, "rb");
  145.   if (!fh)                              return -1;
  146.   fseek(fh, 0, SEEK_END);
  147.   filesize = (U32)ftell(fh);
  148.   fseek(fh, 0, SEEK_SET);
  149.   for (i = 0; i < filesize; i++)
  150.     if (write_ubyte(fgetc(fh)))         return -1;
  151.   fclose(fh);
  152.  
  153.   return filesize;
  154. }
  155.  
  156.