home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 February / PCO_0299.ISO / filesbbs / linux / mikmod-3.000 / mikmod-3 / mikmod-3.1.2 / drivers / drv_wav.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-12-07  |  3.4 KB  |  158 lines

  1. /*    MikMod sound library
  2.     (c) 1998 Miodrag Vallat and others - see file AUTHORS for complete list
  3.  
  4.     This library is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU Library General Public License as
  6.     published by the Free Software Foundation; either version 2 of
  7.     the License, or (at your option) any later version.
  8.  
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU Library General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU Library General Public
  15.     License along with this library; if not, write to the Free Software
  16.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18.  
  19. /*==============================================================================
  20.  
  21.   $Id: drv_wav.c,v 1.16 1998/12/07 06:01:51 miod Exp $
  22.  
  23.   Mikmod driver for output to a file called MUSIC.WAV
  24.  
  25. ==============================================================================*/
  26.  
  27. #ifdef HAVE_CONFIG_H
  28. #include "config.h"
  29. #endif
  30.  
  31. #ifdef HAVE_UNISTD_H
  32. #include <unistd.h>
  33. #endif
  34.  
  35. #include <mikmod_internals.h>
  36.  
  37. #define BUFFERSIZE 32768
  38. #define FILENAME "music.wav"
  39.  
  40. static    FILE *wavout=NULL;
  41. static    SBYTE *audiobuffer=NULL;
  42. static    ULONG dumpsize;
  43.  
  44. static void putheader(void)
  45. {
  46.     _mm_write_string("RIFF    WAVEfmt ",wavout);
  47.     _mm_write_I_ULONG(16,wavout);    /* length of this RIFF block crap */
  48.  
  49.     _mm_write_I_UWORD(1, wavout);    /* microsoft format type */
  50.     _mm_write_I_UWORD((md_mode&DMODE_STEREO)?2:1,wavout);
  51.     _mm_write_I_ULONG(md_mixfreq,wavout);
  52.     _mm_write_I_ULONG(md_mixfreq*((md_mode&DMODE_STEREO)?2:1)*
  53.                       ((md_mode&DMODE_16BITS)?2:1),wavout);
  54.     /* block alignment (8/16 bit) */
  55.     _mm_write_I_UWORD(((md_mode&DMODE_16BITS)?2:1)* 
  56.                       ((md_mode&DMODE_STEREO)?2:1),wavout);
  57.     _mm_write_I_UWORD((md_mode&DMODE_16BITS)?16:8,wavout);
  58.     _mm_write_string("data",wavout);
  59. }
  60.  
  61. static BOOL WAV_IsThere(void)
  62. {
  63.     return 1;
  64. }
  65.  
  66. static BOOL WAV_Init(void)
  67. {
  68.     if(!(wavout=fopen(FILENAME, "wb"))) {
  69.         _mm_errno=MMERR_OPENING_FILE;
  70.         return 1;
  71.     }
  72.     if(!(audiobuffer=(SBYTE*)_mm_malloc(BUFFERSIZE))) {
  73.         fclose(wavout);unlink(FILENAME);
  74.         wavout=NULL;
  75.         return 1;
  76.     }
  77.  
  78.     md_mode|=DMODE_SOFT_MUSIC|DMODE_SOFT_SNDFX;
  79.  
  80.     if (VC_Init()) {
  81.         fclose(wavout);unlink(FILENAME);
  82.         wavout=NULL;
  83.         return 1;
  84.     }
  85.     putheader();
  86.     dumpsize=0;
  87.  
  88.     return 0;
  89. }
  90.  
  91. static void WAV_Exit(void)
  92. {
  93.     VC_Exit();
  94.  
  95.     /* write in the actual sizes now */
  96.     if(wavout) {
  97.         _mm_fseek(wavout,4,SEEK_SET);
  98.         _mm_write_I_ULONG(dumpsize+32,wavout);
  99.         _mm_fseek(wavout,40,SEEK_SET);
  100.         _mm_write_I_ULONG(dumpsize,wavout);
  101.         fclose(wavout);
  102.         wavout=NULL;
  103.     }
  104.     if(audiobuffer) {
  105.         free(audiobuffer);
  106.         audiobuffer=NULL;
  107.     }
  108. }
  109.  
  110. static void WAV_Update(void)
  111. {
  112.     ULONG done;
  113.  
  114.     done=VC_WriteBytes(audiobuffer,BUFFERSIZE);
  115.     fwrite(audiobuffer,1,done,wavout);
  116.     dumpsize+=done;
  117. }
  118.  
  119. static BOOL WAV_Reset(void)
  120. {
  121.     fclose(wavout);
  122.     if(!(wavout=fopen(FILENAME, "wb"))) {
  123.         _mm_errno=MMERR_OPENING_FILE;
  124.         return 1;
  125.     }
  126.     putheader();
  127.     dumpsize=0;
  128.  
  129.     return 0;
  130. }
  131.  
  132. MDRIVER drv_wav={
  133.     NULL,
  134.     "Disk writer (wav)",
  135.     "Wav disk writer (music.wav) v1.1",
  136.     0,255,
  137.     WAV_IsThere,
  138.     VC_SampleLoad,
  139.     VC_SampleUnload,
  140.     VC_SampleSpace,
  141.     VC_SampleLength,
  142.     WAV_Init,
  143.     WAV_Exit,
  144.     WAV_Reset,
  145.     VC_SetNumVoices,
  146.     VC_PlayStart,
  147.     VC_PlayStop,
  148.     WAV_Update,
  149.     VC_VoiceSetVolume,
  150.     VC_VoiceSetFrequency,
  151.     VC_VoiceSetPanning,
  152.     VC_VoicePlay,
  153.     VC_VoiceStop,
  154.     VC_VoiceStopped,
  155.     VC_VoiceGetPosition,
  156.     NULL
  157. };
  158.