/// <summary> /// Start playing the tune with the selected song /// </summary> /// <param name="SongNumber">song id (1..count), 0 = default song</param> public void Start(int SongNumber) { if (Stopping) { return; } if (_CurrentTune == null) { return; } _WavePlayer = new WaveOut(); WaveFormat fmt = new WaveFormat(_Frequency, 16, 2); _BufferedWaveProvider = new BufferedWaveProvider(fmt); _BufferedWaveProvider.BufferDuration = TimeSpan.FromSeconds(2); // allow us to get well ahead of ourselves _WavePlayer.Init(_BufferedWaveProvider); _InternalPlayer = new InternalPlayer(); sid2_config_t config = _InternalPlayer.config(); config.frequency = _Frequency; config.playback = SID2Types.sid2_playback_t.sid2_mono; config.optimisation = SID2Types.SID2_DEFAULT_OPTIMISATION; config.sidModel = (SID2Types.sid2_model_t)_CurrentTune.Info.sidModel; config.clockDefault = SID2Types.sid2_clock_t.SID2_CLOCK_CORRECT; config.clockSpeed = SID2Types.sid2_clock_t.SID2_CLOCK_CORRECT; config.clockForced = false; config.environment = SID2Types.sid2_env_t.sid2_envR; config.forceDualSids = false; config.volume = 255; config.sampleFormat = SID2Types.sid2_sample_t.SID2_LITTLE_SIGNED; config.sidDefault = SID2Types.sid2_model_t.SID2_MODEL_CORRECT; config.sidSamples = true; config.precision = SID2Types.SID2_DEFAULT_PRECISION; _InternalPlayer.config(config); _CurrentTune.selectSong(SongNumber); _InternalPlayer.load(_CurrentTune); _IsStereo = _CurrentTune.isStereo; _InternalPlayer.start(); _Thread = new Thread(new ThreadStart(ThreadProc)); _Thread.Start(); }
/// <summary> /// Inject regular program and set start address /// </summary> /// <param name="HexData"></param> /// <param name="DataStartAddress"></param> /// <param name="InitialAddress"></param> /// <returns></returns> public bool PlayFromBinary(string HexData, int DataStartAddress, int InitialAddress) { Stop(); var byteData = StringToByteArrayFastest(HexData); _CurrentTune = new SidTune(); _CurrentTune.info.loadAddr = DataStartAddress; _CurrentTune.info.c64dataLen = byteData.Length; _CurrentTune.info.initAddr = InitialAddress; _CurrentTune.info.playAddr = InitialAddress; _CurrentTune.info.compatibility = SidTune.SIDTUNE_COMPATIBILITY_R64; _CurrentTune.InjectProgramInMemory(byteData, DataStartAddress); _CurrentTune.status = true; _WavePlayer = new WaveOut(); WaveFormat fmt = new WaveFormat(_Frequency, 16, 2); _BufferedWaveProvider = new BufferedWaveProvider(fmt); _BufferedWaveProvider.BufferDuration = TimeSpan.FromSeconds(2); // allow us to get well ahead of ourselves _WavePlayer.Init(_BufferedWaveProvider); _InternalPlayer = new InternalPlayer(); sid2_config_t config = _InternalPlayer.config(); config.frequency = _Frequency; config.playback = SID2Types.sid2_playback_t.sid2_mono; config.optimisation = SID2Types.SID2_DEFAULT_OPTIMISATION; config.sidModel = (SID2Types.sid2_model_t)_CurrentTune.Info.sidModel; config.clockDefault = SID2Types.sid2_clock_t.SID2_CLOCK_CORRECT; config.clockSpeed = SID2Types.sid2_clock_t.SID2_CLOCK_CORRECT; config.clockForced = false; config.environment = SID2Types.sid2_env_t.sid2_envR; config.forceDualSids = false; config.volume = 255; config.sampleFormat = SID2Types.sid2_sample_t.SID2_LITTLE_SIGNED; config.sidDefault = SID2Types.sid2_model_t.SID2_MODEL_CORRECT; config.sidSamples = true; config.precision = SID2Types.SID2_DEFAULT_PRECISION; config.environment = SID2Types.sid2_env_t.sid2_envR; _InternalPlayer.load(_CurrentTune); _InternalPlayer.config(config); // inject code for (int i = 0; i < byteData.Length; ++i) { _InternalPlayer.mem_writeMemByte(DataStartAddress + i, byteData[i]); } _InternalPlayer.SetCPUPos(InitialAddress); _IsStereo = _CurrentTune.isStereo; _InternalPlayer.start(); _Thread = new Thread(new ThreadStart(ThreadProc)); _Thread.Start(); return(true); }