Start to implement linux sound management
This commit is contained in:
parent
64f0a3f302
commit
26b067ff04
|
@ -1,4 +1,4 @@
|
||||||
#define WINDOWS
|
//#define WINDOWS
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
@ -33,14 +33,6 @@ namespace testexetrisathlon
|
||||||
internal static class Program
|
internal static class Program
|
||||||
{
|
{
|
||||||
public const string Sqr = "■";
|
public const string Sqr = "■";
|
||||||
|
|
||||||
/*private static readonly WaveStream Intro = new WaveFileReader(Assembly.GetManifestResourceStream("testexetrisathlon.Intro.wav"));
|
|
||||||
private static readonly WaveStream InGame1 = new WaveFileReader(Assembly.GetManifestResourceStream("testexetrisathlon.InGame1.wav"));
|
|
||||||
private static readonly WaveStream InGame2 = new WaveFileReader(Assembly.GetManifestResourceStream("testexetrisathlon.InGame2.wav"));
|
|
||||||
private static readonly WaveStream GameOver = new WaveFileReader(Assembly.GetManifestResourceStream("testexetrisathlon.GameOver.wav"));
|
|
||||||
private static WaveStream _inGame = SettingsMan.UsingAltTrack ? InGame2 : InGame1;
|
|
||||||
private static WaveStream _current = Intro;
|
|
||||||
private static WaveOutEvent _output = new WaveOutEvent();*/
|
|
||||||
private const string Intro = "Intro";
|
private const string Intro = "Intro";
|
||||||
private const string GameOver = "GameOver";
|
private const string GameOver = "GameOver";
|
||||||
public static int[,] Grid = new int[23, 10];
|
public static int[,] Grid = new int[23, 10];
|
||||||
|
@ -63,15 +55,17 @@ namespace testexetrisathlon
|
||||||
public static readonly Random Rnd = new Random();
|
public static readonly Random Rnd = new Random();
|
||||||
private static ISoundManager soundManager;
|
private static ISoundManager soundManager;
|
||||||
private static string InGame => SettingsMan.UsingAltTrack ? "InGame2" : "InGame1";
|
private static string InGame => SettingsMan.UsingAltTrack ? "InGame2" : "InGame1";
|
||||||
#if WINDOWS
|
|
||||||
[DllImport("winmm.dll")]
|
|
||||||
private static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
private static void Main()
|
private static void Main()
|
||||||
{
|
{
|
||||||
soundManager = new WindowsSoundManager();
|
soundManager = new
|
||||||
|
#if WINDOW
|
||||||
|
WindowsSoundManager
|
||||||
|
#else
|
||||||
|
LinuxSoundManager
|
||||||
|
#endif
|
||||||
|
();
|
||||||
soundManager.Init(new Dictionary<string, string>
|
soundManager.Init(new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
{"Intro", "testexetrisathlon.Intro.wav"},
|
{"Intro", "testexetrisathlon.Intro.wav"},
|
||||||
|
@ -87,15 +81,13 @@ namespace testexetrisathlon
|
||||||
#endif
|
#endif
|
||||||
BackgroundColor = ConsoleColor.Red;
|
BackgroundColor = ConsoleColor.Red;
|
||||||
ForegroundColor = ConsoleColor.Yellow;
|
ForegroundColor = ConsoleColor.Yellow;
|
||||||
|
#if WINDOWS
|
||||||
SetWindowSize(42, 29);
|
SetWindowSize(42, 29);
|
||||||
SetCursorPosition(0, 0);
|
|
||||||
Clear();
|
|
||||||
if (Debug)
|
if (Debug)
|
||||||
SetWindowSize(50, 40);
|
SetWindowSize(50, 40);
|
||||||
#if WINDOWS
|
|
||||||
int newVolume = (ushort.MaxValue / 10) * SettingsMan.Volume;
|
|
||||||
waveOutSetVolume(IntPtr.Zero, ((uint) newVolume & 0x0000ffff) | ((uint) newVolume << 16));
|
|
||||||
#endif
|
#endif
|
||||||
|
SetCursorPosition(0, 0);
|
||||||
|
Clear();
|
||||||
bool playing = true;
|
bool playing = true;
|
||||||
GameState state = GameState.Menu;
|
GameState state = GameState.Menu;
|
||||||
try
|
try
|
||||||
|
@ -325,7 +317,7 @@ namespace testexetrisathlon
|
||||||
{
|
{
|
||||||
_linesCleared++;
|
_linesCleared++;
|
||||||
combo++;
|
combo++;
|
||||||
Beep(400, 200);
|
Beeper.Beep(400, 200);
|
||||||
for (int j = 0; j < 10; j++) DroppedTetrominoeLocationGrid[i, j] = 0;
|
for (int j = 0; j < 10; j++) DroppedTetrominoeLocationGrid[i, j] = 0;
|
||||||
int[,] newDroppedTetrominoeLocationGrid = new int[23, 10];
|
int[,] newDroppedTetrominoeLocationGrid = new int[23, 10];
|
||||||
for (int k = 1; k < i; k++)
|
for (int k = 1; k < i; k++)
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace testexetrisathlon.SoundManagement
|
||||||
|
{
|
||||||
|
public static class Beeper
|
||||||
|
{
|
||||||
|
public static void Beep(int frequency, int duration)
|
||||||
|
{
|
||||||
|
#if WINDOWS
|
||||||
|
Console.Beep(frequency, duration);
|
||||||
|
#else
|
||||||
|
Console.Write("\a");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace testexetrisathlon.SoundManagement
|
||||||
|
{
|
||||||
|
public class LinuxSoundManager : ISoundManager
|
||||||
|
{
|
||||||
|
private static readonly Assembly Assembly = Assembly.GetExecutingAssembly();
|
||||||
|
private Dictionary<string, string> _files;
|
||||||
|
private string _current;
|
||||||
|
private Process? alsa;
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
foreach (string file in _files.Values) File.Delete(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Init(Dictionary<string, string> manifestResources)
|
||||||
|
{
|
||||||
|
_files = new Dictionary<string, string>();
|
||||||
|
foreach ((string name, string key) in manifestResources)
|
||||||
|
{
|
||||||
|
string file = Path.GetTempFileName();
|
||||||
|
File.Move(file, Path.ChangeExtension(file, "wav"));
|
||||||
|
file = Path.ChangeExtension(file, "wav");
|
||||||
|
using Stream resource = Assembly.GetManifestResourceStream(key);
|
||||||
|
using FileStream fileStream = File.Create(file);
|
||||||
|
resource.Seek(0, SeekOrigin.Begin);
|
||||||
|
resource.CopyTo(fileStream);
|
||||||
|
_files.Add(name, file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetCurrent(string id)
|
||||||
|
{
|
||||||
|
if (_current == id) return;
|
||||||
|
alsa?.Kill();
|
||||||
|
_current = id;
|
||||||
|
//TODO fix actually killing, remove orphan processes
|
||||||
|
alsa = new Process
|
||||||
|
{
|
||||||
|
StartInfo = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = "/bin/sh",
|
||||||
|
Arguments = $"-c \"while [ true ]; do aplay -q {_files[id].Replace("\"", "\\\"")}; done\"",
|
||||||
|
RedirectStandardOutput = false,
|
||||||
|
RedirectStandardInput = false,
|
||||||
|
UseShellExecute = false,
|
||||||
|
CreateNoWindow = true,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
alsa.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetVolume(int percent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,9 +8,9 @@ namespace testexetrisathlon.SoundManagement
|
||||||
public sealed class WindowsSoundManager : ISoundManager
|
public sealed class WindowsSoundManager : ISoundManager
|
||||||
{
|
{
|
||||||
private static readonly Assembly Assembly = Assembly.GetExecutingAssembly();
|
private static readonly Assembly Assembly = Assembly.GetExecutingAssembly();
|
||||||
private static WaveOutEvent _output;
|
private WaveOutEvent _output;
|
||||||
private static WaveStream _current;
|
private WaveStream _current;
|
||||||
private static string _currentId;
|
private string _currentId;
|
||||||
private Dictionary<string, LoopStream> _loadedSounds;
|
private Dictionary<string, LoopStream> _loadedSounds;
|
||||||
|
|
||||||
public void Init(Dictionary<string, string> manifestResources)
|
public void Init(Dictionary<string, string> manifestResources)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using testexetrisathlon.SoundManagement;
|
||||||
using static System.Console;
|
using static System.Console;
|
||||||
|
|
||||||
namespace testexetrisathlon
|
namespace testexetrisathlon
|
||||||
|
@ -85,7 +86,7 @@ namespace testexetrisathlon
|
||||||
{
|
{
|
||||||
Location.ForEach(s => Program.DroppedTetrominoeLocationGrid[s[0], s[1]] = 1);
|
Location.ForEach(s => Program.DroppedTetrominoeLocationGrid[s[0], s[1]] = 1);
|
||||||
Program.IsDropped = true;
|
Program.IsDropped = true;
|
||||||
Beep(800, 200);
|
Beeper.Beep(800, 200);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<LangVersion>8</LangVersion>
|
<LangVersion>8</LangVersion>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
@ -9,7 +8,12 @@
|
||||||
<Deterministic>false</Deterministic>
|
<Deterministic>false</Deterministic>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>if exist "$(SolutionDir)Data\pkgtool.exe" ($(SolutionDir)Data\pkgtool.exe build --noLogo --binDir .) else if exist "%appdata%\UpTool2\Apps\0e35d154-d0d3-45e0-b080-62f521263a44\app\pkgtool.exe" ("%appdata%\UpTool2\Apps\0e35d154-d0d3-45e0-b080-62f521263a44\app\pkgtool.exe" build --noLogo --binDir .) else echo Cound not find Package build tools, skipping</PostBuildEvent>
|
<PostBuildEvent Condition="'$(OS)' == 'Windows_NT' ">
|
||||||
|
if exist "$(SolutionDir)Data\pkgtool.exe" ($(SolutionDir)Data\pkgtool.exe build --noLogo --binDir .) else if exist "%appdata%\UpTool2\Apps\0e35d154-d0d3-45e0-b080-62f521263a44\app\pkgtool.exe" ("%appdata%\UpTool2\Apps\0e35d154-d0d3-45e0-b080-62f521263a44\app\pkgtool.exe" build --noLogo --binDir .) else echo Cound not find Package build tools, skipping
|
||||||
|
</PostBuildEvent>
|
||||||
|
<PostBuildEvent Condition="'$(OS)' != 'Windows_NT'">
|
||||||
|
if [[ -f "$(SolutionDir)Data/pkgtool.exe" ]]; then $(SolutionDir)Data/pkgtool.exe build --noLogo --binDir .; else echo Cound not find Package build tools, skipping; fi
|
||||||
|
</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ApplicationIcon>tetris_yUxH6t_256px.ico</ApplicationIcon>
|
<ApplicationIcon>tetris_yUxH6t_256px.ico</ApplicationIcon>
|
||||||
|
|
Reference in New Issue