From: <col...@us...> - 2004-05-21 16:57:56
|
Update of /cvsroot/exult/exult/audio/midi_drivers In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30280/audio/midi_drivers Modified Files: fmopl.cc fmopl_midi.cc fmopl_midi.h win_midiout.cc win_midiout.h Log Message: * various files: Some minor extremely changes that to compile for PocketPC Index: fmopl.cc =================================================================== RCS file: /cvsroot/exult/exult/audio/midi_drivers/fmopl.cc,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- fmopl.cc 7 Aug 2002 15:02:16 -0000 1.2 +++ fmopl.cc 21 May 2004 16:57:13 -0000 1.3 @@ -38,8 +38,10 @@ #include <iostream> #include "fmopl.h" +#ifndef UNDER_CE using std::malloc; using std::free; +#endif #ifndef PI #define PI 3.14159265358979323846 Index: fmopl_midi.cc =================================================================== RCS file: /cvsroot/exult/exult/audio/midi_drivers/fmopl_midi.cc,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- fmopl_midi.cc 8 Oct 2002 00:32:47 -0000 1.3 +++ fmopl_midi.cc 21 May 2004 16:57:13 -0000 1.4 @@ -24,6 +24,7 @@ #include <string> +#include "Audio.h" #include "fmopl_midi.h" #include "fmopldrv.h" #include "xmidi.h" @@ -255,19 +256,28 @@ void FMOpl_Midi::init_device() { string s; + + Audio *audio = Audio::get_ptr(); // Dual Opl mode - config->value("config/audio/midi/dual_opl",s,"yes"); - if (s == "yes") dual = true; - else { - s = "no"; - dual = false; - } + if (audio->is_stereo()) + { + config->value("config/audio/midi/dual_opl",s,"yes"); + if (s == "yes") dual = true; + else { + s = "no"; + dual = false; + } - std::cout << "Dual OPL mode: " << s << endl; + std::cout << "Dual OPL mode: " << s << endl; - // Make sure it's in the config - config->set("config/audio/midi/dual_opl",s,true); + // Make sure it's in the config + config->set("config/audio/midi/dual_opl",s,true); + } + else + { + dual = false; + } // Now setup all our settings playing = false; @@ -279,13 +289,13 @@ // Create Left buffer = new RingBuffer16(44096); opl = new OplDriver; - opl->open(22050); + opl->open(audio->get_sample_rate()); // Create right, if required if (dual) { buffer_right = new RingBuffer16(44096); opl_right = new OplDriver; - opl_right->open(22050); + opl_right->open(audio->get_sample_rate()); } else { opl_right = 0; @@ -314,7 +324,7 @@ // Hook the process #ifdef PENTAGRAM - Mix_OpenAudio(22050, AUDIO_S16SYS, 2, 4096); + Mix_OpenAudio(audio->get_sample_rate(), AUDIO_S16SYS, 2, 4096); #endif Mix_HookMusic (mixer_hook_static, (void*) this); } @@ -364,19 +374,31 @@ } } -uint32 FMOpl_Midi::GenerateSamples(uint32 count_required) { +uint32 FMOpl_Midi::GenerateSamples(uint32 count_required, uint32 sample_rate) { uint32 amount_generated = 0; + uint32 inc = 1; + uint32 gen = OPL_NUM_SAMPLES_PER_PASS; + + if (sample_rate == 44100) gen *= 2; + else if (sample_rate == 11025) inc *= 2; + else if (sample_rate != 22050) + { + // Approximate it! + inc = 6; + gen = (OPL_TIME_PER_PASS*sample_rate)/(120*OPL_TICK_MULTIPLIER*inc); + } + while (amount_generated < count_required) { HandleStop(); PlayNotes(); HandlePlay(); - GetSamples(OPL_NUM_SAMPLES_PER_PASS); - amount_generated += OPL_NUM_SAMPLES_PER_PASS; - wmoClockIncTime(1); + GetSamples(gen); + amount_generated += gen; + wmoClockIncTime(inc); } return amount_generated - count_required; @@ -719,8 +741,13 @@ // Looks like we are shutting down if (!is_available) return; + Audio *audio = Audio::get_ptr(); + // Generate the music - generate_rem = GenerateSamples(len/4-generate_rem); + if (audio->is_stereo()) + generate_rem = GenerateSamples(len/4-generate_rem, audio->get_sample_rate()); + else + generate_rem = GenerateSamples(len/2-generate_rem, audio->get_sample_rate()); // Copy the buffers into SDL_Mixer's buffer sint16* stream16 = (sint16*) stream; @@ -732,7 +759,10 @@ int i = 0; // Lock it (Left or Mono) - buffer->LockRead(len/4, b1, size1, b2, size2); + if (audio->is_stereo()) + buffer->LockRead(len/4, b1, size1, b2, size2); + else + buffer->LockRead(len/2, b1, size1, b2, size2); sint16* b1_r = b1; sint16* b2_r = b2; @@ -744,14 +774,28 @@ // Copy the samples if (global_volume >= 255) { - for (i = 0; i < size1; ++i) { - stream16[i<<1] = b1[i]; - stream16[(i<<1)+1] = b1_r[i]; + + if (audio->is_stereo()) { + + for (i = 0; i < size1; ++i) { + stream16[i<<1] = b1[i]; + stream16[(i<<1)+1] = b1_r[i]; + } + + for (i = 0; i < size2; ++i) { + stream16[(i+size1)<<1] = b2[i]; + stream16[((i+size1)<<1)+1] = b2_r[i]; + } } + else { - for (i = 0; i < size2; ++i) { - stream16[(i+size1)<<1] = b2[i]; - stream16[((i+size1)<<1)+1] = b2_r[i]; + for (i = 0; i < size1; ++i) { + stream16[i] = b1[i]; + } + + for (i = 0; i < size2; ++i) { + stream16[i+size1] = b2[i]; + } } } else if (global_volume && dual) { @@ -766,12 +810,25 @@ } } else if (global_volume) { - for (i = 0; i < size1; ++i) { - stream16[(i<<1)+1] = stream16[i<<1] = (b1[i]*global_volume)/255; + if (audio->is_stereo()) { + + for (i = 0; i < size1; ++i) { + stream16[(i<<1)+1] = stream16[i<<1] = (b1[i]*global_volume)/255; + } + + for (i = 0; i < size2; ++i) { + stream16[((i+size1)<<1)+1] = stream16[(i+size1)<<1] = (b2[i]*global_volume)/255; + } } + else { - for (i = 0; i < size2; ++i) { - stream16[((i+size1)<<1)+1] = stream16[(i+size1)<<1] = (b2[i]*global_volume)/255; + for (i = 0; i < size1; ++i) { + stream16[i] = (b1[i]*global_volume)/255; + } + + for (i = 0; i < size2; ++i) { + stream16[i+size1] = (b2[i]*global_volume)/255; + } } } @@ -916,10 +973,10 @@ repeat -at 22050 KHz there are 735 samples for every 4 ticks. -at 22050 KHz there are 147 samples for every 4/5 ticks -at 22050 KHz there are 98 samples for every 8/15 ticks -at 22050 KHz there are 49 samples for every 4/15 ticks +at audio->get_sample_rate() KHz there are 735 samples for every 4 ticks. +at audio->get_sample_rate() KHz there are 147 samples for every 4/5 ticks +at audio->get_sample_rate() KHz there are 98 samples for every 8/15 ticks +at audio->get_sample_rate() KHz there are 49 samples for every 4/15 ticks The wmo clock 'should' be based on the 98 samples number. For every 98 samples, we increment the clock 15 units. Working out the midi tick is unit/8. The unit Index: fmopl_midi.h =================================================================== RCS file: /cvsroot/exult/exult/audio/midi_drivers/fmopl_midi.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- fmopl_midi.h 8 Oct 2002 00:32:47 -0000 1.3 +++ fmopl_midi.h 21 May 2004 16:57:13 -0000 1.4 @@ -137,7 +137,7 @@ void HandlePlay(); void HandleStop(); - uint32 GenerateSamples(uint32 count_required); + uint32 GenerateSamples(uint32 count_required, uint32 sample_rate); void GetSamples(uint32 samples); Index: win_midiout.cc =================================================================== RCS file: /cvsroot/exult/exult/audio/midi_drivers/win_midiout.cc,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- win_midiout.cc 8 Oct 2002 00:32:47 -0000 1.32 +++ win_midiout.cc 21 May 2004 16:57:13 -0000 1.33 @@ -22,7 +22,7 @@ //Windows-specific code -#ifdef WIN32 +#if defined(WIN32) && !defined(UNDER_CE) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN Index: win_midiout.h =================================================================== RCS file: /cvsroot/exult/exult/audio/midi_drivers/win_midiout.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- win_midiout.h 8 Oct 2002 00:32:47 -0000 1.19 +++ win_midiout.h 21 May 2004 16:57:13 -0000 1.20 @@ -19,7 +19,7 @@ #ifndef WIN_MIDIOUT_H #define WIN_MIDIOUT_H -#ifdef WIN32 +#if defined(WIN32) && !defined(UNDER_CE) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN |