From fdf108a879fc8f98fc346b9a7ece544f5629731e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 4 May 2014 07:47:21 +0200 Subject: [PATCH] port Tao.OpenAl to OpenTK.Audio.OpenAL --- Makefile | 2 +- OpenRA.Game/OpenRA.Game.csproj | 7 +- OpenRA.Game/Sound.cs | 123 +++++++++--------- packaging/windows/OpenRA.nsi | 4 +- thirdparty/SDL2-CS.dll.config | 3 + thirdparty/Tao/Tao.OpenAl.dll | Bin 69632 -> 0 bytes thirdparty/Tao/Tao.OpenAl.dll.config | 12 -- .../windows/{OpenAL32.dll => soft_oal.dll} | Bin 8 files changed, 71 insertions(+), 80 deletions(-) delete mode 100644 thirdparty/Tao/Tao.OpenAl.dll delete mode 100644 thirdparty/Tao/Tao.OpenAl.dll.config rename thirdparty/windows/{OpenAL32.dll => soft_oal.dll} (100%) diff --git a/Makefile b/Makefile index 7f753cee2d..46f775589e 100644 --- a/Makefile +++ b/Makefile @@ -80,7 +80,7 @@ VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev game_SRCS := $(shell find OpenRA.Game/ -iname '*.cs') game_TARGET = OpenRA.Game.exe game_KIND = winexe -game_LIBS = $(COMMON_LIBS) $(game_DEPS) thirdparty/Tao/Tao.OpenAl.dll thirdparty/SharpFont.dll +game_LIBS = $(COMMON_LIBS) $(game_DEPS) thirdparty/SDL2-CS.dll thirdparty/SharpFont.dll game_FLAGS = -win32icon:OpenRA.Game/OpenRA.ico PROGRAMS += game game: $(game_TARGET) diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 1e3083e1e6..b5d52232e0 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -76,10 +76,6 @@ ..\thirdparty\Eluant.dll - - False - ..\thirdparty\Tao\Tao.OpenAl.dll - ..\thirdparty\ICSharpCode.SharpZipLib.dll @@ -89,6 +85,9 @@ ..\thirdparty\MaxMind.Db.dll + + ..\thirdparty\SDL2-CS.dll + diff --git a/OpenRA.Game/Sound.cs b/OpenRA.Game/Sound.cs index e54fbf4611..8f4ea93c54 100644 --- a/OpenRA.Game/Sound.cs +++ b/OpenRA.Game/Sound.cs @@ -16,7 +16,8 @@ using OpenRA.FileSystem; using OpenRA.GameRules; using OpenRA.Primitives; using OpenRA.Traits; -using Tao.OpenAl; +using OpenTK; +using OpenTK.Audio.OpenAL; namespace OpenRA { @@ -449,13 +450,13 @@ namespace OpenRA float volume = 1f; Dictionary sourcePool = new Dictionary(); - static string[] QueryDevices(string label, int type) + static string[] QueryDevices(string label, AlcGetStringList type) { // Clear error bit - Al.alGetError(); + AL.GetError(); - var devices = Alc.alcGetStringv(IntPtr.Zero, type); - if (Al.alGetError() != Al.AL_NO_ERROR) + var devices = Alc.GetString(IntPtr.Zero, type).ToArray(); + if (AL.GetError() != ALError.NoError) { Log.Write("sound", "Failed to query OpenAL device list using {0}", label); return new string[] { }; @@ -466,12 +467,12 @@ namespace OpenRA public static string[] AvailableDevices() { - // Returns all devices under windows vista and newer - if (Alc.alcIsExtensionPresent(IntPtr.Zero, "ALC_ENUMERATE_ALL_EXT") == Alc.ALC_TRUE) - return QueryDevices("ALC_ENUMERATE_ALL_EXT", Alc.ALC_ALL_DEVICES_SPECIFIER); + // Returns all devices under Windows Vista and newer + if (Alc.IsExtensionPresent(IntPtr.Zero, "ALC_ENUMERATE_ALL_EXT")) + return QueryDevices("ALC_ENUMERATE_ALL_EXT", AlcGetStringList.AllDevicesSpecifier); - if (Alc.alcIsExtensionPresent(IntPtr.Zero, "ALC_ENUMERATION_EXT") == Alc.ALC_TRUE) - return QueryDevices("ALC_ENUMERATION_EXT", Alc.ALC_DEVICE_SPECIFIER); + if (Alc.IsExtensionPresent(IntPtr.Zero, "ALC_ENUMERATION_EXT")) + return QueryDevices("ALC_ENUMERATION_EXT", AlcGetStringList.DeviceSpecifier); return new string[] { }; } @@ -485,25 +486,25 @@ namespace OpenRA else Console.WriteLine("Using default device"); - var dev = Alc.alcOpenDevice(Game.Settings.Sound.Device); + var dev = Alc.OpenDevice(Game.Settings.Sound.Device); if (dev == IntPtr.Zero) { Console.WriteLine("Failed to open device. Falling back to default"); - dev = Alc.alcOpenDevice(null); + dev = Alc.OpenDevice(null); if (dev == IntPtr.Zero) throw new InvalidOperationException("Can't create OpenAL device"); } - var ctx = Alc.alcCreateContext(dev, IntPtr.Zero); - if (ctx == IntPtr.Zero) + var ctx = Alc.CreateContext(dev, (int[])null); + if (ctx == ContextHandle.Zero) throw new InvalidOperationException("Can't create OpenAL context"); - Alc.alcMakeContextCurrent(ctx); + Alc.MakeContextCurrent(ctx); for (var i = 0; i < PoolSize; i++) { var source = 0; - Al.alGenSources(1, out source); - if (0 != Al.alGetError()) + AL.GenSources(1, out source); + if (0 != AL.GetError()) { Log.Write("sound", "Failed generating OpenAL source {0}", i); return; @@ -528,8 +529,8 @@ namespace OpenRA foreach (int key in sourcePool.Keys) { int state; - Al.alGetSourcei(key, Al.AL_SOURCE_STATE, out state); - if (state != Al.AL_PLAYING && state != Al.AL_PAUSED) + AL.GetSource(key, ALGetSourcei.SourceState, out state); + if (state != (int)ALSourceState.Playing && state != (int)ALSourceState.Paused) freeSources.Add(key); } @@ -606,7 +607,7 @@ namespace OpenRA public float Volume { get { return volume; } - set { Al.alListenerf(Al.AL_GAIN, volume = value); } + set { AL.Listener(ALListenerf.Gain, volume = value); } } public void PauseSound(ISound sound, bool paused) @@ -616,11 +617,11 @@ namespace OpenRA var key = ((OpenAlSound)sound).Source; int state; - Al.alGetSourcei(key, Al.AL_SOURCE_STATE, out state); - if (state == Al.AL_PLAYING && paused) - Al.alSourcePause(key); - else if (state == Al.AL_PAUSED && !paused) - Al.alSourcePlay(key); + AL.GetSource(key, ALGetSourcei.SourceState, out state); + if (state == (int)ALSourceState.Playing && paused) + AL.SourcePause(key); + else if (state == (int)ALSourceState.Paused && !paused) + AL.SourcePlay(key); } public void SetAllSoundsPaused(bool paused) @@ -628,11 +629,11 @@ namespace OpenRA foreach (var key in sourcePool.Keys) { int state; - Al.alGetSourcei(key, Al.AL_SOURCE_STATE, out state); - if (state == Al.AL_PLAYING && paused) - Al.alSourcePause(key); - else if (state == Al.AL_PAUSED && !paused) - Al.alSourcePlay(key); + AL.GetSource(key, ALGetSourcei.SourceState, out state); + if (state == (int)ALSourceState.Playing && paused) + AL.SourcePause(key); + else if (state == (int)ALSourceState.Paused && !paused) + AL.SourcePlay(key); } } @@ -641,14 +642,14 @@ namespace OpenRA var sounds = sourcePool.Select(s => s.Key).Where(b => { int state; - Al.alGetSourcei(b, Al.AL_SOURCE_STATE, out state); - return (state == Al.AL_PLAYING || state == Al.AL_PAUSED) && + AL.GetSource(b, ALGetSourcei.SourceState, out state); + return (state == (int)ALSourceState.Playing || state == (int)ALSourceState.Paused) && (music == null || b != ((OpenAlSound)music).Source) && (video == null || b != ((OpenAlSound)video).Source); }); foreach (var s in sounds) - Al.alSourcef(s, Al.AL_GAIN, volume); + AL.Source(s, ALSourcef.Gain, volume); } public void StopSound(ISound sound) @@ -658,9 +659,9 @@ namespace OpenRA var key = ((OpenAlSound)sound).Source; int state; - Al.alGetSourcei(key, Al.AL_SOURCE_STATE, out state); - if (state == Al.AL_PLAYING || state == Al.AL_PAUSED) - Al.alSourceStop(key); + AL.GetSource(key, ALGetSourcei.SourceState, out state); + if (state == (int)ALSourceState.Playing || state == (int)ALSourceState.Paused) + AL.SourceStop(key); } public void StopAllSounds() @@ -668,20 +669,20 @@ namespace OpenRA foreach (var key in sourcePool.Keys) { int state; - Al.alGetSourcei(key, Al.AL_SOURCE_STATE, out state); - if (state == Al.AL_PLAYING || state == Al.AL_PAUSED) - Al.alSourceStop(key); + AL.GetSource(key, ALGetSourcei.SourceState, out state); + if (state == (int)ALSourceState.Playing || state == (int)ALSourceState.Paused) + AL.SourceStop(key); } } public void SetListenerPosition(WPos position) { // Move the listener out of the plane so that sounds near the middle of the screen aren't too positional - Al.alListener3f(Al.AL_POSITION, position.X, position.Y, position.Z + 2133); + AL.Listener(ALListener3f.Position, position.X, position.Y, position.Z + 2133); var orientation = new[] { 0f, 0f, 1f, 0f, -1f, 0f }; - Al.alListenerfv(Al.AL_ORIENTATION, ref orientation[0]); - Al.alListenerf(Al.AL_METERS_PER_UNIT, .01f); + AL.Listener(ALListenerfv.Orientation, ref orientation); + AL.Listener(ALListenerf.EfxMetersPerUnit, .01f); } } @@ -689,18 +690,18 @@ namespace OpenRA { public readonly int Buffer; - static int MakeALFormat(int channels, int bits) + static ALFormat MakeALFormat(int channels, int bits) { if (channels == 1) - return bits == 16 ? Al.AL_FORMAT_MONO16 : Al.AL_FORMAT_MONO8; + return bits == 16 ? ALFormat.Mono16 : ALFormat.Mono8; else - return bits == 16 ? Al.AL_FORMAT_STEREO16 : Al.AL_FORMAT_STEREO8; + return bits == 16 ? ALFormat.Stereo16 : ALFormat.Stereo8; } public OpenAlSoundSource(byte[] data, int channels, int sampleBits, int sampleRate) { - Al.alGenBuffers(1, out Buffer); - Al.alBufferData(Buffer, MakeALFormat(channels, sampleBits), data, data.Length, sampleRate); + AL.GenBuffers(1, out Buffer); + AL.BufferData(Buffer, MakeALFormat(channels, sampleBits), data, data.Length, sampleRate); } } @@ -717,16 +718,16 @@ namespace OpenRA Source = source; Volume = volume; - Al.alSourcef(source, Al.AL_PITCH, 1f); - Al.alSource3f(source, Al.AL_POSITION, pos.X, pos.Y, pos.Z); - Al.alSource3f(source, Al.AL_VELOCITY, 0f, 0f, 0f); - Al.alSourcei(source, Al.AL_BUFFER, buffer); - Al.alSourcei(source, Al.AL_LOOPING, looping ? Al.AL_TRUE : Al.AL_FALSE); - Al.alSourcei(source, Al.AL_SOURCE_RELATIVE, relative ? 1 : 0); + AL.Source(source, ALSourcef.Pitch, 1f); + AL.Source(source, ALSource3f.Position, pos.X, pos.Y, pos.Z); + AL.Source(source, ALSource3f.Velocity, 0f, 0f, 0f); + AL.Source(source, ALSourcei.Buffer, buffer); + AL.Source(source, ALSourceb.Looping, looping); + AL.Source(source, ALSourceb.SourceRelative, relative); - Al.alSourcef(source, Al.AL_REFERENCE_DISTANCE, 6826); - Al.alSourcef(source, Al.AL_MAX_DISTANCE, 136533); - Al.alSourcePlay(source); + AL.Source(source, ALSourcef.ReferenceDistance, 6826); + AL.Source(source, ALSourcef.MaxDistance, 136533); + AL.SourcePlay(source); } public float Volume @@ -739,7 +740,7 @@ namespace OpenRA set { if (Source != -1) - Al.alSourcef(Source, Al.AL_GAIN, volume = value); + AL.Source(Source, ALSourcef.Gain, volume = value); } } @@ -747,8 +748,8 @@ namespace OpenRA { get { - float pos; - Al.alGetSourcef(Source, Al.AL_SAMPLE_OFFSET, out pos); + int pos; + AL.GetSource(Source, ALGetSourcei.SampleOffset, out pos); return pos / 22050f; } } @@ -758,8 +759,8 @@ namespace OpenRA get { int state; - Al.alGetSourcei(Source, Al.AL_SOURCE_STATE, out state); - return state == Al.AL_PLAYING; + AL.GetSource(Source, ALGetSourcei.SourceState, out state); + return state == (int)ALSourceState.Playing; } } } diff --git a/packaging/windows/OpenRA.nsi b/packaging/windows/OpenRA.nsi index 070ecb245c..7377fa7975 100644 --- a/packaging/windows/OpenRA.nsi +++ b/packaging/windows/OpenRA.nsi @@ -93,7 +93,7 @@ Section "Game" GAME File "${SRCDIR}\KopiLua.dll" File "${SRCDIR}\NLua.dll" File "${SRCDIR}\eluant.dll" - File "${DEPSDIR}\OpenAL32.dll" + File "${DEPSDIR}\soft_oal.dll" File "${DEPSDIR}\SDL2.dll" File "${DEPSDIR}\freetype6.dll" File "${DEPSDIR}\zlib1.dll" @@ -214,7 +214,7 @@ Function ${UN}Clean Delete $INSTDIR\KopiLua.dll Delete $INSTDIR\NLua.dll Delete $INSTDIR\SDL2-CS.dll - Delete $INSTDIR\OpenAL32.dll + Delete $INSTDIR\soft_oal.dll Delete $INSTDIR\SDL2.dll Delete $INSTDIR\lua51.dll Delete $INSTDIR\eluant.dll diff --git a/thirdparty/SDL2-CS.dll.config b/thirdparty/SDL2-CS.dll.config index 7ebda83a28..e7ebbb513f 100644 --- a/thirdparty/SDL2-CS.dll.config +++ b/thirdparty/SDL2-CS.dll.config @@ -3,4 +3,7 @@ + + + diff --git a/thirdparty/Tao/Tao.OpenAl.dll b/thirdparty/Tao/Tao.OpenAl.dll deleted file mode 100644 index c45c0d083c24f986e682d132ccf8f7c695ff84ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69632 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ⅆ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 diff --git a/thirdparty/Tao/Tao.OpenAl.dll.config b/thirdparty/Tao/Tao.OpenAl.dll.config deleted file mode 100644 index cafbeba30e..0000000000 --- a/thirdparty/Tao/Tao.OpenAl.dll.config +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/thirdparty/windows/OpenAL32.dll b/thirdparty/windows/soft_oal.dll similarity index 100% rename from thirdparty/windows/OpenAL32.dll rename to thirdparty/windows/soft_oal.dll