From 96edd67bb7e93df34e61ed835827819e7445f2da Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Sat, 30 Nov 2002 11:54:54 +0000 Subject: [PATCH] Sinewave and disabling support, although sine is buggy. Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@551 --- src/hardware/pcspeaker.cpp | 78 ++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 19 deletions(-) diff --git a/src/hardware/pcspeaker.cpp b/src/hardware/pcspeaker.cpp index 5043df46..f85f2891 100644 --- a/src/hardware/pcspeaker.cpp +++ b/src/hardware/pcspeaker.cpp @@ -20,6 +20,7 @@ #include "dosbox.h" #include "mixer.h" #include "timer.h" +#include "setup.h" #ifndef PI @@ -30,20 +31,25 @@ #define SPKR_RATE 22050 #define SPKR_VOLUME 5000 -#define FREQ_SHIFT 16 -#define FREQ_MAX (2 << FREQ_SHIFT) +#define SPKR_SHIFT 16 + +#define SIN_ENT 1024 +#define SIN_MAX (SIN_ENT << SPKR_SHIFT) + +#define FREQ_MAX (2 << SPKR_SHIFT) #define FREQ_HALF (FREQ_MAX >> 1) - - struct Speaker { - Bit32u freq_add; - Bit32u freq_pos; + Bitu freq_add; + Bitu freq_pos; Bit16s volume; MIXER_Channel * chan; bool enabled; bool realsound; + bool sinewave; + Bitu mode; Bit16u buffer[SPKR_BUF]; + Bit16s table[SIN_ENT]; Bitu buf_pos; }; @@ -52,6 +58,7 @@ static Speaker spkr; void PCSPEAKER_SetCounter(Bitu cntr,Bitu mode) { + spkr.mode=mode; switch (mode) { case 0: if (cntr>72) cntr=72; @@ -59,8 +66,14 @@ void PCSPEAKER_SetCounter(Bitu cntr,Bitu mode) { if (spkr.buf_pos0) { - *(Bit16s*)(stream)=spkr.buffer[buf_pos >> 16]; - buf_pos+=buf_add; - stream+=2; + switch (spkr.mode) { + case 0: + /* Generate the "RealSound" */ + { + Bitu buf_add=(spkr.buf_pos<<16)/len; + Bitu buf_pos=0; + spkr.buf_pos=0;spkr.realsound=0; + while (len-->0) { + *(Bit16s*)(stream)=spkr.buffer[buf_pos >> 16]; + buf_pos+=buf_add; + stream+=2; + } + break; } - } else { - /* Generate a square wave */ - while (len-->0) { + case 3: + if (spkr.sinewave) while (len-->0) { + spkr.freq_pos+=spkr.freq_add; + spkr.freq_pos&=(SIN_MAX-1); + *(Bit16s*)(stream)=spkr.table[spkr.freq_pos>>SPKR_SHIFT]; + stream+=2; + } else while (len-->0) { spkr.freq_pos+=spkr.freq_add; if (spkr.freq_pos>=FREQ_MAX) spkr.freq_pos-=FREQ_MAX; if (spkr.freq_pos>=FREQ_HALF) { @@ -92,11 +113,26 @@ static void PCSPEAKER_CallBack(Bit8u * stream,Bit32u len) { } stream+=2; } + break; + case 4: + while (len-->0) { + if (spkr.freq_pos) { + *(Bit16s*)(stream)=spkr.volume; + spkr.freq_pos--; + } else { + *(Bit16s*)(stream)=-spkr.volume; + } + stream+=2; + } + break; } } void PCSPEAKER_Init(Section* sec) { MSG_Add("SPEAKER_CONFIGFILE_HELP","pcspeaker related options.\n"); + Section_prop * section=static_cast(sec); + if(!section->Get_bool("enabled")) return; + spkr.sinewave=section->Get_bool("sinewave"); spkr.chan=MIXER_AddChannel(&PCSPEAKER_CallBack,SPKR_RATE,"PC-SPEAKER"); MIXER_Enable(spkr.chan,false); MIXER_SetMode(spkr.chan,MIXER_16MONO); @@ -104,4 +140,8 @@ void PCSPEAKER_Init(Section* sec) { spkr.enabled=false; spkr.realsound=false; spkr.buf_pos=0; + /* Generate the sine wave */ + for (Bitu i=0;i