// --- initialization and deinitialization --- /// <summary>Initializes audio. A call to Deinitialize must be made when terminating the program.</summary> /// <returns>Whether initializing audio was successful.</returns> public void Initialize(HostInterface host, SoundRange range) { Deinitialize(); CurrentHost = host; switch (range) { case SoundRange.Low: OuterRadiusFactorMinimum = 2.0; OuterRadiusFactorMaximum = 8.0; OuterRadiusFactorMaximumSpeed = 1.0; break; case SoundRange.Medium: OuterRadiusFactorMinimum = 4.0; OuterRadiusFactorMaximum = 16.0; OuterRadiusFactorMaximumSpeed = 2.0; break; case SoundRange.High: OuterRadiusFactorMinimum = 6.0; OuterRadiusFactorMaximum = 24.0; OuterRadiusFactorMaximumSpeed = 3.0; break; } OuterRadiusFactor = Math.Sqrt(OuterRadiusFactorMinimum * OuterRadiusFactorMaximum); OuterRadiusFactorSpeed = 0.0; OpenAlDevice = Alc.OpenDevice(null); try { OpenAlMic = new AudioCapture(AudioCapture.DefaultDevice, SamplingRate, ALFormat.Mono16, BufferSize); } catch { } if (OpenAlDevice != IntPtr.Zero) { OpenAlContext = Alc.CreateContext(OpenAlDevice, (int[])null); if (OpenAlContext != ContextHandle.Zero) { Alc.MakeContextCurrent(OpenAlContext); try { AL.SpeedOfSound(343.0f); } catch { MessageBox.Show(Translations.GetInterfaceString("errors_sound_openal_version"), Translations.GetInterfaceString("program_title"), MessageBoxButtons.OK, MessageBoxIcon.Hand); } AL.DistanceModel(ALDistanceModel.None); return; } Alc.CloseDevice(OpenAlDevice); OpenAlDevice = IntPtr.Zero; OpenAlMic.Dispose(); OpenAlMic = null; MessageBox.Show(Translations.GetInterfaceString("errors_sound_openal_context"), Translations.GetInterfaceString("program_title"), MessageBoxButtons.OK, MessageBoxIcon.Hand); return; } OpenAlContext = ContextHandle.Zero; MessageBox.Show(Translations.GetInterfaceString("errors_sound_openal_device"), Translations.GetInterfaceString("program_title"), MessageBoxButtons.OK, MessageBoxIcon.Hand); }
// --- initialization and deinitialization --- /// <summary>Initializes audio. A call to Deinitialize must be made when terminating the program.</summary> /// <returns>Whether initializing audio was successful.</returns> public void Initialize(HostInterface host, SoundRange range) { if (host.Platform == HostPlatform.MicrosoftWindows) { /* * If shipping an AnyCPU build and OpenALSoft / SDL, these are architecture specific PInvokes * Add the appropriate search path so this will work (common convention) */ string path = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location); if (path != null) { path = Path.Combine(path, IntPtr.Size == 4 ? "x86" : "x64"); bool ok = SetDllDirectory(path); if (!ok) { throw new System.ComponentModel.Win32Exception(); } } } Deinitialize(); CurrentHost = host; switch (range) { case SoundRange.Low: OuterRadiusFactorMinimum = 2.0; OuterRadiusFactorMaximum = 8.0; OuterRadiusFactorMaximumSpeed = 1.0; break; case SoundRange.Medium: OuterRadiusFactorMinimum = 4.0; OuterRadiusFactorMaximum = 16.0; OuterRadiusFactorMaximumSpeed = 2.0; break; case SoundRange.High: OuterRadiusFactorMinimum = 6.0; OuterRadiusFactorMaximum = 24.0; OuterRadiusFactorMaximumSpeed = 3.0; break; } OuterRadiusFactor = Math.Sqrt(OuterRadiusFactorMinimum * OuterRadiusFactorMaximum); OuterRadiusFactorSpeed = 0.0; OpenAlDevice = Alc.OpenDevice(null); string deviceName = Alc.GetString(OpenAlDevice, AlcGetString.DefaultDeviceSpecifier); if ((Environment.OSVersion.Platform == PlatformID.Win32S | Environment.OSVersion.Platform == PlatformID.Win32Windows | Environment.OSVersion.Platform == PlatformID.Win32NT) && deviceName == "Generic Software") { /* * Creative OpenAL implementation on Windows seems to be limited to max 16 simulataneous sounds * Now shipping OpenAL Soft, but detect this and don't glitch * Further note that the current version of OpenAL Soft (1.20.0 at the time of writing) does not like OpenTK * The version in use is 1.17.0 found here: https://openal-soft.org/openal-binaries/ */ systemMaxSounds = 16; } try { OpenAlMic = new AudioCapture(AudioCapture.DefaultDevice, SamplingRate, ALFormat.Mono16, BufferSize); } catch { OpenAlMic = null; } if (OpenAlDevice != IntPtr.Zero) { OpenAlContext = Alc.CreateContext(OpenAlDevice, (int[])null); if (OpenAlContext != ContextHandle.Zero) { Alc.MakeContextCurrent(OpenAlContext); try { AL.SpeedOfSound(343.0f); } catch { MessageBox.Show(Translations.GetInterfaceString("errors_sound_openal_version"), Translations.GetInterfaceString("program_title"), MessageBoxButtons.OK, MessageBoxIcon.Hand); } AL.DistanceModel(ALDistanceModel.None); return; } Alc.CloseDevice(OpenAlDevice); OpenAlDevice = IntPtr.Zero; if (OpenAlMic != null) { OpenAlMic.Dispose(); OpenAlMic = null; } MessageBox.Show(Translations.GetInterfaceString("errors_sound_openal_context"), Translations.GetInterfaceString("program_title"), MessageBoxButtons.OK, MessageBoxIcon.Hand); return; } OpenAlContext = ContextHandle.Zero; MessageBox.Show(Translations.GetInterfaceString("errors_sound_openal_device"), Translations.GetInterfaceString("program_title"), MessageBoxButtons.OK, MessageBoxIcon.Hand); }
internal Options() { this.LanguageCode = "en-US"; this.FullscreenMode = false; this.VerticalSynchronization = true; this.WindowWidth = 960; this.WindowHeight = 600; this.FullscreenWidth = 1024; this.FullscreenHeight = 768; this.FullscreenBits = 32; this.UserInterfaceFolder = "Default"; this.Interpolation = Interface.InterpolationMode.BilinearMipmapped; this.TransparencyMode = Renderer.TransparencyMode.Quality; this.AnisotropicFilteringLevel = 0; this.AnisotropicFilteringMaximum = 0; this.ViewingDistance = 600; this.MotionBlur = MotionBlurMode.None; this.Toppling = true; this.Collisions = true; this.Derailments = true; this.GameMode = GameMode.Normal; this.BlackBox = false; this.UseJoysticks = true; this.JoystickAxisThreshold = 0.0; this.KeyRepeatDelay = 0.5; this.KeyRepeatInterval = 0.1; this.SoundModel = Sounds.SoundModels.Inverse; this.SoundRange = SoundRange.Low; this.SoundNumber = 16; this.ShowWarningMessages = true; this.ShowErrorMessages = true; this.ObjectOptimizationBasicThreshold = 10000; this.ObjectOptimizationFullThreshold = 1000; this.RouteFolder = ""; this.TrainFolder = ""; this.RecentlyUsedRoutes = new string[] { }; this.RecentlyUsedTrains = new string[] { }; this.RecentlyUsedLimit = 10; this.RouteEncodings = new EncodingValue[] { }; this.TrainEncodings = new EncodingValue[] { }; this.MainMenuWidth = 0; this.MainMenuHeight = 0; this.DisableDisplayLists = false; this.LoadInAdvance = false; this.NoTextureResize = false; this.ProxyUrl = string.Empty; this.ProxyUserName = string.Empty; this.ProxyPassword = string.Empty; }
// --- initialization and deinitialization --- /// <summary>Initializes audio. A call to Deinitialize must be made when terminating the program.</summary> /// <returns>Whether initializing audio was successful.</returns> public void Initialize(HostInterface host, SoundRange range) { Deinitialize(); CurrentHost = host; switch (range) { case SoundRange.Low: OuterRadiusFactorMinimum = 2.0; OuterRadiusFactorMaximum = 8.0; OuterRadiusFactorMaximumSpeed = 1.0; break; case SoundRange.Medium: OuterRadiusFactorMinimum = 4.0; OuterRadiusFactorMaximum = 16.0; OuterRadiusFactorMaximumSpeed = 2.0; break; case SoundRange.High: OuterRadiusFactorMinimum = 6.0; OuterRadiusFactorMaximum = 24.0; OuterRadiusFactorMaximumSpeed = 3.0; break; } OuterRadiusFactor = Math.Sqrt(OuterRadiusFactorMinimum * OuterRadiusFactorMaximum); OuterRadiusFactorSpeed = 0.0; OpenAlDevice = Alc.OpenDevice(null); string deviceName = Alc.GetString(OpenAlDevice, AlcGetString.DefaultDeviceSpecifier); if ((Environment.OSVersion.Platform == PlatformID.Win32S | Environment.OSVersion.Platform == PlatformID.Win32Windows | Environment.OSVersion.Platform == PlatformID.Win32NT) && deviceName == "Generic Software") { /* * Creative OpenAL implementation on Windows seems to be limited to max 16 simulataneous sounds * Now shipping OpenAL Soft, but detect this and don't glitch * Further note that the current version of OpenAL Soft (1.20.0 at the time of writing) does not like OpenTK * The version in use is 1.17.0 found here: https://openal-soft.org/openal-binaries/ */ systemMaxSounds = 16; } try { OpenAlMic = new AudioCapture(AudioCapture.DefaultDevice, SamplingRate, ALFormat.Mono16, BufferSize); } catch { } if (OpenAlDevice != IntPtr.Zero) { OpenAlContext = Alc.CreateContext(OpenAlDevice, (int[])null); if (OpenAlContext != ContextHandle.Zero) { Alc.MakeContextCurrent(OpenAlContext); try { AL.SpeedOfSound(343.0f); } catch { MessageBox.Show(Translations.GetInterfaceString("errors_sound_openal_version"), Translations.GetInterfaceString("program_title"), MessageBoxButtons.OK, MessageBoxIcon.Hand); } AL.DistanceModel(ALDistanceModel.None); return; } Alc.CloseDevice(OpenAlDevice); OpenAlDevice = IntPtr.Zero; OpenAlMic.Dispose(); OpenAlMic = null; MessageBox.Show(Translations.GetInterfaceString("errors_sound_openal_context"), Translations.GetInterfaceString("program_title"), MessageBoxButtons.OK, MessageBoxIcon.Hand); return; } OpenAlContext = ContextHandle.Zero; MessageBox.Show(Translations.GetInterfaceString("errors_sound_openal_device"), Translations.GetInterfaceString("program_title"), MessageBoxButtons.OK, MessageBoxIcon.Hand); }