Added support for changing speaker frequency while output is enabled
This commit is contained in:
parent
3193de9516
commit
c5ca69da5e
bochs/iodev
@ -278,7 +278,7 @@ void bx_pit_c::write(Bit32u address, Bit32u dvalue, unsigned io_len)
|
||||
Bit32u value32, time_passed32 = (Bit32u)time_passed;
|
||||
bx_bool new_speaker_active;
|
||||
|
||||
if(time_passed32) {
|
||||
if (time_passed32) {
|
||||
periodic(time_passed32);
|
||||
}
|
||||
BX_PIT_THIS s.last_usec = BX_PIT_THIS s.last_usec + time_passed;
|
||||
@ -298,6 +298,11 @@ void bx_pit_c::write(Bit32u address, Bit32u dvalue, unsigned io_len)
|
||||
|
||||
case 0x42: /* timer 2: write count register */
|
||||
BX_PIT_THIS s.timer.write(2, value);
|
||||
if (BX_PIT_THIS s.speaker_active) {
|
||||
value32 = BX_PIT_THIS get_timer(2);
|
||||
if (value32 == 0) value32 = 0x10000;
|
||||
DEV_speaker_beep_on((float)(1193180.0 / value32));
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x43: /* timer 0-2 mode control */
|
||||
|
@ -135,18 +135,19 @@ bx_bool bx_soundmod_ctl_c::beep_on(float frequency)
|
||||
{
|
||||
if (soundmod != NULL) {
|
||||
BX_DEBUG(("Beep ON (frequency=%.2f)",frequency));
|
||||
if (!beep_active) {
|
||||
soundmod->startwaveplayback(44100, 8, 0, 0);
|
||||
beep_bytes = (int)(44100.0 / frequency / 2);
|
||||
beep_bufsize = 4410;
|
||||
beep_buffer = (Bit8u*)malloc(beep_bufsize);
|
||||
#ifdef WIN32
|
||||
DWORD threadID;
|
||||
CreateThread(NULL, 0, beep_thread, soundmod, 0, &threadID);
|
||||
#else
|
||||
pthread_create(&thread, NULL, (void *(*)(void *))&beep_thread, soundmod);
|
||||
#endif
|
||||
if (beep_active) {
|
||||
beep_off();
|
||||
}
|
||||
soundmod->startwaveplayback(44100, 8, 0, 0);
|
||||
beep_bytes = (int)(44100.0 / frequency / 2);
|
||||
beep_bufsize = 4410;
|
||||
beep_buffer = (Bit8u*)malloc(beep_bufsize);
|
||||
#ifdef WIN32
|
||||
DWORD threadID;
|
||||
CreateThread(NULL, 0, beep_thread, soundmod, 0, &threadID);
|
||||
#else
|
||||
pthread_create(&thread, NULL, (void *(*)(void *))&beep_thread, soundmod);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -80,6 +80,9 @@ bx_speaker_c::~bx_speaker_c()
|
||||
void bx_speaker_c::init(void)
|
||||
{
|
||||
outputinit = 0;
|
||||
#if defined(WIN32)
|
||||
useBeep = FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
void bx_speaker_c::reset(unsigned type)
|
||||
@ -102,6 +105,7 @@ void bx_speaker_c::reset(unsigned type)
|
||||
}
|
||||
#elif defined(WIN32)
|
||||
BX_INFO(("Using system beep for output"));
|
||||
useBeep = TRUE;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -110,6 +114,11 @@ void bx_speaker_c::reset(unsigned type)
|
||||
|
||||
void bx_speaker_c::beep_on(float frequency)
|
||||
{
|
||||
#if defined(WIN32)
|
||||
if (useBeep && (beep_frequency != 0.0)) {
|
||||
beep_off();
|
||||
}
|
||||
#endif
|
||||
beep_frequency = frequency;
|
||||
|
||||
#if BX_SUPPORT_SOUNDLOW
|
||||
@ -122,7 +131,9 @@ void bx_speaker_c::beep_on(float frequency)
|
||||
ioctl(consolefd, KIOCSOUND, (int)(clock_tick_rate/frequency));
|
||||
}
|
||||
#elif defined(WIN32)
|
||||
usec_start = bx_pc_system.time_usec();
|
||||
if (useBeep) {
|
||||
usec_start = bx_pc_system.time_usec();
|
||||
}
|
||||
#endif
|
||||
|
||||
// give the gui a chance to signal beep on
|
||||
@ -162,10 +173,12 @@ void bx_speaker_c::beep_off()
|
||||
}
|
||||
#elif defined(WIN32)
|
||||
// FIXME: sound should start at beep_on() and end here
|
||||
DWORD threadID;
|
||||
beep_info.msec = (DWORD)((bx_pc_system.time_usec() - usec_start) / 1000);
|
||||
beep_info.frequency = (DWORD)beep_frequency;
|
||||
CreateThread(NULL, 0, BeepThread, NULL, 0, &threadID);
|
||||
if (useBeep) {
|
||||
DWORD threadID;
|
||||
beep_info.msec = (DWORD)((bx_pc_system.time_usec() - usec_start) / 1000);
|
||||
beep_info.frequency = (DWORD)beep_frequency;
|
||||
CreateThread(NULL, 0, BeepThread, NULL, 0, &threadID);
|
||||
}
|
||||
#endif
|
||||
|
||||
// give the gui a chance to signal beep off
|
||||
|
@ -46,6 +46,7 @@ private:
|
||||
signed int consolefd;
|
||||
const static unsigned int clock_tick_rate = 1193180;
|
||||
#elif defined(WIN32)
|
||||
BOOL useBeep;
|
||||
Bit64u usec_start;
|
||||
#endif
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user