From 06c521a9818f7ccea27f201675ff611e81862ec1 Mon Sep 17 00:00:00 2001 From: Talon Date: Fri, 25 Aug 2023 14:39:31 +0200 Subject: [PATCH] Initial commit --- .gitignore | 405 ++++++++++ Ryuclaw.Audio.Desktop/Class1.cs | 7 + .../Ryuclaw.Audio.Desktop.csproj | 12 + Ryuclaw.Client.Mac/AppDelegate.cs | 15 + .../AppIcon.appiconset/Contents.json | 70 ++ .../AppIcon.appiconset/Icon1024.png | Bin 0 -> 10750 bytes .../AppIcon.appiconset/Icon128.png | Bin 0 -> 1232 bytes .../AppIcon.appiconset/Icon16.png | Bin 0 -> 271 bytes .../AppIcon.appiconset/Icon256.png | Bin 0 -> 2113 bytes .../AppIcon.appiconset/Icon32.png | Bin 0 -> 459 bytes .../AppIcon.appiconset/Icon512.png | Bin 0 -> 4194 bytes .../AppIcon.appiconset/Icon64.png | Bin 0 -> 788 bytes .../Assets.xcassets/Contents.json | 7 + Ryuclaw.Client.Mac/Entitlements.plist | 6 + Ryuclaw.Client.Mac/Info.plist | 30 + Ryuclaw.Client.Mac/Main.cs | 6 + Ryuclaw.Client.Mac/Main.storyboard | 719 ++++++++++++++++++ Ryuclaw.Client.Mac/Ryuclaw.Client.Mac.csproj | 21 + Ryuclaw.Client.Mac/ViewController.cs | 32 + Ryuclaw.Client.Mac/ViewController.designer.cs | 16 + Ryuclaw.Core/Class1.cs | 7 + Ryuclaw.Core/Ryuclaw.Core.csproj | 15 + Ryuclaw.Mac.sln | 49 ++ Ryuclaw.Shared/Audio/IAudioCache.cs | 10 + Ryuclaw.Shared/Audio/IAudioEngine.cs | 16 + Ryuclaw.Shared/Audio/IAudioSource.cs | 14 + Ryuclaw.Shared/Class1.cs | 7 + Ryuclaw.Shared/Ryuclaw.Shared.csproj | 19 + Ryuclaw.Shared/Speech/ISpeech.cs | 17 + .../Ryuclaw.Speech.MacOS.csproj | 18 + Ryuclaw.Speech.MacOS/TTS.cs | 72 ++ 31 files changed, 1590 insertions(+) create mode 100644 .gitignore create mode 100644 Ryuclaw.Audio.Desktop/Class1.cs create mode 100644 Ryuclaw.Audio.Desktop/Ryuclaw.Audio.Desktop.csproj create mode 100644 Ryuclaw.Client.Mac/AppDelegate.cs create mode 100644 Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon1024.png create mode 100644 Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon128.png create mode 100644 Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon16.png create mode 100644 Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon256.png create mode 100644 Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon32.png create mode 100644 Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon512.png create mode 100644 Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon64.png create mode 100644 Ryuclaw.Client.Mac/Assets.xcassets/Contents.json create mode 100644 Ryuclaw.Client.Mac/Entitlements.plist create mode 100644 Ryuclaw.Client.Mac/Info.plist create mode 100644 Ryuclaw.Client.Mac/Main.cs create mode 100644 Ryuclaw.Client.Mac/Main.storyboard create mode 100644 Ryuclaw.Client.Mac/Ryuclaw.Client.Mac.csproj create mode 100644 Ryuclaw.Client.Mac/ViewController.cs create mode 100644 Ryuclaw.Client.Mac/ViewController.designer.cs create mode 100644 Ryuclaw.Core/Class1.cs create mode 100644 Ryuclaw.Core/Ryuclaw.Core.csproj create mode 100644 Ryuclaw.Mac.sln create mode 100644 Ryuclaw.Shared/Audio/IAudioCache.cs create mode 100644 Ryuclaw.Shared/Audio/IAudioEngine.cs create mode 100644 Ryuclaw.Shared/Audio/IAudioSource.cs create mode 100644 Ryuclaw.Shared/Class1.cs create mode 100644 Ryuclaw.Shared/Ryuclaw.Shared.csproj create mode 100644 Ryuclaw.Shared/Speech/ISpeech.cs create mode 100644 Ryuclaw.Speech.MacOS/Ryuclaw.Speech.MacOS.csproj create mode 100644 Ryuclaw.Speech.MacOS/TTS.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..92275db --- /dev/null +++ b/.gitignore @@ -0,0 +1,405 @@ +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/main/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/main/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# content below from: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ \ No newline at end of file diff --git a/Ryuclaw.Audio.Desktop/Class1.cs b/Ryuclaw.Audio.Desktop/Class1.cs new file mode 100644 index 0000000..0409fc1 --- /dev/null +++ b/Ryuclaw.Audio.Desktop/Class1.cs @@ -0,0 +1,7 @@ +namespace Ryuclaw.Audio.Desktop; + +public class Class1 +{ + +} + diff --git a/Ryuclaw.Audio.Desktop/Ryuclaw.Audio.Desktop.csproj b/Ryuclaw.Audio.Desktop/Ryuclaw.Audio.Desktop.csproj new file mode 100644 index 0000000..2a2a25d --- /dev/null +++ b/Ryuclaw.Audio.Desktop/Ryuclaw.Audio.Desktop.csproj @@ -0,0 +1,12 @@ + + + + net7.0 + enable + enable + + + + + + diff --git a/Ryuclaw.Client.Mac/AppDelegate.cs b/Ryuclaw.Client.Mac/AppDelegate.cs new file mode 100644 index 0000000..7693315 --- /dev/null +++ b/Ryuclaw.Client.Mac/AppDelegate.cs @@ -0,0 +1,15 @@ +namespace Ryuclaw.Client.Mac; + +[Register ("AppDelegate")] +public class AppDelegate : NSApplicationDelegate { + public override void DidFinishLaunching (NSNotification notification) + { + // Insert code here to initialize your application + } + + public override void WillTerminate (NSNotification notification) + { + // Insert code here to tear down your application + } +} + diff --git a/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Contents.json b/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9d7519f --- /dev/null +++ b/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,70 @@ +{ + "images": [ + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16", + "filename": "Icon16.png" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16", + "filename": "Icon32.png" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32", + "filename": "Icon32.png" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32", + "filename": "Icon64.png" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128", + "filename": "Icon128.png" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128", + "filename": "Icon256.png" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256", + "filename": "Icon256.png" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256", + "filename": "Icon512.png" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512", + "filename": "Icon512.png" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512", + "filename": "Icon1024.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + }, +} + + diff --git a/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon1024.png b/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon1024.png new file mode 100644 index 0000000000000000000000000000000000000000..d76627d493d1307108d32c68de52176915f6940b GIT binary patch literal 10750 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 K-mKlOKm8B#*|OUJ literal 0 HcmV?d00001 diff --git a/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon128.png b/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..0f75ad9c69124af52151483daaf1f1e6197ba04b GIT binary patch literal 1232 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBZmOq?V@L(#+uQygB8d{mKOXne7Izk!et~H( zXI1F=TMN4b%Pu<0t?`a1Gd0j(xgcEkXI^rEVNj%nZjF4j3{N@G!^>6!VVd zN$0PBTov*oA`u@{DF7vKjyIbM>vaBQ8 z55M03^x#$M4cm5$O4fU6S}y*^u=jBI(kr{JPAdOY#6Q7j!>Wi|yYx=a?$kZG z^}?lnIk_^+{_U!NU2@}BR4m`5m231SwjFagv$dalchQE~74gCwzlqfuXfc#-UhQOe z=IxE_6g}Oj^&2g|AO3p%_3w*&9gK9hpMK0VW79X2MDdAFCkc8xe5s%GZks%BC}-v2 z4u(0~!~Uwg405<>tkiI!=tz}X-;tQtFF1>wUoa-mV>`fio^Qag5jpV4u9b| zd!N^VhVqi)4S5{*{qk>rZV;Y(t*sz4(f^uEd3%n@_P9;|msII5V^4U}-~9FRI~kU{ zuOGJ=2)nT@@Mk_R8*F}#%_#YfP=Qnae(!5Kdo^E~t=-(%dUNiU^SmmHihqT8cfDiu zNzY-(+Eecww~zaVG2_zu?|k7WUp&^Iw07zD>SOEQ=SkG6_)Kq_DZX)c{oNgfW)J3l zOlSJKWJ0menVSvOtc4m^EY+^vba;N)YvC0xr3RPeBwHu3HClpJu?J``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{t{0Y$B+ufx0CjAH3f(?*spb&!hP{Uz~tbA zv8(rfTOhY!`D*rz6+5SAWMpS&Owf?g+Vbuw6Yty@nLiH->L1iRm$5kJBzJGhfh8(i z8D{;LFM9ImYt$R_@MFOX--)d=*f}TuM{V?6|81)m>|ma&)6UnI@qj;PPoC0c!F!8+ ziq<)7j%GhIZSIsSi#mD|jPix=C5Z|yf9xFEvp-o?_V2ySo+@E&g&z!FoO)fNJ5|mB P-OJ$V>gTe~DWM4fxVdHb literal 0 HcmV?d00001 diff --git a/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon256.png b/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon256.png new file mode 100644 index 0000000000000000000000000000000000000000..5233b44b5f83ce3ebff731c95c0daad82397f934 GIT binary patch literal 2113 zcmeHI`#02i82-%Hm|PN8$K8*Xsn2eqM1NNN#1Nz}T&-F%PUq@x4? zP&w)9>;(WqwjzK6N(Sezmjuc{G1Ap93IJt|e+L1c=4t&aiSlxB0+npNX&FHVIl4Il z@H$iZ`z3h*w)C8IcJz)x2nRjx=MnW=7X5LQ&V#`rSF0;h9_+fyqAfPo#iZ^&UTv3? zylC9LD<=5)SI6I8XsSwoy@*v6{h9Rapo!76HS30){O6s!t-?zmyAgLJmoDq(begej zI|2(Qp9D=VlN=RJPE?cgW9Mx<<|W??ZWUbglazo*b7l^v2si)&ACMqP5g;{y!XBW8 z1-o*9gXNFIe@7Bm$(dRh_1{}&Vh|$w(v}^bMdV98w3`I2$>R(7LdGZ~V(7bn-9jJZ z6i)Ju@0(G${)cv-F1hMj=n{=xZcD4uixnj9_nGMpr(iZ$9Q{xb$0?3%w>&W7lX<~T z94TIWE3FsG4`$;{wz>07iPU%@!$z5zcnf#5!~DItMYVP#p&PSlOwXw8sU(=Y0X-kAXYu!PE*?K8a*l!h}M z4DK2`YHmCMThJ!FjzMGA{lDrz09%LKI~cZK2o8Kf8l$p*wRD@8Ffiwp0qKzZa79`} zT01pT!4lLUWR_cBuuBDGF#&}&tw@cfFO6*k%4zLD zO#MC4EW9qo%pbC669C>A=$HC-URc|Zba_BghCygpT^-J7&&uyBf7Hu^i(0;Eo;`?| z`eH*C%`8_PG*rrqANjoG@bTQC6*oYN9HFfi=U!{aqhTvqOx$kRe{+m9I@*q^z6x>3 z^T5^cmRP4iruV?gRnqtXZ{kd1M8T2EX!x!gT+ls;XQ3>8 z%(oaYE&LmO;ulk@*zcWbY!o+6Dxq_4z7?2I_)>A`OXX~f@W;M3LpV5J9Y!<~H+rJ6 zYb(mj7^Mnbzw`8%s1*sSy+OOx-S!=S3+MQKh)&Rau)R z^3CvF-Qo3yL*umr(Jo-;n6Jgf!t&zz&^(nA+OvU&3Eflm1h=Eb-)emJC;>^zDnd?hhAg=lFgtF9o}<3 zNN(UXT&c)(eWR@r-(x2~l>^e9`>ifXP@G>7T9459rWziYN&@Mw{Z=D90xapT!9kY$ zYph0M1q9}*4q7u2jSRRGPyBXbl)x0ECX+o7^tjm!UycH+RxNZ%WUZ;;s0&$og*D%~ z^wt>iOt~t^Xb|;Y)G4jNH*tzz()HeLW92<5&#l5{vF%F>?5etmcz)6?(q2nHo!iZG z4l9>~2fBS!f_C4(yVOZoH{A2+9=S#pJ4#Sm`F$BkM>@Bb_u_>*{cbI{e&h+!~%vi>6|G znm^k`?s+fFv7F_4p`Hz0dz;x}?v-n!^3mPw3dmY~=v8=n&_%8O&11w_#?7)D$fuPb z4arB0324~dOlSh58)mut=FMkc<7d#g`;NHZZ4|tF#WS6q`CQCrp5aDZeGfhRjlRY` z^js|Iim-_KNf5$ZJe^{1&-3N4iOSdOYB1**;+a=YU9C+C?)Gk5waGsh>V&VGit6UZ z)QVZlvu*q#DUm0bI$;zhjp)%kuC~$K9PPodS~n0i%Xapa1{> literal 0 HcmV?d00001 diff --git a/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon32.png b/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon32.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac18161643c576e7f2803bae69dadd41f84249c GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zIV@L(#+iAPK4+n^}*RNea>qbzEn+adp zrVD-B&aGX&psBgLd3As|`}968tMEVUcjj2_$a?-NYT;zApo3z8ItRrUeUC9+(s^l# z?4~*VPCNSV{JvX!u9aolq^tfvJOu0xGwB=vp}%=*XP+q}zt+3aCy(W3tA<{k znL^{0o~9Xg9Jxsj-|qK**Kmlr8nEjZ)K{|J4y-j*3dGqKBk)29f_%0s7i zUAva=-zfgCm!WlP*ZFf79WPI0%jSA>@nuwl$I{T92~W4E20L7+4i`z<`9pvRxN2>Dp_Adi@S*gG238=d5&yxY{;aTIDc2)V>@aw``njxgN@xNA&oILx literal 0 HcmV?d00001 diff --git a/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon512.png b/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon512.png new file mode 100644 index 0000000000000000000000000000000000000000..b152227c79d9f57171ad0bbfa5b5162ae7e8a28d GIT binary patch literal 4194 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 literal 0 HcmV?d00001 diff --git a/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon64.png b/Ryuclaw.Client.Mac/Assets.xcassets/AppIcon.appiconset/Icon64.png new file mode 100644 index 0000000000000000000000000000000000000000..5c497ade8328f2bd2ed43f33a1c767ae2447c488 GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di3`{FMT^vIy7~jsa%@9tMIR5`*caqPAX-A}7 zb@;f>W=!5$$h*SgMFP9AR%wCZ0t?L<2bX3Yx7yMy+CHVsFTFRJEB1)Ok}Z}|*@u@V zeSBQIZts^_NA5hGwYc&5&w~?pKi+%#_rG^LzyIZbzS}V32lp`t=Homo;@7Vpuc^LcaG^u8-pF28=G{%gw0 zvbrykPxgPWHD9MF^;x;LjSGA23wB&P zrggyPde5CRR*RhLc;c-&txtJJv#THADz&h@)V=fM)@|!%%jruuZwS)MRh%B{uDJgC zxx2f>-7JbiY(MteGXJ}^JP5;}N^>q8=?92(=KeG;3`g%s5crT|O zVmg7L>g=0@(@oL}_o&zZ94PF}|{RnuH;9oOoepB)o$`cCJAZ4BAl y`pqP_cy9hZ^Lyskc)yP)%bPG`A6vrs%)hw#MTGY2-CDpz%;4$j=d#Wzp$P!ufnpW_ literal 0 HcmV?d00001 diff --git a/Ryuclaw.Client.Mac/Assets.xcassets/Contents.json b/Ryuclaw.Client.Mac/Assets.xcassets/Contents.json new file mode 100644 index 0000000..dd87896 --- /dev/null +++ b/Ryuclaw.Client.Mac/Assets.xcassets/Contents.json @@ -0,0 +1,7 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} + diff --git a/Ryuclaw.Client.Mac/Entitlements.plist b/Ryuclaw.Client.Mac/Entitlements.plist new file mode 100644 index 0000000..9ae5993 --- /dev/null +++ b/Ryuclaw.Client.Mac/Entitlements.plist @@ -0,0 +1,6 @@ + + + + + + diff --git a/Ryuclaw.Client.Mac/Info.plist b/Ryuclaw.Client.Mac/Info.plist new file mode 100644 index 0000000..84c36d5 --- /dev/null +++ b/Ryuclaw.Client.Mac/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleName + Ryuclaw.Client.Mac + CFBundleIdentifier + com.companyname.Ryuclaw.Client.Mac + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + CFBundleDevelopmentRegion + en + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + NSHumanReadableCopyright + ${AuthorCopyright:HtmlEncode} + NSPrincipalClass + NSApplication + NSMainStoryboardFile + Main + XSAppIconAssets + Assets.xcassets/AppIcon.appiconset + + diff --git a/Ryuclaw.Client.Mac/Main.cs b/Ryuclaw.Client.Mac/Main.cs new file mode 100644 index 0000000..6f94f6c --- /dev/null +++ b/Ryuclaw.Client.Mac/Main.cs @@ -0,0 +1,6 @@ +using Ryuclaw.Client.Mac; + +// This is the main entry point of the application. +NSApplication.Init (); +NSApplication.Main (args); + diff --git a/Ryuclaw.Client.Mac/Main.storyboard b/Ryuclaw.Client.Mac/Main.storyboard new file mode 100644 index 0000000..4305792 --- /dev/null +++ b/Ryuclaw.Client.Mac/Main.storyboard @@ -0,0 +1,719 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ryuclaw.Client.Mac/Ryuclaw.Client.Mac.csproj b/Ryuclaw.Client.Mac/Ryuclaw.Client.Mac.csproj new file mode 100644 index 0000000..8598972 --- /dev/null +++ b/Ryuclaw.Client.Mac/Ryuclaw.Client.Mac.csproj @@ -0,0 +1,21 @@ + + + net7.0-macos + Exe + enable + true + 10.14 + + + false + false + + + false + false + + + + + + diff --git a/Ryuclaw.Client.Mac/ViewController.cs b/Ryuclaw.Client.Mac/ViewController.cs new file mode 100644 index 0000000..5a4b694 --- /dev/null +++ b/Ryuclaw.Client.Mac/ViewController.cs @@ -0,0 +1,32 @@ +using ObjCRuntime; +using Ryuclaw.Speech.MacOS; + +namespace Ryuclaw.Client.Mac; + +public partial class ViewController : NSViewController { + private TTS synth; + protected ViewController (NativeHandle handle) : base (handle) + { + // This constructor is required if the view controller is loaded from a xib or a storyboard. + // Do not put any initialization here, use ViewDidLoad instead. + } + + public override void ViewDidLoad () + { + base.ViewDidLoad (); + + // Do any additional setup after loading the view. + synth = new TTS(); + synth.Speak("Rawr, world!"); + } + + public override NSObject RepresentedObject { + get => base.RepresentedObject; + set { + base.RepresentedObject = value; + + // Update the view, if already loaded. + } + } +} + diff --git a/Ryuclaw.Client.Mac/ViewController.designer.cs b/Ryuclaw.Client.Mac/ViewController.designer.cs new file mode 100644 index 0000000..10823e3 --- /dev/null +++ b/Ryuclaw.Client.Mac/ViewController.designer.cs @@ -0,0 +1,16 @@ +// WARNING +// +// This file has been generated automatically by Visual Studio to store outlets and +// actions made in the UI designer. If it is removed, they will be lost. +// Manual changes to this file may not be handled correctly. +// + +namespace Ryuclaw.Client.Mac; + +[Register ("ViewController")] +partial class ViewController { + void ReleaseDesignerOutlets () + { + } +} + diff --git a/Ryuclaw.Core/Class1.cs b/Ryuclaw.Core/Class1.cs new file mode 100644 index 0000000..fc641e8 --- /dev/null +++ b/Ryuclaw.Core/Class1.cs @@ -0,0 +1,7 @@ +namespace Ryuclaw.Core; + +public class Class1 +{ + +} + diff --git a/Ryuclaw.Core/Ryuclaw.Core.csproj b/Ryuclaw.Core/Ryuclaw.Core.csproj new file mode 100644 index 0000000..601ac86 --- /dev/null +++ b/Ryuclaw.Core/Ryuclaw.Core.csproj @@ -0,0 +1,15 @@ + + + + net7.0 + enable + enable + + + + + + + + + diff --git a/Ryuclaw.Mac.sln b/Ryuclaw.Mac.sln new file mode 100644 index 0000000..5d16a62 --- /dev/null +++ b/Ryuclaw.Mac.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 25.0.1706.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryuclaw.Core", "Ryuclaw.Core\Ryuclaw.Core.csproj", "{C61EB08C-53CF-4601-AA12-FD67906E04AB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryuclaw.Shared", "Ryuclaw.Shared\Ryuclaw.Shared.csproj", "{D9A56B6D-E6BC-401F-AC63-892355347132}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryuclaw.Speech.MacOS", "Ryuclaw.Speech.MacOS\Ryuclaw.Speech.MacOS.csproj", "{9A2D1A3A-21C5-4628-94A8-700B15898C4F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryuclaw.Audio.Desktop", "Ryuclaw.Audio.Desktop\Ryuclaw.Audio.Desktop.csproj", "{D0638E02-6D08-43FB-A976-FA0E9912EAF3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryuclaw.Client.Mac", "Ryuclaw.Client.Mac\Ryuclaw.Client.Mac.csproj", "{0C6AE29F-C44B-4876-ABE9-D36C79158BBD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C61EB08C-53CF-4601-AA12-FD67906E04AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C61EB08C-53CF-4601-AA12-FD67906E04AB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C61EB08C-53CF-4601-AA12-FD67906E04AB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C61EB08C-53CF-4601-AA12-FD67906E04AB}.Release|Any CPU.Build.0 = Release|Any CPU + {D9A56B6D-E6BC-401F-AC63-892355347132}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9A56B6D-E6BC-401F-AC63-892355347132}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9A56B6D-E6BC-401F-AC63-892355347132}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9A56B6D-E6BC-401F-AC63-892355347132}.Release|Any CPU.Build.0 = Release|Any CPU + {9A2D1A3A-21C5-4628-94A8-700B15898C4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A2D1A3A-21C5-4628-94A8-700B15898C4F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A2D1A3A-21C5-4628-94A8-700B15898C4F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A2D1A3A-21C5-4628-94A8-700B15898C4F}.Release|Any CPU.Build.0 = Release|Any CPU + {D0638E02-6D08-43FB-A976-FA0E9912EAF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D0638E02-6D08-43FB-A976-FA0E9912EAF3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0638E02-6D08-43FB-A976-FA0E9912EAF3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D0638E02-6D08-43FB-A976-FA0E9912EAF3}.Release|Any CPU.Build.0 = Release|Any CPU + {0C6AE29F-C44B-4876-ABE9-D36C79158BBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C6AE29F-C44B-4876-ABE9-D36C79158BBD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C6AE29F-C44B-4876-ABE9-D36C79158BBD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C6AE29F-C44B-4876-ABE9-D36C79158BBD}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EA66C6E2-58BC-43AC-8B74-4E7F8883046E} + EndGlobalSection +EndGlobal diff --git a/Ryuclaw.Shared/Audio/IAudioCache.cs b/Ryuclaw.Shared/Audio/IAudioCache.cs new file mode 100644 index 0000000..69b198c --- /dev/null +++ b/Ryuclaw.Shared/Audio/IAudioCache.cs @@ -0,0 +1,10 @@ +using System; +namespace Ryuclaw.Shared.Audio +{ + public interface IAudioCache + { + public IAudioSource Get(string name); + public void Set(string name, IAudioSource source); + } +} + diff --git a/Ryuclaw.Shared/Audio/IAudioEngine.cs b/Ryuclaw.Shared/Audio/IAudioEngine.cs new file mode 100644 index 0000000..484d472 --- /dev/null +++ b/Ryuclaw.Shared/Audio/IAudioEngine.cs @@ -0,0 +1,16 @@ +using System; +using System.Numerics; + +namespace Ryuclaw.Shared.Audio +{ + public interface IAudioEngine + { + public bool Start(); + public void Stop(); + public void Update(float dt); + public void SetListenerPosition(Vector3 position); + public void SetListenerOrientation(Vector3 forward, Vector3 up); + public IAudioSource CreateSource(string name); + } +} + diff --git a/Ryuclaw.Shared/Audio/IAudioSource.cs b/Ryuclaw.Shared/Audio/IAudioSource.cs new file mode 100644 index 0000000..7054bba --- /dev/null +++ b/Ryuclaw.Shared/Audio/IAudioSource.cs @@ -0,0 +1,14 @@ +using System; +using System.Numerics; + +namespace Ryuclaw.Shared.Audio +{ + public interface IAudioSource + { + public void Play(); + public void Stop(); + public void Update(float dt); + public void SetPosition(Vector3 position); + } +} + diff --git a/Ryuclaw.Shared/Class1.cs b/Ryuclaw.Shared/Class1.cs new file mode 100644 index 0000000..ad7e06e --- /dev/null +++ b/Ryuclaw.Shared/Class1.cs @@ -0,0 +1,7 @@ +namespace Ryuclaw.Shared; + +public class Class1 +{ + +} + diff --git a/Ryuclaw.Shared/Ryuclaw.Shared.csproj b/Ryuclaw.Shared/Ryuclaw.Shared.csproj new file mode 100644 index 0000000..29e05ae --- /dev/null +++ b/Ryuclaw.Shared/Ryuclaw.Shared.csproj @@ -0,0 +1,19 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + + + diff --git a/Ryuclaw.Shared/Speech/ISpeech.cs b/Ryuclaw.Shared/Speech/ISpeech.cs new file mode 100644 index 0000000..66da605 --- /dev/null +++ b/Ryuclaw.Shared/Speech/ISpeech.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Ryuclaw.Shared.Speech +{ + public interface ISpeech + { + public void SetRate(float rate); + public void SetPitch(float pitch); + public List GetVoices(); + public void SetVoice(string name); + public void Speak(string text); + public void Stop(); + + } +} + diff --git a/Ryuclaw.Speech.MacOS/Ryuclaw.Speech.MacOS.csproj b/Ryuclaw.Speech.MacOS/Ryuclaw.Speech.MacOS.csproj new file mode 100644 index 0000000..3413bbe --- /dev/null +++ b/Ryuclaw.Speech.MacOS/Ryuclaw.Speech.MacOS.csproj @@ -0,0 +1,18 @@ + + + net7.0-macos + enable + true + + + false + false + + + false + false + + + + + diff --git a/Ryuclaw.Speech.MacOS/TTS.cs b/Ryuclaw.Speech.MacOS/TTS.cs new file mode 100644 index 0000000..0e73a90 --- /dev/null +++ b/Ryuclaw.Speech.MacOS/TTS.cs @@ -0,0 +1,72 @@ +using Ryuclaw.Shared.Speech; +using AVFoundation; + +namespace Ryuclaw.Speech.MacOS { + + public class TTS : ISpeech { + private float Rate { get; set; } + private float Pitch { get; set; } + private AVSpeechSynthesizer Synth; + private AVSpeechSynthesisVoice Voice; + + public TTS() + { + Synth = new AVSpeechSynthesizer(); + Rate = 1; + Pitch = 1; + Voice = AVSpeechSynthesisVoice.FromIdentifier(AVSpeechSynthesisVoice.IdentifierAlex); + + } + + public void SetRate(float rate) + { + Rate = rate; + } + + public void SetPitch(float pitch) + { + Pitch = pitch; + } + + public List GetVoices() + { + var availableVoices = AVSpeechSynthesisVoice.GetSpeechVoices(); + List voices = new(); + foreach (var voice in availableVoices) + { + voices.Add(voice.Name); + } + return null; + } + + public void SetVoice(string name) + { + foreach (var voice in AVSpeechSynthesisVoice.GetSpeechVoices()) + { + if (voice.Name.Equals(name)) + { + Voice = voice; + return; + } + } + Voice = AVSpeechSynthesisVoice.FromIdentifier(AVSpeechSynthesisVoice.IdentifierAlex); + } + + public void Speak(string text) + { + var utterance = new AVSpeechUtterance(text); + utterance.Rate = Rate; + utterance.PitchMultiplier = Pitch; + utterance.Voice = Voice; + utterance.PrefersAssistiveTechnologySettings = true; + + Synth.SpeakUtterance(utterance); + } + + public void Stop() + { + Synth.StopSpeaking(AVSpeechBoundary.Immediate); + } + + } +}