Ticket #8610: madmoose-axe-premix.diff
File madmoose-axe-premix.diff, 14.3 KB (added by , 17 years ago) |
---|
-
sound/mixer.cpp
108 108 109 109 _handleSeed = 0; 110 110 111 _premixChannel = 0;112 111 int i = 0; 113 112 114 113 for (i = 0; i < ARRAYSIZE(_volumeForSoundType); i++) … … 122 121 123 122 Mixer::~Mixer() { 124 123 stopAll(true); 125 126 delete _premixChannel;127 _premixChannel = 0;128 124 } 129 125 130 126 uint Mixer::getOutputRate() const { 131 127 return (uint)_syst->getOutputSampleRate(); 132 128 } 133 129 134 void Mixer::setupPremix(AudioStream *stream, SoundType type) {135 Common::StackLock lock(_mutex);136 137 delete _premixChannel;138 _premixChannel = 0;139 140 if (stream == 0)141 return;142 143 // Create the channel144 _premixChannel = new Channel(this, type, stream, false);145 }146 147 130 void Mixer::insertChannel(SoundHandle *handle, Channel *chan) { 148 131 149 132 int index = -1; … … 246 229 // zero the buf 247 230 memset(buf, 0, 2 * len * sizeof(int16)); 248 231 249 if (_premixChannel && !_premixChannel->isPaused()) 250 _premixChannel->mix(buf, len); 251 252 // now mix all channels 232 // mix all channels 253 233 for (int i = 0; i != NUM_CHANNELS; i++) 254 234 if (_channels[i]) { 255 235 if (_channels[i]->isFinished()) { … … 278 258 } 279 259 } 280 260 } 281 282 // Note: the _premixChannel is *not* affected by stopAll!283 261 } 284 262 285 263 void Mixer::stopID(int id) { … … 341 319 _channels[i]->pause(paused); 342 320 } 343 321 } 344 345 // Unlike stopAll, we also pause the premix channel, if present.346 if (_premixChannel)347 _premixChannel->pause(paused);348 322 } 349 323 350 324 void Mixer::pauseID(int id, bool paused) { -
sound/softsynth/emumidi.h
30 30 protected: 31 31 bool _isOpen; 32 32 Audio::Mixer *_mixer; 33 Audio::SoundHandle _mixerSoundHandle; 33 34 34 35 private: 35 36 Common::TimerManager::TimerProc _timerProc; -
sound/softsynth/ym2612.cpp
741 741 742 742 MidiDriver_Emulated::open(); 743 743 744 _mixer-> setupPremix(this);744 _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_mixerSoundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 745 745 return 0; 746 746 } 747 747 … … 750 750 return; 751 751 _isOpen = false; 752 752 753 // Detach the premix callback handler 754 _mixer->setupPremix(0); 753 _mixer->stopHandle(_mixerSoundHandle); 755 754 } 756 755 757 756 void MidiDriver_YM2612::send(uint32 b) { -
sound/softsynth/adlib.cpp
847 847 adlib_write(0xBD, 0x00); 848 848 create_lookup_table(); 849 849 850 _mixer-> setupPremix(this);850 _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_mixerSoundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 851 851 852 852 return 0; 853 853 } … … 857 857 return; 858 858 _isOpen = false; 859 859 860 // Detach the premix callback handler 861 _mixer->setupPremix(0); 860 _mixer->stopHandle(_mixerSoundHandle); 862 861 863 862 uint i; 864 863 for (i = 0; i < ARRAYSIZE(_voices); ++i) { -
sound/mixer.h
102 102 OSystem *_syst; 103 103 Common::Mutex _mutex; 104 104 105 Channel *_premixChannel;106 107 105 int _volumeForSoundType[4]; 108 106 109 107 uint32 _handleSeed; … … 130 128 131 129 132 130 /** 133 * Set the premix stream. This is mainly used for the adlib music, but134 * is not limited to it. The premix stream is invoked by the mixer whenever135 * it needs to generate any data, before any other mixing takes place.136 */137 void setupPremix(AudioStream *stream, SoundType type = kPlainSoundType);138 139 140 141 /**142 131 * Start playing the given raw sound data. 143 132 * Internally, this simply creates an audio input stream wrapping the data 144 133 * (using the makeLinearInputStream factory function), which is then … … 201 190 202 191 203 192 /** 204 * Pause/unpause all sounds, including all regular channels and the205 * premix channel.193 * Pause/unpause all sounds, including all regular and permanent 194 * channels 206 195 * 207 196 * @param paused true to pause everything, false to unpause 208 197 */ -
engines/sword1/music.cpp
255 255 _converter[0] = NULL; 256 256 _converter[1] = NULL; 257 257 _volumeL = _volumeR = 192; 258 _mixer-> setupPremix(this);258 _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 259 259 } 260 260 261 261 Music::~Music() { 262 _mixer->s etupPremix(0);262 _mixer->stopHandle(_soundHandle); 263 263 delete _converter[0]; 264 264 delete _converter[1]; 265 265 } -
engines/sword1/music.h
27 27 #include "common/mutex.h" 28 28 #include "common/file.h" 29 29 #include "sound/audiostream.h" 30 #include "sound/mixer.h" 30 31 #include "sound/rate.h" 31 32 32 namespace Audio {33 class Mixer;34 }35 36 33 namespace Sword1 { 37 34 38 35 #define TOTAL_TUNES 270 … … 108 105 MusicHandle _handles[2]; 109 106 Audio::RateConverter *_converter[2]; 110 107 Audio::Mixer *_mixer; 108 Audio::SoundHandle _soundHandle; 111 109 uint32 _sampleRate; 112 110 Common::Mutex _mutex; 113 111 -
engines/sword2/sound.h
176 176 177 177 Common::Mutex _mutex; 178 178 179 Audio::SoundHandle _mixerSoundHandle; 179 180 Audio::SoundHandle _leadInHandle; 180 181 Audio::SoundHandle _leadOutHandle; 181 182 -
engines/sword2/sound.cpp
83 83 _mixBuffer = NULL; 84 84 _mixBufferLen = 0; 85 85 86 _vm->_mixer-> setupPremix(this, Audio::Mixer::kMusicSoundType);86 _vm->_mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_mixerSoundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 87 87 } 88 88 89 89 Sound::~Sound() { 90 _vm->_mixer->s etupPremix(0);90 _vm->_mixer->stopHandle(_mixerSoundHandle); 91 91 92 92 clearFxQueue(true); 93 93 stopMusic(true); -
engines/scumm/player_mod.h
26 26 27 27 #include "scumm/scumm.h" 28 28 #include "sound/audiostream.h" 29 #include "sound/mixer.h" 29 30 30 31 namespace Audio { 31 32 class RateConverter; … … 77 78 }; 78 79 79 80 Audio::Mixer *_mixer; 81 Audio::SoundHandle _soundHandle; 80 82 81 83 uint32 _mixamt; 82 84 uint32 _mixpos; -
engines/scumm/player_nes.h
27 27 #include "common/scummsys.h" 28 28 #include "scumm/music.h" 29 29 #include "sound/audiostream.h" 30 #include "sound/mixer.h" 30 31 31 namespace Audio {32 class Mixer;33 }34 35 32 namespace Scumm { 36 33 37 34 class ScummEngine; … … 80 77 81 78 ScummEngine *_vm; 82 79 Audio::Mixer *_mixer; 80 Audio::SoundHandle _soundHandle; 83 81 APUe::APU *_apu; 84 82 int _sample_rate; 85 83 int _samples_per_frame; -
engines/scumm/player_v2.h
28 28 #include "common/mutex.h" 29 29 #include "scumm/music.h" 30 30 #include "sound/audiostream.h" 31 #include "sound/mixer.h" 31 32 32 namespace Audio {33 class Mixer;34 }35 36 33 namespace Scumm { 37 34 38 35 class ScummEngine; … … 96 93 protected: 97 94 bool _isV3Game; 98 95 Audio::Mixer *_mixer; 96 Audio::SoundHandle _soundHandle; 99 97 ScummEngine *_vm; 100 98 101 99 bool _pcjr; -
engines/scumm/player_mod.cpp
46 46 _playproc = NULL; 47 47 _playparam = NULL; 48 48 49 _mixer-> setupPremix(this);49 _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 50 50 } 51 51 52 52 Player_MOD::~Player_MOD() { 53 // Detach the premix callback handler 54 _mixer->setupPremix(0); 53 _mixer->stopHandle(_soundHandle); 55 54 for (int i = 0; i < MOD_MAXCHANS; i++) { 56 55 if (!_channels[i].id) 57 56 continue; -
engines/scumm/player_nes.cpp
620 620 621 621 APU_writeControl(0); 622 622 623 _mixer-> setupPremix(this);623 _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 624 624 } 625 625 626 626 Player_NES::~Player_NES() { 627 _mixer->s etupPremix(0);627 _mixer->stopHandle(_soundHandle); 628 628 delete _apu; 629 629 } 630 630 -
engines/scumm/player_v2.cpp
375 375 set_pcjr(pcjr); 376 376 setMusicVolume(255); 377 377 378 _mixer-> setupPremix(this);378 _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 379 379 } 380 380 381 381 Player_V2::~Player_V2() { 382 382 mutex_up(); 383 // Detach the premix callback handler 384 _mixer->setupPremix(0); 383 _mixer->stopHandle(_soundHandle); 385 384 mutex_down(); 386 385 } 387 386 -
engines/agi/sound.h
26 26 #define AGI_SOUND_H 27 27 28 28 #include "sound/audiostream.h" 29 #include "sound/mixer.h" 29 30 30 namespace Audio {31 class Mixer;32 } // End of namespace Audio33 34 31 namespace Agi { 35 32 36 33 #define BUFFER_SIZE 410 … … 128 125 129 126 private: 130 127 Audio::Mixer *_mixer; 128 Audio::SoundHandle _soundHandle; 131 129 uint32 _sampleRate; 132 130 133 131 void premixerCall(int16 *buf, uint len); -
engines/agi/sound.cpp
324 324 /*loadInstruments("demo.sys"); */ 325 325 #endif 326 326 327 _mixer-> setupPremix(this);327 _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 328 328 329 329 return r; 330 330 } 331 331 332 332 void SoundMgr::deinitSound() { 333 333 debugC(3, kDebugLevelSound, "()"); 334 _mixer->s etupPremix(NULL);334 _mixer->stopHandle(_soundHandle); 335 335 free(sndBuffer); 336 336 } 337 337 -
engines/kyra/sound_adlib.cpp
406 406 407 407 Common::Mutex _mutex; 408 408 Audio::Mixer *_mixer; 409 Audio::SoundHandle _soundHandle; 409 410 410 411 bool _v2; 411 412 … … 445 446 446 447 _tablePtr1 = _tablePtr2 = 0; 447 448 448 _mixer-> setupPremix(this);449 _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 449 450 450 451 _samplesPerCallback = getRate() / CALLBACKS_PER_SECOND; 451 452 _samplesPerCallbackRemainder = getRate() % CALLBACKS_PER_SECOND; … … 456 457 } 457 458 458 459 AdlibDriver::~AdlibDriver() { 459 _mixer->s etupPremix(0);460 _mixer->stopHandle(_soundHandle); 460 461 OPLDestroy(_adlib); 461 462 _adlib = 0; 462 463 } -
engines/kyra/sound.h
57 57 58 58 namespace Audio { 59 59 class AudioStream; 60 class Mixer;61 class SoundHandle;62 60 } // end of namespace Audio 63 61 64 62 namespace Kyra { -
engines/sky/music/adlibmusic.h
26 26 #include "sky/music/musicbase.h" 27 27 #include "sound/audiostream.h" 28 28 #include "sound/fmopl.h" 29 #include "sound/mixer.h" 29 30 30 namespace Audio {31 class Mixer;32 }33 34 31 namespace Sky { 35 32 36 33 class AdlibMusic : public Audio::AudioStream, public MusicBase { … … 50 47 private: 51 48 FM_OPL *_opl; 52 49 Audio::Mixer *_mixer; 50 Audio::SoundHandle _soundHandle; 53 51 uint8 *_initSequence; 54 52 uint32 _sampleRate, _nextMusicPoll; 55 53 virtual void setupPointers(void); -
engines/sky/music/adlibmusic.cpp
39 39 40 40 _opl = makeAdlibOPL(_sampleRate); 41 41 42 _mixer-> setupPremix(this);42 _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 43 43 } 44 44 45 45 AdlibMusic::~AdlibMusic(void) { 46 46 47 _mixer->s etupPremix(0);47 _mixer->stopHandle(_soundHandle); 48 48 } 49 49 50 50 void AdlibMusic::premixerCall(int16 *data, uint len) { -
engines/cine/sound_driver.cpp
60 60 memset(_channelsVolumeTable, 0, sizeof(_channelsVolumeTable)); 61 61 memset(_instrumentsTable, 0, sizeof(_instrumentsTable)); 62 62 initCard(); 63 _mixer-> setupPremix(this);63 _mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); 64 64 } 65 65 66 66 AdlibSoundDriver::~AdlibSoundDriver() { 67 _mixer->s etupPremix(NULL);67 _mixer->stopHandle(_soundHandle); 68 68 } 69 69 70 70 void AdlibSoundDriver::setupChannel(int channel, const byte *data, int instrument, int volume) { -
engines/cine/sound_driver.h
27 27 28 28 #include "sound/audiostream.h" 29 29 #include "sound/fmopl.h" 30 #include "sound/mixer.h" 30 31 31 namespace Audio {32 class Mixer;33 }34 35 32 namespace Cine { 36 33 37 34 class SoundDriver { … … 105 102 FM_OPL *_opl; 106 103 int _sampleRate; 107 104 Audio::Mixer *_mixer; 105 Audio::SoundHandle _soundHandle; 108 106 109 107 byte _vibrato; 110 108 int _channelsVolumeTable[4];