view pwplib/snd-w32.c @ 35:b9d679965320

Code cleanups.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 24 May 2010 01:22:33 +0300
parents c60e531d19cd
children e2b6a35bcb0c
line wrap: on
line source

#include "config.h"

#ifdef DRIVE_WIN32

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

#include <windows.h>

#define TIMERHZ 72

#include "pwplib.h"
#include "gb.h"

#define NUMBUFS 2

#define HARDBUFSIZE 65536

struct
{
  int      buffersize;
  HWAVEOUT outHandle;
  WAVEHDR  waveHdr[NUMBUFS];
  char     *bufData[NUMBUFS];
  int      currbuf;
  int      bufferptr;
  int      letsgo;
}
pwp_w32snd;

void win32snd_fill()
{
   while(pwp_w32snd.bufferptr<(HARDBUFSIZE-pwp_w32snd.buffersize))
   {
      pwplib.player();

      gb_genwave(pwp_w32snd.bufData[pwp_w32snd.currbuf] +
                 pwp_w32snd.bufferptr,
                 pwp_w32snd.buffersize);

      pwp_w32snd.bufferptr += pwp_w32snd.buffersize;
   }
  pwp_w32snd.waveHdr[pwp_w32snd.currbuf].lpData =
            pwp_w32snd.bufData[pwp_w32snd.currbuf];
  pwp_w32snd.waveHdr[pwp_w32snd.currbuf].dwBufferLength =
            pwp_w32snd.bufferptr;

  pwp_w32snd.bufferptr=0;

   waveOutPrepareHeader(
      pwp_w32snd.outHandle,
     &pwp_w32snd.waveHdr[pwp_w32snd.currbuf],
      sizeof(WAVEHDR));

   waveOutWrite(
          pwp_w32snd.outHandle,
         &pwp_w32snd.waveHdr[pwp_w32snd.currbuf],
          sizeof(WAVEHDR));

   pwp_w32snd.currbuf=(pwp_w32snd.currbuf+1)%NUMBUFS;
}

static void CALLBACK win32snd_callback(HWAVEOUT hwo,UINT uMsg,
       DWORD dwParam0, DWORD dwParam1, DWORD dwParam2)
{
   if(pwp_w32snd.letsgo==0) return;

/*
   if(pwp_w32snd.waveHdr[pwp_w32snd.currbuf].dwFlags&WHDR_PREPARED)
      waveOutUnprepareHeader(
        pwp_w32snd.outHandle,
       &pwp_w32snd.waveHdr[pwp_w32snd.currbuf],
            sizeof(WAVEHDR));
*/
   win32snd_fill();
}

void win32snd_restore()
{
}

void win32snd_start()
{
   if(pwp_w32snd.letsgo==0)
   {
     {int i=0;
      for(;i<NUMBUFS;i++) win32snd_fill();
     }

     pwp_w32snd.letsgo++;
   }
}

int win32snd_init()
{
   HANDLE bufHandle,waveHdrHandle;
   WAVEFORMATEX waveFormat;

   /************/

   /* try: 8000/8/1, 11025/8/1, 11025/16/1, 22050/16/1, 22050/16/2,
           44100/16/2 */

   waveFormat.wFormatTag = WAVE_FORMAT_PCM;
   waveFormat.nChannels = 1;
   waveFormat.nSamplesPerSec = 22050;
   waveFormat.wBitsPerSample = 8;
   waveFormat.nBlockAlign =
     waveFormat.nChannels * (waveFormat.wBitsPerSample/8);
   waveFormat.nAvgBytesPerSec =
     waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
   waveFormat.cbSize = 0;

   pwp_w32snd.letsgo=0;

   {int i=0;for(;i<NUMBUFS;i++)
   pwp_w32snd.bufData[i] = malloc(HARDBUFSIZE);
   }

   pwplib.sound=gb_sound;
   gb_init(waveFormat.nAvgBytesPerSec);

   pwp_w32snd.buffersize = waveFormat.nAvgBytesPerSec/TIMERHZ;
   pwp_w32snd.currbuf=0;
   pwp_w32snd.bufferptr = 0;
 
   {int r = waveOutOpen(&pwp_w32snd.outHandle,WAVE_MAPPER,&waveFormat,
                        (DWORD)win32snd_callback,0,
                        CALLBACK_FUNCTION);
    if(r) { printf("ERROR\n"); }
   }

   pwplib_regdestr(win32snd_restore);

//   pwp_w32snd.buffersize = waveFormat.nAvgBytesPerSec/TIMERHZ;

   pwplib.loopflush = win32snd_start;

   return 1;
}

#endif