UNTESTED! DO NOT USE - PC speaker passthrough

This commit is contained in:
tildearrow 2022-03-05 15:00:19 -05:00
parent c684107b11
commit 6728edbb71
3 changed files with 39 additions and 6 deletions

View File

@ -21,6 +21,12 @@
#include "../engine.h"
#include <math.h>
#ifdef __linux__
#include <sys/ioctl.h>
#include <unistd.h>
#include <linux/kd.h>
#endif
#define PCSPKR_DIVIDER 4
#define CHIP_DIVIDER 1
@ -106,6 +112,19 @@ void DivPlatformPCSpeaker::acquire_piezo(short* bufL, short* bufR, size_t start,
}
}
void DivPlatformPCSpeaker::acquire_real(short* bufL, short* bufR, size_t start, size_t len) {
#ifdef __linux__
if (lastOn!=on || lastFreq!=freq) {
lastOn=on;
lastFreq=freq;
ioctl(STDOUT_FILENO,KIOCSOUND,on?freq:0);
}
#endif
for (size_t i=start; i<start+len; i++) {
bufL[i]=0;
}
}
void DivPlatformPCSpeaker::acquire(short* bufL, short* bufR, size_t start, size_t len) {
switch (speakerType) {
case 0:
@ -117,6 +136,9 @@ void DivPlatformPCSpeaker::acquire(short* bufL, short* bufR, size_t start, size_
case 2:
acquire_piezo(bufL,bufR,start,len);
break;
case 3:
acquire_real(bufL,bufR,start,len);
break;
}
}
@ -282,12 +304,20 @@ void DivPlatformPCSpeaker::reset() {
}
on=false;
lastOn=false;
freq=0;
lastFreq=0;
pos=0;
flip=false;
low=0;
band=0;
if (speakerType==3) {
#ifdef __linux__
ioctl(STDOUT_FILENO,KIOCSOUND,0);
#endif
}
memset(regPool,0,2);
}
@ -329,6 +359,11 @@ int DivPlatformPCSpeaker::init(DivEngine* p, int channels, int sugRate, unsigned
}
void DivPlatformPCSpeaker::quit() {
if (speakerType==3) {
#ifdef __linux__
ioctl(STDOUT_FILENO,KIOCSOUND,0);
#endif
}
}
DivPlatformPCSpeaker::~DivPlatformPCSpeaker() {

View File

@ -52,12 +52,12 @@ class DivPlatformPCSpeaker: public DivDispatch {
};
Channel chan[1];
bool isMuted[1];
bool on, flip;
bool on, flip, lastOn;
int pos, speakerType;
float low, band;
float low2, high2, band2;
float low3, band3;
unsigned short freq;
unsigned short freq, lastFreq;
unsigned char regPool[2];
friend void putDispatchChan(void*,int,int);
@ -65,6 +65,7 @@ class DivPlatformPCSpeaker: public DivDispatch {
void acquire_unfilt(short* bufL, short* bufR, size_t start, size_t len);
void acquire_cone(short* bufL, short* bufR, size_t start, size_t len);
void acquire_piezo(short* bufL, short* bufR, size_t start, size_t len);
void acquire_real(short* bufL, short* bufR, size_t start, size_t len);
public:
void acquire(short* bufL, short* bufR, size_t start, size_t len);

View File

@ -17,7 +17,6 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <SDL_video.h>
#define _USE_MATH_DEFINES
#include "gui.h"
#include "util.h"
@ -4894,12 +4893,10 @@ bool FurnaceGUI::loop() {
e->setSysFlags(i,(flags&(~3))|2,restart);
updateWindowTitle();
}
/*
if (ImGui::RadioButton("Use system beeper",(flags&3)==3)) {
if (ImGui::RadioButton("Use system beeper (Linux only!)",(flags&3)==3)) {
e->setSysFlags(i,(flags&(~3))|3,restart);
updateWindowTitle();
}
*/
break;
}
case DIV_SYSTEM_QSOUND: {