///<summary> ///</summary> ///<param name="module"></param> public ModulePlayer(SongModule module) { _uniTrk = new UniTrk(); _uniTrk.UniInit(); CurrentModule = module; WaveTableInstance = new WaveTable(); PlayerInstance = new SharpModPlayer(_uniTrk); MixCfg = new MixConfig { Is16Bits = true, Style = RenderingStyle.Stereo, Rate = 48000 }; ChannelsMixer = new ChannelsMixer(MixCfg /* DMode.DMODE_16BITS | DMode.DMODE_STEREO*/); //this.ChannelsMixer.MixFreq = 48000; ChannelsMixer.ChannelsCount = module.ChannelsCount; ChannelsMixer.OnTickHandler += PlayerInstance.MP_HandleTick; ChannelsMixer.OnBPMRequest += delegate { return(PlayerInstance.mp_bpm); }; ChannelsMixer.WaveTable = WaveTableInstance; PlayerInstance.MP_Init(CurrentModule); PlayerInstance._mixer = ChannelsMixer; PlayerInstance.SpeedConstant = 1.0f; PlayerInstance.mp_volume = 100; PlayerInstance.mp_bpm = 125; PlayerInstance.OnUpdateUI += PlayerInstance_OnUpdateUI; PlayerInstance.OnCurrentModEnd += new CurrentModEndHandler(PlayerInstance_OnCurrentModEnd); InitWaveTable(); }
/// <summary> /// Load header of the module with the best loader /// </summary> /// <param name="module">Module to fill</param> /// <returns>true if success</returns> private bool LoadHeader(SongModule module) { var toReturn = false; _currentLoader = null; foreach (var loader in Loaders) { //Reset the reader _reader.Rewind(); loader.Reader = _reader; if (loader.Test()) { _currentLoader = loader; break; } } // Loader not found... if (null == _currentLoader) { throw new SharpModException(SharpModExceptionResources.ERROR_NOT_A_MODULE); } if (!_uniTrack.UniInit()) { return(false); } _currentLoader.UniTrack = _uniTrack; // init module loader if (_currentLoader.Init(module)) { _reader.Rewind(); toReturn = _currentLoader.Load(); } // free unitrk allocations _uniTrack.UniCleanup(); return(toReturn); }
/// <summary> /// Refresh the UniTrk Stream from the Track /// </summary> /// <param name="track"></param> internal short[] ToUniTrk(Track track) { lock (locker) { UniTrk trk = new UniTrk(); //trk.UniReset(); trk.UniInit(); trk.UniReset(); //int n_ptr = offset; foreach (PatternCell pc in track.Cells) { if (pc == null) { continue; } if (pc.Instrument != 0) { trk.UniInstrument((short)(pc.Instrument)); } if (pc.Period != 0 && pc.Note != null) { trk.UniNote((short)(pc.Period)); } if (pc.Effect > 0) { trk.UniPTEffect((short)(pc.Effect /*- 3*/), pc.EffectData); } trk.UniNewline(); } return(trk.UniDup()); } //track.UniModSong.Tracks[track.TrackNumber + (track.PatternNumber * track.UniModSong.NumChn)] = trk.UniDup(); }