diff options
-rw-r--r-- | backends/fs/fs.h | 11 | ||||
-rw-r--r-- | backends/fs/posix/posix-fs.cpp | 1 | ||||
-rw-r--r-- | backends/fs/windows/windows-fs.cpp | 16 | ||||
-rw-r--r-- | backends/midi/adlib.cpp | 195 | ||||
-rw-r--r-- | backends/midi/alsa.cpp | 20 | ||||
-rw-r--r-- | backends/midi/coreaudio.cpp | 15 | ||||
-rw-r--r-- | backends/midi/null.cpp | 6 | ||||
-rw-r--r-- | backends/midi/quicktime.cpp | 17 | ||||
-rw-r--r-- | backends/midi/windows.cpp | 22 | ||||
-rw-r--r-- | backends/null/null.cpp | 4 | ||||
-rw-r--r-- | backends/sdl/fb2opengl.h | 659 | ||||
-rw-r--r-- | backends/sdl/sdl-common.cpp | 217 | ||||
-rw-r--r-- | backends/sdl/sdl-common.h | 18 | ||||
-rw-r--r-- | backends/sdl/sdl.cpp | 28 | ||||
-rw-r--r-- | backends/sdl/sdl_gl.cpp | 123 | ||||
-rw-r--r-- | sound/fmopl.cpp | 757 | ||||
-rw-r--r-- | sound/fmopl.h | 18 | ||||
-rw-r--r-- | sound/mididrv.cpp | 30 | ||||
-rw-r--r-- | sound/mididrv.h | 6 | ||||
-rw-r--r-- | sound/midistreamer.cpp | 35 | ||||
-rw-r--r-- | sound/midistreamer.h | 4 | ||||
-rw-r--r-- | sound/mixer.cpp | 123 | ||||
-rw-r--r-- | sound/mixer.h | 84 | ||||
-rw-r--r-- | sound/mpu401.cpp | 65 | ||||
-rw-r--r-- | sound/mpu401.h | 4 |
25 files changed, 1166 insertions, 1312 deletions
diff --git a/backends/fs/fs.h b/backends/fs/fs.h index abade8f189..a001fb202c 100644 --- a/backends/fs/fs.h +++ b/backends/fs/fs.h @@ -148,14 +148,12 @@ public: */ class FSList : ScummVM::List<FilesystemNode *> { public: - ~FSList() - { + ~FSList() { for (int i = 0; i < _size; i++) delete _data[i]; } - void push_back(const FilesystemNode& element) - { + void push_back(const FilesystemNode &element) { ensureCapacity(_size + 1); // Determine where to insert the item. // TODO this is inefficient, should use binary search instead @@ -163,13 +161,12 @@ public: while (i < _size && *_data[i] < element) i++; if (i < _size) - memmove(&_data[i+1], &_data[i], (_size - i) * sizeof(FilesystemNode *)); + memmove(&_data[i + 1], &_data[i], (_size - i) * sizeof(FilesystemNode *)); _data[i] = element.clone(); _size++; } - const FilesystemNode& operator [](int idx) const - { + const FilesystemNode& operator [](int idx) const { assert(idx >= 0 && idx < _size); return *_data[idx]; } diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp index 23ad5786fe..eec49da03e 100644 --- a/backends/fs/posix/posix-fs.cpp +++ b/backends/fs/posix/posix-fs.cpp @@ -141,7 +141,6 @@ const char *lastPathComponent(const ScummVM::String &str) { } FilesystemNode *POSIXFilesystemNode::parent() const { - POSIXFilesystemNode *p = new POSIXFilesystemNode(); // Root node is its own parent. Still we can't just return this diff --git a/backends/fs/windows/windows-fs.cpp b/backends/fs/windows/windows-fs.cpp index 2cdb0d625c..cb7974a48e 100644 --- a/backends/fs/windows/windows-fs.cpp +++ b/backends/fs/windows/windows-fs.cpp @@ -186,22 +186,22 @@ FSList *WindowsFilesystemNode::listDir(ListMode mode) const { } const char *lastPathComponent(const ScummVM::String &str) { - const char *start = str.c_str(); - const char *cur = start + str.size() - 2; + const char *start = str.c_str(); + const char *cur = start + str.size() - 2; - while (cur > start && *cur != '\\') { - --cur; - } + while (cur > start && *cur != '\\') { + --cur; + } - return cur+1; + return cur + 1; } FilesystemNode *WindowsFilesystemNode::parent() const { assert(_isValid || _isPseudoRoot); WindowsFilesystemNode *p = new WindowsFilesystemNode(); if (!_isPseudoRoot && _path.size() > 3) { - const char *start = _path.c_str(); - const char *end = lastPathComponent(_path); + const char *start = _path.c_str(); + const char *end = lastPathComponent(_path); p->_path = String(start, end - start); p->_isValid = true; diff --git a/backends/midi/adlib.cpp b/backends/midi/adlib.cpp index 3cdddb5f92..873fe6007b 100644 --- a/backends/midi/adlib.cpp +++ b/backends/midi/adlib.cpp @@ -431,8 +431,7 @@ const byte volume_table[] = { 62, 63, 63, 63 }; -static int lookup_volume(int a, int b) -{ +static int lookup_volume(int a, int b) { if (b == 0) return 0; @@ -458,8 +457,7 @@ static int lookup_volume(int a, int b) } } -static void create_lookup_table() -{ +static void create_lookup_table() { int i, j; int sum; @@ -476,8 +474,6 @@ static void create_lookup_table() typedef void TimerCallback (void *); - - //////////////////////////////////////// // // Adlib MIDI driver @@ -570,34 +566,28 @@ private: static void premix_proc(void *param, int16 *buf, uint len); }; - - // MidiChannel method implementations void AdlibPart::init (MidiDriver_ADLIB *owner, byte channel) { _owner = owner; _channel = channel; - } -MidiDriver *AdlibPart::device() -{ +MidiDriver *AdlibPart::device() { return _owner; } -void AdlibPart::noteOff (byte note) -{ +void AdlibPart::noteOff (byte note) { _owner->part_key_off (this, note); } -void AdlibPart::noteOn (byte note, byte velocity) -{ +void AdlibPart::noteOn (byte note, byte velocity) { _owner->part_key_on (this, note, velocity); } -void AdlibPart::programChange (byte program) -{ - if (program > 127) return; +void AdlibPart::programChange (byte program) { + if (program > 127) + return; uint i; uint count = 0; @@ -609,8 +599,7 @@ void AdlibPart::programChange (byte program) _owner->part_set_instrument (this, (AdlibInstrument *) &map_gm_to_fm [program]); } -void AdlibPart::pitchBend (int16 bend) -{ +void AdlibPart::pitchBend (int16 bend) { MidiChannelAdl *mc; _pitchbend = bend; @@ -620,8 +609,7 @@ void AdlibPart::pitchBend (int16 bend) } } -void AdlibPart::controlChange (byte control, byte value) -{ +void AdlibPart::controlChange (byte control, byte value) { switch (control) { case 1: modulationWheel (value); break; case 7: volume (value); break; @@ -640,8 +628,7 @@ void AdlibPart::controlChange (byte control, byte value) } } -void AdlibPart::modulationWheel (byte value) -{ +void AdlibPart::modulationWheel (byte value) { MidiChannelAdl *mc; _modwheel = value; @@ -653,8 +640,7 @@ void AdlibPart::modulationWheel (byte value) } } -void AdlibPart::volume (byte value) -{ +void AdlibPart::volume (byte value) { MidiChannelAdl *mc; _vol_eff = value; @@ -666,8 +652,7 @@ void AdlibPart::volume (byte value) } } -void AdlibPart::pitchBendFactor (byte value) -{ +void AdlibPart::pitchBendFactor (byte value) { MidiChannelAdl *mc; _pitchbend_factor = value; @@ -677,8 +662,7 @@ void AdlibPart::pitchBendFactor (byte value) } } -void AdlibPart::detune (byte value) -{ +void AdlibPart::detune (byte value) { MidiChannelAdl *mc; _detune_eff = value; @@ -688,13 +672,11 @@ void AdlibPart::detune (byte value) } } -void AdlibPart::priority (byte value) -{ +void AdlibPart::priority (byte value) { _pri_eff = value; } -void AdlibPart::sustain (bool value) -{ +void AdlibPart::sustain (bool value) { MidiChannelAdl *mc; _pedal = value; @@ -706,23 +688,18 @@ void AdlibPart::sustain (bool value) } } -void AdlibPart::allNotesOff() -{ +void AdlibPart::allNotesOff() { while (_mc) _owner->mc_off (_mc); } -void AdlibPart::sysEx_customInstrument (uint32 type, byte *instr) -{ +void AdlibPart::sysEx_customInstrument (uint32 type, byte *instr) { _owner->sysEx_customInstrument (this, type, instr); } - - // MidiDriver method implementations -MidiDriver_ADLIB::MidiDriver_ADLIB() -{ +MidiDriver_ADLIB::MidiDriver_ADLIB() { uint i; for (i = 0; i < ARRAYSIZE(_parts); ++i) { _parts[i].init (this, i); @@ -731,8 +708,7 @@ MidiDriver_ADLIB::MidiDriver_ADLIB() _isOpen = false; } -int MidiDriver_ADLIB::open () -{ +int MidiDriver_ADLIB::open() { if (_isOpen) return MERR_ALREADY_OPEN; _isOpen = true; @@ -765,8 +741,7 @@ int MidiDriver_ADLIB::open () return 0; } -void MidiDriver_ADLIB::close() -{ +void MidiDriver_ADLIB::close() { uint i; for (i = 0; i < ARRAYSIZE(_midi_channels); ++i) { if (_midi_channels [i]._part) @@ -779,8 +754,7 @@ void MidiDriver_ADLIB::close() _isOpen = false; } -void MidiDriver_ADLIB::send (uint32 b) -{ +void MidiDriver_ADLIB::send (uint32 b) { //byte param3 = (byte) ((b >> 24) & 0xFF); byte param2 = (byte) ((b >> 16) & 0xFF); byte param1 = (byte) ((b >> 8) & 0xFF); @@ -790,13 +764,16 @@ void MidiDriver_ADLIB::send (uint32 b) switch (cmd) { case 0x80:// Note Off - part_key_off (part, param1); break; + part_key_off (part, param1); + break; case 0x90: // Note On - part_key_on (part, param1, param2); break; + part_key_on (part, param1, param2); + break; case 0xA0: // Aftertouch break; // Not supported. case 0xB0: // Control Change - part->controlChange (param1, param2); break; + part->controlChange (param1, param2); + break; case 0xC0: // Program Change if (chan != 9) part->programChange (param1); @@ -804,7 +781,8 @@ void MidiDriver_ADLIB::send (uint32 b) case 0xD0: // Channel Pressure break; // Not supported. case 0xE0: // Pitch Bend - part->pitchBend ((param1 | (param2 << 7)) - 0x2000); break; + part->pitchBend ((param1 | (param2 << 7)) - 0x2000); + break; case 0xF0: // SysEx // We should never get here! SysEx information has to be // sent via high-level semantic methods. @@ -816,8 +794,7 @@ void MidiDriver_ADLIB::send (uint32 b) } } -uint32 MidiDriver_ADLIB::property (int prop, uint32 param) -{ +uint32 MidiDriver_ADLIB::property (int prop, uint32 param) { switch (prop) { case PROP_SMALLHEADER: // Indicates older game, use different operator volume algorithm _game_SmallHeader = (param > 0); @@ -827,42 +804,37 @@ uint32 MidiDriver_ADLIB::property (int prop, uint32 param) return 0; } -void MidiDriver_ADLIB::setPitchBendRange (byte channel, uint range) -{ +void MidiDriver_ADLIB::setPitchBendRange (byte channel, uint range) { MidiChannelAdl *mc; AdlibPart *part = &_parts [channel]; part->_pitchbend_factor = range; for (mc = part->_mc; mc; mc = mc->_next) { adlib_note_on(mc->_channel, mc->_note + part->_transpose_eff, - (part->_pitchbend * part->_pitchbend_factor >> 6) + part->_detune_eff); + (part->_pitchbend * part->_pitchbend_factor >> 6) + part->_detune_eff); } } -void MidiDriver_ADLIB::sysEx_customInstrument (byte channel, uint32 type, byte *instr) -{ +void MidiDriver_ADLIB::sysEx_customInstrument (byte channel, uint32 type, byte *instr) { sysEx_customInstrument (&_parts [channel], type, instr); } -void MidiDriver_ADLIB::sysEx_customInstrument (AdlibPart *part, uint32 type, byte *instr) -{ +void MidiDriver_ADLIB::sysEx_customInstrument (AdlibPart *part, uint32 type, byte *instr) { if (type == 'ADL ') { AdlibInstrument *i = &part->_part_instr; memcpy(i, instr, sizeof(AdlibInstrument)); } } -void MidiDriver_ADLIB::setTimerCallback (void *timer_param, void (*timer_proc) (void *)) -{ +void MidiDriver_ADLIB::setTimerCallback (void *timer_param, void (*timer_proc) (void *)) { _timer_proc = (TimerCallback *) timer_proc; _timer_param = timer_param; } -MidiChannel *MidiDriver_ADLIB::allocateChannel() -{ +MidiChannel *MidiDriver_ADLIB::allocateChannel() { AdlibPart *part; uint i; - + for (i = 0; i < ARRAYSIZE(_parts); ++i) { part = &_parts[i]; if (!part->_allocated) { @@ -873,22 +845,17 @@ MidiChannel *MidiDriver_ADLIB::allocateChannel() return NULL; } -MidiDriver *MidiDriver_ADLIB_create() -{ +MidiDriver *MidiDriver_ADLIB_create() { return new MidiDriver_ADLIB(); } - - // All the code brought over from IMuseAdlib -void MidiDriver_ADLIB::premix_proc(void *param, int16 *buf, uint len) -{ +void MidiDriver_ADLIB::premix_proc(void *param, int16 *buf, uint len) { ((MidiDriver_ADLIB *) param)->generate_samples(buf, len); } -void MidiDriver_ADLIB::adlib_write(byte port, byte value) -{ +void MidiDriver_ADLIB::adlib_write(byte port, byte value) { if (_adlib_reg_cache[port] == value) return; _adlib_reg_cache[port] = value; @@ -896,8 +863,7 @@ void MidiDriver_ADLIB::adlib_write(byte port, byte value) OPLWriteReg(_opl, port, value); } -void MidiDriver_ADLIB::generate_samples(int16 *data, int len) -{ +void MidiDriver_ADLIB::generate_samples(int16 *data, int len) { int step; if (!_opl) { @@ -921,13 +887,11 @@ void MidiDriver_ADLIB::generate_samples(int16 *data, int len) } while (len -= step); } -void MidiDriver_ADLIB::reset_tick() -{ +void MidiDriver_ADLIB::reset_tick() { _next_tick = 88; } -void MidiDriver_ADLIB::on_timer() -{ +void MidiDriver_ADLIB::on_timer() { MidiChannelAdl *mc; int i; @@ -952,8 +916,7 @@ void MidiDriver_ADLIB::on_timer() } } -void MidiDriver_ADLIB::mc_off(MidiChannelAdl * mc2) -{ +void MidiDriver_ADLIB::mc_off(MidiChannelAdl * mc2) { MidiChannelAdl *mc = (MidiChannelAdl *)mc2, *tmp; adlib_key_off(mc->_channel); @@ -969,8 +932,7 @@ void MidiDriver_ADLIB::mc_off(MidiChannelAdl * mc2) mc->_part = NULL; } -void MidiDriver_ADLIB::mc_inc_stuff(MidiChannelAdl *mc, Struct10 * s10, Struct11 * s11) -{ +void MidiDriver_ADLIB::mc_inc_stuff(MidiChannelAdl *mc, Struct10 *s10, Struct11 *s11) { byte code; AdlibPart *part = mc->_part; @@ -981,15 +943,15 @@ void MidiDriver_ADLIB::mc_inc_stuff(MidiChannelAdl *mc, Struct10 * s10, Struct11 case 0: mc->_vol_2 = s10->start_value + s11->modify_val; adlib_set_param(mc->_channel, 0, - volume_table[lookup_table[mc->_vol_2] - [part->_vol_eff >> 2]]); + volume_table[lookup_table[mc->_vol_2] + [part->_vol_eff >> 2]]); break; case 13: mc->_vol_1 = s10->start_value + s11->modify_val; if (mc->_twochan) { adlib_set_param(mc->_channel, 13, - volume_table[lookup_table[mc->_vol_1] - [part->_vol_eff >> 2]]); + volume_table[lookup_table[mc->_vol_1] + [part->_vol_eff >> 2]]); } else { adlib_set_param(mc->_channel, 13, mc->_vol_1); } @@ -1002,7 +964,7 @@ void MidiDriver_ADLIB::mc_inc_stuff(MidiChannelAdl *mc, Struct10 * s10, Struct11 break; default: adlib_set_param(mc->_channel, s11->param, - s10->start_value + s11->modify_val); + s10->start_value + s11->modify_val); break; } } @@ -1011,14 +973,12 @@ void MidiDriver_ADLIB::mc_inc_stuff(MidiChannelAdl *mc, Struct10 * s10, Struct11 adlib_key_onoff(mc->_channel); } -void MidiDriver_ADLIB::adlib_key_off(int chan) -{ +void MidiDriver_ADLIB::adlib_key_off(int chan){ byte port = chan + 0xB0; adlib_write(port, adlib_read(port) & ~0x20); } -byte MidiDriver_ADLIB::struct10_ontimer(Struct10 * s10, Struct11 * s11) -{ +byte MidiDriver_ADLIB::struct10_ontimer(Struct10 *s10, Struct11 *s11) { byte result = 0; int i; @@ -1061,8 +1021,7 @@ byte MidiDriver_ADLIB::struct10_ontimer(Struct10 * s10, Struct11 * s11) return result; } -void MidiDriver_ADLIB::adlib_set_param(int channel, byte param, int value) -{ +void MidiDriver_ADLIB::adlib_set_param(int channel, byte param, int value) { const AdlibSetParams *as; byte port; @@ -1096,8 +1055,7 @@ void MidiDriver_ADLIB::adlib_set_param(int channel, byte param, int value) adlib_write(port, (adlib_read(port) & ~as->c) | (((byte)value) << as->b)); } -void MidiDriver_ADLIB::adlib_key_onoff(int channel) -{ +void MidiDriver_ADLIB::adlib_key_onoff(int channel) { byte val; byte port = channel + 0xB0; assert(channel >= 0 && channel < 9); @@ -1107,8 +1065,7 @@ void MidiDriver_ADLIB::adlib_key_onoff(int channel) adlib_write(port, val | 0x20); } -void MidiDriver_ADLIB::struct10_setup(Struct10 * s10) -{ +void MidiDriver_ADLIB::struct10_setup(Struct10 *s10) { int b, c, d, e, f, g, h; byte t; @@ -1157,8 +1114,7 @@ void MidiDriver_ADLIB::struct10_setup(Struct10 * s10) s10->speed_lo_counter = 0; } -void MidiDriver_ADLIB::adlib_playnote(int channel, int note) -{ +void MidiDriver_ADLIB::adlib_playnote(int channel, int note) { byte old, oct, notex; int note2; int i; @@ -1189,8 +1145,7 @@ void MidiDriver_ADLIB::adlib_playnote(int channel, int note) adlib_write(channel + 0xB0, oct | 0x20); } -int MidiDriver_ADLIB::random_nr(int a) -{ +int MidiDriver_ADLIB::random_nr(int a) { static byte _rand_seed = 1; if (_rand_seed & 1) { _rand_seed >>= 1; @@ -1201,8 +1156,7 @@ int MidiDriver_ADLIB::random_nr(int a) return _rand_seed * a >> 8; } -void MidiDriver_ADLIB::part_key_off (AdlibPart *part, byte note) -{ +void MidiDriver_ADLIB::part_key_off (AdlibPart *part, byte note) { MidiChannelAdl *mc; for (mc = part->_mc; mc; mc = mc->_next) { @@ -1215,8 +1169,7 @@ void MidiDriver_ADLIB::part_key_off (AdlibPart *part, byte note) } } -void MidiDriver_ADLIB::part_key_on (AdlibPart *part, byte note, byte velocity) -{ +void MidiDriver_ADLIB::part_key_on (AdlibPart *part, byte note, byte velocity) { MidiChannelAdl *mc; mc = allocate_midichan(part->_pri_eff); @@ -1227,8 +1180,7 @@ void MidiDriver_ADLIB::part_key_on (AdlibPart *part, byte note, byte velocity) mc_key_on(mc, note, velocity); } -MidiChannelAdl *MidiDriver_ADLIB::allocate_midichan(byte pri) -{ +MidiChannelAdl *MidiDriver_ADLIB::allocate_midichan(byte pri) { MidiChannelAdl *ac, *best = NULL; int i; @@ -1251,8 +1203,7 @@ MidiChannelAdl *MidiDriver_ADLIB::allocate_midichan(byte pri) return best; } -void MidiDriver_ADLIB::link_mc (AdlibPart *part, MidiChannelAdl *mc) -{ +void MidiDriver_ADLIB::link_mc (AdlibPart *part, MidiChannelAdl *mc) { mc->_part = part; mc->_next = (MidiChannelAdl *)part->_mc; part->_mc = mc; @@ -1262,8 +1213,7 @@ void MidiDriver_ADLIB::link_mc (AdlibPart *part, MidiChannelAdl *mc) mc->_next->_prev = mc; } -void MidiDriver_ADLIB::mc_key_on (MidiChannelAdl * mc2, byte note, byte velocity) -{ +void MidiDriver_ADLIB::mc_key_on (MidiChannelAdl *mc2, byte note, byte velocity) { MidiChannelAdl *mc = (MidiChannelAdl *)mc2; AdlibPart *part = mc->_part; AdlibInstrument *instr = &part->_part_instr; @@ -1309,8 +1259,7 @@ void MidiDriver_ADLIB::mc_key_on (MidiChannelAdl * mc2, byte note, byte velocity } } -void MidiDriver_ADLIB::adlib_setup_channel(int chan, AdlibInstrument * instr, byte vol_1, byte vol_2) -{ +void MidiDriver_ADLIB::adlib_setup_channel(int chan, AdlibInstrument *instr, byte vol_1, byte vol_2) { byte port; assert(chan >= 0 && chan < 9); @@ -1348,10 +1297,8 @@ void MidiDriver_ADLIB::adlib_note_on_ex(int chan, byte note, int mod) } void MidiDriver_ADLIB::mc_init_stuff (MidiChannelAdl *mc, Struct10 * s10, - Struct11 * s11, byte flags, InstrumentExtra * ie) -{ + Struct11 * s11, byte flags, InstrumentExtra * ie) { AdlibPart *part = mc->_part; - s11->modify_val = 0; s11->flag0x40 = flags & 0x40; s10->loop = flags & 0x20; @@ -1387,8 +1334,7 @@ void MidiDriver_ADLIB::mc_init_stuff (MidiChannelAdl *mc, Struct10 * s10, struct10_init(s10, ie); } -void MidiDriver_ADLIB::struct10_init(Struct10 * s10, InstrumentExtra * ie) -{ +void MidiDriver_ADLIB::struct10_init(Struct10 *s10, InstrumentExtra *ie) { s10->active = 1; s10->cur_val = 0; s10->modwheel_last = 31; @@ -1408,8 +1354,7 @@ void MidiDriver_ADLIB::struct10_init(Struct10 * s10, InstrumentExtra * ie) struct10_setup(s10); } -int MidiDriver_ADLIB::adlib_read_param(int chan, byte param) -{ +int MidiDriver_ADLIB::adlib_read_param(int chan, byte param) { const AdlibSetParams *as; byte val; byte port; @@ -1442,8 +1387,7 @@ int MidiDriver_ADLIB::adlib_read_param(int chan, byte param) return val; } -void MidiDriver_ADLIB::adlib_note_on(int chan, byte note, int mod) -{ +void MidiDriver_ADLIB::adlib_note_on(int chan, byte note, int mod) { int code; assert(chan >= 0 && chan < 9); code = (note << 7) + mod; @@ -1451,8 +1395,7 @@ void MidiDriver_ADLIB::adlib_note_on(int chan, byte note, int mod) adlib_playnote(chan, channel_table_2[chan] + code); } -void MidiDriver_ADLIB::part_set_instrument(AdlibPart *part, AdlibInstrument * instr) -{ +void MidiDriver_ADLIB::part_set_instrument(AdlibPart *part, AdlibInstrument *instr) { AdlibInstrument *i = &part->_part_instr; memcpy(i, instr, sizeof(AdlibInstrument)); } diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index 2f7a5fb281..dfab217b2d 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -70,8 +70,7 @@ MidiDriver_ALSA::MidiDriver_ALSA() { } -int MidiDriver_ALSA::open() -{ +int MidiDriver_ALSA::open() { char *var; unsigned int caps; @@ -128,16 +127,13 @@ int MidiDriver_ALSA::open() return 0; } -void MidiDriver_ALSA::close() -{ +void MidiDriver_ALSA::close() { _isOpen = false; if (seq_handle) snd_seq_close(seq_handle); } - -void MidiDriver_ALSA::send(uint32 b) -{ +void MidiDriver_ALSA::send(uint32 b) { unsigned int midiCmd[4]; ev.type = SND_SEQ_EVENT_OSS; @@ -168,7 +164,6 @@ void MidiDriver_ALSA::send(uint32 b) snd_seq_ev_set_pgmchange(&ev, chanID, midiCmd[1]); send_event(0); break; - case 0xE0:{ // long theBend = ((((long)midiCmd[1] + (long)(midiCmd[2] << 7))) - 0x2000) / 4; // snd_seq_ev_set_pitchbend(&ev, chanID, theBend); @@ -186,8 +181,7 @@ void MidiDriver_ALSA::send(uint32 b) } } -int MidiDriver_ALSA::parse_addr(char *arg, int *client, int *port) -{ +int MidiDriver_ALSA::parse_addr(char *arg, int *client, int *port) { char *p; if (isdigit(*arg)) { @@ -205,8 +199,7 @@ int MidiDriver_ALSA::parse_addr(char *arg, int *client, int *port) return 0; } -void MidiDriver_ALSA::send_event(int do_flush) -{ +void MidiDriver_ALSA::send_event(int do_flush) { snd_seq_ev_set_direct(&ev); snd_seq_ev_set_source(&ev, my_port); snd_seq_ev_set_dest(&ev, seq_client, seq_port); @@ -216,8 +209,7 @@ void MidiDriver_ALSA::send_event(int do_flush) snd_seq_flush_output(seq_handle); } -MidiDriver *MidiDriver_ALSA_create() -{ +MidiDriver *MidiDriver_ALSA_create() { return new MidiDriver_ALSA(); } diff --git a/backends/midi/coreaudio.cpp b/backends/midi/coreaudio.cpp index 199e17f730..4372171580 100644 --- a/backends/midi/coreaudio.cpp +++ b/backends/midi/coreaudio.cpp @@ -50,8 +50,7 @@ private: }; -int MidiDriver_CORE::open() -{ +int MidiDriver_CORE::open() { if (au_output != NULL) return MERR_ALREADY_OPEN; @@ -90,8 +89,7 @@ int MidiDriver_CORE::open() return 0; } -void MidiDriver_CORE::close() -{ +void MidiDriver_CORE::close() { // Stop the output AudioOutputUnitStop(au_output); @@ -100,8 +98,7 @@ void MidiDriver_CORE::close() CloseComponent(au_MusicDevice); } -void MidiDriver_CORE::send(uint32 b) -{ +void MidiDriver_CORE::send(uint32 b) { unsigned char first_byte, seccond_byte, status_byte; status_byte = (b & 0x000000FF); first_byte = (b & 0x0000FF00) >> 8; @@ -115,13 +112,11 @@ void MidiDriver_CORE::send(uint32 b) MusicDeviceMIDIEvent(au_MusicDevice, status_byte, first_byte, seccond_byte, 0); } -void MidiDriver_CORE::sysEx(byte *msg, uint16 length) -{ +void MidiDriver_CORE::sysEx(byte *msg, uint16 length) { MusicDeviceSysEx(au_MusicDevice, msg, length); } -MidiDriver *MidiDriver_CORE_create() -{ +MidiDriver *MidiDriver_CORE_create() { return new MidiDriver_CORE(); } diff --git a/backends/midi/null.cpp b/backends/midi/null.cpp index 74612d18cf..01fad7559f 100644 --- a/backends/midi/null.cpp +++ b/backends/midi/null.cpp @@ -30,13 +30,11 @@ public: void send(uint32 b) { } }; -int MidiDriver_NULL::open() -{ +int MidiDriver_NULL::open() { warning("Music not enabled - MIDI support selected with no MIDI driver available. Try Adlib"); return 0; } -MidiDriver *MidiDriver_NULL_create() -{ +MidiDriver *MidiDriver_NULL_create() { return new MidiDriver_NULL(); } diff --git a/backends/midi/quicktime.cpp b/backends/midi/quicktime.cpp index e447208bf0..c4ac0d1f40 100644 --- a/backends/midi/quicktime.cpp +++ b/backends/midi/quicktime.cpp @@ -64,13 +64,11 @@ private: byte _pitchbend_range [16]; }; -MidiDriver_QT::MidiDriver_QT() -{ +MidiDriver_QT::MidiDriver_QT() { qtNoteAllocator = NULL; } -int MidiDriver_QT::open() -{ +int MidiDriver_QT::open() { ComponentResult qtErr = noErr; int i; @@ -129,8 +127,7 @@ void MidiDriver_QT::close() } } -void MidiDriver_QT::send(uint32 b) -{ +void MidiDriver_QT::send(uint32 b) { MusicMIDIPacket midPacket; unsigned char *midiCmd = midPacket.data; midPacket.length = 3; @@ -214,7 +211,7 @@ void MidiDriver_QT::send(uint32 b) // mysterious reasons the actual factor we have to use is more like 1/32 or 3/64. // Maybe the QT docs are right, and _pitchbend[chanID] = ((uint16) midiCmd[1] | (uint16) (midiCmd[2] << 7)); - long theBend = ((long) _pitchbend[chanID] - 0x2000) * _pitchbend_range[chanID] / 32; + long theBend = ((long) _pitchbend[chanID] - 0x2000) * _pitchbend_range[chanID] / 32; NASetController(qtNoteAllocator, qtNoteChannel[chanID], kControllerPitchBend, theBend); } @@ -227,8 +224,7 @@ void MidiDriver_QT::send(uint32 b) } } -void MidiDriver_QT::setPitchBendRange (byte channel, uint range) -{ +void MidiDriver_QT::setPitchBendRange (byte channel, uint range) { if (_pitchbend_range[channel] == range) return; _pitchbend_range[channel] = range; @@ -238,8 +234,7 @@ void MidiDriver_QT::setPitchBendRange (byte channel, uint range) NASetController(qtNoteAllocator, qtNoteChannel[channel], kControllerPitchBend, theBend); } -MidiDriver *MidiDriver_QT_create() -{ +MidiDriver *MidiDriver_QT_create() { return new MidiDriver_QT(); } diff --git a/backends/midi/windows.cpp b/backends/midi/windows.cpp index c78dea3a6e..1d34a9153a 100644 --- a/backends/midi/windows.cpp +++ b/backends/midi/windows.cpp @@ -49,13 +49,12 @@ public: void sysEx (byte *msg, uint16 length); }; -int MidiDriver_WIN::open() -{ +int MidiDriver_WIN::open() { if (_isOpen) return MERR_ALREADY_OPEN; _streamEvent = CreateEvent (NULL, true, true, NULL); - MMRESULT res = midiOutOpen((HMIDIOUT *) &_mo, MIDI_MAPPER, (unsigned long) _streamEvent, 0, CALLBACK_EVENT); + MMRESULT res = midiOutOpen((HMIDIOUT *)&_mo, MIDI_MAPPER, (unsigned long) _streamEvent, 0, CALLBACK_EVENT); if (res != MMSYSERR_NOERROR) { check_error(res); return MERR_DEVICE_NOT_AVAILABLE; @@ -65,8 +64,7 @@ int MidiDriver_WIN::open() return 0; } -void MidiDriver_WIN::close() -{ +void MidiDriver_WIN::close() { _isOpen = false; check_error(midiOutClose(_mo)); CloseHandle (_streamEvent); @@ -100,7 +98,7 @@ void MidiDriver_WIN::sysEx (byte *msg, uint16 length) midiOutUnprepareHeader (_mo, &_streamHeader, sizeof (_streamHeader)); _streamBuffer [0] = 0xFF; - memcpy (&_streamBuffer[1], msg, length); + memcpy(&_streamBuffer[1], msg, length); _streamBuffer [length+1] = 0xF7; _streamHeader.lpData = (char *) _streamBuffer; @@ -115,17 +113,16 @@ void MidiDriver_WIN::sysEx (byte *msg, uint16 length) return; } - ResetEvent (_streamEvent); + ResetEvent(_streamEvent); result = midiOutLongMsg (_mo, &_streamHeader, sizeof (_streamHeader)); if (result != MMSYSERR_NOERROR) { - check_error (result); - SetEvent (_streamEvent); + check_error(result); + SetEvent(_streamEvent); return; } } -void MidiDriver_WIN::check_error(MMRESULT result) -{ +void MidiDriver_WIN::check_error(MMRESULT result) { char buf[200]; if (result != MMSYSERR_NOERROR) { midiOutGetErrorText(result, buf, 200); @@ -133,8 +130,7 @@ void MidiDriver_WIN::check_error(MMRESULT result) } } -MidiDriver *MidiDriver_WIN_create() -{ +MidiDriver *MidiDriver_WIN_create() { return new MidiDriver_WIN(); } diff --git a/backends/null/null.cpp b/backends/null/null.cpp index df42dbfc38..0b779b61d5 100644 --- a/backends/null/null.cpp +++ b/backends/null/null.cpp @@ -63,7 +63,7 @@ uint32 OSystem_NULL::get_ticks() { #ifdef UNIX struct timeval tv; gettimeofday(&tv, NULL); - a = tv.tv_sec * 1000 + tv.tv_usec/1000; + a = tv.tv_sec * 1000 + tv.tv_usec / 1000; #endif return a; @@ -74,7 +74,7 @@ void OSystem_NULL::delay_msecs(uint msecs) { Sleep(msecs); #endif #ifdef UNIX - usleep(msecs*1000); + usleep(msecs * 1000); #endif } diff --git a/backends/sdl/fb2opengl.h b/backends/sdl/fb2opengl.h index 705093c976..e69f9af180 100644 --- a/backends/sdl/fb2opengl.h +++ b/backends/sdl/fb2opengl.h @@ -42,400 +42,395 @@ #endif class FB2GL { - private: - // Framebuffer for 8 bpp - unsigned char ogl_fb[256][256]; - unsigned char ogl_fbb[256][64]; - // Framebuffer for RGBA - unsigned char ogl_fb1[256][256][4]; - unsigned char ogl_fb2[256][64][4]; - // Framebuffer for the blit function (SDL Blitting) - unsigned char fb1[256*256*4]; // Enough room for RGBA - unsigned char fb2[64*256*4]; // Enough room for RGBA - // Texture(s) - GLuint texture; - GLuint textureb; - // Display list - GLuint dlist; - // Color Table (256 colors, RGB) - char ogl_ctable[256][3]; - char ogl_temp_ctable[256][3]; // Support for OpenGL 1.1 - char flags; - void maketex(); - void makedlist(int xf, int yf); - - public: - SDL_Surface *screen; - FB2GL() { - flags=0; - screen=NULL; - } - int init(int width, int height, int xfix, int yfix, char _flags); - void update(void *fb, int width, int height, int pitch, int xskip, int yskip); - void palette(int index, int r, int g, int b); - void setPalette(int first, int ncolors); - void blit16(SDL_Surface *fb, int num_rect, SDL_Rect *rectlist, int xskip, int yskip); - void display(); + private: + // Framebuffer for 8 bpp + unsigned char ogl_fb[256][256]; + unsigned char ogl_fbb[256][64]; + // Framebuffer for RGBA + unsigned char ogl_fb1[256][256][4]; + unsigned char ogl_fb2[256][64][4]; + // Framebuffer for the blit function (SDL Blitting) + unsigned char fb1[256 * 256 * 4]; // Enough room for RGBA + unsigned char fb2[64 * 256 * 4]; // Enough room for RGBA + // Texture(s) + GLuint texture; + GLuint textureb; + // Display list + GLuint dlist; + // Color Table (256 colors, RGB) + char ogl_ctable[256][3]; + char ogl_temp_ctable[256][3]; // Support for OpenGL 1.1 + char flags; + void maketex(); + void makedlist(int xf, int yf); + public: + SDL_Surface *screen; + FB2GL() { + flags = 0; + screen = NULL; + } + int init(int width, int height, int xfix, int yfix, char _flags); + void update(void *fb, int width, int height, int pitch, int xskip, int yskip); + void palette(int index, int r, int g, int b); + void setPalette(int first, int ncolors); + void blit16(SDL_Surface *fb, int num_rect, SDL_Rect *rectlist, int xskip, int yskip); + void display(); }; -void FB2GL::maketex() -{ - glGenTextures(0,&texture); - glBindTexture(GL_TEXTURE_2D,texture); +void FB2GL::maketex() { + glGenTextures(0,&texture); + glBindTexture(GL_TEXTURE_2D,texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - // Bilinear filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + // Bilinear filtering + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); /* - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */ - - if (flags & FB2GL_RGBA) { - glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,256,256,0,GL_RGBA, GL_UNSIGNED_BYTE, ogl_fb1); - } - else { - glTexImage2D(GL_TEXTURE_2D,0,GL_COLOR_INDEX,256,256,0,GL_COLOR_INDEX, GL_UNSIGNED_BYTE, ogl_fb); - } - - if (flags & FB2GL_320) { - glGenTextures(1,&textureb); - glBindTexture(GL_TEXTURE_2D,textureb); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - - // Bilinear filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + if (flags & FB2GL_RGBA) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, ogl_fb1); + } + else { + glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX, 256, 256, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, ogl_fb); + } + + if (flags & FB2GL_320) { + glGenTextures(1, &textureb); + glBindTexture(GL_TEXTURE_2D, textureb); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + + // Bilinear filtering + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); /* - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */ - if (flags & FB2GL_RGBA) { - glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,64,256,0,GL_RGBA, - GL_UNSIGNED_BYTE, ogl_fb2); - } - else { - glTexImage2D(GL_TEXTURE_2D,0,GL_COLOR_INDEX,64,256,0,GL_COLOR_INDEX, - GL_UNSIGNED_BYTE, ogl_fbb); - } - } - + if (flags & FB2GL_RGBA) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 256, 0, GL_RGBA, + GL_UNSIGNED_BYTE, ogl_fb2); + } + else { + glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX, 64, 256, 0, GL_COLOR_INDEX, + GL_UNSIGNED_BYTE, ogl_fbb); + } + } } -void FB2GL::makedlist(int xf, int yf) -{ - double xfix=(double)xf/128; // 128 = 256/2 (half texture => 0.0 to 1.0) - double yfix=(double)yf/128; - // End of 256x256 (from -1.0 to 1.0) - double texend = (double)96/160; // 160=320/2 (== 0.0), 256-160=96. - - if (glIsList(dlist)) - glDeleteLists(dlist,1); - - dlist=glGenLists(1); - glNewList(dlist,GL_COMPILE); - - glEnable(GL_TEXTURE_2D); - - glBindTexture(GL_TEXTURE_2D, texture); - - if (!(flags & FB2GL_320)) { // Normal 256x256 - glBegin(GL_QUADS); - glTexCoord2f(0.0,1.0); glVertex2f(-1.0,-1.0-yfix); // upper left - glTexCoord2f(0.0,0.0); glVertex2f(-1.0,1.0); // lower left - glTexCoord2f(1.0,0.0); glVertex2f(1.0+xfix,1.0); // lower right - glTexCoord2f(1.0,1.0); glVertex2f(1.0+xfix,-1.0-yfix); // upper right - glEnd(); - } - else { // 320x256 - - // First, the 256x256 texture - glBegin(GL_QUADS); - glTexCoord2f(0.0,1.0); glVertex2f(-1.0,-1.0-yfix); // upper left - glTexCoord2f(0.0,0.0); glVertex2f(-1.0,1.0); // lower left - glTexCoord2f(1.0,0.0); glVertex2f(texend+xfix,1.0); // lower right - glTexCoord2f(1.0,1.0); glVertex2f(texend+xfix,-1.0-yfix); // upper right - glEnd(); - - // 64x256 - glBindTexture(GL_TEXTURE_2D, textureb); - - glBegin(GL_QUADS); - glTexCoord2f(0.0,1.0); glVertex2f(texend+xfix,-1.0-yfix); // upper left - glTexCoord2f(0.0,0.0); glVertex2f(texend+xfix,1.0); // lower left - glTexCoord2f(1.0,0.0); glVertex2f(1.0+xfix,1.0); // lower right - glTexCoord2f(1.0,1.0); glVertex2f(1.0+xfix,-1.0-yfix); // upper right - glEnd(); - } - - glDisable(GL_TEXTURE_2D); - - glEndList(); +void FB2GL::makedlist(int xf, int yf) { + double xfix = (double)xf / 128; // 128 = 256/2 (half texture => 0.0 to 1.0) + double yfix = (double)yf / 128; + // End of 256x256 (from -1.0 to 1.0) + double texend = (double)96 / 160; // 160=320/2 (== 0.0), 256-160=96. + + if (glIsList(dlist)) + glDeleteLists(dlist, 1); + + dlist=glGenLists(1); + glNewList(dlist, GL_COMPILE); + + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, texture); + + if (!(flags & FB2GL_320)) { // Normal 256x256 + glBegin(GL_QUADS); + glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, -1.0 - yfix); // upper left + glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, 1.0); // lower left + glTexCoord2f(1.0, 0.0); glVertex2f(1.0 + xfix, 1.0); // lower right + glTexCoord2f(1.0, 1.0); glVertex2f(1.0 + xfix, -1.0 - yfix); // upper right + glEnd(); + } + else { // 320x256 + + // First, the 256x256 texture + glBegin(GL_QUADS); + glTexCoord2f(0.0, 1.0); glVertex2f( -1.0, -1.0 - yfix); // upper left + glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, 1.0); // lower left + glTexCoord2f(1.0, 0.0); glVertex2f(texend + xfix, 1.0); // lower right + glTexCoord2f(1.0, 1.0); glVertex2f(texend + xfix, -1.0 - yfix); // upper right + glEnd(); + + // 64x256 + glBindTexture(GL_TEXTURE_2D, textureb); + + glBegin(GL_QUADS); + glTexCoord2f(0.0, 1.0); glVertex2f(texend + xfix, -1.0 - yfix); // upper left + glTexCoord2f(0.0, 0.0); glVertex2f(texend + xfix, 1.0); // lower left + glTexCoord2f(1.0, 0.0); glVertex2f(1.0 + xfix, 1.0); // lower right + glTexCoord2f(1.0, 1.0); glVertex2f(1.0 + xfix, -1.0 - yfix); // upper right + glEnd(); + } + + glDisable(GL_TEXTURE_2D); + + glEndList(); } -int FB2GL::init(int width, int height, int xfix, int yfix, char _flags) -{ - char gl_ext[4096]; - gl_ext[0]='\0'; - - flags = _flags; - - // Fullscreen? - if (!screen) { - screen = SDL_SetVideoMode(width, height, (flags & FB2GL_16BIT? 16: 0), - SDL_HWPALETTE | SDL_HWSURFACE | SDL_OPENGL | SDL_GL_DOUBLEBUFFER | - (flags & FB2GL_FS? SDL_FULLSCREEN: 0)); - } - - fprintf(stderr,"Screen BitsPerPixel: %d\n",screen->format->BitsPerPixel); - - if (!screen) { - fprintf(stderr, "Couldn't start video res %dx%d\n", width, height); - return 0; - } - - - if (!(flags & FB2GL_RGBA)) { // Check for Paletted Texture Extension - - strcpy(gl_ext, (char *)glGetString(GL_EXTENSIONS)); +int FB2GL::init(int width, int height, int xfix, int yfix, char _flags) { + char gl_ext[4096]; + gl_ext[0]='\0'; + + flags = _flags; + + // Fullscreen? + if (!screen) { + screen = SDL_SetVideoMode(width, height, (flags & FB2GL_16BIT ? 16: 0), + SDL_HWPALETTE | SDL_HWSURFACE | SDL_OPENGL | SDL_GL_DOUBLEBUFFER | + (flags & FB2GL_FS? SDL_FULLSCREEN: 0)); + } + + warning("Screen BitsPerPixel: %d\n",screen->format->BitsPerPixel); + + if (!screen) { + fprintf(stderr, "Couldn't start video res %dx%d\n", width, height); + return 0; + } + + + if (!(flags & FB2GL_RGBA)) { // Check for Paletted Texture Extension + + strcpy(gl_ext, (char *)glGetString(GL_EXTENSIONS)); fprintf(stderr,"gl_ext= %s\n",gl_ext); - if ( strstr( gl_ext , "GL_EXT_paletted_texture") ) - glEnable(GL_EXT_paletted_texture); - else { - fprintf(stderr,"Your OpenGL version doesn't support paletted texture\n"); - return 0; - } - } - - if (width>0 && height>0) - maketex(); - makedlist(xfix, yfix); - -/* glEnable(GL_ALPHA_TEST); - glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER,0); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);*/ - - return 1; + if ( strstr( gl_ext , "GL_EXT_paletted_texture") ) + glEnable(GL_EXT_paletted_texture); + else { + fprintf(stderr,"Your OpenGL version doesn't support paletted texture\n"); + return 0; + } + } + + if (width>0 && height>0) + maketex(); + makedlist(xfix, yfix); + +/* glEnable(GL_ALPHA_TEST); + glEnable(GL_BLEND); + glAlphaFunc(GL_GREATER,0); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);*/ + + return 1; } void FB2GL::display() { - glCallList(dlist); - SDL_GL_SwapBuffers(); + glCallList(dlist); + SDL_GL_SwapBuffers(); } void FB2GL::update(void *fb, int w, int h, int pitch, int xskip, int yskip) { - unsigned char *fb1=(unsigned char *)fb; - int x,y,scr_pitch,byte=0; - - if (flags & FB2GL_PITCH) scr_pitch=pitch; - else { - scr_pitch=w*pitch; - byte = pitch; // Bytes perl pixel (for RGBA mode) - } - - if (flags & FB2GL_RGBA) { - - if (flags & FB2GL_EXPAND) { // Expand the 8 bit fb into a RGB fb - - for (y=yskip; y<h; y++) { + unsigned char *fb1=(unsigned char *)fb; + int x,y,scr_pitch,byte=0; + + if (flags & FB2GL_PITCH) scr_pitch=pitch; + else { + scr_pitch=w*pitch; + byte = pitch; // Bytes perl pixel (for RGBA mode) + } + + if (flags & FB2GL_RGBA) { + + if (flags & FB2GL_EXPAND) { // Expand the 8 bit fb into a RGB fb + + for (y=yskip; y<h; y++) { for (x=xskip; x<w; x++) { - if (x<256) { - ogl_fb1[y][x][0] = ogl_ctable[*(fb1+x)][0]; - ogl_fb1[y][x][1] = ogl_ctable[*(fb1+x)][1]; - ogl_fb1[y][x][2] = ogl_ctable[*(fb1+x)][2]; - ogl_fb1[y][x][3] = 255; - } - else { - ogl_fb2[y][x-256][0] = ogl_ctable[*(fb1+x)][0]; - ogl_fb2[y][x-256][1] = ogl_ctable[*(fb1+x)][1]; - ogl_fb2[y][x-256][2] = ogl_ctable[*(fb1+x)][2]; - ogl_fb2[y][x-256][3] = 255; - } + if (x<256) { + ogl_fb1[y][x][0] = ogl_ctable[*(fb1+x)][0]; + ogl_fb1[y][x][1] = ogl_ctable[*(fb1+x)][1]; + ogl_fb1[y][x][2] = ogl_ctable[*(fb1+x)][2]; + ogl_fb1[y][x][3] = 255; + } + else { + ogl_fb2[y][x-256][0] = ogl_ctable[*(fb1+x)][0]; + ogl_fb2[y][x-256][1] = ogl_ctable[*(fb1+x)][1]; + ogl_fb2[y][x-256][2] = ogl_ctable[*(fb1+x)][2]; + ogl_fb2[y][x-256][3] = 255; + } } fb1 += scr_pitch; - } - } - else { // No expansion - for (y=yskip; y<h; y++) { + } + } + else { // No expansion + for (y=yskip; y<h; y++) { for (x=xskip; x<w; x++) { - if (x<256) { - ogl_fb1[y-yskip][x-xskip][0] = *(fb1+(x*byte)); - ogl_fb1[y-yskip][x-xskip][1] = *(fb1+(x*byte)+1); - ogl_fb1[y-yskip][x-xskip][2] = *(fb1+(x*byte)+2); - } - else { - ogl_fb2[y-yskip][x-256][0] = *(fb1+(x*byte)); - ogl_fb2[y-yskip][x-256][1] = *(fb1+(x*byte)+1); - ogl_fb2[y-yskip][x-256][2] = *(fb1+(x*byte)+2); - } + if (x<256) { + ogl_fb1[y-yskip][x-xskip][0] = *(fb1+(x*byte)); + ogl_fb1[y-yskip][x-xskip][1] = *(fb1+(x*byte)+1); + ogl_fb1[y-yskip][x-xskip][2] = *(fb1+(x*byte)+2); + } + else { + ogl_fb2[y-yskip][x-256][0] = *(fb1+(x*byte)); + ogl_fb2[y-yskip][x-256][1] = *(fb1+(x*byte)+1); + ogl_fb2[y-yskip][x-256][2] = *(fb1+(x*byte)+2); + } } fb1 += scr_pitch; - } - } + } + } - // Update 256x256 texture - glBindTexture(GL_TEXTURE_2D,texture); - glFlush(); - glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,256-xskip,256-yskip,GL_RGBA, + // Update 256x256 texture + glBindTexture(GL_TEXTURE_2D,texture); + glFlush(); + glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,256-xskip,256-yskip,GL_RGBA, GL_UNSIGNED_BYTE,ogl_fb1); - if (flags & FB2GL_320) { - // Update 64x256 texture - glBindTexture(GL_TEXTURE_2D,textureb); - glFlush(); - glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,64-xskip,256-yskip,GL_RGBA, + if (flags & FB2GL_320) { + // Update 64x256 texture + glBindTexture(GL_TEXTURE_2D,textureb); + glFlush(); + glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,64-xskip,256-yskip,GL_RGBA, GL_UNSIGNED_BYTE,ogl_fb2); - } + } - } - else { // non RGBA (paletted) + } + else { // non RGBA (paletted) - for (y=0; y<h; y++) - for (x=0; x<w; x++) { + for (y=0; y<h; y++) + for (x=0; x<w; x++) { if (x<256) { - ogl_fb[ y ][ x ] = *(fb1 + (y)*scr_pitch + x); + ogl_fb[ y ][ x ] = *(fb1 + (y)*scr_pitch + x); } else { - ogl_fbb[ y ][ x - 256 ] = *(fb1 + y*scr_pitch + x); + ogl_fbb[ y ][ x - 256 ] = *(fb1 + y*scr_pitch + x); } - } + } - // Update 256x256 texture - glBindTexture(GL_TEXTURE_2D,texture); - glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,256-xskip,256-yskip, + // Update 256x256 texture + glBindTexture(GL_TEXTURE_2D,texture); + glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,256-xskip,256-yskip, GL_COLOR_INDEX, GL_UNSIGNED_BYTE,ogl_fb); - if (flags & FB2GL_320) { - // Update 64x256 texture - glBindTexture(GL_TEXTURE_2D,textureb); - glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,64-xskip,256-yskip, - GL_COLOR_INDEX, GL_UNSIGNED_BYTE,ogl_fbb); - } + if (flags & FB2GL_320) { + // Update 64x256 texture + glBindTexture(GL_TEXTURE_2D,textureb); + glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,64-xskip,256-yskip, + GL_COLOR_INDEX, GL_UNSIGNED_BYTE,ogl_fbb); + } - } + } - display(); + display(); } void FB2GL::blit16(SDL_Surface *fb, int num_rect, SDL_Rect *rect, int xskip, int yskip) { - int x, y, i; - int rx, ry, rw, rh; - int xend=0, yend=0; - int pitch = fb->pitch/2; // 16 bit pointer access (not char *) - int tex1_w = 0, tex2_w = 0, tex2_x = 0; - - for (i=0; i<num_rect; i++) { - tex1_w = tex2_w = tex2_x = 0; - rx = rect[i].x; - ry = rect[i].y; - rw = rect[i].w; - rh = rect[i].h; - xend = rx + rw; - yend = ry + rh; - if (xend > fb->w) continue; - if (yend > fb->h) continue; - - if (rx < 256) { // Begins before the end of the 1st texture - if (xend >= 256) { // Ends after the first texture + int x, y, i; + int rx, ry, rw, rh; + int xend=0, yend=0; + int pitch = fb->pitch/2; // 16 bit pointer access (not char *) + int tex1_w = 0, tex2_w = 0, tex2_x = 0; + + for (i=0; i<num_rect; i++) { + tex1_w = tex2_w = tex2_x = 0; + rx = rect[i].x; + ry = rect[i].y; + rw = rect[i].w; + rh = rect[i].h; + xend = rx + rw; + yend = ry + rh; + if (xend > fb->w) continue; + if (yend > fb->h) continue; + + if (rx < 256) { // Begins before the end of the 1st texture + if (xend >= 256) { // Ends after the first texture tex2_w = xend-256; // For the 2nd texture tex1_w = rw - tex2_w; // For the 1st texture - } - else tex1_w = rw; - } - else { - tex2_w = rw; - tex2_x = rx - 256; - } - - for (y = ry; y < yend; y++) { - for (x = rx; x < xend; x++) { - - if (x < 256 && tex1_w) { - int pos = (x-rx+(y-ry)*tex1_w)*4; // RGBA - SDL_GetRGB(((Uint16 *)fb->pixels)[x+y*(pitch)],fb->format, - &fb1[pos], - &fb1[pos+1], - &fb1[pos+2]); + } + else tex1_w = rw; + } + else { + tex2_w = rw; + tex2_x = rx - 256; + } + + for (y = ry; y < yend; y++) { + for (x = rx; x < xend; x++) { + + if (x < 256 && tex1_w) { + int pos = (x-rx+(y-ry)*tex1_w)*4; // RGBA + SDL_GetRGB(((Uint16 *)fb->pixels)[x+y*(pitch)],fb->format, + &fb1[pos], + &fb1[pos+1], + &fb1[pos+2]); } else if (x >= 256 && tex2_w) { - int rx2 = rx < 256? 256: rx; - int pos = (x-rx2+(y-ry)*tex2_w)*4; // RGBA - SDL_GetRGB(((Uint16 *)fb->pixels)[x+y*(pitch)],fb->format, - &fb2[pos], - &fb2[pos+1], - &fb2[pos+2]); + int rx2 = rx < 256? 256: rx; + int pos = (x-rx2+(y-ry)*tex2_w)*4; // RGBA + SDL_GetRGB(((Uint16 *)fb->pixels)[x+y*(pitch)],fb->format, + &fb2[pos], + &fb2[pos+1], + &fb2[pos+2]); + } + } + } + + if (tex1_w > 0) { + // Update 256x256 texture + glBindTexture(GL_TEXTURE_2D,texture); + glFlush(); + glTexSubImage2D(GL_TEXTURE_2D,0,rx+xskip,ry+yskip,tex1_w,rh,GL_RGBA, + GL_UNSIGNED_BYTE,fb1); + } + if (tex2_w > 0) { // What was left for this texture + // Update 64x256 texture + glBindTexture(GL_TEXTURE_2D,textureb); + glFlush(); + glTexSubImage2D(GL_TEXTURE_2D,0,tex2_x+xskip,ry+yskip,tex2_w,rh,GL_RGBA, + GL_UNSIGNED_BYTE,fb2); + } } - } - } - - if (tex1_w > 0) { - // Update 256x256 texture - glBindTexture(GL_TEXTURE_2D,texture); - glFlush(); - glTexSubImage2D(GL_TEXTURE_2D,0,rx+xskip,ry+yskip,tex1_w,rh,GL_RGBA, - GL_UNSIGNED_BYTE,fb1); - } - if (tex2_w > 0) { // What was left for this texture - // Update 64x256 texture - glBindTexture(GL_TEXTURE_2D,textureb); - glFlush(); - glTexSubImage2D(GL_TEXTURE_2D,0,tex2_x+xskip,ry+yskip,tex2_w,rh,GL_RGBA, - GL_UNSIGNED_BYTE,fb2); - } - } } void FB2GL::palette(int i, int r, int g, int b) { - if (flags & FB2GL_EXPAND) { - ogl_temp_ctable[i][0]=r; - ogl_temp_ctable[i][1]=g; - ogl_temp_ctable[i][2]=b; - } - else { // Paletted texture - ogl_ctable[i][0]=r; - ogl_ctable[i][1]=g; - ogl_ctable[i][2]=b; - } + if (flags & FB2GL_EXPAND) { + ogl_temp_ctable[i][0]=r; + ogl_temp_ctable[i][1]=g; + ogl_temp_ctable[i][2]=b; + } + else { // Paletted texture + ogl_ctable[i][0]=r; + ogl_ctable[i][1]=g; + ogl_ctable[i][2]=b; + } } void FB2GL::setPalette(int f, int n) { - char temp[256][3]; - int i; + char temp[256][3]; + int i; - if (flags & FB2GL_EXPAND) { - for (i=f; i<n; i++) { - ogl_ctable[i][0] = ogl_temp_ctable[i][0]; - ogl_ctable[i][1] = ogl_temp_ctable[i][1]; - ogl_ctable[i][2] = ogl_temp_ctable[i][2]; - } - } - else { // Paletted texture - glBindTexture(GL_TEXTURE_2D,texture); - glGetColorTable(GL_TEXTURE_2D,GL_RGB,GL_UNSIGNED_BYTE,&temp); + if (flags & FB2GL_EXPAND) { + for (i=f; i<n; i++) { + ogl_ctable[i][0] = ogl_temp_ctable[i][0]; + ogl_ctable[i][1] = ogl_temp_ctable[i][1]; + ogl_ctable[i][2] = ogl_temp_ctable[i][2]; + } + } + else { // Paletted texture + glBindTexture(GL_TEXTURE_2D,texture); + glGetColorTable(GL_TEXTURE_2D,GL_RGB,GL_UNSIGNED_BYTE,&temp); - for (i=f; i<n; i++) { - temp[i][0] = ogl_ctable[i][0]; - temp[i][1] = ogl_ctable[i][1]; - temp[i][2] = ogl_ctable[i][2]; - } + for (i=f; i<n; i++) { + temp[i][0] = ogl_ctable[i][0]; + temp[i][1] = ogl_ctable[i][1]; + temp[i][2] = ogl_ctable[i][2]; + } - glColorTable(GL_TEXTURE_2D,GL_RGB,256,GL_RGB,GL_UNSIGNED_BYTE,&temp); + glColorTable(GL_TEXTURE_2D,GL_RGB,256,GL_RGB,GL_UNSIGNED_BYTE,&temp); - if (flags & FB2GL_320) { - glBindTexture(GL_TEXTURE_2D,textureb); - glColorTable(GL_TEXTURE_2D,GL_RGB,256,GL_RGB,GL_UNSIGNED_BYTE,&temp); - } + if (flags & FB2GL_320) { + glBindTexture(GL_TEXTURE_2D,textureb); + glColorTable(GL_TEXTURE_2D,GL_RGB,256,GL_RGB,GL_UNSIGNED_BYTE,&temp); + } - } + } } diff --git a/backends/sdl/sdl-common.cpp b/backends/sdl/sdl-common.cpp index fe1d5765fe..c390b910f5 100644 --- a/backends/sdl/sdl-common.cpp +++ b/backends/sdl/sdl-common.cpp @@ -73,7 +73,7 @@ OSystem *OSystem_SDL_Common::create(int gfx_mode, bool full_screen) { #ifndef MACOSX // Work around a bug in OS X // Clean up on exit atexit_proc_installed = true; - atexit(atexit_proc); + atexit(atexit_proc); #endif // enable joystick @@ -95,21 +95,18 @@ OSystem_SDL_Common::OSystem_SDL_Common() _cdrom(0), _dirty_checksums(0), _mouseVisible(false), _mouseDrawn(false), _mouseData(0), _mouseHotspotX(0), _mouseHotspotY(0), - _currentShakePos(0), _newShakePos(0) -{ + _currentShakePos(0), _newShakePos(0) { // allocate palette storage - _currentPalette = (SDL_Color*)calloc(sizeof(SDL_Color), 256); + _currentPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256); // allocate the dirty rect storage - _mouseBackup = (byte*)malloc(MAX_MOUSE_W * MAX_MOUSE_H * MAX_SCALING * 2); - + _mouseBackup = (byte *)malloc(MAX_MOUSE_W * MAX_MOUSE_H * MAX_SCALING * 2); + // reset mouse state memset(&km, 0, sizeof(km)); - } -OSystem_SDL_Common::~OSystem_SDL_Common() -{ +OSystem_SDL_Common::~OSystem_SDL_Common() { if (_dirty_checksums) free(_dirty_checksums); free(_currentPalette); @@ -117,17 +114,16 @@ OSystem_SDL_Common::~OSystem_SDL_Common() } void OSystem_SDL_Common::init_size(uint w, uint h) { - // Avoid redundant res changes if ((int)w == _screenWidth && (int)h == _screenHeight) return; _screenWidth = w; _screenHeight = h; - CKSUM_NUM = (_screenWidth*_screenHeight/(8*8)); + CKSUM_NUM = (_screenWidth * _screenHeight / (8 * 8)); if (_dirty_checksums) free(_dirty_checksums); - _dirty_checksums = (uint32*)calloc(CKSUM_NUM*2, sizeof(uint32)); + _dirty_checksums = (uint32 *)calloc(CKSUM_NUM * 2, sizeof(uint32)); unload_gfx_mode(); load_gfx_mode(); @@ -145,18 +141,33 @@ void OSystem_SDL_Common::copy_rect(const byte *buf, int pitch, int x, int y, int return; if (((uint32)buf & 3) == 0 && pitch == _screenWidth && x==0 && y==0 && - w==_screenWidth && h==_screenHeight && _mode_flags&DF_WANT_RECT_OPTIM) { + w==_screenWidth && h==_screenHeight && _mode_flags&DF_WANT_RECT_OPTIM) { /* Special, optimized case for full screen updates. * It tries to determine what areas were actually changed, * and just updates those, on the actual display. */ add_dirty_rgn_auto(buf); } else { /* Clip the coordinates */ - if (x < 0) { w+=x; buf-=x; x = 0; } - if (y < 0) { h+=y; buf-=y*pitch; y = 0; } - if (w > _screenWidth-x) { w = _screenWidth - x; } - if (h > _screenHeight-y) { h = _screenHeight - y; } - + if (x < 0) { + w += x; + buf -= x; + x = 0; + } + + if (y < 0) { + h += y; + buf -= y * pitch; + y = 0; + } + + if (w > _screenWidth - x) { + w = _screenWidth - x; + } + + if (h > _screenHeight - y) { + h = _screenHeight - y; + } + if (w <= 0 || h <= 0) return; @@ -183,7 +194,6 @@ void OSystem_SDL_Common::copy_rect(const byte *buf, int pitch, int x, int y, int void OSystem_SDL_Common::move_screen(int dx, int dy, int height) { - if ((dx == 0) && (dy == 0)) return; @@ -227,7 +237,6 @@ void OSystem_SDL_Common::add_dirty_rect(int x, int y, int w, int h) { _forceFull = true; else { SDL_Rect *r = &_dirty_rect_list[_num_dirty_rects++]; - // Extend the dirty region by 1 pixel for scalers // that "smear" the screen, e.g. 2xSAI if (_mode_flags & DF_UPDATE_EXPAND_1_PIXEL) { @@ -238,10 +247,22 @@ void OSystem_SDL_Common::add_dirty_rect(int x, int y, int w, int h) { } // clip - if (x < 0) { w+=x; x=0; } - if (y < 0) { h+=y; y=0; } - if (w > _screenWidth-x) { w = _screenWidth - x; } - if (h > _screenHeight-y) { h = _screenHeight - y; } + if (x < 0) { + w += x; x = 0; + } + + if (y < 0) { + h += y; + y=0; + } + + if (w > _screenWidth - x) { + w = _screenWidth - x; + } + + if (h > _screenHeight - y) { + h = _screenHeight - y; + } r->x = x; r->y = y; @@ -250,18 +271,19 @@ void OSystem_SDL_Common::add_dirty_rect(int x, int y, int w, int h) { } } -#define ROL(a,n) a = (a<<(n)) | (a>>(32-(n))) -#define DOLINE(x) a ^= ((uint32*)buf)[0+(x)*(_screenWidth/4)]; b ^= ((uint32*)buf)[1+(x)*(_screenWidth/4)] +#define ROL(a,n) a = (a << (n)) | (a >> (32 - (n))) +#define DOLINE(x) a ^= ((uint32*)buf)[0 + (x) * (_screenWidth / 4)]; b ^= ((uint32 *)buf)[1 + (x) * (_screenWidth / 4)] + void OSystem_SDL_Common::mk_checksums(const byte *buf) { uint32 *sums = _dirty_checksums; uint x,y; - const uint last_x = (uint)_screenWidth/8; - const uint last_y = (uint)_screenHeight/8; + const uint last_x = (uint)_screenWidth / 8; + const uint last_y = (uint)_screenHeight / 8; /* the 8x8 blocks in buf are enumerated starting in the top left corner and * reading each line at a time from left to right */ - for(y=0; y != last_y; y++, buf+=_screenWidth*(8-1)) - for(x=0; x != last_x; x++, buf+=8) { + for(y = 0; y != last_y; y++, buf += _screenWidth * (8 - 1)) + for(x=0; x != last_x; x++, buf += 8) { uint32 a = x; uint32 b = y; @@ -270,8 +292,8 @@ void OSystem_SDL_Common::mk_checksums(const byte *buf) { DOLINE(4); ROL(a,13); ROL(b,11); DOLINE(6); ROL(a,13); ROL(b,11); - a*=0xDEADBEEF; - b*=0xBAADF00D; + a *= 0xDEADBEEF; + b *= 0xBAADF00D; DOLINE(1); ROL(a,13); ROL(b,11); DOLINE(3); ROL(a,13); ROL(b,11); @@ -279,15 +301,14 @@ void OSystem_SDL_Common::mk_checksums(const byte *buf) { DOLINE(7); ROL(a,13); ROL(b,11); /* output the checksum for this block */ - *sums++=a+b; + *sums++ = a + b; } } #undef DOLINE #undef ROL - void OSystem_SDL_Common::add_dirty_rgn_auto(const byte *buf) { - assert( ((uint32)buf & 3) == 0); + assert(((uint32)buf & 3) == 0); /* generate a table of the checksums */ mk_checksums(buf); @@ -304,18 +325,18 @@ void OSystem_SDL_Common::add_dirty_rgn_auto(const byte *buf) { int x,y,w; uint32 *ck = _dirty_checksums; - for(y=0; y!=_screenHeight/8; y++) { - for(x=0; x!=_screenWidth/8; x++,ck++) { + for(y = 0; y!=_screenHeight / 8; y++) { + for(x = 0; x!=_screenWidth / 8; x++,ck++) { if (ck[0] != ck[CKSUM_NUM]) { /* found a dirty 8x8 block, now go as far to the right as possible, and at the same time, unmark the dirty status by setting old to new. */ w=0; do { - ck[w+CKSUM_NUM] = ck[w]; + ck[w + CKSUM_NUM] = ck[w]; w++; - } while (x+w != _screenWidth/8 && ck[w] != ck[w+CKSUM_NUM]); - - add_dirty_rect(x*8, y*8, w*8, 8); + } while (x + w != _screenWidth / 8 && ck[w] != ck[w + CKSUM_NUM]); + + add_dirty_rect(x * 8, y * 8, w * 8, 8); if (_forceFull) goto get_out; @@ -338,18 +359,18 @@ void OSystem_SDL_Common::kbd_mouse() { km.x_down_count = 2; } if (km.y_down_count == 1) { - km.y_down_time = time; + km.y_down_time = time; km.y_down_count = 2; } if (km.x_vel || km.y_vel) { if (km.x_down_count) { - if (time > km.x_down_time + km.delay_time*12) { + if (time > km.x_down_time + km.delay_time * 12) { if (km.x_vel > 0) km.x_vel++; else km.x_vel--; - } else if (time > km.x_down_time + km.delay_time*8) { + } else if (time > km.x_down_time + km.delay_time * 8) { if (km.x_vel > 0) km.x_vel = 5; else @@ -357,12 +378,12 @@ void OSystem_SDL_Common::kbd_mouse() { } } if (km.y_down_count) { - if (time > km.y_down_time + km.delay_time*12) { + if (time > km.y_down_time + km.delay_time * 12) { if (km.y_vel > 0) km.y_vel++; else km.y_vel--; - } else if (time > km.y_down_time + km.delay_time*8) { + } else if (time > km.y_down_time + km.delay_time * 8) { if (km.y_vel > 0) km.y_vel = 5; else @@ -412,7 +433,7 @@ bool OSystem_SDL_Common::show_mouse(bool visible) { return last; } - + void OSystem_SDL_Common::set_mouse_pos(int x, int y) { if (x != _mouseCurState.x || y != _mouseCurState.y) { _mouseCurState.x = x; @@ -427,7 +448,6 @@ void OSystem_SDL_Common::warp_mouse(int x, int y) { } void OSystem_SDL_Common::set_mouse_cursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y) { - assert(0 <= w && w <= MAX_MOUSE_W); assert(0 <= h && h <= MAX_MOUSE_H); _mouseCurState.w = w; @@ -436,23 +456,23 @@ void OSystem_SDL_Common::set_mouse_cursor(const byte *buf, uint w, uint h, int h _mouseHotspotX = hotspot_x; _mouseHotspotY = hotspot_y; - _mouseData = (byte*)buf; + _mouseData = (byte *)buf; undraw_mouse(); } - + void OSystem_SDL_Common::set_shake_pos(int shake_pos) { _newShakePos = shake_pos; } - + uint32 OSystem_SDL_Common::get_msecs() { return SDL_GetTicks(); } - + void OSystem_SDL_Common::delay_msecs(uint msecs) { SDL_Delay(msecs); } - + void *OSystem_SDL_Common::create_thread(ThreadProc *proc, void *param) { return SDL_CreateThread(proc, param); } @@ -472,7 +492,7 @@ static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) } return key; } - + bool OSystem_SDL_Common::poll_event(Event *event) { SDL_Event ev; int axis; @@ -579,7 +599,7 @@ bool OSystem_SDL_Common::poll_event(Event *event) { default: break; } - + return true; } @@ -589,7 +609,7 @@ bool OSystem_SDL_Common::poll_event(Event *event) { event->kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); switch(ev.key.keysym.sym){ - case SDLK_LEFT: + case SDLK_LEFT: if (km.x_vel < 0) { km.x_vel = 0; km.x_down_count = 0; @@ -717,7 +737,7 @@ bool OSystem_SDL_Common::poll_event(Event *event) { } } return true; - + case SDL_JOYAXISMOTION: axis = ev.jaxis.value; if ( axis > JOY_DEADZONE) { @@ -728,7 +748,7 @@ bool OSystem_SDL_Common::poll_event(Event *event) { event->event_code = EVENT_MOUSEMOVE; } else axis = 0; - + if ( ev.jaxis.axis == JOY_XAXIS) { #ifdef JOY_ANALOG km.x_vel = axis/2000; @@ -748,11 +768,11 @@ bool OSystem_SDL_Common::poll_event(Event *event) { axis = -axis; #endif #ifdef JOY_ANALOG - km.y_vel = -axis/2000; + km.y_vel = -axis / 2000; km.y_down_count = 0; #else if (axis != 0) { - km.y_vel = (-axis > 0) ? 1:-1; + km.y_vel = (-axis > 0) ? 1: -1; km.y_down_count = 1; } else { km.y_vel = 0; @@ -760,7 +780,7 @@ bool OSystem_SDL_Common::poll_event(Event *event) { } #endif } - return true; + return true; case SDL_QUIT: quit(); @@ -772,7 +792,6 @@ bool OSystem_SDL_Common::set_sound_proc(void *param, SoundProc *proc, byte forma SDL_AudioSpec desired; /* only one format supported at the moment */ - desired.freq = SAMPLES_PER_SEC; desired.format = AUDIO_S16SYS; desired.channels = 2; @@ -818,13 +837,13 @@ uint32 OSystem_SDL_Common::property(int param, Property *value) { return 0; } - + void OSystem_SDL_Common::quit() { if(_cdrom) { SDL_CDStop(_cdrom); SDL_CDClose(_cdrom); } - unload_gfx_mode(); + unload_gfx_mode(); exit(0); } @@ -868,10 +887,9 @@ void OSystem_SDL_Common::draw_mouse() { _mouseOldState.h = h; // Draw the mouse cursor; backup the covered area in "bak" - if (SDL_LockSurface(_overlayVisible ? _tmpscreen : _screen) == -1) error("SDL_LockSurface failed: %s.\n", SDL_GetError()); - + // Mark as dirty add_dirty_rect(x, y, w, h); @@ -897,10 +915,10 @@ void OSystem_SDL_Common::draw_mouse() { } } else { - uint16 *bak = (uint16*)_mouseBackup; // Surface used to backup the area obscured by the mouse + uint16 *bak = (uint16 *)_mouseBackup; // Surface used to backup the area obscured by the mouse uint16 *dst; // Surface we are drawing into - dst = (uint16 *)_tmpscreen->pixels + (y+1) * _tmpScreenWidth + (x+1); + dst = (uint16 *)_tmpscreen->pixels + (y + 1) * _tmpScreenWidth + (x + 1); while (h > 0) { int width = w; while (width > 0) { @@ -916,11 +934,10 @@ void OSystem_SDL_Common::draw_mouse() { dst += _tmpScreenWidth - w; h--; } - } SDL_UnlockSurface(_overlayVisible ? _tmpscreen : _screen); - + // Finally, set the flag to indicate the mouse has been drawn _mouseDrawn = true; } @@ -940,9 +957,8 @@ void OSystem_SDL_Common::undraw_mouse() { int x, y; if (!_overlayVisible) { - byte *dst, *bak = _mouseBackup; - + // No need to do clipping here, since draw_mouse() did that already dst = (byte *)_screen->pixels + old_mouse_y * _screenWidth + old_mouse_x; for (y = 0; y < old_mouse_h; ++y, bak += MAX_MOUSE_W, dst += _screenWidth) { @@ -956,7 +972,7 @@ void OSystem_SDL_Common::undraw_mouse() { uint16 *dst, *bak = (uint16 *)_mouseBackup; // No need to do clipping here, since draw_mouse() did that already - dst = (uint16 *)_tmpscreen->pixels + (old_mouse_y+1) * _tmpScreenWidth + (old_mouse_x+1); + dst = (uint16 *)_tmpscreen->pixels + (old_mouse_y + 1) * _tmpScreenWidth + (old_mouse_x + 1); for (y = 0; y < old_mouse_h; ++y, bak += MAX_MOUSE_W, dst += _tmpScreenWidth) { for (x = 0; x < old_mouse_w; ++x) { dst[x] = bak[x]; @@ -972,7 +988,6 @@ void OSystem_SDL_Common::undraw_mouse() { void OSystem_SDL_Common::stop_cdrom() { /* Stop CD Audio in 1/10th of a second */ cd_stop_time = SDL_GetTicks() + 100; cd_num_loops = 0; - } void OSystem_SDL_Common::play_cdrom(int track, int num_loops, int start_frame, int end_frame) { @@ -983,7 +998,7 @@ void OSystem_SDL_Common::play_cdrom(int track, int num_loops, int start_frame, i return; if (end_frame > 0) - end_frame+=5; + end_frame +=5; cd_track = track; cd_num_loops = num_loops; @@ -1009,7 +1024,7 @@ bool OSystem_SDL_Common::poll_cdrom() { void OSystem_SDL_Common::update_cdrom() { if (!_cdrom) return; - + if (cd_stop_time != 0 && SDL_GetTicks() >= cd_stop_time) { SDL_CDStop(_cdrom); cd_num_loops = 0; @@ -1098,8 +1113,7 @@ void OSystem_SDL_Common::delete_mutex(void *mutex) { SDL_DestroyMutex((SDL_mutex *) mutex); } -void OSystem_SDL_Common::show_overlay() -{ +void OSystem_SDL_Common::show_overlay() { // hide the mouse undraw_mouse(); @@ -1107,8 +1121,7 @@ void OSystem_SDL_Common::show_overlay() clear_overlay(); } -void OSystem_SDL_Common::hide_overlay() -{ +void OSystem_SDL_Common::hide_overlay() { // hide the mouse undraw_mouse(); @@ -1116,8 +1129,7 @@ void OSystem_SDL_Common::hide_overlay() _forceFull = true; } -void OSystem_SDL_Common::clear_overlay() -{ +void OSystem_SDL_Common::clear_overlay() { if (!_overlayVisible) return; @@ -1144,8 +1156,7 @@ int16 OSystem_SDL_Common::get_width() { return _screenWidth; } -void OSystem_SDL_Common::grab_overlay(int16 *buf, int pitch) -{ +void OSystem_SDL_Common::grab_overlay(int16 *buf, int pitch) { if (!_overlayVisible) return; @@ -1169,8 +1180,7 @@ void OSystem_SDL_Common::grab_overlay(int16 *buf, int pitch) SDL_UnlockSurface(_tmpscreen); } -void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, int y, int w, int h) -{ +void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, int y, int w, int h) { if (!_overlayVisible) return; @@ -1178,13 +1188,28 @@ void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, i return; // Clip the coordinates - if (x < 0) { w+=x; buf-=x; x = 0; } - if (y < 0) { h+=y; buf-=y*pitch; y = 0; } - if (w > _screenWidth-x) { w = _screenWidth - x; } - if (h > _screenHeight-y) { h = _screenHeight - y; } + if (x < 0) { + w += x; + buf -= x; + x = 0; + } + + if (y < 0) { + h += y; buf -= y * pitch; + y = 0; + } + + if (w > _screenWidth - x) { + w = _screenWidth - x; + } + + if (h > _screenHeight-y) { + h = _screenHeight - y; + } + if (w <= 0 || h <= 0) return; - + // Mark the modified region as dirty cksum_valid = false; add_dirty_rect(x, y, w, h); @@ -1195,9 +1220,9 @@ void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, i if (SDL_LockSurface(_tmpscreen) == -1) error("SDL_LockSurface failed: %s.\n", SDL_GetError()); - int16 *dst = (int16 *)_tmpscreen->pixels + (y+1) * _tmpScreenWidth + (x+1); + int16 *dst = (int16 *)_tmpscreen->pixels + (y + 1) * _tmpScreenWidth + (x + 1); do { - memcpy(dst, buf, w*2); + memcpy(dst, buf, w * 2); dst += _tmpScreenWidth; buf += pitch; } while (--h); @@ -1205,12 +1230,10 @@ void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, i SDL_UnlockSurface(_tmpscreen); } -int16 OSystem_SDL_Common::RBGToColor(uint8 r, uint8 g, uint8 b) -{ +int16 OSystem_SDL_Common::RBGToColor(uint8 r, uint8 g, uint8 b) { return SDL_MapRGB(_tmpscreen->format, r, g, b); } -void OSystem_SDL_Common::colorToRBG(int16 color, uint8 &r, uint8 &g, uint8 &b) -{ +void OSystem_SDL_Common::colorToRBG(int16 color, uint8 &r, uint8 &g, uint8 &b) { SDL_GetRGB(color, _tmpscreen->format, &r, &g, &b); } diff --git a/backends/sdl/sdl-common.h b/backends/sdl/sdl-common.h index e0d4d37a28..0bb63a961c 100644 --- a/backends/sdl/sdl-common.h +++ b/backends/sdl/sdl-common.h @@ -57,29 +57,29 @@ public: // backend of the mouse cursor's current position, this function // actually moves the cursor to the specified position. void warp_mouse(int x, int y); - + // Set the bitmap that's used when drawing the cursor. void set_mouse_cursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y); - + // Shaking is used in SCUMM. Set current shake position. void set_shake_pos(int shake_pos); - + // Get the number of milliseconds since the program was started. uint32 get_msecs(); - + // Delay for a specified amount of milliseconds void delay_msecs(uint msecs); - + // Create a thread void *create_thread(ThreadProc *proc, void *param); - + // Get the next event. // Returns true if an event was retrieved. bool poll_event(Event *event); - + // Set function that generates samples bool set_sound_proc(void *param, SoundProc *proc, byte sound); - + // Poll CD status // Returns true if cd audio is playing bool poll_cdrom(); @@ -183,7 +183,7 @@ protected: // joystick SDL_Joystick *_joystick; - + bool _mouseVisible; bool _mouseDrawn; byte *_mouseData; diff --git a/backends/sdl/sdl.cpp b/backends/sdl/sdl.cpp index d618b60065..7e3fb0868a 100644 --- a/backends/sdl/sdl.cpp +++ b/backends/sdl/sdl.cpp @@ -140,7 +140,6 @@ normal_mode:; if (_screen == NULL) error("_screen failed"); - // // Create the surface that contains the scaled graphics in 16 bit mode // @@ -161,9 +160,9 @@ normal_mode:; Init_2xSaI(565); // Need some extra bytes around when using 2xSaI - uint16 *tmp_screen = (uint16*)calloc(_tmpScreenWidth*(_screenHeight+3), sizeof(uint16)); + uint16 *tmp_screen = (uint16 *)calloc(_tmpScreenWidth * (_screenHeight + 3), sizeof(uint16)); _tmpscreen = SDL_CreateRGBSurfaceFrom(tmp_screen, - _tmpScreenWidth, _screenHeight + 3, 16, _tmpScreenWidth*2, + _tmpScreenWidth, _screenHeight + 3, 16, _tmpScreenWidth * 2, _hwscreen->format->Rmask, _hwscreen->format->Gmask, _hwscreen->format->Bmask, @@ -171,13 +170,12 @@ normal_mode:; if (_tmpscreen == NULL) error("_tmpscreen failed"); - + // keyboard cursor control, some other better place for it? km.x_max = _screenWidth * _scaleFactor - 1; km.y_max = _screenHeight * _scaleFactor - 1; km.delay_time = 25; km.last_time = 0; - } void OSystem_SDL::unload_gfx_mode() { @@ -230,12 +228,11 @@ void OSystem_SDL::hotswap_gfx_mode() { } void OSystem_SDL::update_screen() { - assert(_hwscreen != NULL); // If the shake position changed, fill the dirty area with blackness if (_currentShakePos != _newShakePos) { - SDL_Rect blackrect = {0, 0, _screenWidth*_scaleFactor, _newShakePos*_scaleFactor}; + SDL_Rect blackrect = {0, 0, _screenWidth * _scaleFactor, _newShakePos * _scaleFactor}; SDL_FillRect(_hwscreen, &blackrect, 0); _currentShakePos = _newShakePos; @@ -270,11 +267,11 @@ void OSystem_SDL::update_screen() { // Only draw anything if necessary if (_num_dirty_rects > 0) { - + SDL_Rect *r; uint32 srcPitch, dstPitch; SDL_Rect *last_rect = _dirty_rect_list + _num_dirty_rects; - + // Convert appropriate parts of the 8bpp image into 16bpp if (!_overlayVisible) { SDL_Rect dst; @@ -286,7 +283,7 @@ void OSystem_SDL::update_screen() { error("SDL_BlitSurface failed: %s", SDL_GetError()); } } - + SDL_LockSurface(_tmpscreen); SDL_LockSurface(_hwscreen); @@ -300,11 +297,11 @@ void OSystem_SDL::update_screen() { dst_h = r->h; if (dst_h > _screenHeight - dst_y) dst_h = _screenHeight - dst_y; - + dst_y *= _scaleFactor; - - _scaler_proc((byte*)_tmpscreen->pixels + (r->x*2+2) + (r->y+1)*srcPitch, srcPitch, NULL, - (byte*)_hwscreen->pixels + r->x*2*_scaleFactor + dst_y*dstPitch, dstPitch, r->w, dst_h); + + _scaler_proc((byte *)_tmpscreen->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch, NULL, + (byte *)_hwscreen->pixels + r->x * 2 * _scaleFactor + dst_y * dstPitch, dstPitch, r->w, dst_h); } r->x *= _scaleFactor; @@ -332,7 +329,6 @@ void OSystem_SDL::update_screen() { } uint32 OSystem_SDL::property(int param, Property *value) { - if (param == PROP_TOGGLE_FULLSCREEN) { assert(_hwscreen != 0); _full_screen ^= true; @@ -358,8 +354,6 @@ uint32 OSystem_SDL::property(int param, Property *value) { return 1; } - - return OSystem_SDL_Common::property(param, value); } diff --git a/backends/sdl/sdl_gl.cpp b/backends/sdl/sdl_gl.cpp index c0e3875026..378d336c18 100644 --- a/backends/sdl/sdl_gl.cpp +++ b/backends/sdl/sdl_gl.cpp @@ -108,14 +108,14 @@ void OSystem_SDL_OpenGL::load_gfx_mode() { // gl_flags = FB2GL_320 | FB2GL_RGBA | FB2GL_16BIT; - if (_full_screen) { - gl_flags |= (FB2GL_FS); - _glScreenStart = 0; + if (_full_screen) { + gl_flags |= (FB2GL_FS); + _glScreenStart = 0; } // 640x480 screen resolution - fb2gl.init(640,480,0,_glScreenStart? 15: 70,gl_flags); + fb2gl.init(640, 480, 0,_glScreenStart? 15: 70,gl_flags); - SDL_SetGamma(1.25,1.25,1.25); + SDL_SetGamma(1.25, 1.25, 1.25); // @@ -123,9 +123,9 @@ void OSystem_SDL_OpenGL::load_gfx_mode() { // // Need some extra bytes around when using 2xSaI - uint16 *tmp_screen = (uint16*)calloc(_tmpScreenWidth*(_screenHeight+3),sizeof(uint16)); + uint16 *tmp_screen = (uint16 *)calloc(_tmpScreenWidth * (_screenHeight + 3),sizeof(uint16)); _tmpscreen = SDL_CreateRGBSurfaceFrom(tmp_screen, - _tmpScreenWidth, _screenHeight + 3, 16, _tmpScreenWidth*2, + _tmpScreenWidth, _screenHeight + 3, 16, _tmpScreenWidth * 2, Rmask, Gmask, Bmask, @@ -144,16 +144,15 @@ void OSystem_SDL_OpenGL::load_gfx_mode() { tmpBlackRect.y = 0; tmpBlackRect.w = _screenWidth; tmpBlackRect.h = 256-_screenHeight-_glScreenStart; - + if (_tmpscreen == NULL) error("_tmpscreen failed"); - + // keyboard cursor control, some other better place for it? km.x_max = _screenWidth * _scaleFactor - 1; km.y_max = _screenHeight * _scaleFactor - 1; km.delay_time = 25; km.last_time = 0; - } void OSystem_SDL_OpenGL::unload_gfx_mode() { @@ -163,20 +162,19 @@ void OSystem_SDL_OpenGL::unload_gfx_mode() { } if (_tmpscreen) { - free((uint16*)_tmpscreen->pixels); + free((uint16 *)_tmpscreen->pixels); SDL_FreeSurface(_tmpscreen); _tmpscreen = NULL; } } void OSystem_SDL_OpenGL::update_screen() { - // If the shake position changed, fill the dirty area with blackness if (_currentShakePos != _newShakePos) { SDL_Rect blackrect = {0, _glScreenStart, _screenWidth, _newShakePos+_glScreenStart}; SDL_FillRect(tmpSurface, &blackrect, 0); - fb2gl.blit16(tmpSurface,1,&blackrect,0,0); + fb2gl.blit16(tmpSurface, 1, &blackrect, 0, 0); _currentShakePos = _newShakePos; @@ -227,13 +225,14 @@ void OSystem_SDL_OpenGL::update_screen() { } // Almost the same thing as SDL_UpdateRects - fb2gl.blit16(_tmpscreen,_num_dirty_rects,_dirty_rect_list,0, - _currentShakePos+_glScreenStart); + fb2gl.blit16(_tmpscreen, _num_dirty_rects, _dirty_rect_list, 0, + _currentShakePos+_glScreenStart); + + tmpBlackRect.h = 256 - _screenHeight - _glScreenStart - _currentShakePos; - tmpBlackRect.h = 256-_screenHeight-_glScreenStart-_currentShakePos; - SDL_FillRect(tmpSurface, &tmpBlackRect, 0); - fb2gl.blit16(tmpSurface,1,&tmpBlackRect,0,_screenHeight+_glScreenStart+_currentShakePos); + fb2gl.blit16(tmpSurface, 1, &tmpBlackRect, 0,_screenHeight + + _glScreenStart+_currentShakePos); fb2gl.display(); } @@ -243,67 +242,61 @@ void OSystem_SDL_OpenGL::update_screen() { } uint32 OSystem_SDL_OpenGL::property(int param, Property *value) { + int i; if (param == PROP_TOGGLE_FULLSCREEN) { _full_screen ^= true; - + SDL_WM_ToggleFullScreen(fb2gl.screen); return 1; } else if (param == PROP_SET_GFX_MODE) { - SDL_Rect full = {0,0,_screenWidth,_screenHeight}; + SDL_Rect full = {0, 0, _screenWidth, _screenHeight}; glPopMatrix(); switch(value->gfx_mode) { - case 0: // Bilinear Filtering (on/off) - _glBilinearFilter ^= true; - for (int i=0; i<2; i++) { - glBindTexture(GL_TEXTURE_2D,i); - if (_glBilinearFilter) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, - GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, - GL_LINEAR); - } - else { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, - GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, - GL_NEAREST); - } - } - break; - case 1: // Don't fit the whole screen - fb2gl.init(0,0,0,15,gl_flags); - _glScreenStart = 20; - SDL_FillRect(tmpSurface,&tmpBlackRect,0); - fb2gl.blit16(tmpSurface,1,&tmpBlackRect,0,0); - break; - case 2: // Fit the whole screen - fb2gl.init(0,0,0,70,gl_flags); - _glScreenStart = 0; - break; - default: // Zooming - glPushMatrix(); -/* SDL_FillRect(tmpSurface, &full, 0); - fb2gl.blit16(tmpSurface,1,&full,0,_glScreenStart); - fb2gl.display(); - double x = (double)((_mouseCurState.x) - - (_screenWidth/2)) / (_screenWidth/2); - double y = (double)((_mouseCurState.y) - - (_screenHeight/2)) / (_screenHeight/2); - glTranslatef(-x,y,0); + case 0: // Bilinear Filtering (on/off) + _glBilinearFilter ^= true; + for (i = 0; i < 2; i++) { + glBindTexture(GL_TEXTURE_2D, i); + if (_glBilinearFilter) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + } + break; + case 1: // Don't fit the whole screen + fb2gl.init(0, 0, 0, 15, gl_flags); + _glScreenStart = 20; + SDL_FillRect(tmpSurface, &tmpBlackRect, 0); + fb2gl.blit16(tmpSurface, 1, &tmpBlackRect, 0, 0); + break; + case 2: // Fit the whole screen + fb2gl.init(0, 0, 0, 70, gl_flags); + _glScreenStart = 0; + break; + default: // Zooming + glPushMatrix(); +/* SDL_FillRect(tmpSurface, &full, 0); + fb2gl.blit16(tmpSurface, 1, &full,0, _glScreenStart); + fb2gl.display(); + double x = (double)((_mouseCurState.x) + - (_screenWidth / 2)) / (_screenWidth / 2); + double y = (double)((_mouseCurState.y) + - (_screenHeight / 2)) / (_screenHeight / 2); + glTranslatef(-x, y, 0); */ - glScalef(1.0+(double)(value->gfx_mode-1)/10, - 1.0+(double)(value->gfx_mode-1)/10, - 0); + glScalef(1.0 + (double)(value->gfx_mode - 1) / 10, + 1.0 + (double)(value->gfx_mode - 1) / 10, 0); }; - fb2gl.blit16(_tmpscreen,1,&full,0,_glScreenStart); + fb2gl.blit16(_tmpscreen, 1, &full, 0, _glScreenStart); fb2gl.display(); - + return 1; } - - + return OSystem_SDL_Common::property(param, value); } diff --git a/sound/fmopl.cpp b/sound/fmopl.cpp index dca5d23e65..014e2da010 100644 --- a/sound/fmopl.cpp +++ b/sound/fmopl.cpp @@ -154,11 +154,11 @@ static const double KSL_TABLE_SEED[8 * 16] = { static int SL_TABLE[16]; -static const uint SL_TABLE_SEED[16]={ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 31 +static const uint SL_TABLE_SEED[16] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 31 }; -#define TL_MAX (EG_ENT*2) /* limit(tl + ksr + envelope) + sinwave */ +#define TL_MAX (EG_ENT * 2) /* limit(tl + ksr + envelope) + sinwave */ /* TotalLevel : 48 24 12 6 3 1.5 0.75 (dB) */ /* TL_TABLE[ 0 to TL_MAX ] : plus section */ /* TL_TABLE[ TL_MAX to TL_MAX+TL_MAX-1 ] : minus section */ @@ -174,14 +174,14 @@ static int *VIB_TABLE; /* envelope output curve table */ /* attack + decay + OFF */ //static int ENV_CURVE[2*EG_ENT+1]; -static int ENV_CURVE[2 * 4096+1]; // to keep it static ... +static int ENV_CURVE[2 * 4096 + 1]; // to keep it static ... /* multiple table */ -#define ML(a) (int)(a*2) +#define ML(a) (int)(a * 2) static const uint MUL_TABLE[16]= { /* 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 */ - ML(0.50), ML(1.00), ML(2.00), ML(3.00), ML(4.00), ML(5.00), ML(6.00), ML(7.00), - ML(8.00), ML(9.00), ML(10.00), ML(10.00),ML(12.00),ML(12.00),ML(15.00),ML(15.00) + ML(0.50), ML(1.00), ML(2.00), ML(3.00), ML(4.00), ML(5.00), ML(6.00), ML(7.00), + ML(8.00), ML(9.00), ML(10.00), ML(10.00),ML(12.00),ML(12.00),ML(15.00),ML(15.00) }; #undef ML @@ -200,37 +200,37 @@ static void *cur_chip = NULL; /* current chip point */ /* static OPLSAMPLE *bufL,*bufR; */ static OPL_CH *S_CH; static OPL_CH *E_CH; -OPL_SLOT *SLOT7_1,*SLOT7_2,*SLOT8_1,*SLOT8_2; +OPL_SLOT *SLOT7_1, *SLOT7_2, *SLOT8_1, *SLOT8_2; static int outd[1]; static int ams; static int vib; -int *ams_table; -int *vib_table; +int *ams_table; +int *vib_table; static int amsIncr; static int vibIncr; static int feedback2; /* connect for SLOT 2 */ /* --------------------- rebuild tables ------------------- */ -#define SC_KSL(mydb) ((uint) (mydb / (EG_STEP/2))) -#define SC_SL(db) (int)(db*((3/EG_STEP)*(1<<ENV_BITS)))+EG_DST +#define SC_KSL(mydb) ((uint) (mydb / (EG_STEP / 2))) +#define SC_SL(db) (int)(db * ((3 / EG_STEP) * (1 << ENV_BITS))) + EG_DST void OPLBuildTables(int ENV_BITS_PARAM, int EG_ENT_PARAM) { int i; ENV_BITS = ENV_BITS_PARAM; EG_ENT = EG_ENT_PARAM; - EG_OFF = ((2*EG_ENT)<<ENV_BITS); /* OFF */ + EG_OFF = ((2 * EG_ENT)<<ENV_BITS); /* OFF */ EG_DED = EG_OFF; - EG_DST = (EG_ENT<<ENV_BITS); /* DECAY START */ + EG_DST = (EG_ENT << ENV_BITS); /* DECAY START */ EG_AED = EG_DST; //EG_STEP = (96.0/EG_ENT); - for (i = 0; i < (int)(sizeof(KSL_TABLE_SEED)/sizeof(double)); i++) + for (i = 0; i < (int)(sizeof(KSL_TABLE_SEED) / sizeof(double)); i++) KSL_TABLE[i] = SC_KSL(KSL_TABLE_SEED[i]); - for (i = 0; i < (int)(sizeof(SL_TABLE_SEED)/sizeof(uint)); i++) + for (i = 0; i < (int)(sizeof(SL_TABLE_SEED) / sizeof(uint)); i++) SL_TABLE[i] = SC_SL(SL_TABLE_SEED[i]); } @@ -239,7 +239,7 @@ void OPLBuildTables(int ENV_BITS_PARAM, int EG_ENT_PARAM) { /* --------------------- subroutines --------------------- */ -inline int Limit( int val, int max, int min ) { +inline int Limit(int val, int max, int min) { if ( val > max ) val = max; else if ( val < min ) @@ -249,30 +249,25 @@ inline int Limit( int val, int max, int min ) { } /* status set and IRQ handling */ -inline void OPL_STATUS_SET(FM_OPL *OPL,int flag) -{ +inline void OPL_STATUS_SET(FM_OPL *OPL, int flag) { /* set status flag */ OPL->status |= flag; - if(!(OPL->status & 0x80)) - { - if(OPL->status & OPL->statusmask) - { /* IRQ on */ + if(!(OPL->status & 0x80)) { + if(OPL->status & OPL->statusmask) { /* IRQ on */ OPL->status |= 0x80; /* callback user interrupt handler (IRQ is OFF to ON) */ - if(OPL->IRQHandler) (OPL->IRQHandler)(OPL->IRQParam,1); + if(OPL->IRQHandler) + (OPL->IRQHandler)(OPL->IRQParam,1); } } } /* status reset and IRQ handling */ -inline void OPL_STATUS_RESET(FM_OPL *OPL,int flag) -{ +inline void OPL_STATUS_RESET(FM_OPL *OPL, int flag) { /* reset status flag */ - OPL->status &=~flag; - if((OPL->status & 0x80)) - { - if (!(OPL->status & OPL->statusmask) ) - { + OPL->status &= ~flag; + if((OPL->status & 0x80)) { + if (!(OPL->status & OPL->statusmask)) { OPL->status &= 0x7f; /* callback user interrupt handler (IRQ is ON to OFF) */ if(OPL->IRQHandler) (OPL->IRQHandler)(OPL->IRQParam,0); @@ -281,8 +276,7 @@ inline void OPL_STATUS_RESET(FM_OPL *OPL,int flag) } /* IRQ mask set */ -inline void OPL_STATUSMASK_SET(FM_OPL *OPL,int flag) -{ +inline void OPL_STATUSMASK_SET(FM_OPL *OPL, int flag) { OPL->statusmask = flag; /* IRQ handling check */ OPL_STATUS_SET(OPL,0); @@ -290,8 +284,7 @@ inline void OPL_STATUSMASK_SET(FM_OPL *OPL,int flag) } /* ----- key on ----- */ -inline void OPL_KEYON(OPL_SLOT *SLOT) -{ +inline void OPL_KEYON(OPL_SLOT *SLOT) { /* sin wave restart */ SLOT->Cnt = 0; /* set attack */ @@ -301,13 +294,11 @@ inline void OPL_KEYON(OPL_SLOT *SLOT) SLOT->eve = EG_AED; } /* ----- key off ----- */ -inline void OPL_KEYOFF(OPL_SLOT *SLOT) -{ - if( SLOT->evm > ENV_MOD_RR) - { +inline void OPL_KEYOFF(OPL_SLOT *SLOT) { + if( SLOT->evm > ENV_MOD_RR) { /* set envelope counter from envleope output */ SLOT->evm = ENV_MOD_RR; - if( !(SLOT->evc&EG_DST) ) + if( !(SLOT->evc & EG_DST) ) //SLOT->evc = (ENV_CURVE[SLOT->evc>>ENV_BITS]<<ENV_BITS) + EG_DST; SLOT->evc = EG_DST; SLOT->eve = EG_DED; @@ -317,11 +308,9 @@ inline void OPL_KEYOFF(OPL_SLOT *SLOT) /* ---------- calcrate Envelope Generator & Phase Generator ---------- */ /* return : envelope output */ -inline uint OPL_CALC_SLOT( OPL_SLOT *SLOT ) -{ +inline uint OPL_CALC_SLOT(OPL_SLOT *SLOT) { /* calcrate envelope generator */ - if( (SLOT->evc+=SLOT->evs) >= SLOT->eve ) - { + if((SLOT->evc += SLOT->evs) >= SLOT->eve) { switch( SLOT->evm ){ case ENV_MOD_AR: /* ATTACK -> DECAY1 */ /* next DR */ @@ -333,38 +322,33 @@ inline uint OPL_CALC_SLOT( OPL_SLOT *SLOT ) case ENV_MOD_DR: /* DECAY -> SL or RR */ SLOT->evc = SLOT->SL; SLOT->eve = EG_DED; - if(SLOT->eg_typ) - { + if(SLOT->eg_typ) { SLOT->evs = 0; - } - else - { + } else { SLOT->evm = ENV_MOD_RR; SLOT->evs = SLOT->evsr; } break; case ENV_MOD_RR: /* RR -> OFF */ SLOT->evc = EG_OFF; - SLOT->eve = EG_OFF+1; + SLOT->eve = EG_OFF + 1; SLOT->evs = 0; break; } } /* calcrate envelope */ - return SLOT->TLL+ENV_CURVE[SLOT->evc>>ENV_BITS]+(SLOT->ams ? ams : 0); + return SLOT->TLL + ENV_CURVE[SLOT->evc>>ENV_BITS] + (SLOT->ams ? ams : 0); } /* set algorythm connection */ -static void set_algorythm( OPL_CH *CH) -{ +static void set_algorythm(OPL_CH *CH) { int *carrier = &outd[0]; CH->connect1 = CH->CON ? carrier : &feedback2; CH->connect2 = carrier; } /* ---------- frequency counter for operater update ---------- */ -inline void CALC_FCSLOT(OPL_CH *CH,OPL_SLOT *SLOT) -{ +inline void CALC_FCSLOT(OPL_CH *CH, OPL_SLOT *SLOT) { int ksr; /* frequency step counter */ @@ -383,72 +367,70 @@ inline void CALC_FCSLOT(OPL_CH *CH,OPL_SLOT *SLOT) } /* set multi,am,vib,EG-TYP,KSR,mul */ -inline void set_mul(FM_OPL *OPL,int slot,int v) -{ - OPL_CH *CH = &OPL->P_CH[slot/2]; - OPL_SLOT *SLOT = &CH->SLOT[slot&1]; - - SLOT->mul = MUL_TABLE[v&0x0f]; - SLOT->KSR = (v&0x10) ? 0 : 2; - SLOT->eg_typ = (v&0x20)>>5; - SLOT->vib = (v&0x40); - SLOT->ams = (v&0x80); - CALC_FCSLOT(CH,SLOT); +inline void set_mul(FM_OPL *OPL, int slot, int v) { + OPL_CH *CH = &OPL->P_CH[slot / 2]; + OPL_SLOT *SLOT = &CH->SLOT[slot & 1]; + + SLOT->mul = MUL_TABLE[v & 0x0f]; + SLOT->KSR = (v & 0x10) ? 0 : 2; + SLOT->eg_typ = (v & 0x20) >> 5; + SLOT->vib = (v & 0x40); + SLOT->ams = (v & 0x80); + CALC_FCSLOT(CH, SLOT); } /* set ksl & tl */ -inline void set_ksl_tl(FM_OPL *OPL,int slot,int v) -{ - OPL_CH *CH = &OPL->P_CH[slot/2]; - OPL_SLOT *SLOT = &CH->SLOT[slot&1]; - int ksl = v>>6; /* 0 / 1.5 / 3 / 6 db/OCT */ +inline void set_ksl_tl(FM_OPL *OPL, int slot, int v) { + OPL_CH *CH = &OPL->P_CH[slot / 2]; + OPL_SLOT *SLOT = &CH->SLOT[slot & 1]; + int ksl = v >> 6; /* 0 / 1.5 / 3 / 6 db/OCT */ SLOT->ksl = ksl ? 3-ksl : 31; - SLOT->TL = (int)((v&0x3f)*(0.75/EG_STEP)); /* 0.75db step */ + SLOT->TL = (int)((v & 0x3f) * (0.75 / EG_STEP)); /* 0.75db step */ - if( !(OPL->mode&0x80) ) - { /* not CSM latch total level */ - SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl); + if(!(OPL->mode & 0x80)) { /* not CSM latch total level */ + SLOT->TLL = SLOT->TL + (CH->ksl_base >> SLOT->ksl); } } /* set attack rate & decay rate */ -inline void set_ar_dr(FM_OPL *OPL,int slot,int v) -{ - OPL_CH *CH = &OPL->P_CH[slot/2]; - OPL_SLOT *SLOT = &CH->SLOT[slot&1]; - int ar = v>>4; - int dr = v&0x0f; +inline void set_ar_dr(FM_OPL *OPL, int slot, int v) { + OPL_CH *CH = &OPL->P_CH[slot / 2]; + OPL_SLOT *SLOT = &CH->SLOT[slot & 1]; + int ar = v >> 4; + int dr = v & 0x0f; - SLOT->AR = ar ? &OPL->AR_TABLE[ar<<2] : RATE_0; + SLOT->AR = ar ? &OPL->AR_TABLE[ar << 2] : RATE_0; SLOT->evsa = SLOT->AR[SLOT->ksr]; - if( SLOT->evm == ENV_MOD_AR ) SLOT->evs = SLOT->evsa; + if(SLOT->evm == ENV_MOD_AR) + SLOT->evs = SLOT->evsa; SLOT->DR = dr ? &OPL->DR_TABLE[dr<<2] : RATE_0; SLOT->evsd = SLOT->DR[SLOT->ksr]; - if( SLOT->evm == ENV_MOD_DR ) SLOT->evs = SLOT->evsd; + if(SLOT->evm == ENV_MOD_DR) + SLOT->evs = SLOT->evsd; } /* set sustain level & release rate */ -inline void set_sl_rr(FM_OPL *OPL,int slot,int v) -{ - OPL_CH *CH = &OPL->P_CH[slot/2]; - OPL_SLOT *SLOT = &CH->SLOT[slot&1]; - int sl = v>>4; +inline void set_sl_rr(FM_OPL *OPL, int slot, int v) { + OPL_CH *CH = &OPL->P_CH[slot / 2]; + OPL_SLOT *SLOT = &CH->SLOT[slot & 1]; + int sl = v >> 4; int rr = v & 0x0f; SLOT->SL = SL_TABLE[sl]; - if( SLOT->evm == ENV_MOD_DR ) SLOT->eve = SLOT->SL; + if(SLOT->evm == ENV_MOD_DR) + SLOT->eve = SLOT->SL; SLOT->RR = &OPL->DR_TABLE[rr<<2]; SLOT->evsr = SLOT->RR[SLOT->ksr]; - if( SLOT->evm == ENV_MOD_RR ) SLOT->evs = SLOT->evsr; + if(SLOT->evm == ENV_MOD_RR) + SLOT->evs = SLOT->evsr; } /* operator output calcrator */ -#define OP_OUT(slot,env,con) slot->wavetable[((slot->Cnt+con)/(0x1000000/SIN_ENT))&(SIN_ENT-1)][env] +#define OP_OUT(slot,env,con) slot->wavetable[((slot->Cnt + con) / (0x1000000 / SIN_ENT)) & (SIN_ENT-1)][env] /* ---------- calcrate one of channel ---------- */ -inline void OPL_CALC_CH( OPL_CH *CH ) -{ +inline void OPL_CALC_CH(OPL_CH *CH) { uint env_out; OPL_SLOT *SLOT; @@ -456,46 +438,44 @@ inline void OPL_CALC_CH( OPL_CH *CH ) /* SLOT 1 */ SLOT = &CH->SLOT[SLOT1]; env_out=OPL_CALC_SLOT(SLOT); - if( env_out < (uint)(EG_ENT-1)) - { + if(env_out < (uint)(EG_ENT - 1)) { /* PG */ - if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE); - else SLOT->Cnt += SLOT->Incr; + if(SLOT->vib) + SLOT->Cnt += (SLOT->Incr * vib / VIB_RATE); + else + SLOT->Cnt += SLOT->Incr; /* connectoion */ - if(CH->FB) - { - int feedback1 = (CH->op1_out[0]+CH->op1_out[1])>>CH->FB; + if(CH->FB) { + int feedback1 = (CH->op1_out[0] + CH->op1_out[1]) >> CH->FB; CH->op1_out[1] = CH->op1_out[0]; - *CH->connect1 += CH->op1_out[0] = OP_OUT(SLOT,env_out,feedback1); + *CH->connect1 += CH->op1_out[0] = OP_OUT(SLOT, env_out, feedback1); } - else - { - *CH->connect1 += OP_OUT(SLOT,env_out,0); + else { + *CH->connect1 += OP_OUT(SLOT, env_out, 0); } - }else - { + }else { CH->op1_out[1] = CH->op1_out[0]; CH->op1_out[0] = 0; } /* SLOT 2 */ SLOT = &CH->SLOT[SLOT2]; env_out=OPL_CALC_SLOT(SLOT); - if( env_out < (uint)(EG_ENT-1) ) - { + if(env_out < (uint)(EG_ENT - 1)) { /* PG */ - if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE); - else SLOT->Cnt += SLOT->Incr; + if(SLOT->vib) + SLOT->Cnt += (SLOT->Incr * vib / VIB_RATE); + else + SLOT->Cnt += SLOT->Incr; /* connectoion */ - outd[0] += OP_OUT(SLOT,env_out, feedback2); + outd[0] += OP_OUT(SLOT, env_out, feedback2); } } /* ---------- calcrate rythm block ---------- */ #define WHITE_NOISE_db 6.0 -inline void OPL_CALC_RH( OPL_CH *CH ) -{ - uint env_tam,env_sd,env_top,env_hh; - int whitenoise = int((rand()&1)*(WHITE_NOISE_db/EG_STEP)); +inline void OPL_CALC_RH(OPL_CH *CH) { + uint env_tam, env_sd, env_top, env_hh; + int whitenoise = int((rand()&1) * (WHITE_NOISE_db / EG_STEP)); int tone8; OPL_SLOT *SLOT; @@ -505,192 +485,189 @@ inline void OPL_CALC_RH( OPL_CH *CH ) feedback2 = 0; /* SLOT 1 */ SLOT = &CH[6].SLOT[SLOT1]; - env_out=OPL_CALC_SLOT(SLOT); - if( env_out < EG_ENT-1 ) - { + env_out = OPL_CALC_SLOT(SLOT); + if(env_out < EG_ENT-1) { /* PG */ - if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE); - else SLOT->Cnt += SLOT->Incr; + if(SLOT->vib) + SLOT->Cnt += (SLOT->Incr * vib / VIB_RATE); + else + SLOT->Cnt += SLOT->Incr; /* connectoion */ - if(CH[6].FB) - { - int feedback1 = (CH[6].op1_out[0]+CH[6].op1_out[1])>>CH[6].FB; + if(CH[6].FB) { + int feedback1 = (CH[6].op1_out[0] + CH[6].op1_out[1]) >> CH[6].FB; CH[6].op1_out[1] = CH[6].op1_out[0]; - feedback2 = CH[6].op1_out[0] = OP_OUT(SLOT,env_out,feedback1); + feedback2 = CH[6].op1_out[0] = OP_OUT(SLOT, env_out, feedback1); } - else - { - feedback2 = OP_OUT(SLOT,env_out,0); + else { + feedback2 = OP_OUT(SLOT, env_out, 0); } - }else - { + }else { feedback2 = 0; CH[6].op1_out[1] = CH[6].op1_out[0]; CH[6].op1_out[0] = 0; } /* SLOT 2 */ SLOT = &CH[6].SLOT[SLOT2]; - env_out=OPL_CALC_SLOT(SLOT); - if( env_out < EG_ENT-1 ) - { + env_out = OPL_CALC_SLOT(SLOT); + if(env_out < EG_ENT-1) { /* PG */ - if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE); - else SLOT->Cnt += SLOT->Incr; + if(SLOT->vib) + SLOT->Cnt += (SLOT->Incr * vib / VIB_RATE); + else + SLOT->Cnt += SLOT->Incr; /* connectoion */ - outd[0] += OP_OUT(SLOT,env_out, feedback2)*2; + outd[0] += OP_OUT(SLOT, env_out, feedback2) * 2; } // SD (17) = mul14[fnum7] + white noise // TAM (15) = mul15[fnum8] // TOP (18) = fnum6(mul18[fnum8]+whitenoise) // HH (14) = fnum7(mul18[fnum8]+whitenoise) + white noise - env_sd =OPL_CALC_SLOT(SLOT7_2) + whitenoise; - env_tam=OPL_CALC_SLOT(SLOT8_1); - env_top=OPL_CALC_SLOT(SLOT8_2); - env_hh =OPL_CALC_SLOT(SLOT7_1) + whitenoise; + env_sd = OPL_CALC_SLOT(SLOT7_2) + whitenoise; + env_tam =OPL_CALC_SLOT(SLOT8_1); + env_top = OPL_CALC_SLOT(SLOT8_2); + env_hh = OPL_CALC_SLOT(SLOT7_1) + whitenoise; /* PG */ - if(SLOT7_1->vib) SLOT7_1->Cnt += (2*SLOT7_1->Incr*vib/VIB_RATE); - else SLOT7_1->Cnt += 2*SLOT7_1->Incr; - if(SLOT7_2->vib) SLOT7_2->Cnt += ((CH[7].fc*8)*vib/VIB_RATE); - else SLOT7_2->Cnt += (CH[7].fc*8); - if(SLOT8_1->vib) SLOT8_1->Cnt += (SLOT8_1->Incr*vib/VIB_RATE); - else SLOT8_1->Cnt += SLOT8_1->Incr; - if(SLOT8_2->vib) SLOT8_2->Cnt += ((CH[8].fc*48)*vib/VIB_RATE); - else SLOT8_2->Cnt += (CH[8].fc*48); + if(SLOT7_1->vib) + SLOT7_1->Cnt += (2 * SLOT7_1->Incr * vib / VIB_RATE); + else + SLOT7_1->Cnt += 2 * SLOT7_1->Incr; + if(SLOT7_2->vib) + SLOT7_2->Cnt += ((CH[7].fc * 8) * vib / VIB_RATE); + else + SLOT7_2->Cnt += (CH[7].fc * 8); + if(SLOT8_1->vib) + SLOT8_1->Cnt += (SLOT8_1->Incr * vib / VIB_RATE); + else + SLOT8_1->Cnt += SLOT8_1->Incr; + if(SLOT8_2->vib) + SLOT8_2->Cnt += ((CH[8].fc * 48) * vib / VIB_RATE); + else + SLOT8_2->Cnt += (CH[8].fc * 48); tone8 = OP_OUT(SLOT8_2,whitenoise,0 ); /* SD */ - if( env_sd < (uint)(EG_ENT-1) ) - outd[0] += OP_OUT(SLOT7_1,env_sd, 0)*8; + if(env_sd < (uint)(EG_ENT - 1)) + outd[0] += OP_OUT(SLOT7_1, env_sd, 0) * 8; /* TAM */ - if( env_tam < (uint)(EG_ENT-1) ) - outd[0] += OP_OUT(SLOT8_1,env_tam, 0)*2; + if(env_tam < (uint)(EG_ENT - 1)) + outd[0] += OP_OUT(SLOT8_1, env_tam, 0) * 2; /* TOP-CY */ - if( env_top < (uint)(EG_ENT-1) ) - outd[0] += OP_OUT(SLOT7_2,env_top,tone8)*2; + if(env_top < (uint)(EG_ENT - 1)) + outd[0] += OP_OUT(SLOT7_2, env_top, tone8) * 2; /* HH */ - if( env_hh < (uint)(EG_ENT-1) ) - outd[0] += OP_OUT(SLOT7_2,env_hh,tone8)*2; + if(env_hh < (uint)(EG_ENT-1)) + outd[0] += OP_OUT(SLOT7_2, env_hh, tone8) * 2; } /* ----------- initialize time tabls ----------- */ -static void init_timetables( FM_OPL *OPL , int ARRATE , int DRRATE ) -{ +static void init_timetables(FM_OPL *OPL, int ARRATE, int DRRATE) { int i; double rate; /* make attack rate & decay rate tables */ - for (i = 0;i < 4;i++) OPL->AR_TABLE[i] = OPL->DR_TABLE[i] = 0; - for (i = 4;i <= 60;i++){ - rate = OPL->freqbase; /* frequency rate */ - if( i < 60 ) rate *= 1.0+(i&3)*0.25; /* b0-1 : x1 , x1.25 , x1.5 , x1.75 */ - rate *= 1<<((i>>2)-1); /* b2-5 : shift bit */ - rate *= (double)(EG_ENT<<ENV_BITS); + for (i = 0; i < 4; i++) + OPL->AR_TABLE[i] = OPL->DR_TABLE[i] = 0; + for (i = 4; i <= 60; i++){ + rate = OPL->freqbase; /* frequency rate */ + if(i < 60) + rate *= 1.0 + (i & 3) * 0.25; /* b0-1 : x1 , x1.25 , x1.5 , x1.75 */ + rate *= 1 << ((i >> 2) - 1); /* b2-5 : shift bit */ + rate *= (double)(EG_ENT << ENV_BITS); OPL->AR_TABLE[i] = (int)(rate / ARRATE); OPL->DR_TABLE[i] = (int)(rate / DRRATE); } - for (i = 60;i < 75;i++) - { + for (i = 60; i < 75; i++) { OPL->AR_TABLE[i] = EG_AED-1; OPL->DR_TABLE[i] = OPL->DR_TABLE[60]; } } /* ---------- generic table initialize ---------- */ -static int OPLOpenTable( void ) -{ +static int OPLOpenTable(void) { int s,t; double rate; int i,j; double pom; /* allocate dynamic tables */ - if( (TL_TABLE = (int *)malloc(TL_MAX*2*sizeof(int))) == NULL) + if((TL_TABLE = (int *)malloc(TL_MAX * 2 * sizeof(int))) == NULL) return 0; - if( (SIN_TABLE = (int **)malloc(SIN_ENT*4 *sizeof(int *))) == NULL) - { + if((SIN_TABLE = (int **)malloc(SIN_ENT * 4 * sizeof(int *))) == NULL) { free(TL_TABLE); return 0; } - if( (AMS_TABLE = (int *)malloc(AMS_ENT*2 *sizeof(int))) == NULL) - { + if((AMS_TABLE = (int *)malloc(AMS_ENT * 2 * sizeof(int))) == NULL) { free(TL_TABLE); free(SIN_TABLE); return 0; } - if( (VIB_TABLE = (int *)malloc(VIB_ENT*2 *sizeof(int))) == NULL) - { + if((VIB_TABLE = (int *)malloc(VIB_ENT * 2 * sizeof(int))) == NULL) { free(TL_TABLE); free(SIN_TABLE); free(AMS_TABLE); return 0; } /* make total level table */ - for (t = 0;t < EG_ENT-1 ;t++){ - rate = ((1<<TL_BITS)-1)/pow(10,EG_STEP*t/20); /* dB -> voltage */ - TL_TABLE[ t] = (int)rate; - TL_TABLE[TL_MAX+t] = -TL_TABLE[t]; + for (t = 0; t < EG_ENT - 1 ; t++){ + rate = ((1 << TL_BITS) - 1) / pow(10, EG_STEP * t / 20); /* dB -> voltage */ + TL_TABLE[ t] = (int)rate; + TL_TABLE[TL_MAX + t] = -TL_TABLE[t]; } /* fill volume off area */ - for ( t = EG_ENT-1; t < TL_MAX ;t++){ - TL_TABLE[t] = TL_TABLE[TL_MAX+t] = 0; + for (t = EG_ENT - 1; t < TL_MAX; t++){ + TL_TABLE[t] = TL_TABLE[TL_MAX + t] = 0; } /* make sinwave table (total level offet) */ /* degree 0 = degree 180 = off */ - SIN_TABLE[0] = SIN_TABLE[SIN_ENT/2] = &TL_TABLE[EG_ENT-1]; - for (s = 1;s <= SIN_ENT/4;s++){ - pom = sin(2*PI*s/SIN_ENT); /* sin */ - pom = 20*log10(1/pom); /* decibel */ + SIN_TABLE[0] = SIN_TABLE[SIN_ENT /2 ] = &TL_TABLE[EG_ENT - 1]; + for (s = 1;s <= SIN_ENT / 4; s++){ + pom = sin(2 * PI * s / SIN_ENT); /* sin */ + pom = 20 * log10(1 / pom); /* decibel */ j = int(pom / EG_STEP); /* TL_TABLE steps */ /* degree 0 - 90 , degree 180 - 90 : plus section */ - SIN_TABLE[ s] = SIN_TABLE[SIN_ENT/2-s] = &TL_TABLE[j]; + SIN_TABLE[ s] = SIN_TABLE[SIN_ENT / 2 - s] = &TL_TABLE[j]; /* degree 180 - 270 , degree 360 - 270 : minus section */ - SIN_TABLE[SIN_ENT/2+s] = SIN_TABLE[SIN_ENT -s] = &TL_TABLE[TL_MAX+j]; + SIN_TABLE[SIN_ENT / 2 + s] = SIN_TABLE[SIN_ENT - s] = &TL_TABLE[TL_MAX + j]; } - for (s = 0;s < SIN_ENT;s++) - { - SIN_TABLE[SIN_ENT*1+s] = s<(SIN_ENT/2) ? SIN_TABLE[s] : &TL_TABLE[EG_ENT]; - SIN_TABLE[SIN_ENT*2+s] = SIN_TABLE[s % (SIN_ENT/2)]; - SIN_TABLE[SIN_ENT*3+s] = (s/(SIN_ENT/4))&1 ? &TL_TABLE[EG_ENT] : SIN_TABLE[SIN_ENT*2+s]; + for (s = 0;s < SIN_ENT; s++) { + SIN_TABLE[SIN_ENT * 1 + s] = s < (SIN_ENT / 2) ? SIN_TABLE[s] : &TL_TABLE[EG_ENT]; + SIN_TABLE[SIN_ENT * 2 + s] = SIN_TABLE[s % (SIN_ENT / 2)]; + SIN_TABLE[SIN_ENT * 3 + s] = (s / (SIN_ENT / 4)) & 1 ? &TL_TABLE[EG_ENT] : SIN_TABLE[SIN_ENT * 2 + s]; } /* envelope counter -> envelope output table */ - for (i=0; i<EG_ENT; i++) - { + for (i=0; i < EG_ENT; i++) { /* ATTACK curve */ - pom = pow( ((double)(EG_ENT-1-i)/EG_ENT) , 8 ) * EG_ENT; + pom = pow(((double)(EG_ENT - 1 - i) / EG_ENT), 8) * EG_ENT; /* if( pom >= EG_ENT ) pom = EG_ENT-1; */ ENV_CURVE[i] = (int)pom; /* DECAY ,RELEASE curve */ - ENV_CURVE[(EG_DST>>ENV_BITS)+i]= i; + ENV_CURVE[(EG_DST >> ENV_BITS) + i]= i; } /* off */ - ENV_CURVE[EG_OFF>>ENV_BITS]= EG_ENT-1; + ENV_CURVE[EG_OFF >> ENV_BITS]= EG_ENT - 1; /* make LFO ams table */ - for (i=0; i<AMS_ENT; i++) - { - pom = (1.0+sin(2*PI*i/AMS_ENT))/2; /* sin */ - AMS_TABLE[i] = (int)((1.0/EG_STEP)*pom); /* 1dB */ - AMS_TABLE[AMS_ENT+i] = (int)((4.8/EG_STEP)*pom); /* 4.8dB */ + for (i=0; i < AMS_ENT; i++) { + pom = (1.0 + sin(2 * PI * i / AMS_ENT)) / 2; /* sin */ + AMS_TABLE[i] = (int)((1.0 / EG_STEP) * pom); /* 1dB */ + AMS_TABLE[AMS_ENT + i] = (int)((4.8 / EG_STEP) * pom); /* 4.8dB */ } /* make LFO vibrate table */ - for (i=0; i<VIB_ENT; i++) - { + for (i=0; i < VIB_ENT; i++) { /* 100cent = 1seminote = 6% ?? */ - pom = (double)VIB_RATE*0.06*sin(2*PI*i/VIB_ENT); /* +-100sect step */ - VIB_TABLE[i] = (int)(VIB_RATE + (pom*0.07)); /* +- 7cent */ - VIB_TABLE[VIB_ENT+i] = (int)(VIB_RATE + (pom*0.14)); /* +-14cent */ + pom = (double)VIB_RATE * 0.06 * sin(2 * PI * i / VIB_ENT); /* +-100sect step */ + VIB_TABLE[i] = (int)(VIB_RATE + (pom * 0.07)); /* +- 7cent */ + VIB_TABLE[VIB_ENT + i] = (int)(VIB_RATE + (pom * 0.14)); /* +-14cent */ } return 1; } - -static void OPLCloseTable( void ) -{ +static void OPLCloseTable(void) { free(TL_TABLE); free(SIN_TABLE); free(AMS_TABLE); @@ -698,8 +675,7 @@ static void OPLCloseTable( void ) } /* CSM Key Controll */ -inline void CSMKeyControll(OPL_CH *CH) -{ +inline void CSMKeyControll(OPL_CH *CH) { OPL_SLOT *slot1 = &CH->SLOT[SLOT1]; OPL_SLOT *slot2 = &CH->SLOT[SLOT2]; /* all key off */ @@ -715,49 +691,41 @@ inline void CSMKeyControll(OPL_CH *CH) } /* ---------- opl initialize ---------- */ -static void OPL_initalize(FM_OPL *OPL) -{ +static void OPL_initalize(FM_OPL *OPL) { int fn; /* frequency base */ - OPL->freqbase = (OPL->rate) ? ((double)OPL->clock / OPL->rate) / 72 : 0; + OPL->freqbase = (OPL->rate) ? ((double)OPL->clock / OPL->rate) / 72 : 0; /* Timer base time */ OPL->TimerBase = 1.0/((double)OPL->clock / 72.0 ); /* make time tables */ - init_timetables( OPL , OPL_ARRATE , OPL_DRRATE ); + init_timetables(OPL, OPL_ARRATE, OPL_DRRATE); /* make fnumber -> increment counter table */ - for( fn=0 ; fn < 1024 ; fn++ ) - { + for( fn=0; fn < 1024; fn++) { OPL->FN_TABLE[fn] = (uint)(OPL->freqbase * fn * FREQ_RATE * (1<<7) / 2); } /* LFO freq.table */ - OPL->amsIncr = (int)(OPL->rate ? (double)AMS_ENT*(1<<AMS_SHIFT) / OPL->rate * 3.7 * ((double)OPL->clock/3600000) : 0); - OPL->vibIncr = (int)(OPL->rate ? (double)VIB_ENT*(1<<VIB_SHIFT) / OPL->rate * 6.4 * ((double)OPL->clock/3600000) : 0); + OPL->amsIncr = (int)(OPL->rate ? (double)AMS_ENT * (1 << AMS_SHIFT) / OPL->rate * 3.7 * ((double)OPL->clock/3600000) : 0); + OPL->vibIncr = (int)(OPL->rate ? (double)VIB_ENT * (1 << VIB_SHIFT) / OPL->rate * 6.4 * ((double)OPL->clock/3600000) : 0); } /* ---------- write a OPL registers ---------- */ -void OPLWriteReg(FM_OPL *OPL, int r, int v) -{ +void OPLWriteReg(FM_OPL *OPL, int r, int v) { OPL_CH *CH; int slot; uint block_fnum; - switch(r&0xe0) - { + switch(r & 0xe0) { case 0x00: /* 00-1f:controll */ - switch(r&0x1f) - { + switch(r & 0x1f) { case 0x01: /* wave selector enable */ - if(OPL->type&OPL_TYPE_WAVESEL) - { - OPL->wavesel = v&0x20; - if(!OPL->wavesel) - { + if(OPL->type&OPL_TYPE_WAVESEL) { + OPL->wavesel = v & 0x20; + if(!OPL->wavesel) { /* preset compatible mode */ int c; - for(c=0;c<OPL->max_ch;c++) - { + for(c=0; c<OPL->max_ch; c++) { OPL->P_CH[c].SLOT[SLOT1].wavetable = &SIN_TABLE[0]; OPL->P_CH[c].SLOT[SLOT2].wavetable = &SIN_TABLE[0]; } @@ -765,36 +733,32 @@ void OPLWriteReg(FM_OPL *OPL, int r, int v) } return; case 0x02: /* Timer 1 */ - OPL->T[0] = (256-v)*4; + OPL->T[0] = (256-v) * 4; break; case 0x03: /* Timer 2 */ - OPL->T[1] = (256-v)*16; + OPL->T[1] = (256-v) * 16; return; case 0x04: /* IRQ clear / mask and Timer enable */ - if(v&0x80) - { /* IRQ flag clear */ - OPL_STATUS_RESET(OPL,0x7f); + if(v & 0x80) { /* IRQ flag clear */ + OPL_STATUS_RESET(OPL, 0x7f); } - else - { /* set IRQ mask ,timer enable*/ - uint8 st1 = v&1; - uint8 st2 = (v>>1)&1; + else { /* set IRQ mask ,timer enable*/ + uint8 st1 = v & 1; + uint8 st2 = (v >> 1) & 1; /* IRQRST,T1MSK,t2MSK,EOSMSK,BRMSK,x,ST2,ST1 */ - OPL_STATUS_RESET(OPL,v&0x78); - OPL_STATUSMASK_SET(OPL,((~v)&0x78)|0x01); + OPL_STATUS_RESET(OPL, v & 0x78); + OPL_STATUSMASK_SET(OPL,((~v) & 0x78) | 0x01); /* timer 2 */ - if(OPL->st[1] != st2) - { - double interval = st2 ? (double)OPL->T[1]*OPL->TimerBase : 0.0; + if(OPL->st[1] != st2) { + double interval = st2 ? (double)OPL->T[1] * OPL->TimerBase : 0.0; OPL->st[1] = st2; - if (OPL->TimerHandler) (OPL->TimerHandler)(OPL->TimerParam+1,interval); + if (OPL->TimerHandler) (OPL->TimerHandler)(OPL->TimerParam + 1, interval); } /* timer 1 */ - if(OPL->st[0] != st1) - { - double interval = st1 ? (double)OPL->T[0]*OPL->TimerBase : 0.0; + if(OPL->st[0] != st1) { + double interval = st1 ? (double)OPL->T[0] * OPL->TimerBase : 0.0; OPL->st[0] = st1; - if (OPL->TimerHandler) (OPL->TimerHandler)(OPL->TimerParam+0,interval); + if (OPL->TimerHandler) (OPL->TimerHandler)(OPL->TimerParam + 0, interval); } } return; @@ -802,137 +766,136 @@ void OPLWriteReg(FM_OPL *OPL, int r, int v) break; case 0x20: /* am,vib,ksr,eg type,mul */ slot = slot_array[r&0x1f]; - if(slot == -1) return; + if(slot == -1) + return; set_mul(OPL,slot,v); return; case 0x40: slot = slot_array[r&0x1f]; - if(slot == -1) return; + if(slot == -1) + return; set_ksl_tl(OPL,slot,v); return; case 0x60: slot = slot_array[r&0x1f]; - if(slot == -1) return; + if(slot == -1) + return; set_ar_dr(OPL,slot,v); return; case 0x80: slot = slot_array[r&0x1f]; - if(slot == -1) return; + if(slot == -1) + return; set_sl_rr(OPL,slot,v); return; case 0xa0: - switch(r) - { + switch(r) { case 0xbd: /* amsep,vibdep,r,bd,sd,tom,tc,hh */ { - uint8 rkey = OPL->rythm^v; - OPL->ams_table = &AMS_TABLE[v&0x80 ? AMS_ENT : 0]; - OPL->vib_table = &VIB_TABLE[v&0x40 ? VIB_ENT : 0]; - OPL->rythm = v&0x3f; - if(OPL->rythm&0x20) - { + uint8 rkey = OPL->rythm ^ v; + OPL->ams_table = &AMS_TABLE[v & 0x80 ? AMS_ENT : 0]; + OPL->vib_table = &VIB_TABLE[v & 0x40 ? VIB_ENT : 0]; + OPL->rythm = v & 0x3f; + if(OPL->rythm & 0x20) { /* BD key on/off */ - if(rkey&0x10) - { - if(v&0x10) - { + if(rkey & 0x10) { + if(v & 0x10) { OPL->P_CH[6].op1_out[0] = OPL->P_CH[6].op1_out[1] = 0; OPL_KEYON(&OPL->P_CH[6].SLOT[SLOT1]); OPL_KEYON(&OPL->P_CH[6].SLOT[SLOT2]); } - else - { + else { OPL_KEYOFF(&OPL->P_CH[6].SLOT[SLOT1]); OPL_KEYOFF(&OPL->P_CH[6].SLOT[SLOT2]); } } /* SD key on/off */ - if(rkey&0x08) - { - if(v&0x08) OPL_KEYON(&OPL->P_CH[7].SLOT[SLOT2]); - else OPL_KEYOFF(&OPL->P_CH[7].SLOT[SLOT2]); + if(rkey & 0x08) { + if(v & 0x08) + OPL_KEYON(&OPL->P_CH[7].SLOT[SLOT2]); + else + OPL_KEYOFF(&OPL->P_CH[7].SLOT[SLOT2]); }/* TAM key on/off */ - if(rkey&0x04) - { - if(v&0x04) OPL_KEYON(&OPL->P_CH[8].SLOT[SLOT1]); - else OPL_KEYOFF(&OPL->P_CH[8].SLOT[SLOT1]); + if(rkey & 0x04) { + if(v & 0x04) + OPL_KEYON(&OPL->P_CH[8].SLOT[SLOT1]); + else + OPL_KEYOFF(&OPL->P_CH[8].SLOT[SLOT1]); } /* TOP-CY key on/off */ - if(rkey&0x02) - { - if(v&0x02) OPL_KEYON(&OPL->P_CH[8].SLOT[SLOT2]); - else OPL_KEYOFF(&OPL->P_CH[8].SLOT[SLOT2]); + if(rkey & 0x02) { + if(v & 0x02) + OPL_KEYON(&OPL->P_CH[8].SLOT[SLOT2]); + else + OPL_KEYOFF(&OPL->P_CH[8].SLOT[SLOT2]); } /* HH key on/off */ - if(rkey&0x01) - { - if(v&0x01) OPL_KEYON(&OPL->P_CH[7].SLOT[SLOT1]); - else OPL_KEYOFF(&OPL->P_CH[7].SLOT[SLOT1]); + if(rkey & 0x01) { + if(v & 0x01) + OPL_KEYON(&OPL->P_CH[7].SLOT[SLOT1]); + else + OPL_KEYOFF(&OPL->P_CH[7].SLOT[SLOT1]); } } } return; } /* keyon,block,fnum */ - if( (r&0x0f) > 8) return; - CH = &OPL->P_CH[r&0x0f]; - if(!(r&0x10)) - { /* a0-a8 */ - block_fnum = (CH->block_fnum&0x1f00) | v; + if((r & 0x0f) > 8) + return; + CH = &OPL->P_CH[r & 0x0f]; + if(!(r&0x10)) { /* a0-a8 */ + block_fnum = (CH->block_fnum & 0x1f00) | v; } - else - { /* b0-b8 */ - int keyon = (v>>5)&1; - block_fnum = ((v&0x1f)<<8) | (CH->block_fnum&0xff); - if(CH->keyon != keyon) - { - if( (CH->keyon=keyon) ) - { + else { /* b0-b8 */ + int keyon = (v >> 5) & 1; + block_fnum = ((v & 0x1f) << 8) | (CH->block_fnum & 0xff); + if(CH->keyon != keyon) { + if((CH->keyon=keyon)) { CH->op1_out[0] = CH->op1_out[1] = 0; OPL_KEYON(&CH->SLOT[SLOT1]); OPL_KEYON(&CH->SLOT[SLOT2]); } - else - { + else { OPL_KEYOFF(&CH->SLOT[SLOT1]); OPL_KEYOFF(&CH->SLOT[SLOT2]); } } } /* update */ - if(CH->block_fnum != block_fnum) - { - int blockRv = 7-(block_fnum>>10); - int fnum = block_fnum&0x3ff; + if(CH->block_fnum != block_fnum) { + int blockRv = 7 - (block_fnum >> 10); + int fnum = block_fnum & 0x3ff; CH->block_fnum = block_fnum; - - CH->ksl_base = KSL_TABLE[block_fnum>>6]; - CH->fc = OPL->FN_TABLE[fnum]>>blockRv; - CH->kcode = CH->block_fnum>>9; - if( (OPL->mode&0x40) && CH->block_fnum&0x100) CH->kcode |=1; + CH->ksl_base = KSL_TABLE[block_fnum >> 6]; + CH->fc = OPL->FN_TABLE[fnum] >> blockRv; + CH->kcode = CH->block_fnum >> 9; + if((OPL->mode & 0x40) && CH->block_fnum & 0x100) + CH->kcode |=1; CALC_FCSLOT(CH,&CH->SLOT[SLOT1]); CALC_FCSLOT(CH,&CH->SLOT[SLOT2]); } return; case 0xc0: /* FB,C */ - if( (r&0x0f) > 8) return; + if((r & 0x0f) > 8) + return; CH = &OPL->P_CH[r&0x0f]; { - int feedback = (v>>1)&7; - CH->FB = feedback ? (8+1) - feedback : 0; - CH->CON = v&1; - set_algorythm(CH); + int feedback = (v >> 1) & 7; + CH->FB = feedback ? (8 + 1) - feedback : 0; + CH->CON = v & 1; + set_algorythm(CH); } return; case 0xe0: /* wave type */ - slot = slot_array[r&0x1f]; - if(slot == -1) return; - CH = &OPL->P_CH[slot/2]; - if(OPL->wavesel) - { - CH->SLOT[slot&1].wavetable = &SIN_TABLE[(v&0x03)*SIN_ENT]; + slot = slot_array[r & 0x1f]; + if(slot == -1) + return; + CH = &OPL->P_CH[slot / 2]; + if(OPL->wavesel) { + CH->SLOT[slot&1].wavetable = &SIN_TABLE[(v & 0x03) * SIN_ENT]; } return; } @@ -942,22 +905,23 @@ void OPLWriteReg(FM_OPL *OPL, int r, int v) static int OPL_LockTable(void) { num_lock++; - if(num_lock>1) return 0; + if(num_lock>1) + return 0; /* first time */ cur_chip = NULL; /* allocate total level table (128kb space) */ - if( !OPLOpenTable() ) - { + if(!OPLOpenTable()) { num_lock--; return -1; } return 0; } -static void OPL_UnLockTable(void) -{ - if(num_lock) num_lock--; - if(num_lock) return; +static void OPL_UnLockTable(void) { + if(num_lock) + num_lock--; + if(num_lock) + return; /* last time */ cur_chip = NULL; OPLCloseTable(); @@ -968,17 +932,16 @@ static void OPL_UnLockTable(void) /*******************************************************************************/ /* ---------- update one of chip ----------- */ -void YM3812UpdateOne(FM_OPL *OPL, int16 *buffer, int length) -{ - int i; +void YM3812UpdateOne(FM_OPL *OPL, int16 *buffer, int length) { + int i; int data; int16 *buf = buffer; - uint amsCnt = OPL->amsCnt; - uint vibCnt = OPL->vibCnt; - uint8 rythm = OPL->rythm&0x20; - OPL_CH *CH,*R_CH; + uint amsCnt = OPL->amsCnt; + uint vibCnt = OPL->vibCnt; + uint8 rythm = OPL->rythm & 0x20; + OPL_CH *CH, *R_CH; - if( (void *)OPL != cur_chip ){ + if((void *)OPL != cur_chip){ cur_chip = (void *)OPL; /* channel pointers */ S_CH = OPL->P_CH; @@ -995,21 +958,20 @@ void YM3812UpdateOne(FM_OPL *OPL, int16 *buffer, int length) vib_table = OPL->vib_table; } R_CH = rythm ? &S_CH[6] : E_CH; - for( i=0; i < length ; i++ ) - { + for(i = 0; i < length; i++) { /* channel A channel B channel C */ /* LFO */ - ams = ams_table[(amsCnt+=amsIncr)>>AMS_SHIFT]; - vib = vib_table[(vibCnt+=vibIncr)>>VIB_SHIFT]; + ams = ams_table[(amsCnt += amsIncr) >> AMS_SHIFT]; + vib = vib_table[(vibCnt += vibIncr) >> VIB_SHIFT]; outd[0] = 0; /* FM part */ - for(CH=S_CH ; CH < R_CH ; CH++) + for(CH=S_CH; CH < R_CH; CH++) OPL_CALC_CH(CH); /* Rythn part */ if(rythm) OPL_CALC_RH(S_CH); /* limit check */ - data = Limit( outd[0] , OPL_MAXOUT, OPL_MINOUT ); + data = Limit(outd[0], OPL_MAXOUT, OPL_MINOUT); /* store to sound buffer */ buf[i] = data >> OPL_OUTSB; } @@ -1019,32 +981,30 @@ void YM3812UpdateOne(FM_OPL *OPL, int16 *buffer, int length) } /* ---------- reset a chip ---------- */ -void OPLResetChip(FM_OPL *OPL) -{ +void OPLResetChip(FM_OPL *OPL) { int c,s; int i; /* reset chip */ - OPL->mode = 0; /* normal mode */ - OPL_STATUS_RESET(OPL,0x7f); + OPL->mode = 0; /* normal mode */ + OPL_STATUS_RESET(OPL, 0x7f); /* reset with register write */ - OPLWriteReg(OPL,0x01,0); /* wabesel disable */ - OPLWriteReg(OPL,0x02,0); /* Timer1 */ - OPLWriteReg(OPL,0x03,0); /* Timer2 */ - OPLWriteReg(OPL,0x04,0); /* IRQ mask clear */ - for(i = 0xff ; i >= 0x20 ; i-- ) OPLWriteReg(OPL,i,0); + OPLWriteReg(OPL, 0x01,0); /* wabesel disable */ + OPLWriteReg(OPL, 0x02,0); /* Timer1 */ + OPLWriteReg(OPL, 0x03,0); /* Timer2 */ + OPLWriteReg(OPL, 0x04,0); /* IRQ mask clear */ + for(i = 0xff; i >= 0x20; i--) + OPLWriteReg(OPL,i,0); /* reset OPerator paramater */ - for( c = 0 ; c < OPL->max_ch ; c++ ) - { + for(c = 0; c < OPL->max_ch ;c++ ) { OPL_CH *CH = &OPL->P_CH[c]; /* OPL->P_CH[c].PAN = OPN_CENTER; */ - for(s = 0 ; s < 2 ; s++ ) - { + for(s = 0; s < 2; s++ ) { /* wave table */ CH->SLOT[s].wavetable = &SIN_TABLE[0]; /* CH->SLOT[s].evm = ENV_MOD_RR; */ CH->SLOT[s].evc = EG_OFF; - CH->SLOT[s].eve = EG_OFF+1; + CH->SLOT[s].eve = EG_OFF + 1; CH->SLOT[s].evs = 0; } } @@ -1052,26 +1012,27 @@ void OPLResetChip(FM_OPL *OPL) /* ---------- Create a virtual YM3812 ---------- */ /* 'rate' is sampling rate and 'bufsiz' is the size of the */ -FM_OPL *OPLCreate(int type, int clock, int rate) -{ +FM_OPL *OPLCreate(int type, int clock, int rate) { char *ptr; FM_OPL *OPL; int state_size; int max_ch = 9; /* normaly 9 channels */ - if( OPL_LockTable() ==-1) return NULL; + if( OPL_LockTable() == -1) + return NULL; /* allocate OPL state space */ state_size = sizeof(FM_OPL); - state_size += sizeof(OPL_CH)*max_ch; + state_size += sizeof(OPL_CH) * max_ch; /* allocate memory block */ ptr = (char *)calloc(state_size, 1); - if(ptr==NULL) return NULL; + if(ptr == NULL) + return NULL; /* clear */ - memset(ptr,0,state_size); - OPL = (FM_OPL *)ptr; ptr+=sizeof(FM_OPL); - OPL->P_CH = (OPL_CH *)ptr; ptr+=sizeof(OPL_CH)*max_ch; + memset(ptr, 0, state_size); + OPL = (FM_OPL *)ptr; ptr += sizeof(FM_OPL); + OPL->P_CH = (OPL_CH *)ptr; ptr += sizeof(OPL_CH) * max_ch; /* set channel state pointer */ OPL->type = type; @@ -1088,54 +1049,46 @@ FM_OPL *OPLCreate(int type, int clock, int rate) } /* ---------- Destroy one of vietual YM3812 ---------- */ -void OPLDestroy(FM_OPL *OPL) -{ +void OPLDestroy(FM_OPL *OPL) { OPL_UnLockTable(); free(OPL); } /* ---------- Option handlers ---------- */ -void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER TimerHandler,int channelOffset) -{ +void OPLSetTimerHandler(FM_OPL *OPL, OPL_TIMERHANDLER TimerHandler,int channelOffset) { OPL->TimerHandler = TimerHandler; OPL->TimerParam = channelOffset; } -void OPLSetIRQHandler(FM_OPL *OPL,OPL_IRQHANDLER IRQHandler,int param) -{ + +void OPLSetIRQHandler(FM_OPL *OPL, OPL_IRQHANDLER IRQHandler, int param) { OPL->IRQHandler = IRQHandler; OPL->IRQParam = param; } -void OPLSetUpdateHandler(FM_OPL *OPL,OPL_UPDATEHANDLER UpdateHandler,int param) -{ +void OPLSetUpdateHandler(FM_OPL *OPL, OPL_UPDATEHANDLER UpdateHandler,int param) { OPL->UpdateHandler = UpdateHandler; OPL->UpdateParam = param; } /* ---------- YM3812 I/O interface ---------- */ -int OPLWrite(FM_OPL *OPL,int a,int v) -{ - if( !(a&1) ) - { /* address port */ +int OPLWrite(FM_OPL *OPL,int a,int v) { + if(!(a & 1)) { /* address port */ OPL->address = v & 0xff; } - else - { /* data port */ - if(OPL->UpdateHandler) OPL->UpdateHandler(OPL->UpdateParam,0); - OPLWriteReg(OPL,OPL->address,v); + else { /* data port */ + if(OPL->UpdateHandler) + OPL->UpdateHandler(OPL->UpdateParam,0); + OPLWriteReg(OPL, OPL->address,v); } - return OPL->status>>7; + return OPL->status >> 7; } -unsigned char OPLRead(FM_OPL *OPL,int a) -{ - if( !(a&1) ) - { /* status port */ - return OPL->status & (OPL->statusmask|0x80); +unsigned char OPLRead(FM_OPL *OPL,int a) { + if(!(a & 1)) { /* status port */ + return OPL->status & (OPL->statusmask | 0x80); } /* data port */ - switch(OPL->address) - { + switch(OPL->address) { case 0x05: /* KeyBoard IN */ warning("OPL:read unmapped KEYBOARD port\n"); return 0; @@ -1148,25 +1101,23 @@ unsigned char OPLRead(FM_OPL *OPL,int a) return 0; } -int OPLTimerOver(FM_OPL *OPL,int c) -{ - if( c ) - { /* Timer B */ - OPL_STATUS_SET(OPL,0x20); +int OPLTimerOver(FM_OPL *OPL, int c) { + if(c) { /* Timer B */ + OPL_STATUS_SET(OPL, 0x20); } - else - { /* Timer A */ - OPL_STATUS_SET(OPL,0x40); + else { /* Timer A */ + OPL_STATUS_SET(OPL, 0x40); /* CSM mode key,TL controll */ - if( OPL->mode & 0x80 ) - { /* CSM mode total level latch and auto key on */ + if(OPL->mode & 0x80) { /* CSM mode total level latch and auto key on */ int ch; - if(OPL->UpdateHandler) OPL->UpdateHandler(OPL->UpdateParam,0); - for(ch=0;ch<9;ch++) - CSMKeyControll( &OPL->P_CH[ch] ); + if(OPL->UpdateHandler) + OPL->UpdateHandler(OPL->UpdateParam,0); + for(ch = 0; ch < 9; ch++) + CSMKeyControll(&OPL->P_CH[ch]); } } /* reload timer */ - if (OPL->TimerHandler) (OPL->TimerHandler)(OPL->TimerParam+c,(double)OPL->T[c]*OPL->TimerBase); - return OPL->status>>7; + if (OPL->TimerHandler) + (OPL->TimerHandler)(OPL->TimerParam + c, (double)OPL->T[c] * OPL->TimerBase); + return OPL->status >> 7; } diff --git a/sound/fmopl.h b/sound/fmopl.h index 64b64d3e73..5fa8a3e4d1 100644 --- a/sound/fmopl.h +++ b/sound/fmopl.h @@ -76,10 +76,10 @@ typedef struct fm_opl_channel { int op1_out[2]; /* slot1 output for selfeedback */ /* phase generator state */ - uint block_fnum; /* block+fnum */ + uint block_fnum; /* block+fnum */ uint8 kcode; /* key code : KeyScaleCode */ - uint fc; /* Freq. Increment base */ - uint ksl_base; /* KeyScaleLevel Base step */ + uint fc; /* Freq. Increment base */ + uint ksl_base; /* KeyScaleLevel Base step */ uint8 keyon; /* key on/off flag */ } OPL_CH; @@ -139,14 +139,14 @@ void OPLBuildTables(int ENV_BITS_PARAM, int EG_ENT_PARAM); FM_OPL *OPLCreate(int type, int clock, int rate); void OPLDestroy(FM_OPL *OPL); -void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER TimerHandler,int channelOffset); -void OPLSetIRQHandler(FM_OPL *OPL,OPL_IRQHANDLER IRQHandler,int param); -void OPLSetUpdateHandler(FM_OPL *OPL,OPL_UPDATEHANDLER UpdateHandler,int param); +void OPLSetTimerHandler(FM_OPL *OPL, OPL_TIMERHANDLER TimerHandler, int channelOffset); +void OPLSetIRQHandler(FM_OPL *OPL, OPL_IRQHANDLER IRQHandler, int param); +void OPLSetUpdateHandler(FM_OPL *OPL, OPL_UPDATEHANDLER UpdateHandler, int param); void OPLResetChip(FM_OPL *OPL); -int OPLWrite(FM_OPL *OPL,int a,int v); -unsigned char OPLRead(FM_OPL *OPL,int a); -int OPLTimerOver(FM_OPL *OPL,int c); +int OPLWrite(FM_OPL *OPL, int a, int v); +unsigned char OPLRead(FM_OPL *OPL, int a); +int OPLTimerOver(FM_OPL *OPL, int c); void OPLWriteReg(FM_OPL *OPL, int r, int v); void YM3812UpdateOne(FM_OPL *OPL, int16 *buffer, int length); #endif diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index ab110eb7d4..2d006c3bbe 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -31,18 +31,13 @@ #include "common/engine.h" // for warning/error/debug #include "common/util.h" // for ARRAYSIZE - - /* Default (empty) property method */ -uint32 MidiDriver::property(int prop, uint32 param) -{ +uint32 MidiDriver::property(int prop, uint32 param) { return 0; } - /* retrieve a string representation of an error code */ -const char *MidiDriver::getErrorName(int error_code) -{ +const char *MidiDriver::getErrorName(int error_code) { static const char *const midi_errors[] = { "No error", "Cannot connect", @@ -66,22 +61,20 @@ public: int open(); void close(); void send(uint32 b); - void sysEx (byte *msg, uint16 length); + void sysEx(byte *msg, uint16 length); private: bool _isOpen; int device, _device_num; }; -MidiDriver_SEQ::MidiDriver_SEQ() -{ +MidiDriver_SEQ::MidiDriver_SEQ() { _isOpen = false; device = 0; _device_num = 0; } -int MidiDriver_SEQ::open() -{ +int MidiDriver_SEQ::open() { if (_isOpen) return MERR_ALREADY_OPEN; _isOpen = true; @@ -109,15 +102,12 @@ int MidiDriver_SEQ::open() return 0; } -void MidiDriver_SEQ::close() -{ +void MidiDriver_SEQ::close() { ::close(device); _isOpen = false; } - -void MidiDriver_SEQ::send(uint32 b) -{ +void MidiDriver_SEQ::send(uint32 b) { unsigned char buf[256]; int position = 0; @@ -158,8 +148,7 @@ void MidiDriver_SEQ::send(uint32 b) write(device, buf, position); } -void MidiDriver_SEQ::sysEx (byte *msg, uint16 length) -{ +void MidiDriver_SEQ::sysEx (byte *msg, uint16 length) { if (length > 254) { warning ("Cannot send SysEx block - data too large"); return; @@ -188,8 +177,7 @@ void MidiDriver_SEQ::sysEx (byte *msg, uint16 length) write (device, buf, position); } -MidiDriver *MidiDriver_SEQ_create() -{ +MidiDriver *MidiDriver_SEQ_create() { return new MidiDriver_SEQ(); } diff --git a/sound/mididrv.h b/sound/mididrv.h index 9520e99e62..0900f9b480 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -45,7 +45,6 @@ public: PROP_SMALLHEADER = 2 }; - // Open the midi driver. // Returns 0 if successful, otherwise an error code. virtual int open() = 0; @@ -83,8 +82,6 @@ public: virtual MidiChannel *getPercussionChannel() = 0; }; - - class MidiChannel { public: virtual MidiDriver *device() = 0; @@ -114,8 +111,6 @@ public: virtual void sysEx_customInstrument (uint32 type, byte *instr) = 0; }; - - // MIDI Driver Types enum { MD_AUTO = 0, @@ -131,7 +126,6 @@ enum { MD_ADLIB = 10 }; - // Factory functions, for faster compile extern MidiDriver *MidiDriver_NULL_create(); extern MidiDriver *MidiDriver_ADLIB_create(); diff --git a/sound/midistreamer.cpp b/sound/midistreamer.cpp index fef0faf268..66a870b2d1 100644 --- a/sound/midistreamer.cpp +++ b/sound/midistreamer.cpp @@ -24,20 +24,19 @@ #include "common/util.h" MidiStreamer::MidiStreamer (MidiDriver *target) : -_target (target), -_stream_proc (0), -_stream_param (0), -_isOpen (false), -_paused (false), -_event_count (0), -_event_index (0), -_tempo (500000), // 120 BPM = 500,000 microseconds between each beat -_ticks_per_beat (96), -_delay (0) + _target (target), + _stream_proc (0), + _stream_param (0), + _isOpen (false), + _paused (false), + _event_count (0), + _event_index (0), + _tempo (500000), // 120 BPM = 500,000 microseconds between each beat + _ticks_per_beat (96), + _delay (0) { } -void MidiStreamer::set_stream_callback (void *param, StreamCallback *sc) -{ +void MidiStreamer::set_stream_callback (void *param, StreamCallback *sc) { _stream_param = param; _stream_proc = sc; @@ -51,8 +50,7 @@ void MidiStreamer::timer_thread (void *param) { ((MidiStreamer *) param)->on_timer(); } -void MidiStreamer::on_timer() -{ +void MidiStreamer::on_timer() { if (_paused || !_stream_proc) return; @@ -80,8 +78,7 @@ void MidiStreamer::on_timer() } // end while } -int MidiStreamer::open() -{ +int MidiStreamer::open() { if (_isOpen) close(); @@ -99,8 +96,7 @@ int MidiStreamer::open() return 0; } -void MidiStreamer::close() -{ +void MidiStreamer::close() { if (!_isOpen) return; @@ -116,8 +112,7 @@ void MidiStreamer::close() _paused = true; } -uint32 MidiStreamer::property (int prop, uint32 param) -{ +uint32 MidiStreamer::property (int prop, uint32 param) { switch (prop) { // 16-bit time division according to standard midi specification diff --git a/sound/midistreamer.h b/sound/midistreamer.h index 760ebf4cdb..daa3a7f056 100644 --- a/sound/midistreamer.h +++ b/sound/midistreamer.h @@ -35,7 +35,7 @@ class MidiStreamer { public: // Called whenever more MIDI commands need to be generated. // Return 0 to tell MidiStreamer that end of stream was reached. - typedef int StreamCallback (void *param, MidiEvent * ev, int num); + typedef int StreamCallback (void *param, MidiEvent *ev, int num); // Special events that can be inserted in a MidiEvent. // event = (ME_xxx<<24) | <24-bit data associated with event> @@ -51,7 +51,7 @@ private: bool _isOpen; bool _paused; - MidiEvent _events [64]; + MidiEvent _events[64]; int _event_count; int _event_index; diff --git a/sound/mixer.cpp b/sound/mixer.cpp index ea469ed8ae..cf901ff832 100644 --- a/sound/mixer.cpp +++ b/sound/mixer.cpp @@ -37,7 +37,7 @@ SoundMixer::~SoundMixer() { free(_volumeTable); } -void SoundMixer::unInsert(Channel * chan) { +void SoundMixer::unInsert(Channel *chan) { for (int i = 0; i != NUM_CHANNELS; i++) { if (_channels[i] == chan) { if (_handles[i]) { @@ -51,10 +51,10 @@ void SoundMixer::unInsert(Channel * chan) { error("SoundMixer::channel_deleted chan not found"); } -int SoundMixer::append(int index, void * sound, uint32 size, uint rate, byte flags) { +int SoundMixer::append(int index, void *sound, uint32 size, uint rate, byte flags) { _syst->lock_mutex(_mutex); - Channel * chan = _channels[index]; + Channel *chan = _channels[index]; if (!chan) { debug(2, "Trying to stream to an unexistant streamer : %d", index); playStream(NULL, index, sound, size, rate, flags); @@ -69,7 +69,7 @@ int SoundMixer::append(int index, void * sound, uint32 size, uint rate, byte fla return 1; } -int SoundMixer::insertAt(PlayingSoundHandle * handle, int index, Channel * chan) { +int SoundMixer::insertAt(PlayingSoundHandle *handle, int index, Channel *chan) { if(index == -1) { for (int i = _beginSlots; i != NUM_CHANNELS; i++) if (_channels[i] == NULL) { index = i; break; } @@ -88,7 +88,7 @@ int SoundMixer::insertAt(PlayingSoundHandle * handle, int index, Channel * chan) return index; } -int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags) { +int SoundMixer::playRaw(PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags) { for (int i = _beginSlots; i != NUM_CHANNELS; i++) { if (_channels[i] == NULL) { return insertAt(handle, i, new ChannelRaw(this, sound, size, rate, flags, -1)); @@ -99,7 +99,7 @@ int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, return -1; } -int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags, int id) { +int SoundMixer::playRaw(PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags, int id) { for (int i = _beginSlots; i != NUM_CHANNELS; i++) { if (_channels[i] == NULL) { return insertAt(handle, i, new ChannelRaw(this, sound, size, rate, flags, id)); @@ -110,8 +110,8 @@ int SoundMixer::playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, return -1; } -int SoundMixer::playStream(PlayingSoundHandle * handle, int idx, void * sound, uint32 size, - uint rate, byte flags, int32 timeout, int32 buffer_size) { +int SoundMixer::playStream(PlayingSoundHandle *handle, int idx, void *sound, uint32 size, + uint rate, byte flags, int32 timeout, int32 buffer_size) { return insertAt(handle, idx, new ChannelStream(this, sound, size, rate, flags, timeout, buffer_size)); } @@ -124,7 +124,7 @@ void SoundMixer::beginSlots(int index) { } #ifdef USE_MAD -int SoundMixer::playMP3(PlayingSoundHandle * handle, void *sound, uint32 size, byte flags) { +int SoundMixer::playMP3(PlayingSoundHandle *handle, void *sound, uint32 size, byte flags) { for (int i = _beginSlots; i != NUM_CHANNELS; i++) { if (_channels[i] == NULL) { return insertAt(handle, i, new ChannelMP3(this, sound, size, flags)); @@ -134,7 +134,7 @@ int SoundMixer::playMP3(PlayingSoundHandle * handle, void *sound, uint32 size, b warning("SoundMixer::out of mixer slots"); return -1; } -int SoundMixer::playMP3CDTrack(PlayingSoundHandle * handle, File * file, mad_timer_t duration) { +int SoundMixer::playMP3CDTrack(PlayingSoundHandle *handle, File *file, mad_timer_t duration) { /* Stop the previously playing CD track (if any) */ for (int i = _beginSlots; i != NUM_CHANNELS; i++) { if (_channels[i] == NULL) { @@ -148,7 +148,7 @@ int SoundMixer::playMP3CDTrack(PlayingSoundHandle * handle, File * file, mad_tim #endif #ifdef USE_VORBIS -int SoundMixer::playVorbis(PlayingSoundHandle * handle, OggVorbis_File * ov_file, int duration, bool is_cd_track) { +int SoundMixer::playVorbis(PlayingSoundHandle *handle, OggVorbis_File *ov_file, int duration, bool is_cd_track) { for (int i = _beginSlots; i != NUM_CHANNELS; i++) { if (_channels[i] == NULL) { return insertAt(handle, i, new ChannelVorbis(this, ov_file, duration, is_cd_track)); @@ -185,15 +185,13 @@ void SoundMixer::mix(int16 *buf, uint len) { _syst->unlock_mutex(_mutex); } -void SoundMixer::onGenerateSamples(void * s, byte * samples, int len) { +void SoundMixer::onGenerateSamples(void *s, byte *samples, int len) { ((SoundMixer *)s)->mix((int16 *)samples, len >> 2); } -bool SoundMixer::bindToSystem(OSystem * syst) { +bool SoundMixer::bindToSystem(OSystem *syst) { uint rate = (uint) syst->property(OSystem::PROP_GET_SAMPLE_RATE, 0); - _outputRate = rate; - _syst = syst; _mutex = _syst->create_mutex(); @@ -230,7 +228,7 @@ bool SoundMixer::hasActiveChannel() { return false; } -void SoundMixer::setupPremix(void * param, PremixProc * proc) { +void SoundMixer::setupPremix(void *param, PremixProc *proc) { _premixParam = param; _premixProc = proc; } @@ -267,12 +265,12 @@ bool SoundMixer::Channel::soundFinished() { return false; } -void SoundMixer::Channel::append(void * sound, uint32 size) { +void SoundMixer::Channel::append(void *sound, uint32 size) { error("append method should never be called on something else than a _STREAM mixer "); } /* RAW mixer */ -SoundMixer::ChannelRaw::ChannelRaw(SoundMixer * mixer, void * sound, uint32 size, uint rate, byte flags, int id) { +SoundMixer::ChannelRaw::ChannelRaw(SoundMixer *mixer, void *sound, uint32 size, uint rate, byte flags, int id) { _id = id; _mixer = mixer; _flags = flags; @@ -300,7 +298,6 @@ SoundMixer::ChannelRaw::ChannelRaw(SoundMixer * mixer, void * sound, uint32 size } } - /* * Class that performs cubic interpolation on integer data. * It is expected that the data is equidistant, i.e. all have the same @@ -312,14 +309,12 @@ protected: int a, b, c, d; public: - CubicInterpolator(int a0, int b0, int c0) : x0(2 * a0 - b0), x1(a0), x2(b0), x3(c0) - { + CubicInterpolator(int a0, int b0, int c0) : x0(2 * a0 - b0), x1(a0), x2(b0), x3(c0) { // We use a simple linear interpolation for x0 updateCoefficients(); } - inline void feedData() - { + inline void feedData() { x0 = x1; x1 = x2; x2 = x3; @@ -327,8 +322,7 @@ public: updateCoefficients(); } - inline void feedData(int xNew) - { + inline void feedData(int xNew) { x0 = x1; x1 = x2; x2 = x3; @@ -337,8 +331,7 @@ public: } /* t must be a 16.16 fixed point number between 0 and 1 */ - inline int interpolate(uint32 fpPos) - { + inline int interpolate(uint32 fpPos) { int result = 0; int t = fpPos >> 8; result = (a * t + b) >> 8; @@ -350,8 +343,7 @@ public: } protected: - inline void updateCoefficients() - { + inline void updateCoefficients() { a = ((-x0 * 2) + (x1 * 5) - (x2 * 4) + x3); b = ((x0 + x2 - (2 * x1)) * 6) << 8; c = ((-4 * x0) + x1 + (x2 * 4) - x3) << 8; @@ -370,12 +362,12 @@ static inline int clamped_add_16(int a, int b) { return val; } -static int16 * mix_signed_mono_8(int16 * data, uint * len_ptr, byte ** s_ptr, uint32 * fp_pos_ptr, - int fp_speed, const int16 * vol_tab, byte * s_end, bool reverse_stereo) { +static int16 *mix_signed_mono_8(int16 *data, uint *len_ptr, byte **s_ptr, uint32 *fp_pos_ptr, + int fp_speed, const int16 *vol_tab, byte *s_end, bool reverse_stereo) { uint32 fp_pos = *fp_pos_ptr; byte *s = *s_ptr; uint len = *len_ptr; - + int inc = 1, result; CubicInterpolator interp(vol_tab[*s], vol_tab[*(s + 1)], vol_tab[*(s + 2)]); @@ -409,12 +401,12 @@ static int16 * mix_signed_mono_8(int16 * data, uint * len_ptr, byte ** s_ptr, ui return data; } -static int16 * mix_unsigned_mono_8(int16 * data, uint * len_ptr, byte ** s_ptr, uint32 * fp_pos_ptr, - int fp_speed, const int16 * vol_tab, byte * s_end, bool reverse_stereo) { +static int16 *mix_unsigned_mono_8(int16 *data, uint *len_ptr, byte **s_ptr, uint32 *fp_pos_ptr, + int fp_speed, const int16 *vol_tab, byte *s_end, bool reverse_stereo) { uint32 fp_pos = *fp_pos_ptr; byte *s = *s_ptr; uint len = *len_ptr; - + int inc = 1, result; CubicInterpolator interp(vol_tab[*s ^ 0x80], vol_tab[*(s + 1) ^ 0x80], vol_tab[*(s + 2) ^ 0x80]); @@ -448,18 +440,18 @@ static int16 * mix_unsigned_mono_8(int16 * data, uint * len_ptr, byte ** s_ptr, return data; } -static int16 * mix_signed_stereo_8(int16 * data, uint * len_ptr, byte ** s_ptr, uint32 * fp_pos_ptr, - int fp_speed, const int16 * vol_tab, byte *s_end, bool reverse_stereo) { +static int16 *mix_signed_stereo_8(int16 *data, uint *len_ptr, byte **s_ptr, uint32 *fp_pos_ptr, + int fp_speed, const int16 *vol_tab, byte *s_end, bool reverse_stereo) { warning("Mixing stereo signed 8 bit is not supported yet "); return data; } -static int16 * mix_unsigned_stereo_8(int16 * data, uint * len_ptr, byte ** s_ptr, uint32 * fp_pos_ptr, - int fp_speed, const int16 * vol_tab, byte * s_end, bool reverse_stereo) { +static int16 *mix_unsigned_stereo_8(int16 *data, uint *len_ptr, byte **s_ptr, uint32 *fp_pos_ptr, + int fp_speed, const int16 *vol_tab, byte *s_end, bool reverse_stereo) { uint32 fp_pos = *fp_pos_ptr; byte *s = *s_ptr; uint len = *len_ptr; - + int inc = 1; CubicInterpolator left(vol_tab[*s ^ 0x80], vol_tab[*(s + 2) ^ 0x80], vol_tab[*(s + 4) ^ 0x80]); CubicInterpolator right(vol_tab[*(s + 1) ^ 0x80], vol_tab[*(s + 3) ^ 0x80], vol_tab[*(s + 5) ^ 0x80]); @@ -501,8 +493,8 @@ static int16 * mix_unsigned_stereo_8(int16 * data, uint * len_ptr, byte ** s_ptr return data; } -static int16 * mix_signed_mono_16(int16 * data, uint * len_ptr, byte ** s_ptr, uint32 * fp_pos_ptr, - int fp_speed, const int16 * vol_tab, byte * s_end, bool reverse_stereo) { +static int16 *mix_signed_mono_16(int16 *data, uint *len_ptr, byte **s_ptr, uint32 *fp_pos_ptr, + int fp_speed, const int16 *vol_tab, byte *s_end, bool reverse_stereo) { uint32 fp_pos = *fp_pos_ptr; unsigned char volume = ((int)vol_tab[1]) / 8; byte *s = *s_ptr; @@ -526,14 +518,14 @@ static int16 * mix_signed_mono_16(int16 * data, uint * len_ptr, byte ** s_ptr, u return data; } -static int16 *mix_unsigned_mono_16(int16 *data, uint * len_ptr, byte ** s_ptr, uint32 * fp_pos_ptr, - int fp_speed, const int16 * vol_tab, byte * s_end, bool reverse_stereo) { +static int16 *mix_unsigned_mono_16(int16 *data, uint *len_ptr, byte **s_ptr, uint32 *fp_pos_ptr, + int fp_speed, const int16 *vol_tab, byte *s_end, bool reverse_stereo) { warning("Mixing mono unsigned 16 bit is not supported yet "); return data; } -static int16 *mix_signed_stereo_16(int16 * data, uint * len_ptr, byte ** s_ptr, uint32 * fp_pos_ptr, - int fp_speed, const int16 * vol_tab, byte * s_end, bool reverse_stereo) { +static int16 *mix_signed_stereo_16(int16 *data, uint *len_ptr, byte **s_ptr, uint32 *fp_pos_ptr, + int fp_speed, const int16 *vol_tab, byte *s_end, bool reverse_stereo) { uint32 fp_pos = *fp_pos_ptr; unsigned char volume = ((int)vol_tab[1]) / 8; byte *s = *s_ptr; @@ -562,16 +554,16 @@ static int16 *mix_signed_stereo_16(int16 * data, uint * len_ptr, byte ** s_ptr, return data; } -static int16 * mix_unsigned_stereo_16(int16 * data, uint * len_ptr, byte ** s_ptr, uint32 * fp_pos_ptr, - int fp_speed, const int16 * vol_tab, byte * s_end, bool reverse_stereo) { +static int16 *mix_unsigned_stereo_16(int16 *data, uint *len_ptr, byte **s_ptr, uint32 *fp_pos_ptr, + int fp_speed, const int16 *vol_tab, byte *s_end, bool reverse_stereo) { warning("Mixing stereo unsigned 16 bit is not supported yet "); return data; } -static int16 * (*mixer_helper_table[8]) (int16 * data, uint * len_ptr, byte ** s_ptr, - uint32 * fp_pos_ptr, int fp_speed, const int16 * vol_tab, - byte * s_end, bool reverse_stereo) = { +static int16 *(*mixer_helper_table[8]) (int16 *data, uint *len_ptr, byte **s_ptr, + uint32 *fp_pos_ptr, int fp_speed, const int16 *vol_tab, + byte *s_end, bool reverse_stereo) = { mix_signed_mono_8, mix_unsigned_mono_8, mix_signed_stereo_8, mix_unsigned_stereo_8, mix_signed_mono_16, mix_unsigned_mono_16, @@ -585,7 +577,7 @@ static int16 mixer_element_size[] = { 4, 4 }; -void SoundMixer::ChannelRaw::mix(int16 * data, uint len) { +void SoundMixer::ChannelRaw::mix(int16 *data, uint len) { byte *s, *s_org = NULL; uint32 fp_pos; byte *end; @@ -657,7 +649,7 @@ void SoundMixer::ChannelRaw::realDestroy() { #define WARP_WORKAROUND 50000 -SoundMixer::ChannelStream::ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate, +SoundMixer::ChannelStream::ChannelStream(SoundMixer *mixer, void *sound, uint32 size, uint rate, byte flags, int32 timeout, int32 buffer_size) { _mixer = mixer; _flags = flags; @@ -681,7 +673,7 @@ SoundMixer::ChannelStream::ChannelStream(SoundMixer * mixer, void * sound, uint3 _rate = rate; } -void SoundMixer::ChannelStream::append(void * data, uint32 len) { +void SoundMixer::ChannelStream::append(void *data, uint32 len) { byte *new_end = _endOfData + len; byte *cur_pos = _pos; /* This is just to prevent the variable to move during the tests :-) */ if (new_end > (_ptr + _bufferSize)) { @@ -705,11 +697,11 @@ void SoundMixer::ChannelStream::append(void * data, uint32 len) { _endOfData = new_end; } -void SoundMixer::ChannelStream::mix(int16 * data, uint len) { +void SoundMixer::ChannelStream::mix(int16 *data, uint len) { uint32 fp_pos; const uint32 fp_speed = _fpSpeed; - const int16 * vol_tab = _mixer->_volumeTable; - byte * end_of_data = _endOfData; + const int16 *vol_tab = _mixer->_volumeTable; + byte *end_of_data = _endOfData; if (_toBeDestroyed) { realDestroy(); @@ -734,7 +726,7 @@ void SoundMixer::ChannelStream::mix(int16 * data, uint len) { int wrap_offset = 0; // see if we will wrap - if (_pos + (mixer_element_size[_flags & 0x07] * len) > _endOfBuffer) { + if (_pos + (mixer_element_size[_flags & 0x07] * len) > _endOfBuffer) { wrap_offset = _pos + (mixer_element_size[_flags & 0x07] * len) - _endOfBuffer; debug(9, "using wrap workaround for %d bytes", wrap_offset); memcpy(_endOfBuffer, _ptr, wrap_offset); @@ -766,7 +758,7 @@ void SoundMixer::ChannelStream::realDestroy() { } #ifdef USE_MAD -SoundMixer::ChannelMP3::ChannelMP3(SoundMixer * mixer, void * sound, uint size, byte flags) { +SoundMixer::ChannelMP3::ChannelMP3(SoundMixer *mixer, void *sound, uint size, byte flags) { _mixer = mixer; _flags = flags; _posInFrame = 0xFFFFFFFF; @@ -812,7 +804,7 @@ static inline int scale_sample(mad_fixed_t sample) { return sample >> (MAD_F_FRACBITS + 1 - 16); } -void SoundMixer::ChannelMP3::mix(int16 * data, uint len) { +void SoundMixer::ChannelMP3::mix(int16 *data, uint len) { mad_fixed_t const * ch; const int16 * vol_tab = _mixer->_volumeTable; unsigned char volume = ((int)vol_tab[1]) / 8; @@ -885,7 +877,7 @@ void SoundMixer::ChannelMP3::realDestroy() { #define MP3CD_BUFFERING_SIZE 131072 -SoundMixer::ChannelMP3CDMusic::ChannelMP3CDMusic(SoundMixer * mixer, File * file, +SoundMixer::ChannelMP3CDMusic::ChannelMP3CDMusic(SoundMixer *mixer, File *file, mad_timer_t duration){ _mixer = mixer; _file = file; @@ -905,7 +897,7 @@ SoundMixer::ChannelMP3CDMusic::ChannelMP3CDMusic(SoundMixer * mixer, File * file mad_synth_init(&_synth); } -void SoundMixer::ChannelMP3CDMusic::mix(int16 * data, uint len) { +void SoundMixer::ChannelMP3CDMusic::mix(int16 *data, uint len) { mad_fixed_t const *ch; mad_timer_t frame_duration; unsigned char volume = _mixer->_musicVolume / 8; @@ -1022,7 +1014,7 @@ void SoundMixer::ChannelMP3CDMusic::realDestroy() { #endif #ifdef USE_VORBIS -SoundMixer::ChannelVorbis::ChannelVorbis(SoundMixer * mixer, OggVorbis_File * ov_file, int duration, bool is_cd_track) { +SoundMixer::ChannelVorbis::ChannelVorbis(SoundMixer *mixer, OggVorbis_File *ov_file, int duration, bool is_cd_track) { _mixer = mixer; _ov_file = ov_file; @@ -1036,7 +1028,7 @@ SoundMixer::ChannelVorbis::ChannelVorbis(SoundMixer * mixer, OggVorbis_File * ov _toBeDestroyed = false; } -void SoundMixer::ChannelVorbis::mix(int16 * data, uint len) { +void SoundMixer::ChannelVorbis::mix(int16 *data, uint len) { if (_toBeDestroyed) { realDestroy(); return; @@ -1109,8 +1101,7 @@ void SoundMixer::ChannelVorbis::realDestroy() { } bool SoundMixer::ChannelVorbis::soundFinished() { - return _eof_flag || (_end_pos > 0 && - ov_pcm_tell(_ov_file) >= _end_pos); + return _eof_flag || (_end_pos > 0 && ov_pcm_tell(_ov_file) >= _end_pos); } #endif diff --git a/sound/mixer.h b/sound/mixer.h index c4c7733881..49f7f4a159 100644 --- a/sound/mixer.h +++ b/sound/mixer.h @@ -56,8 +56,8 @@ private: }; class ChannelRaw : public Channel { - SoundMixer * _mixer; - void * _ptr; + SoundMixer *_mixer; + void *_ptr; uint32 _pos; uint32 _size; uint32 _fpSpeed; @@ -68,18 +68,18 @@ private: uint32 _loop_size; public: - ChannelRaw(SoundMixer * mixer, void * sound, uint32 size, uint rate, byte flags, int id); + ChannelRaw(SoundMixer *mixer, void *sound, uint32 size, uint rate, byte flags, int id); - void mix(int16 * data, uint len); + void mix(int16 *data, uint len); void realDestroy(); }; class ChannelStream : public Channel { - SoundMixer * _mixer; - byte * _ptr; - byte * _endOfData; - byte * _endOfBuffer; - byte * _pos; + SoundMixer *_mixer; + byte *_ptr; + byte *_endOfData; + byte *_endOfBuffer; + byte *_pos; uint32 _fpSpeed; uint32 _fpPos; uint32 _bufferSize; @@ -89,17 +89,17 @@ private: byte _flags; public: - ChannelStream(SoundMixer * mixer, void * sound, uint32 size, uint rate, byte flags, int32 timout, int32 buffer_size); + ChannelStream(SoundMixer *mixer, void *sound, uint32 size, uint rate, byte flags, int32 timout, int32 buffer_size); - void append(void * sound, uint32 size); - void mix(int16 * data, uint len); + void append(void *sound, uint32 size); + void mix(int16 *data, uint len); void realDestroy(); }; #ifdef USE_MAD class ChannelMP3 : public Channel { - SoundMixer * _mixer; + SoundMixer *_mixer; void *_ptr; struct mad_stream _stream; struct mad_frame _frame; @@ -111,16 +111,16 @@ private: byte _flags; public: - ChannelMP3(SoundMixer * mixer, void *sound, uint size, byte flags); + ChannelMP3(SoundMixer *mixer, void *sound, uint size, byte flags); - void mix(int16 * data, uint len); + void mix(int16 *data, uint len); void realDestroy(); }; class ChannelMP3CDMusic:public Channel { - SoundMixer * _mixer; - void * _ptr; + SoundMixer *_mixer; + void *_ptr; struct mad_stream _stream; struct mad_frame _frame; struct mad_synth _synth; @@ -128,14 +128,14 @@ private: uint32 _size; uint32 _bufferSize; mad_timer_t _duration; - File * _file; + File *_file; bool _initialized; public: - ChannelMP3CDMusic(SoundMixer * mixer, File * file, mad_timer_t duration); + ChannelMP3CDMusic(SoundMixer *mixer, File *file, mad_timer_t duration); - void mix(int16 * data, uint len); + void mix(int16 *data, uint len); void realDestroy(); bool soundFinished(); }; @@ -144,31 +144,31 @@ private: #ifdef USE_VORBIS class ChannelVorbis : public Channel { - SoundMixer * _mixer; - OggVorbis_File * _ov_file; + SoundMixer *_mixer; + OggVorbis_File *_ov_file; int _end_pos; bool _eof_flag, _is_cd_track; public: - ChannelVorbis(SoundMixer * mixer, OggVorbis_File * ov_file, int duration, bool is_cd_track); + ChannelVorbis(SoundMixer *mixer, OggVorbis_File *ov_file, int duration, bool is_cd_track); - void mix(int16 * data, uint len); + void mix(int16 *data, uint len); void realDestroy(); bool soundFinished(); }; #endif - static void onGenerateSamples(void * s, byte * samples, int len); + static void onGenerateSamples(void *s, byte *samples, int len); public: - typedef void PremixProc (void * param, int16 * data, uint len); + typedef void PremixProc (void *param, int16 *data, uint len); - OSystem * _syst; - void * _mutex; + OSystem *_syst; + void *_mutex; uint _outputRate; - int16 * _volumeTable; + int16 *_volumeTable; int _musicVolume; bool _paused; @@ -177,20 +177,20 @@ public: NUM_CHANNELS = 16 }; - void * _premixParam; - PremixProc * _premixProc; + void *_premixParam; + PremixProc *_premixProc; - Channel * _channels[NUM_CHANNELS]; - PlayingSoundHandle * _handles[NUM_CHANNELS]; + Channel *_channels[NUM_CHANNELS]; + PlayingSoundHandle *_handles[NUM_CHANNELS]; int _beginSlots; SoundMixer(); ~SoundMixer(); - int insertAt(PlayingSoundHandle * handle, int index, Channel * chan); - void append(void * data, uint32 len); - void unInsert(Channel * chan); + int insertAt(PlayingSoundHandle *handle, int index, Channel *chan); + void append(void *data, uint32 len); + void unInsert(Channel *chan); void beginSlots(int index); // start playing a raw sound @@ -204,16 +204,16 @@ public: FLAG_REVERSE_STEREO = 32, // sound should be reverse stereo FLAG_LOOP = 64 // loop the audio }; - int playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags); - int playRaw(PlayingSoundHandle * handle, void * sound, uint32 size, uint rate, byte flags, int id); - int playStream(PlayingSoundHandle * handle, int index, void * sound, uint32 size, uint rate, + int playRaw(PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags); + int playRaw(PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags, int id); + int playStream(PlayingSoundHandle *handle, int index, void *sound, uint32 size, uint rate, byte flags, int32 timeout = 3, int32 buffer_size = 2000000); #ifdef USE_MAD - int playMP3(PlayingSoundHandle * handle, void * sound, uint32 size, byte flags); - int playMP3CDTrack(PlayingSoundHandle * handle, File * file, mad_timer_t duration); + int playMP3(PlayingSoundHandle *handle, void *sound, uint32 size, byte flags); + int playMP3CDTrack(PlayingSoundHandle *handle, File *file, mad_timer_t duration); #endif #ifdef USE_VORBIS - int playVorbis(PlayingSoundHandle * handle, OggVorbis_File * ov_file, int duration, bool is_cd_track); + int playVorbis(PlayingSoundHandle *handle, OggVorbis_File *ov_file, int duration, bool is_cd_track); #endif /* Premix procedure, useful when using fmopl adlib */ diff --git a/sound/mpu401.cpp b/sound/mpu401.cpp index 001c28f204..4e1b6fe48c 100644 --- a/sound/mpu401.cpp +++ b/sound/mpu401.cpp @@ -24,40 +24,58 @@ #include "common/util.h" // for ARRAYSIZE -void MidiChannel_MPU401::init (MidiDriver_MPU401 *owner, byte channel) -{ +void MidiChannel_MPU401::init(MidiDriver_MPU401 *owner, byte channel) { _owner = owner; _channel = channel; _allocated = false; } -MidiDriver *MidiChannel_MPU401::device() { return _owner; } -void MidiChannel_MPU401::noteOff (byte note) { _owner->send(note << 8 | 0x80 | _channel); } -void MidiChannel_MPU401::noteOn (byte note, byte velocity) { _owner->send (velocity << 16 | note << 8 | 0x90 | _channel); } -void MidiChannel_MPU401::programChange (byte program) { _owner->send(program << 8 | 0xC0 | _channel); } -void MidiChannel_MPU401::pitchBend (int16 bend) { _owner->send((((bend + 0x2000) >> 7) & 0x7F) << 16 | ((bend + 0x2000) & 0x7F) << 8 | 0xE0 | _channel); } -void MidiChannel_MPU401::controlChange (byte control, byte value) { _owner->send(value << 16 | control << 8 | 0xB0 | _channel); } -void MidiChannel_MPU401::pitchBendFactor (byte value) { _owner->setPitchBendRange (_channel, value); } -void MidiChannel_MPU401::sysEx_customInstrument (uint32 type, byte *instr) { _owner->sysEx_customInstrument (_channel, type, instr); } +MidiDriver *MidiChannel_MPU401::device() { + return _owner; +} + +void MidiChannel_MPU401::noteOff (byte note) { + _owner->send(note << 8 | 0x80 | _channel); +} + +void MidiChannel_MPU401::noteOn(byte note, byte velocity) { + _owner->send (velocity << 16 | note << 8 | 0x90 | _channel); +} +void MidiChannel_MPU401::programChange(byte program) { + _owner->send(program << 8 | 0xC0 | _channel); +} + +void MidiChannel_MPU401::pitchBend(int16 bend) { + _owner->send((((bend + 0x2000) >> 7) & 0x7F) << 16 | ((bend + 0x2000) & 0x7F) << 8 | 0xE0 | _channel); +} + +void MidiChannel_MPU401::controlChange(byte control, byte value) { + _owner->send(value << 16 | control << 8 | 0xB0 | _channel); +} -MidiDriver_MPU401::MidiDriver_MPU401() : MidiDriver() -{ +void MidiChannel_MPU401::pitchBendFactor(byte value) { + _owner->setPitchBendRange (_channel, value); +} + +void MidiChannel_MPU401::sysEx_customInstrument(uint32 type, byte *instr) { + _owner->sysEx_customInstrument (_channel, type, instr); +} + +MidiDriver_MPU401::MidiDriver_MPU401() : MidiDriver() { uint i; for (i = 0; i < ARRAYSIZE(_midi_channels); ++i) { _midi_channels [i].init (this, i); } } - - -MidiChannel *MidiDriver_MPU401::allocateChannel() -{ +MidiChannel *MidiDriver_MPU401::allocateChannel() { MidiChannel_MPU401 *chan; uint i; - + for (i = 0; i < ARRAYSIZE(_midi_channels); ++i) { - if (i == 9) continue; + if (i == 9) + continue; chan = &_midi_channels[i]; if (!chan->_allocated) { chan->allocate(); @@ -67,24 +85,21 @@ MidiChannel *MidiDriver_MPU401::allocateChannel() return NULL; } - -void MidiDriver_MPU401::setTimerCallback (void *timer_param, void (*timer_proc) (void *)) -{ +void MidiDriver_MPU401::setTimerCallback (void *timer_param, void (*timer_proc) (void *)) { if (!_timer_proc || !timer_proc) { _timer_proc = (TimerCallback *) timer_proc; _timer_param = timer_param; if (!_started_thread && timer_proc) - g_system->create_thread (midi_driver_thread, this); + g_system->create_thread(midi_driver_thread, this); _started_thread = true; } } #if !defined(__MORPHOS__) -int MidiDriver_MPU401::midi_driver_thread(void *param) -{ +int MidiDriver_MPU401::midi_driver_thread(void *param) { MidiDriver_MPU401 *mid = (MidiDriver_MPU401 *)param; int old_time, cur_time; - + old_time = g_system->get_msecs(); for (;;) { diff --git a/sound/mpu401.h b/sound/mpu401.h index b866cd2442..52e5163fb2 100644 --- a/sound/mpu401.h +++ b/sound/mpu401.h @@ -87,8 +87,8 @@ private: public: MidiDriver_MPU401(); - void setTimerCallback (void *timer_param, void (*timer_proc) (void *)); - uint32 getBaseTempo (void) { return 0x4A0000; } + void setTimerCallback(void *timer_param, void (*timer_proc) (void *)); + uint32 getBaseTempo(void) { return 0x4A0000; } MidiChannel *allocateChannel(); MidiChannel *getPercussionChannel() { return &_midi_channels [9]; } |