Added support for changing speaker frequency while output is enabled

This commit is contained in:
Volker Ruppert 2013-06-11 21:04:07 +00:00
parent 3193de9516
commit c5ca69da5e
4 changed files with 37 additions and 17 deletions

@ -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
};