From 050795ac4419b4170d186e4b57054305f29a5b39 Mon Sep 17 00:00:00 2001 From: Volker Ruppert Date: Thu, 19 Feb 2015 18:45:43 +0000 Subject: [PATCH] Rewrite of the SB16 midi and wave output code. - Implemented wave and midi output using the 'soundfile' driver. - Implemented dual midi/wave output in midimode/wavemode 3. - Removed now obsolete output file handling and other cleanups. - The wave input (recording) and OPL3 output features are not affected by the wavemode setting. - TODO: Similar rewrite of ES1370 wave output and related cleanups. --- bochs/.bochsrc | 21 ++-- bochs/iodev/sound/sb16.cc | 250 +++++++++++++++++--------------------- bochs/iodev/sound/sb16.h | 14 +-- 3 files changed, 130 insertions(+), 155 deletions(-) diff --git a/bochs/.bochsrc b/bochs/.bochsrc index 3fb023cb0..1d370f4c8 100644 --- a/bochs/.bochsrc +++ b/bochs/.bochsrc @@ -898,18 +898,17 @@ speaker: enabled=1, mode=sound # enabled: # This optional property controls the presence of the SB16 emulation. # The emulation is turned on unless this property is used and set to 0. -# midimode: -# 0=no data -# 1=output to device (system dependent. midi denotes the device driver) -# 2=SMF file output, including headers -# 3=output the midi data stream to the file (no midi headers and no -# delta times, just command and data bytes) +# midimode: This parameter specifies what to do with the MIDI output. +# 0 = no output +# 1 = output to device specified with the sound option (system dependent) +# 2 = MIDI or raw data output to file (depends on file name extension) +# 3 = dual output (mode 1 and 2 at the same time) # midi: This is the file where the midi output is stored (midimode 2 or 3). -# wavemode: -# 0=no data -# 1=output to device (system dependent. wave denotes the device driver) -# 2=VOC file output, incl. headers -# 3=output the raw wave stream to the file +# wavemode: This parameter specifies what to do with the PCM output. +# 0 = no output +# 1 = output to device specified with the sound option (system dependent) +# 2 = VOC, WAV or raw data output to file (depends on file name extension) +# 3 = dual output (mode 1 and 2 at the same time) # wave: This is the file where the wave output is stored (wavemode 2 or 3). # loglevel: # 0=no log diff --git a/bochs/iodev/sound/sb16.cc b/bochs/iodev/sound/sb16.cc index 31140bb08..51bb61f5b 100644 --- a/bochs/iodev/sound/sb16.cc +++ b/bochs/iodev/sound/sb16.cc @@ -47,7 +47,7 @@ Bit32u fmopl_callback(void *dev, Bit16u rate, Bit8u *buffer, Bit32u len); void sb16_init_options(void) { - static const char *sb16_wavemode_list[] = { + static const char *sb16_mode_list[] = { "0", "1", "2", @@ -63,12 +63,12 @@ void sb16_init_options(void) "Enable SB16 emulation", "Enables the SB16 emulation", 1); - bx_param_num_c *midimode = new bx_param_num_c(menu, + bx_param_enum_c *midimode = new bx_param_enum_c(menu, "midimode", "Midi mode", - "Controls the MIDI output format.", - 0, 3, - 0); + "Controls the MIDI output switches.", + sb16_mode_list, + 0, 0); bx_param_filename_c *midifile = new bx_param_filename_c(menu, "midi", "MIDI file", @@ -77,8 +77,8 @@ void sb16_init_options(void) bx_param_enum_c *wavemode = new bx_param_enum_c(menu, "wavemode", "Wave mode", - "Controls the wave output format.", - sb16_wavemode_list, + "Controls the wave output switches.", + sb16_mode_list, 0, 0); bx_param_filename_c *wavefile = new bx_param_filename_c(menu, "wave", @@ -104,8 +104,6 @@ void sb16_init_options(void) 0, BX_MAX_BIT32U, 0); - midimode->set_options(midimode->USE_SPIN_CONTROL); - loglevel->set_options(loglevel->USE_SPIN_CONTROL); bx_list_c *deplist = new bx_list_c(NULL); deplist->add(midimode); deplist->add(wavemode); @@ -114,7 +112,9 @@ void sb16_init_options(void) enabled->set_dependent_list(deplist); deplist = new bx_list_c(NULL); deplist->add(midifile); - midimode->set_dependent_list(deplist); + midimode->set_dependent_list(deplist, 0); + midimode->set_dependent_bitmap(2, 0x1); + midimode->set_dependent_bitmap(3, 0x1); deplist = new bx_list_c(NULL); deplist->add(wavefile); wavemode->set_dependent_list(deplist, 0); @@ -123,6 +123,7 @@ void sb16_init_options(void) deplist = new bx_list_c(NULL); deplist->add(logfile); loglevel->set_dependent_list(deplist); + loglevel->set_options(loglevel->USE_SPIN_CONTROL); } Bit32s sb16_options_parser(const char *context, int num_params, char *params[]) @@ -175,27 +176,21 @@ void CDECL libsb16_LTX_plugin_fini(void) // some shortcuts to save typing #define LOGFILE BX_SB16_THIS logfile -#define WAVEDATA BX_SB16_THIS wavefile #define MPU BX_SB16_THIS mpu401 #define DSP BX_SB16_THIS dsp #define MIXER BX_SB16_THIS mixer #define EMUL BX_SB16_THIS emuldata #define OPL BX_SB16_THIS opl -#define BX_SB16_WAVEOUT BX_SB16_THIS waveout -#define BX_SB16_WAVEIN BX_SB16_THIS wavein -#define BX_SB16_MIDIOUT BX_SB16_THIS midiout +#define BX_SB16_WAVEOUT1 BX_SB16_THIS waveout[0] +#define BX_SB16_WAVEOUT2 BX_SB16_THIS waveout[1] +#define BX_SB16_WAVEIN BX_SB16_THIS wavein +#define BX_SB16_MIDIOUT1 BX_SB16_THIS midiout[0] +#define BX_SB16_MIDIOUT2 BX_SB16_THIS midiout[1] // here's a safe way to print out null pointeres #define MIGHT_BE_NULL(x) ((x==NULL)? "(null)" : x) -const char *sb16_midi_drv[4] = { - "dummy", - "default", - "file", - "file", -}; - // the device object bx_sb16_c::bx_sb16_c(void) @@ -209,12 +204,13 @@ bx_sb16_c::bx_sb16_c(void) mpu401.timer_handle = BX_NULL_TIMER_HANDLE; dsp.timer_handle = BX_NULL_TIMER_HANDLE; opl.timer_handle = BX_NULL_TIMER_HANDLE; - waveout = NULL; + waveout[0] = NULL; + waveout[1] = NULL; wavein = NULL; - midiout = NULL; + midiout[0] = NULL; + midiout[1] = NULL; midimode = 0; wavemode = 0; - wavefile = NULL; loglevel = 0; logfile = NULL; } @@ -223,8 +219,8 @@ bx_sb16_c::~bx_sb16_c(void) { closemidioutput(); - if (waveout != NULL) { - waveout->unregister_wave_callback(fmopl_callback_id); + if (BX_SB16_WAVEOUT1 != NULL) { + BX_SB16_WAVEOUT1->unregister_wave_callback(fmopl_callback_id); } closewaveoutput(); @@ -259,25 +255,35 @@ void bx_sb16_c::init(void) BX_SB16_THIS loglevel = SIM->get_param_num("loglevel", base)->get(); // always initialize lowlevel driver - BX_SB16_WAVEOUT = DEV_sound_get_waveout("default"); - if (BX_SB16_WAVEOUT == NULL) { + BX_SB16_WAVEOUT1 = DEV_sound_get_waveout("default"); + if (BX_SB16_WAVEOUT1 == NULL) { BX_PANIC(("Couldn't initialize waveout driver")); } + if (BX_SB16_THIS wavemode & 2) { + BX_SB16_WAVEOUT2 = DEV_sound_get_waveout("file"); + if (BX_SB16_WAVEOUT2 == NULL) { + BX_PANIC(("Couldn't initialize wave file driver")); + } + } BX_SB16_WAVEIN = DEV_sound_get_wavein("default"); if (BX_SB16_WAVEIN == NULL) { BX_PANIC(("Couldn't initialize wavein driver")); } - if ((BX_SB16_THIS midimode >= 0) && (BX_SB16_THIS midimode <= 3)) { - BX_SB16_MIDIOUT = DEV_sound_get_midiout(sb16_midi_drv[BX_SB16_THIS midimode]); - if (BX_SB16_MIDIOUT == NULL) { - BX_PANIC(("Couldn't initialize midiout driver")); + BX_SB16_MIDIOUT1 = DEV_sound_get_midiout("default"); + if (BX_SB16_MIDIOUT1 == NULL) { + BX_PANIC(("Couldn't initialize midiout driver")); + } + if (BX_SB16_THIS midimode & 2) { + BX_SB16_MIDIOUT2 = DEV_sound_get_midiout("file"); + if (BX_SB16_MIDIOUT2 == NULL) { + BX_PANIC(("Couldn't initialize midi file driver")); } } DSP.dma.chunk = new Bit8u[BX_SOUNDLOW_WAVEPACKETSIZE]; DSP.dma.chunkindex = 0; - DSP.outputinit = 1; + DSP.outputinit = (BX_SB16_THIS wavemode & 1); DSP.inputinit = 0; MPU.outputinit = 0; @@ -393,7 +399,7 @@ void bx_sb16_c::init(void) (BX_SB16_THISP, opl_timer, 80, 1, 0, "sb16.opl"); // opl timer: inactive, continuous, frequency 80us } - BX_SB16_THIS fmopl_callback_id = waveout->register_wave_callback(BX_SB16_THISP, fmopl_callback); + BX_SB16_THIS fmopl_callback_id = BX_SB16_WAVEOUT1->register_wave_callback(BX_SB16_THISP, fmopl_callback); writelog(MIDILOG(4), "Timers initialized, midi %d, dma %d, opl %d", MPU.timer_handle, DSP.timer_handle, OPL.timer_handle); @@ -474,8 +480,6 @@ void bx_sb16_c::register_state(void) new bx_shadow_num_c(dma, "channels", &DSP.dma.param.channels); new bx_shadow_num_c(dma, "format", &DSP.dma.param.format); new bx_shadow_num_c(dma, "volume", &DSP.dma.param.volume); - new bx_shadow_bool_c(dsp, "outputinit", &DSP.outputinit); - new bx_shadow_bool_c(dsp, "inputinit", &DSP.inputinit); new bx_shadow_data_c(list, "chunk", DSP.dma.chunk, BX_SOUNDLOW_WAVEPACKETSIZE); bx_list_c *csp = new bx_list_c(list, "csp_reg"); for (i=0; i<256; i++) { @@ -535,19 +539,30 @@ void bx_sb16_c::runtime_config(void) BX_SB16_THIS closemidioutput(); if (BX_SB16_THIS midi_changed & 1) { BX_SB16_THIS midimode = SIM->get_param_num("midimode", base)->get(); - if ((BX_SB16_THIS midimode >= 0) && (BX_SB16_THIS midimode <= 3)) { - BX_SB16_MIDIOUT = DEV_sound_get_midiout(sb16_midi_drv[BX_SB16_THIS midimode]); - if (BX_SB16_MIDIOUT == NULL) { - BX_PANIC(("Couldn't initialize midiout driver")); + if (BX_SB16_THIS midimode & 2) { + BX_SB16_MIDIOUT2 = DEV_sound_get_midiout("file"); + if (BX_SB16_MIDIOUT2 == NULL) { + BX_PANIC(("Couldn't initialize midi file driver")); } } } // writemidicommand() re-opens the output device / file on demand BX_SB16_THIS midi_changed = 0; } - if (BX_SB16_THIS wave_changed) { - BX_SB16_THIS closewaveoutput(); - BX_SB16_THIS wavemode = SIM->get_param_enum("wavemode", base)->get(); + if (BX_SB16_THIS wave_changed != 0) { + if (BX_SB16_THIS wavemode & 2) { + BX_SB16_THIS closewaveoutput(); + } + if (BX_SB16_THIS wave_changed & 1) { + BX_SB16_THIS wavemode = SIM->get_param_enum("wavemode", base)->get(); + DSP.outputinit = (BX_SB16_THIS wavemode & 1); + if (BX_SB16_THIS wavemode & 2) { + BX_SB16_WAVEOUT2 = DEV_sound_get_waveout("file"); + if (BX_SB16_WAVEOUT2 == NULL) { + BX_PANIC(("Couldn't initialize wave file driver")); + } + } + } // dsp_dma() re-opens the output file on demand BX_SB16_THIS wave_changed = 0; } @@ -569,9 +584,8 @@ void bx_sb16_c::dsp_dmatimer(void *this_ptr) // output buffer and the output functions are not ready yet // or if buffer is empty in input mode. - if ((BX_SB16_THIS wavemode != 1) || - ((This->dsp.dma.chunkindex + 1 < BX_SOUNDLOW_WAVEPACKETSIZE) && - (This->dsp.dma.count > 0))) { + if ((This->dsp.dma.chunkindex + 1 < BX_SOUNDLOW_WAVEPACKETSIZE) && + (This->dsp.dma.count > 0)) { if (((This->dsp.dma.output == 0) && (This->dsp.dma.chunkcount > 0)) || (This->dsp.dma.output == 1)) { if ((DSP.dma.param.bits == 8) || (BX_SB16_DMAH == 0)) { @@ -969,12 +983,7 @@ void bx_sb16_c::dsp_datawrite(Bit32u value) case 0x80: // 1,2: lo(silence) hi(silence) (len in samples) DSP.datain.getw(&length); - // only handled for VOC output so far - if (BX_SB16_THIS wavemode == 2) - { - Bit8u temparray[3] = { (Bit8u)(length & 0xff), (Bit8u)(length >> 8), (Bit8u)(DSP.dma.timeconstant >> 8) }; - DEV_soundmod_VOC_write_block(WAVEDATA, 3, 3, temparray, 0, NULL); - } + // TODO break; // 8-bit auto DAC DMA, highspeed @@ -1262,18 +1271,19 @@ void bx_sb16_c::dsp_dma(Bit8u command, Bit8u mode, Bit16u length, Bit8u comp) DSP.dma.param.format = issigned | ((comp & 7) << 1) | ((comp & 8) << 4); // write the output to the device/file - base = (bx_list_c*) SIM->get_param(BXPN_SOUND_SB16); if (DSP.dma.output == 1) { - if ((BX_SB16_THIS wavemode == 2) || (BX_SB16_THIS wavemode == 3)) { - bx_param_string_c *waveparam = SIM->get_param_string("wave", base); - if ((WAVEDATA == NULL) && (!waveparam->isempty())) { - WAVEDATA = fopen(waveparam->getptr(), "wb"); - if (WAVEDATA == NULL) { - writelog(WAVELOG(2), "Error opening file %s. Wavemode disabled.", + if (BX_SB16_THIS wavemode & 2) { + if ((DSP.outputinit & 2) == 0) { + base = (bx_list_c*) SIM->get_param(BXPN_SOUND_SB16); + bx_param_string_c *waveparam = SIM->get_param_string("wave", base); + if (BX_SB16_WAVEOUT2->openwaveoutput(waveparam->getptr()) == BX_SOUNDLOW_OK) + DSP.outputinit |= 2; + else + DSP.outputinit &= ~2; + if (((DSP.outputinit & BX_SB16_THIS wavemode) & 2) == 0) { + writelog(WAVELOG(2), "Error opening file %s. Wave file output disabled.", waveparam->getptr()); - BX_SB16_THIS wavemode = 0; - } else if (BX_SB16_THIS wavemode == 2) { - DEV_soundmod_VOC_init_file(WAVEDATA); + BX_SB16_THIS wavemode = DSP.outputinit; } } } @@ -1285,7 +1295,6 @@ void bx_sb16_c::dsp_dma(Bit8u command, Bit8u mode, Bit16u length, Bit8u comp) if (DSP.inputinit == 0) { ret = BX_SB16_WAVEIN->openwaveinput(SIM->get_param_string(BXPN_SOUND_WAVEIN)->getptr(), sb16_adc_handler); if (ret != BX_SOUNDLOW_OK) { - BX_SB16_THIS wavemode = 0; writelog(WAVELOG(2), "Error: Could not open wave input device."); } else { DSP.inputinit = 1; @@ -1294,7 +1303,6 @@ void bx_sb16_c::dsp_dma(Bit8u command, Bit8u mode, Bit16u length, Bit8u comp) if (DSP.inputinit == 1) { ret = BX_SB16_WAVEIN->startwaverecord(&DSP.dma.param); if (ret != BX_SOUNDLOW_OK) { - BX_SB16_THIS wavemode = 0; writelog(WAVELOG(2), "Error: Could not start wave record."); } } @@ -1414,35 +1422,12 @@ void bx_sb16_c::dsp_sendwavepacket() if (DSP.dma.chunkindex == 0) return; - switch (BX_SB16_THIS wavemode) { - case 1: - BX_SB16_WAVEOUT->sendwavepacket(DSP.dma.chunkindex, DSP.dma.chunk, &DSP.dma.param); - break; - case 3: - fwrite(DSP.dma.chunk, 1, DSP.dma.chunkindex, WAVEDATA); - break; - case 2: - Bit8u temparray[12] = - { (Bit8u)(DSP.dma.param.samplerate & 0xff), (Bit8u)(DSP.dma.param.samplerate >> 8), 0, 0, - (Bit8u)DSP.dma.param.bits, DSP.dma.param.channels, 0, 0, 0, 0, 0, 0 }; - switch ((DSP.dma.param.format >> 1) & 7) { - case 2: - temparray[6] = 3; - break; - case 3: - temparray[6] = 2; - break; - case 4: - temparray[6] = 1; - break; - } - if (DSP.dma.param.bits == 16) - temparray[6] = 4; - - DEV_soundmod_VOC_write_block(WAVEDATA, 9, 12, temparray, DSP.dma.chunkindex, DSP.dma.chunk); - break; + if (BX_SB16_THIS wavemode & 1) { + BX_SB16_WAVEOUT1->sendwavepacket(DSP.dma.chunkindex, DSP.dma.chunk, &DSP.dma.param); + } + if (BX_SB16_THIS wavemode & 2) { + BX_SB16_WAVEOUT2->sendwavepacket(DSP.dma.chunkindex, DSP.dma.chunk, &DSP.dma.param); } - DSP.dma.chunkindex = 0; } @@ -1476,14 +1461,8 @@ void bx_sb16_c::dsp_dmadone() if ((DSP.dma.output == 1) && (DSP.dma.mode != 2)) { dsp_sendwavepacket(); // flush the output - - if (BX_SB16_THIS wavemode > 1) { - fflush(WAVEDATA); - } } else if ((DSP.dma.output == 0) && (DSP.dma.mode != 2)) { - if (BX_SB16_THIS wavemode == 1) { - BX_SB16_WAVEIN->stopwaverecord(); - } + BX_SB16_WAVEIN->stopwaverecord(); } // generate the appropriate IRQ @@ -1900,8 +1879,8 @@ Bit32u bx_sb16_c::mpu_status() Bit32u result = 0; if ((MPU.datain.full() == 1) || - ((BX_SB16_THIS midimode == 1) && - (BX_SB16_MIDIOUT->midiready() == BX_SOUNDLOW_ERR))) + ((BX_SB16_THIS midimode & 1) && + (BX_SB16_MIDIOUT1->midiready() == BX_SOUNDLOW_ERR))) result |= 0x40; // output not ready if (MPU.dataout.empty() == 1) result |= 0x80; // no input available @@ -2398,25 +2377,35 @@ void bx_sb16_c::writemidicommand(int command, int length, Bit8u data[]) /* Initialize output device/file if necessary and not done yet */ if (BX_SB16_THIS midimode > 0) { - if (MPU.outputinit != 1) { + if ((MPU.outputinit & BX_SB16_THIS midimode) != BX_SB16_THIS midimode) { writelog(MIDILOG(4), "Initializing Midi output."); - if (BX_SB16_THIS midimode == 1) { + if (BX_SB16_THIS midimode & 1) { midiparam = SIM->get_param_string(BXPN_SOUND_MIDIOUT); - } else { + if (BX_SB16_MIDIOUT1->openmidioutput(midiparam->getptr()) == BX_SOUNDLOW_OK) + MPU.outputinit |= 1; + else + MPU.outputinit &= ~1; + } + if (BX_SB16_THIS midimode & 2) { bx_list_c *base = (bx_list_c*) SIM->get_param(BXPN_SOUND_SB16); midiparam = SIM->get_param_string("midi", base); + if (BX_SB16_MIDIOUT2->openmidioutput(midiparam->getptr()) == BX_SOUNDLOW_OK) + MPU.outputinit |= 2; + else + MPU.outputinit &= ~2; } - if (BX_SB16_MIDIOUT->openmidioutput(midiparam->getptr()) == BX_SOUNDLOW_OK) - MPU.outputinit = 1; - else - MPU.outputinit = 0; - if (MPU.outputinit != 1) { + if ((MPU.outputinit & BX_SB16_THIS midimode) != BX_SB16_THIS midimode) { writelog(MIDILOG(2), "Error: Couldn't open midi output. Midi disabled."); - BX_SB16_THIS midimode = 0; + BX_SB16_THIS midimode = MPU.outputinit; return; } } - BX_SB16_MIDIOUT->sendmidicommand(deltatime, command, length, data); + if (BX_SB16_THIS midimode & 1) { + BX_SB16_MIDIOUT1->sendmidicommand(deltatime, command, length, data); + } + if (BX_SB16_THIS midimode & 2) { + BX_SB16_MIDIOUT2->sendmidicommand(deltatime, command, length, data); + } } } @@ -2549,39 +2538,28 @@ void bx_sb16_c::midiremapprogram(int channel) void bx_sb16_c::closemidioutput() { if (BX_SB16_THIS midimode > 0) { - if (MPU.outputinit != 0) { - BX_SB16_MIDIOUT->closemidioutput(); - MPU.outputinit = 0; + if (MPU.outputinit & 1) { + BX_SB16_MIDIOUT1->closemidioutput(); + MPU.outputinit &= ~1; + } + if (MPU.outputinit & 2) { + BX_SB16_MIDIOUT2->closemidioutput(); + MPU.outputinit &= ~2; } } } void bx_sb16_c::closewaveoutput() { - switch (BX_SB16_THIS wavemode) { - case 1: - // nothing to do here yet - break; - case 2: - if (WAVEDATA != NULL) - finishvocfile(); - case 3: - if (WAVEDATA != NULL) - fclose(WAVEDATA); - WAVEDATA = NULL; - break; + if (BX_SB16_THIS wavemode > 0) { + if (DSP.outputinit & 2) { + BX_SB16_WAVEOUT2->closewaveoutput(); + DSP.outputinit &= ~2; + } } } -/* Handler for the voc file output */ - -// close the voc file -void bx_sb16_c::finishvocfile() -{ - fputc(0, WAVEDATA); // blocktype 0: end block -} - // static IO port read callback handler // redirects to non-static class handler to avoid virtual functions @@ -3121,7 +3099,7 @@ Bit64s bx_sb16_c::sb16_param_handler(bx_param_c *param, int set, Bit64s val) } } else if (!strcmp(pname, "wavemode")) { if (val != BX_SB16_THIS wavemode) { - BX_SB16_THIS wave_changed = 1; + BX_SB16_THIS wave_changed |= 1; } } else { BX_PANIC(("sb16_param_handler called with unexpected parameter '%s'", pname)); @@ -3137,7 +3115,7 @@ const char* bx_sb16_c::sb16_param_string_handler(bx_param_string_c *param, int s if ((set) && (strcmp(val, oldval))) { const char *pname = param->get_name(); if (!strcmp(pname, "wave")) { - BX_SB16_THIS wave_changed = 1; + BX_SB16_THIS wave_changed |= 2; } else if (!strcmp(pname, "midi")) { BX_SB16_THIS midi_changed |= 2; } else if (!strcmp(pname, "log")) { diff --git a/bochs/iodev/sound/sb16.h b/bochs/iodev/sound/sb16.h index 0f810371b..ca742f409 100644 --- a/bochs/iodev/sound/sb16.h +++ b/bochs/iodev/sound/sb16.h @@ -152,13 +152,12 @@ public: private: int midimode, wavemode, loglevel; - bx_bool wave_changed; - Bit8u midi_changed; + Bit8u midi_changed, wave_changed; Bit32u dmatimer; - FILE *logfile, *wavefile; // the output files or devices - bx_soundlow_waveout_c *waveout; // waveout support + FILE *logfile; + bx_soundlow_waveout_c *waveout[2]; // waveout support bx_soundlow_wavein_c *wavein; // wavein support - bx_soundlow_midiout_c *midiout; // midiout support + bx_soundlow_midiout_c *midiout[2]; // midiout support int currentirq; int currentdma8; int currentdma16; @@ -175,7 +174,7 @@ private: int timer_handle, current_timer; // no. of delta times passed Bit32u last_delta_time; // timer value at last command - bx_bool outputinit; + Bit8u outputinit; } mpu401; // the DSP variables @@ -208,7 +207,7 @@ private: Bit16u blocklength; } dma; int timer_handle; // handle for the DMA timer - bx_bool outputinit; // have the lowlevel output been initialized + Bit8u outputinit; // have the lowlevel output been initialized bx_bool inputinit; // have the lowlevel input been initialized } dsp; @@ -297,7 +296,6 @@ private: BX_SB16_SMF void closemidioutput(); // close midi file / device BX_SB16_SMF void closewaveoutput(); // close wave file - BX_SB16_SMF void finishvocfile(); // close voc file BX_SB16_SMF void create_logfile(); /* The port IO multiplexer functions */