From 8ddbd552ff2e108ef3e3f2d106fc8ec07d4efe10 Mon Sep 17 00:00:00 2001 From: Anthony Steiner Date: Fri, 18 Oct 2024 21:31:39 -0400 Subject: [PATCH] Add project files. --- .gitignore | 400 ++++++++++++++++++ LICENSE | 21 + README.md | 73 ++++ src/.editorconfig | 242 +++++++++++ src/Directory.Build.props | 7 + src/Steinerd.AudioSwitcherPlugin.sln | 33 ++ .../Actions/AudioDevicesFolder.cs | 82 ++++ .../AudioSwitcherApplication.cs | 22 + .../AudioSwitcherPlugin.cs | 80 ++++ .../AudioSwitcher.AudioApi.CoreAudio.dll | Bin 0 -> 108032 bytes .../Dependencies/AudioSwitcher.AudioApi.dll | Bin 0 -> 38912 bytes .../Helpers/PluginLog.cs | 33 ++ .../Helpers/PluginResources.cs | 58 +++ .../Resources/16.png | Bin 0 -> 900 bytes .../Resources/256.png | Bin 0 -> 14969 bytes .../Resources/32.png | Bin 0 -> 1303 bytes .../Resources/48.png | Bin 0 -> 1761 bytes .../Steinerd.AudioSwitcherPlugin.csproj | 74 ++++ .../build-plugin.ps1 | 28 ++ .../metadata/Icon256x256.png | Bin 0 -> 14969 bytes .../metadata/LoupedeckPackage.yaml | 80 ++++ 21 files changed, 1233 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 src/.editorconfig create mode 100644 src/Directory.Build.props create mode 100644 src/Steinerd.AudioSwitcherPlugin.sln create mode 100644 src/Steinerd.AudioSwitcherPlugin/Actions/AudioDevicesFolder.cs create mode 100644 src/Steinerd.AudioSwitcherPlugin/AudioSwitcherApplication.cs create mode 100644 src/Steinerd.AudioSwitcherPlugin/AudioSwitcherPlugin.cs create mode 100644 src/Steinerd.AudioSwitcherPlugin/Dependencies/AudioSwitcher.AudioApi.CoreAudio.dll create mode 100644 src/Steinerd.AudioSwitcherPlugin/Dependencies/AudioSwitcher.AudioApi.dll create mode 100644 src/Steinerd.AudioSwitcherPlugin/Helpers/PluginLog.cs create mode 100644 src/Steinerd.AudioSwitcherPlugin/Helpers/PluginResources.cs create mode 100644 src/Steinerd.AudioSwitcherPlugin/Resources/16.png create mode 100644 src/Steinerd.AudioSwitcherPlugin/Resources/256.png create mode 100644 src/Steinerd.AudioSwitcherPlugin/Resources/32.png create mode 100644 src/Steinerd.AudioSwitcherPlugin/Resources/48.png create mode 100644 src/Steinerd.AudioSwitcherPlugin/Steinerd.AudioSwitcherPlugin.csproj create mode 100644 src/Steinerd.AudioSwitcherPlugin/build-plugin.ps1 create mode 100644 src/Steinerd.AudioSwitcherPlugin/metadata/Icon256x256.png create mode 100644 src/Steinerd.AudioSwitcherPlugin/metadata/LoupedeckPackage.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..74ae05a --- /dev/null +++ b/.gitignore @@ -0,0 +1,400 @@ +## 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/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# 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 +nunit-*.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/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# 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 +*.tlog +*.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 + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# 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 +# NuGet Symbol Packages +*.snupkg +# 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 +*.appxbundle +*.appxupload + +# 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 +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# 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 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# 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/ + +# 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/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +.DS_Store \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..eab197d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Anthony Steiner + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f4b377 --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +# AudioSwitcher Loupedeck Plugin +[![License](http://img.shields.io/:license-MIT-blue.svg?style=flat)](LICENSE) +![forks](https://img.shields.io/github/forks/Steinerd/Loupedeck.AudioSwitcherPlugin?style=flat) +![stars](https://img.shields.io/github/stars/Steinerd/Loupedeck.AudioSwitcherPlugin?style=flat) +![issues](https://img.shields.io/github/issues/Steinerd/Loupedeck.AudioSwitcherPlugin?style=flat) +[![downloads](https://img.shields.io/github/downloads/Steinerd/Loupedeck.AudioSwitcherPlugin/latest/total?style=flat)](https://github.com/Steinerd/Loupedeck.AudioSwitcherPlugin/compare) + +In short, this is a dynamically generated _folder_ accessible via "Audio Devices" button. + +As of (4/28/2022), an additional experiemental PTT (mic mute press-to-talk) button functionality was added. + +## Credits + +This plugin makes use of [Sean Chapman's/xenolightning](https://github.com/xenolightning) [AudioSwitcher](https://github.com/xenolightning/AudioSwitcher) project/NuGet Package. + +-------- + +# Table of Contents + +- [Installation](#installation) +- [Usage](#usage) +- [Support](#support) +- [Contributing](#contributing) +- [License](#license) + +# Installation + +
Loupedeck Installation + + + 1. Go to [latest release](https://github.com/Steinerd/Loupedeck.AudioSwitcherPlugin/releases/latest), and download the `lplug4` file to you computer + 1. Open (normally double-click) to install, the Loupedeck software should take care of the rest + 1. Restart Loupedeck (if not handled by the installer) + 1. In the Loupedeck interface, enable **AudioSwitcher** by clicking Manage plugins + 1. Check the AudioSwitcher box on to enable + 1. Drag the desired control onto your layout + +Once click it will bring you to a dynamic playback device selection page. +
+ +
IDE Installation + Made with Visual Studio 2022, C# will likely only compile in VS2019 or greater. + + Assuming Loupedeck is already installed on your machine, make sure you've stopped it before you debug the project. + + Debugging _should_ build the solution, which will then output the DLL, config, and pdb into your `%LocalAppData%\Loupedeck\Plugins` directory. + + If all goes well, Loupedeck will then open and you can then debug. + +
+ +# Usage + +Follow the __Loupedeck Installation__ instructions above, +once completed you will then be able to drag the ***Audio Devices*** control onto any layout page or button in your Loupedeck. + +As of writing this (Apr 9th, 2022), there is only the one control. +I'm hoping to add more for recording devices, and an auxiliary control that allows you to chance both recording and playback simultaneously. + +# Support + +[Submit an issue](https://github.com/Steinerd/Loupedeck.AudioSwitcherPlugin/issues/new) + +Fill out the template to the best of your abilities and send it through. + +# Contribute + +Easily done. Just [open a pull request](https://github.com/Steinerd/Loupedeck.AudioSwitcherPlugin/compare). + +Don't worry about specifics, I'll handle the minutia. + +# License +The MIT-License for this plugin can be reviewed at [LICENSE](LICENSE) attached to this repo. diff --git a/src/.editorconfig b/src/.editorconfig new file mode 100644 index 0000000..8ec3771 --- /dev/null +++ b/src/.editorconfig @@ -0,0 +1,242 @@ +# Remove the line below if you want to inherit .editorconfig settings from higher directories +root = true + +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_size = 4 +indent_style = space +tab_width = 4 + +# New line preferences +end_of_line = crlf +insert_final_newline = false + +#### .NET Coding Conventions #### + +# Organize usings +dotnet_separate_import_directive_groups = true +dotnet_sort_system_directives_first = true + +# this. and Me. preferences +dotnet_style_qualification_for_event = true:warning +dotnet_style_qualification_for_field = true:warning +dotnet_style_qualification_for_method = true:warning +dotnet_style_qualification_for_property = true:warning + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = false:warning +dotnet_style_predefined_type_for_member_access = false:warning + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:warning +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:warning +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent + +# Expression-level preferences +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_inlined_variable_declaration = true:warning +csharp_style_throw_expression = true:warning +dotnet_style_coalesce_expression = true:warning +dotnet_style_collection_initializer = true:warning +dotnet_style_explicit_tuple_names = true:warning +dotnet_style_null_propagation = true:warning +dotnet_style_object_initializer = false:suggestion +dotnet_style_prefer_auto_properties = true:warning +dotnet_style_prefer_compound_assignment = true:warning +dotnet_style_prefer_conditional_expression_over_assignment = true:warning +dotnet_style_prefer_conditional_expression_over_return = true:warning +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning + +# Field preferences +dotnet_style_readonly_field = true:warning + +# Parameter preferences +dotnet_code_quality_unused_parameters = all:warning + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = true:silent +csharp_style_var_for_built_in_types = true:warning +csharp_style_var_when_type_is_apparent = true:warning + +# Expression-bodied members +csharp_style_expression_bodied_accessors = when_on_single_line:suggestion +csharp_style_expression_bodied_constructors = when_on_single_line:suggestion +csharp_style_expression_bodied_indexers = when_on_single_line:suggestion +csharp_style_expression_bodied_lambdas = when_on_single_line:suggestion +csharp_style_expression_bodied_local_functions = when_on_single_line:suggestion +csharp_style_expression_bodied_methods = when_on_single_line:suggestion +csharp_style_expression_bodied_operators = when_on_single_line:suggestion +csharp_style_expression_bodied_properties = when_on_single_line:suggestion + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true:warning +csharp_style_pattern_matching_over_is_with_cast_check = true:warning + +# Null-checking preferences +csharp_style_conditional_delegate_call = true:warning + +# Modifier preferences +csharp_prefer_static_local_function = false:warning +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async + +# Code-block preferences +csharp_prefer_braces = true:warning +csharp_prefer_simple_using_statement = false:warning + +# Expression-level preferences +csharp_prefer_simple_default_expression = true:warning +csharp_style_pattern_local_over_anonymous_function = true:warning +csharp_style_prefer_index_operator = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion + +# 'using' directive preferences +csharp_using_directive_placement = inside_namespace:warning + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = all +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = false +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = false + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +#### Diagnostic configuration #### + +dotnet_diagnostic.CA1028.severity = none +dotnet_diagnostic.CA1031.severity = none +dotnet_diagnostic.CA1054.severity = none +dotnet_diagnostic.CA1056.severity = none +dotnet_diagnostic.CA1060.severity = none +dotnet_diagnostic.CA1303.severity = none +dotnet_diagnostic.CA1308.severity = none +dotnet_diagnostic.CA1716.severity = none +dotnet_diagnostic.CA1720.severity = none +dotnet_diagnostic.CA2101.severity = none +dotnet_diagnostic.CA2234.severity = none +dotnet_diagnostic.CA5350.severity = none +dotnet_diagnostic.CA9998.severity = none + +dotnet_diagnostic.CS1591.severity = none + +dotnet_diagnostic.IDE0002.severity = none +dotnet_diagnostic.IDE0021.severity = warning +dotnet_diagnostic.IDE0022.severity = warning +dotnet_diagnostic.IDE0058.severity = none +dotnet_diagnostic.IDE0059.severity = none + +dotnet_diagnostic.SA1108.severity = none +dotnet_diagnostic.SA1117.severity = none +dotnet_diagnostic.SA1121.severity = none +dotnet_diagnostic.SA1122.severity = none +dotnet_diagnostic.SA1131.severity = none +dotnet_diagnostic.SA1201.severity = none +dotnet_diagnostic.SA1202.severity = none +dotnet_diagnostic.SA1203.severity = none +dotnet_diagnostic.SA1204.severity = none +dotnet_diagnostic.SA1214.severity = none +dotnet_diagnostic.SA1309.severity = none +dotnet_diagnostic.SA1512.severity = none +dotnet_diagnostic.SA1513.severity = none +dotnet_diagnostic.SA1600.severity = none +dotnet_diagnostic.SA1601.severity = none +dotnet_diagnostic.SA1602.severity = none +dotnet_diagnostic.SA1629.severity = none +dotnet_diagnostic.SA1633.severity = none + +dotnet_diagnostic.SX1309.severity = warning +dotnet_diagnostic.SX1309S.severity = warning diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000..846dd5c --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,7 @@ + + + latest + $(SolutionDir)..\obj\ + $(SolutionDir)..\bin\ + + diff --git a/src/Steinerd.AudioSwitcherPlugin.sln b/src/Steinerd.AudioSwitcherPlugin.sln new file mode 100644 index 0000000..eed6d1c --- /dev/null +++ b/src/Steinerd.AudioSwitcherPlugin.sln @@ -0,0 +1,33 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34408.163 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Steinerd.AudioSwitcherPlugin", "Steinerd.AudioSwitcherPlugin\Steinerd.AudioSwitcherPlugin.csproj", "{E627C50A-0F88-45B5-9F07-93F8383FE83B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9066CC41-024C-4159-A675-BDA3F020AC59}" + ProjectSection(SolutionItems) = preProject + ..\.gitignore = ..\.gitignore + Steinerd.AudioSwitcherPlugin\build-plugin.ps1 = Steinerd.AudioSwitcherPlugin\build-plugin.ps1 + Directory.Build.props = Directory.Build.props + ..\LICENSE = ..\LICENSE + ..\README.md = ..\README.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E627C50A-0F88-45B5-9F07-93F8383FE83B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E627C50A-0F88-45B5-9F07-93F8383FE83B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E627C50A-0F88-45B5-9F07-93F8383FE83B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E627C50A-0F88-45B5-9F07-93F8383FE83B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E1013608-F4CE-4B17-8769-4B52706A2061} + EndGlobalSection +EndGlobal diff --git a/src/Steinerd.AudioSwitcherPlugin/Actions/AudioDevicesFolder.cs b/src/Steinerd.AudioSwitcherPlugin/Actions/AudioDevicesFolder.cs new file mode 100644 index 0000000..81ea047 --- /dev/null +++ b/src/Steinerd.AudioSwitcherPlugin/Actions/AudioDevicesFolder.cs @@ -0,0 +1,82 @@ +namespace Loupedeck.Steinerd.AudioSwitcherPlugin.Actions +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text; + using System.Threading.Tasks; + + using Loupedeck; + using Loupedeck.Steinerd.AudioSwitcherPlugin; + + public class AudioDevicesFolder : PluginDynamicFolder + { + public static AudioDevicesFolder Instance { get; private set; } + + public AudioDevicesFolder() + { + Instance = this; + this.DisplayName = "Audio\nDevices"; + this.GroupName = "Controls"; + + var navArea = this.GetNavigationArea(DeviceType.All); + + } + + public override IEnumerable GetEncoderPressActionNames(DeviceType deviceType) + { + return + [ + null, null, null, + this.CreateAdjustmentName("Refresh") + ]; + } + + public override IEnumerable GetButtonPressActionNames(DeviceType deviceType) + { + + var systemButtons = new[] + { + NavigateUpActionName, + }; + + return !AudioSwitcherPlugin.Instance.ActiveDevices.IsEmpty + ? systemButtons.Concat(AudioSwitcherPlugin.Instance.ActiveDevices.Select(s => this.CreateCommandName(s.Id.ToString("n")))) + : systemButtons.Concat([this.CreateCommandName("Please\nWait...")]); + } + + + public override BitmapImage GetCommandImage(String actionParameter, PluginImageSize imageSize) + { + using var builder = new BitmapBuilder(imageSize); + + builder.Clear(new BitmapColor(0, 0, 0)); + + var device = AudioSwitcherPlugin.Instance.ActiveDevices.FirstOrDefault(f => f.Id.ToString("n") == actionParameter); + + if (device != null) + { + if (device.IsDefaultDevice) + { + builder.Clear(new BitmapColor(0, 100, 0)); + } + } + + builder.DrawText(device.InterfaceName, BitmapColor.White); + + + return builder.ToImage(); + } + + public override void RunCommand(String actionParameter) + { + this.EncoderActionNamesChanged(); + + AudioSwitcherPlugin.Instance.ActiveDevices.FirstOrDefault(f => f.Id.ToString("n") == actionParameter)?.SetAsDefault(); + this.CommandImageChanged(actionParameter); + + } + + + } +} diff --git a/src/Steinerd.AudioSwitcherPlugin/AudioSwitcherApplication.cs b/src/Steinerd.AudioSwitcherPlugin/AudioSwitcherApplication.cs new file mode 100644 index 0000000..37c2af8 --- /dev/null +++ b/src/Steinerd.AudioSwitcherPlugin/AudioSwitcherApplication.cs @@ -0,0 +1,22 @@ +namespace Loupedeck.Steinerd.AudioSwitcherPlugin +{ + using System; + + // This class can be used to connect the Loupedeck plugin to an application. + + public class AudioSwitcherApplication : ClientApplication + { + public AudioSwitcherApplication() + { + } + + // This method can be used to link the plugin to a Windows application. + protected override String GetProcessName() => ""; + + // This method can be used to link the plugin to a macOS application. + protected override String GetBundleName() => ""; + + // This method can be used to check whether the application is installed or not. + public override ClientApplicationStatus GetApplicationStatus() => ClientApplicationStatus.Unknown; + } +} diff --git a/src/Steinerd.AudioSwitcherPlugin/AudioSwitcherPlugin.cs b/src/Steinerd.AudioSwitcherPlugin/AudioSwitcherPlugin.cs new file mode 100644 index 0000000..f5382e2 --- /dev/null +++ b/src/Steinerd.AudioSwitcherPlugin/AudioSwitcherPlugin.cs @@ -0,0 +1,80 @@ +namespace Loupedeck.Steinerd.AudioSwitcherPlugin +{ + using System; + using System.Collections.Concurrent; + using System.Reflection.Metadata; + + using AudioSwitcher.AudioApi.CoreAudio; + + // This class contains the plugin-level logic of the Loupedeck plugin. + + public class AudioSwitcherPlugin : Plugin + { + // Gets a value indicating whether this is an API-only plugin. + public override Boolean UsesApplicationApiOnly => true; + + // Gets a value indicating whether this is a Universal plugin or an Application plugin. + public override Boolean HasNoApplication => true; + + internal CoreAudioController AudioController { get; private set; } + internal ConcurrentStack ActiveDevices { get; private set; } + + public static AudioSwitcherPlugin Instance { get; private set; } + + // Initializes a new instance of the plugin class. + public AudioSwitcherPlugin() + { + // Initialize the plugin log. + PluginLog.Init(this.Log); + + // Initialize the plugin resources. + PluginResources.Init(this.Assembly); + + Instance ??= this; + + this.ActiveDevices ??= new ConcurrentStack(); + + if (this.AudioController == null) + { + // Without this delay the Audio Knob (if used) stops working.... + Task.Factory.StartNew(async () => + { + await Task.Delay(TimeSpan.FromSeconds(15)); + this.AudioController = new CoreAudioController(); + this.RefreshDevices(); + }); + } + } + + public override void RunCommand(String commandName, String parameter) + { + if (parameter == "Refresh") + { + this.RefreshDevices(); + } + + base.RunCommand(commandName, parameter); + } + + // This method is called when the plugin is loaded. + public override void Load() => this.LoadPluginIcons(); + + // This method is called when the plugin is unloaded. + public override void Unload() + { + } + private void LoadPluginIcons() + { + this.Info.Icon16x16 = EmbeddedResources.ReadImage(EmbeddedResources.FindFile("16.png")); + this.Info.Icon32x32 = EmbeddedResources.ReadImage(EmbeddedResources.FindFile("32.png")); + this.Info.Icon48x48 = EmbeddedResources.ReadImage(EmbeddedResources.FindFile("48.png")); + this.Info.Icon256x256 = EmbeddedResources.ReadImage(EmbeddedResources.FindFile("256.png")); + } + + internal void RefreshDevices() + { + this.ActiveDevices.Clear(); + this.ActiveDevices.PushRange(this.AudioController.GetPlaybackDevices(AudioSwitcher.AudioApi.DeviceState.Active).ToArray()); + } + } +} diff --git a/src/Steinerd.AudioSwitcherPlugin/Dependencies/AudioSwitcher.AudioApi.CoreAudio.dll b/src/Steinerd.AudioSwitcherPlugin/Dependencies/AudioSwitcher.AudioApi.CoreAudio.dll new file mode 100644 index 0000000000000000000000000000000000000000..8eb5b12f1b4b5df6ca4ee5a6056998ac58e52ff9 GIT binary patch literal 108032 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 literal 0 HcmV?d00001 diff --git a/src/Steinerd.AudioSwitcherPlugin/Dependencies/AudioSwitcher.AudioApi.dll b/src/Steinerd.AudioSwitcherPlugin/Dependencies/AudioSwitcher.AudioApi.dll new file mode 100644 index 0000000000000000000000000000000000000000..240a909074f5895c9558c0159b776f023e974edb GIT binary patch literal 38912 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 literal 0 HcmV?d00001 diff --git a/src/Steinerd.AudioSwitcherPlugin/Helpers/PluginLog.cs b/src/Steinerd.AudioSwitcherPlugin/Helpers/PluginLog.cs new file mode 100644 index 0000000..f89b932 --- /dev/null +++ b/src/Steinerd.AudioSwitcherPlugin/Helpers/PluginLog.cs @@ -0,0 +1,33 @@ +namespace Loupedeck.Steinerd.AudioSwitcherPlugin +{ + using System; + + // A helper class that enables logging from the plugin code. + + internal static class PluginLog + { + private static PluginLogFile _pluginLogFile; + + public static void Init(PluginLogFile pluginLogFile) + { + pluginLogFile.CheckNullArgument(nameof(pluginLogFile)); + PluginLog._pluginLogFile = pluginLogFile; + } + + public static void Verbose(String text) => PluginLog._pluginLogFile?.Verbose(text); + + public static void Verbose(Exception ex, String text) => PluginLog._pluginLogFile?.Verbose(ex, text); + + public static void Info(String text) => PluginLog._pluginLogFile?.Info(text); + + public static void Info(Exception ex, String text) => PluginLog._pluginLogFile?.Info(ex, text); + + public static void Warning(String text) => PluginLog._pluginLogFile?.Warning(text); + + public static void Warning(Exception ex, String text) => PluginLog._pluginLogFile?.Warning(ex, text); + + public static void Error(String text) => PluginLog._pluginLogFile?.Error(text); + + public static void Error(Exception ex, String text) => PluginLog._pluginLogFile?.Error(ex, text); + } +} diff --git a/src/Steinerd.AudioSwitcherPlugin/Helpers/PluginResources.cs b/src/Steinerd.AudioSwitcherPlugin/Helpers/PluginResources.cs new file mode 100644 index 0000000..4459d5f --- /dev/null +++ b/src/Steinerd.AudioSwitcherPlugin/Helpers/PluginResources.cs @@ -0,0 +1,58 @@ +namespace Loupedeck.Steinerd.AudioSwitcherPlugin +{ + using System; + using System.IO; + using System.Reflection; + + // A helper class for managing plugin resources. + // Note that the resource files handled by this class must be embedded in the plugin assembly at compile time. + // That is, the Build Action of the files must be "Embedded Resource" in the plugin project. + + internal static class PluginResources + { + private static Assembly _assembly; + + public static void Init(Assembly assembly) + { + assembly.CheckNullArgument(nameof(assembly)); + PluginResources._assembly = assembly; + } + + // Retrieves the names of all the resource files in the specified folder. + // The parameter `folderName` must be specified as a full path, for example, `Loupedeck.Steinerd.AudioSwitcherPlugin.Resources`. + // Returns the full names of the resource files, for example, `Loupedeck.Steinerd.AudioSwitcherPlugin.Resources.Resource.txt`. + public static String[] GetFilesInFolder(String folderName) => PluginResources._assembly.GetFilesInFolder(folderName); + + // Finds the first resource file with the specified file name. + // Returns the full name of the found resource file. + // Throws `FileNotFoundException` if the resource file is not found. + public static String FindFile(String fileName) => PluginResources._assembly.FindFileOrThrow(fileName); + + // Finds all the resource files that match the specified regular expression pattern. + // Returns the full names of the found resource files. + // Example: + // `PluginResources.FindFiles(@"\w+\.txt$")` returns all the resource files with the extension `.txt`. + public static String[] FindFiles(String regexPattern) => PluginResources._assembly.FindFiles(regexPattern); + + // Finds the first resource file with the specified file name, and returns the file as a stream. + // Throws `FileNotFoundException` if the resource file is not found. + public static Stream GetStream(String resourceName) => PluginResources._assembly.GetStream(PluginResources.FindFile(resourceName)); + + // Reads content of the specified text file, and returns the file content as a string. + // Throws `FileNotFoundException` if the resource file is not found. + public static String ReadTextFile(String resourceName) => PluginResources._assembly.ReadTextFile(PluginResources.FindFile(resourceName)); + + // Reads content of the specified binary file, and returns the file content as bytes. + // Throws `FileNotFoundException` if the resource file is not found. + public static Byte[] ReadBinaryFile(String resourceName) => PluginResources._assembly.ReadBinaryFile(PluginResources.FindFile(resourceName)); + + // Reads content of the specified image file, and returns the file content as a bitmap image. + // Throws `FileNotFoundException` if the resource file is not found. + public static BitmapImage ReadImage(String resourceName) => PluginResources._assembly.ReadImage(PluginResources.FindFile(resourceName)); + + // Extracts the specified resource file to the given file path in the file system. + // Throws `FileNotFoundException` if the resource file is not found, or a system exception if the output file cannot be written. + public static void ExtractFile(String resourceName, String filePathName) + => PluginResources._assembly.ExtractFile(PluginResources.FindFile(resourceName), filePathName); + } +} diff --git a/src/Steinerd.AudioSwitcherPlugin/Resources/16.png b/src/Steinerd.AudioSwitcherPlugin/Resources/16.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9c57421a91526df9ff2f0cdcb288eef80e9cf3 GIT binary patch literal 900 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L91A{dm2s579wy+r}$X?><>&pI&g_B=H;-Jo{Ees5d(w;7kAsXjXC)j#B6-pef zKmT7#v4tg)&$Oe(+eF+|PtiA5*O$vN`u>5v{1+}=5Hf8sH4~e(WvhwBifCQOpH2&% zeilV3<$s^|^^e8*O1>_Q^=-#~t>1TR)#?Qtr(VZ8-pz7ft+i?$)2h}tZAMNUqM^zn zda5Ss98io(2d=e(+@9Goey!LTMYI7EY$0UQd6H^@~YxLhS*yh<> z`K{8>^=7K{VrSvxONCvQT2ty61RmXd5c~PPIxyr^OI#yLQW8s2t&)pUffR$0fsv7} zfr+kxWr(4vm5G6sk)gJMft7*5p_0Y~6b-rgDVb@NxHW9nw7dh&2&rB)F04ce=Mv()kL=s7f zZ)R?4No7GQ1K3si1$pWAo5K9i%<&BYs$wuSGqE%^w6HKT{P1i!D9Q69nG>8@mC9h? z-xEQB{})&`e}(}naTNi#rlXK*EcpZG&eLdu}Dfv vOEFC~OENUFFg7(xwn#NIGD|Z~Gt>j>&;z<}hfNtMGcb6%`njxgN@xNACXFvH literal 0 HcmV?d00001 diff --git a/src/Steinerd.AudioSwitcherPlugin/Resources/256.png b/src/Steinerd.AudioSwitcherPlugin/Resources/256.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccc7e6106055b49d88aef0b5fbca63761207e4e GIT binary patch literal 14969 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 z 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 literal 0 HcmV?d00001 diff --git a/src/Steinerd.AudioSwitcherPlugin/Resources/32.png b/src/Steinerd.AudioSwitcherPlugin/Resources/32.png new file mode 100644 index 0000000000000000000000000000000000000000..05df1e3a5f1ff617e16caa1afdb971119de7f539 GIT binary patch literal 1303 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SSrgEb!rGoIPDuo)=GUgGKN%KnUnlV3yPpw6i+KuzmBT^vI^j!&I>);lCo zhu@SX%cuP^SY~|d!FR`&zL!&%#HmU*)y(qPb|9&3_ZK5)6LwA2HcqV_&y9};mj0H_ zOO;YNxjN3W#o$lZBMVnP$((Hmo`@@dDVVLFu;CG(qeb)$386fL^CsM<4{WGk_uqJ$ z>XBd7T0Gpjvt8;*IQ)az?hfyg2{P;xA5OPN|SRQ z&0H|wOs!WzvY}*^g$wK4wz5lyBy_JNKIY7O^JL?J%3n>QE&{I1l2aCX@t#;{XQ~}% z7yjmgZ>hE;3->}1-c@pYFNlV&ioVVC&3DnS(!x^awUZe_Gf$|@O)Pqur1hYzsq9+< z_eHx3?^P$2@)k+PhUPH*QMuQ&a^J=bp|-jA8?$2>Ci)nP8#(HjP4-W@bX+irN#uCo zA#1T_alsRhHhW6*%}ZWBO(I_WhL`EZEiGS4m5x{DXf&s>ReG4_-TK)#S7=*tW1oOs z#}gyVDas)$0%OBBt~<3-?r!+sQ~kw%+0<4z%7<$G*AXe^ym-pO{(}LxV;W=9$ww@L zS1xU{>dl;^JU#Z`AxTFLi5A0y%2Jj5Z1oJy3clNpZRx)YOw6h!t`Q|Ei6yC4$wjF^ ziowXh$Vk_~MAyJF#L(2r#K6kPP}{)3%D~`INn-+vhTQy=%(P0}8a8WM-T`V*0NGHS zpH@3h!0&IPKK0I3bhD9uf>vU15!F3nBN zE3vW)04gnJFkJqBw?3L0Pmn2ARvxLD=@}&qhL%PSv4x>PHR4F-K-Gk2rj%rWlw4k; z$N^L$iKN6gGdH!QvLKZK>?-|&ymb3bVSZ@l_=W&gF&LVeSehDISQr_8c(xo=3h^VE z6P#I<%3$E+G-Z+98=zDel2mArCqr6hPAbsr`nh=}Ir-`OX^CZ-$@zK3`iLOcH#Rdg zH#9P_NJ>geF-CC#F*$?NQIrsej=bU># z+*|oMD{`H!n=JrfU33&Z9`X1Uv$jOmB|B&>;w<^$%y0m@6n2Z8)kwTGJ1U+Dz#$9( zWfcJYfozpM1z1a5R%)HEU_(@QG``??^Y&@IW*@JTc|wR9%{|mf?Ej%#_p^<35&bM)^fUr^K`Pzt~ zQkSkt7ph=DUR@#5e}QiF$#`6P+yz}v5IoR5H990aczanSc2#dXe0f-4|0;xEmfF!$ zBLE&VY_}t~LvJqidoLRl9Rw}M)62QHf0gN!E)A`GZr4AndQD!qtq!R=_3}l)3^Q9j zxUqlqUEM*JWS5Fxe%5F2-?UczyV`V9i`aR`x!#B`a_4}c?O={lzVcOmKg5}o^o?W`vrQEh94E0y`wDj9!RcOdC zVJ^d+4k>Z=yE0|JJJ=BCanbOyqeye+p>P0W;1Lx8zY&d#V`-LlOFDI2$|D12aVXdi zzi&`^spLLZbM9Exh7BaQx3O|bHGfGTpFuL&$7(ApQ}sVTXLs6!IbJnhqLl@E%!Ri< ze^uu1oit*BYDSnQER5iR^_}w-4eXd8hDu}NO}CJG z5=!E1xSO7>f(un9c9T44>}hk}gZ!P{HCi(W3vD}sONW}Hu;c{z4mvyoY?V`GHO*D7 zw|iB+$EDkwPSaRxfUT18*$8{&lPsTiRJyRl8FgYZ%3p*kE96P2F`I97v^7qvPdaVH zmNTdflxG13$-QWjO{sNbmk*tDFp7^~`8uah#{F@&=}SMGpI7fT3N@q9EH9xnv$E&S zgvlLS)Vd8TX$V!$MY^mu|7vkXS=dgNIq8Fct52Wx-U69I-@o7ldvqHpPpp0tONZAy zQ8u!Aj(WiLh9G0x)Z;i}%FE#M)MCHB%vZjhQhE6nY3d)-0nNX(oTEMV>g*mgIoIdu zQr5&Zj_oxcC)Rg!=%p<=J66YCY8*ASRwvJ(lE^0~?ldW}wArLm&*C{58M|NZXBy3m zT08MfgC)IHom)nANQ;M{^WLe*v$PFnq`)~Gm`lkn6wei3ql?bSM(@;9^c87v#dQq=Kv>rmHZgaiKwBforVkLNK*WU)O1R)ZQ{g1}{LqWZtiRM@CL$Do zhymn4C@6>k&CRy0{3i|{)JYH=;sX4R9ktCgGm=XFAe9s!4R`_}7dbjkln)EVd>oG> z6=aL^i*WzFa-2UAB0+?JpsXxjP9T?<1rdV$0}0tdTq1$U^XEZWM1e)-Q&XiYKMjax Lu;}M^WPbH;#cSZ* literal 0 HcmV?d00001 diff --git a/src/Steinerd.AudioSwitcherPlugin/Steinerd.AudioSwitcherPlugin.csproj b/src/Steinerd.AudioSwitcherPlugin/Steinerd.AudioSwitcherPlugin.csproj new file mode 100644 index 0000000..129488e --- /dev/null +++ b/src/Steinerd.AudioSwitcherPlugin/Steinerd.AudioSwitcherPlugin.csproj @@ -0,0 +1,74 @@ + + + + net8.0-windows + enable + disable + Loupedeck.Steinerd.AudioSwitcherPlugin + + prompt + 4 + + false + true + + C:\Program Files\Logi\LogiPluginService\ + /Applications/Utilities/LogiPluginService.app/Contents/MonoBundle/ + + $(LocalAppData)\Logi\LogiPluginService\Plugins\ + ~/Library/Application\ Support/Logi/LogiPluginService/Plugins/ + AnyCPU + $(SolutionDir)..\bin\win + + + + + + + + + + + + Dependencies\AudioSwitcher.AudioApi.dll + + + Dependencies\AudioSwitcher.AudioApi.CoreAudio.dll + + + $(PluginApiDir)PluginApi.dll + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Steinerd.AudioSwitcherPlugin/build-plugin.ps1 b/src/Steinerd.AudioSwitcherPlugin/build-plugin.ps1 new file mode 100644 index 0000000..75ab38a --- /dev/null +++ b/src/Steinerd.AudioSwitcherPlugin/build-plugin.ps1 @@ -0,0 +1,28 @@ +$version = "1.0" +$project = "AudioSwitcher" +$assemblyName = "Steinerd.AudioSwitcherPlugin" +$dllName = "$assemblyName.dll" +$pluginPath= "$($env:LOCALAPPDATA)\Logi\LogiPluginService\Plugins\" +$buildPath = ".builds" +$outputFileName = "$project" +$zipPath = "$buildPath\$outputFileName.zip" +$pluginName = "$outputFileName.lplug4" +$loupedeckYaml = ".\metadata\LoupedeckPackage.yaml" +$cwd = Get-Location + +$dllPath = (Get-Content $pluginPath\$assemblyName.link).Trim() + +New-Item -Path "$buildPath" -Force -Name "bin" -ItemType "directory" > $null +New-Item -Path "$buildPath\bin" -Force -Name "win" -ItemType "directory" > $null + +Copy-Item $loupedeckYaml -Force -Destination $buildPath > $null +Copy-Item "$dllPath*" -Destination "$buildPath\bin\win\" -Recurse > $null + +$compress = @{ + Path = "$buildPath\*" + CompressionLevel = "Fastest" + DestinationPath = $zipPath +} +Compress-Archive @Compress > $null + +Rename-Item $zipPath -Force -NewName $pluginName > $null \ No newline at end of file diff --git a/src/Steinerd.AudioSwitcherPlugin/metadata/Icon256x256.png b/src/Steinerd.AudioSwitcherPlugin/metadata/Icon256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccc7e6106055b49d88aef0b5fbca63761207e4e GIT binary patch literal 14969 zcmajG1yGz%@HR+<5P~Fx1Pu@@xWnQe+--3PviRbzAwk39?(QtkE>3WFSY(mlx)9vS z@w@x3?tfp^)os<(Tkp)%{mxF!^z`)f6RxT(gY$;u4H_C6j-2dQbu_eRfd9(tmrpg~ z4enG=kC&F>O5$i}HPKl2Cg@M^pUq^|mC(?c=&9kkse;T`w11(|BOOm~n2xf#E@)_ixc`-BBe2|`Pn8(1a!OJd+b=QS z(i3$u57ncg@x7D#Dz53dh+5w9Fqlg{z8NoNH2?7#^ZB>2&nfXG%({a~n=@dKtBO>f zfIk(fK2^v$uzu1a%x+68oImi}%NMdSpPehqxY)|je)KR@i&4ex+(|1`2ox({uPyk9 z-eCsn(v3V6F9B_7Kne4I$U4;d?>flvJHLzGgaY&9IPIIvU;ohkw>D#!B@|RZ3oO^% z${AIckQ)YPE*nRs{z!mw3V>ctRqEufeuq`7Sh&;jZtURpkCDjAF*M9bvstTdft1v5 z#^d7ZJheGA;$!is5)g-i4@cK4Ji^iig=g8LjeHi8c7X+|sZjTMize@uiWpVP!3?3H zl)Z_a%8I)&o4LKbGge}Pf!Bl;^QT;O1?t0g)tZrCd=6Ei63|+HUtf-COPx^hwlP7d zE}R_N3>jc|p-Rm?+r$`uKTC3WQb`8X%acz`5Oc=0$mURyq^C|mR2gUcjNQ#xdz_PG zHa&CO?g5%MTmX=^Rnj&O zYO)g8vY>w{M^>Tm8O_YRLxfUDWMdBRCu3seP-{QIPj`FjTd-TvR?E<``OwRZcl#bI zs}Cy4*u=3Q@8{le=n~Ke64YfHv}PuY`neWNL2n&GK(~~6g!zjAdF`&*(B^-@qp!IM zpEb)Od_H?Qzh7GgBAaExXIyDknyXFpnPq#Jd9`)sx5IHJmh&~7j4^n~w=zHggOCB% zYN&4#{k9Ec)>`vupkbd6H$N9diI~K~ps#Bp*{~Qtos%9f5MYRiTqW4VC8)0J|E%rB zDe4`zXd--A@&WW!B2(@OwtQ;kKTWDFiAUoh8@2Q;vW>m^FZsIM#W_nR090(}iFmPL{cu^13=w%#oNP#Nrrt*tCndS`2gQ=9x#pr<(}MZFWb}s1+a?dYaP6EkWqPyU zhRNJ5e`Jaa&}*l9rBl#jcs}5+wUqudv_ka#G4G76N@%tL&m}T}G&LD-IryJfcWOKl-F9AI`f5 zFsmSx0%q5m+b-uh!Mu;}mHep-yB#av&3(=50a`~cr)3RYy+5nRZrnV6943CKGZtj= zczic?B)A`izjA?fP$cYAKC}6YXOV&$*4nPk|A`HII~L*(*2_3=qBtL2e!D|U7DCos zPolM^l%A-paDb@=6F9uwl!eQ%=;tiiclhREnvRT2R4q_E7`8;2!r+#{5Tn&Sj(tmj zvJd<6VRB`o>Fye+E8mofIaz?Hgzo>vx;;{t{6x}LJl+0HulySUkngx@)Di<>k{&eIaqRvRC`(JOIK zW>~dJUiNR9Y)6t4k~u97_`U%{KJS3{{^oPaIUp*gTJ|PjrVgNfTFT@iji;ghEa9neK+l$J8=_Xwjvkd)L0{xk)tck zzJ)ykJku%T$%|Ime$5SALiXYJ#PJ9(?G4}6MHl%#^z3UD(e3;h0&?9py-c@&w0<7% zx#pVcvl@Q=Z%tn=&iquyY4h#xma;R4(6!hgl&)0b_UA2Iqz5bwHY8kdZ>6N@Wp%~? z*qh-Bh#~ozM6}D}TKS+)I2ObwN~fsHXaAQ-(UknK<}P6r%R6-d(%$-$DmPob;E@gM zb7r0I?%)hnxPz~r-J_tau1(7*KWOV|D{EPH5}OoyN8&UbZD02eV}he^t`Hg}xHZP@ zOp!DX_F*+){1|sI4HL#?NWuK9K-2g_ zZODnvp;b!&fmK3vZsD=!0=N}2X{4NK04HAo3_<=I!Ov_zkz^HeUc=4fKh@?d(279h zEw^B5k=WI9)4^tqY84Fa7Pd2#Sy-C|ZLOK>I;#P64}5M%cQ51i4^QJ}`D?VwwDCR0 z(#<%V?|031E||${w!lc*)uzk&MJlsUn%NRtN_Q8Nl%27Si0Gm z?YJ8?%Z~)wA=>w8pH5G?ms~lxB&DkWyxW4#sPJ8nZYg*{#JzuJGTBr@^%zj8CK^13 zS%^bwgst#1e6tGH&tMs0M8iC3Uhak|SL*pL6GLJ_iq}`<+ki*AQ^)Rtg}gi`M?`8B zhlbO*+8hCNiL=>_gjLV(Syxc)eB~&AE<~_>igT6l^uxjU>-@tQk$$gWh98txbfr6MOoR-MW@#cNHnpZP$yNSkz5AhUETRv;SR@U z0Z<^Rv0G3XSiL(({if*@KYF2cLfy@-1Z~mpBETy;GwN7<`zJ-k8s0nvNZ)sF2yfQ^ zJe#hbsF~mX2|47Vf#-$y0a6)qYkEhBYvxV2Av$&(F4D}fCQB!bAW`%uby@P|6{?J$D<23Wz(>}9^OpCs zMJX(w5XFnH%Cq|WzKk#9u)R(yQNO(xzS}tpA$%FQ<8UYTqyOIw0c=G^>e@t;4Y@4qg<)en=9_agSdUdv#&@n+nSFGTaRH|I{%#dD~>;Q6&7S|_tmsme}ddyad zXaZ`M%M;;`TTe3P0 zt#tx@A(K9=%@*eE#~b_wQ^*xy3y~f2TA+T?VmKnJDzb4q&u5C}Inm$zW7n}Olu&3v z#iV%)=**8&Dz+ZMBvNllf}5_qdNYY8{>a9NYK?DR4|E-qqi^W6CDCHu2NO-95F*L^bG1DK)6AI$7+I9R&QJ1BueR#yw(*1dH8XNyS z=bV`AQjhPvaCL2p@pOgty71Pz&VFvP9KG=&gDEX=0xWk zT1Kg3&>GC3iX2UXf9(V(saj{Rde4?w)6*P4q78`g^-b^lZVg;lE?b6#r)0H5}&7qBqln3f>N;#ckTFJXq_p-6Ydlqg$Ee zgH{JVW6`S@WjB7?lZ4odvk)X4L4^JorL3)2{Z*G6;C7tu2|gwnwu2x*ky`fX2uucqcz=8Tmj zGt4Wm>lvo+;pTH9`4@$-8|amtHb0blnw5X=vHM?&x1*87t50*^3X80XNB^6)edNU5 z(gvATo!nKYAcWo)Erpf3FckmX>auX7NvRA&$fomE=6iX@I)|}ijxYV3Y&jzo263^Y zZMRKvOO3|R5u;;d;pFyuxz}dXezb`D?IitRXb-__Nosq6JrFW+^bY&thNiklBv5U& zsf>E=rAJih$&a`9Gd8nB#TRF}CUcpt(*yZ)WIVhFZc-6sh<}#E6SOEzSaOibG=GzvRe?o!;tZa1& z-sRxaBwla|BIJ%J-~P6f_(4sZ1hqcUxE}VU5YXeCt}TD4%?J*+Fbn~8AC6p}4GY@i zs}Icz{*emhw(-nU18bI3kU8-PWYeyfbuUHFA&<31s+Dh+gyvG7pEp)$)s1J)m3o}^ z+*!ZIOej~|L9bf0%Y1Ug%}qm={)UV4=NbYSH5t2V(YsXp$c)QXZNs%(uD_Xm(EwL{ z@tNV@E-PPj4cSYL(f9w$JZ+WCVssW)D4)eQP%-@W@yOP%b}|4r*yBy@ZKk@V_R}=@ z5~FI7x$52PW%=m>db#9y`z<+_=p^`UcA{9x2+8qXlQdI;oJjDb-PPOTb3$d$=nwk- zsWDDSx&9fOFnHB=qF9b*DJKuWrd}%a*{I&dK#G0p9U3UfwjQq#=w(YHWtu0~vXK&R zKm38gh}RA$DHHKM%2mJS97WK~}K9n9{BA>;ZMnJfN= zKyOL|=qYI#Op5O5P$E|yew;uii?VoSYY`WW5aKI8mJgnTi+p!BoiRSb45gvI4_jpw z?CfjMWPM=;VZvJb+m&O#jrPNh2K^NEfWkWhf#d= z+#Y88kmb|W$IV*7X7Y~bnX;2fU|-N;?l71(&Ztg#?`;0yo}bpXCyccHGQ7%7rGew) zXuM|>SF_(*yMJf}%w`hK31NtO25;cszZ%;t02pTdt|5$5;J2+^W)-cIk;@=CgW!|6 zEgEOKiPs%Th=0{Mdzr-Y-EMwQf2W=vuMBRW#oTC_pxU8~5;?=LbQ8TnbmL>uIINcO zEEEo=z<6fpx6nLM2{Vm-k$s!`~&9 z)eVue>6So(Wvsj9J5%XSwjzQz`G_lkdInwDk6*kQHiG@{R1}?tNe1 zy+OZiXxYl6J|cEpKT)&k<*GAfQVXF4AZ@BV?C{D4k_jNRaL2*IF>I0#jfWJhbblxiziBC|7R{vhgI%9xMr4=bbm>Z(lGl&B)HL zqvJgJ^J>c#B3&t_O$TYVM~xdY$so5Dw#JaN z!<~+TojRo>;;Y6A!GDL6@cPCQLwNboXz+(^c{@zGz&95p%<<()8P&5@>sg#G(g>{p zXE{JN`Sezl`_HZ#q3H#Sv7$q-!9;p(`4w7qTkZB}N4o`!WHjB(vHgJ-J|YftS9|lz zKUCY{?AlE{{2kgSOYeq?dB<0~vy5xPLnrtxa8Wvn|3ANxI`L1Y=e`_Ol+tJEdmk`V z#>h50QcZq6A3M`!5mE&;xvgCI8>Bs^QpUtd6uw~st3rJ%xF4o7F2j2-6O?#4L$HZI zvVGc)dq+Ezs6cS>AeP986PE^uTD7((&^j}}CE9xN5*5^J;52C%u4CsSOJ6<) zNM}h$sF|UH9_OYT@V%c8U&`j!!y{}Gl8{uy6Wd95?~htaqQsr-e*gdr{6U53mw~7-C)Q-K5#06bi#Q_L618wwjsk z6x9ZS3r2JB#gCu+v@<0MSV<|r+A&!^3l`5I0R8b{ETw(={%V>o$cj4wP{Z{K%hi&b zK3#1{q;iL_&B%02fDi2uP4yC^8&Ge9Hu8Ov{z-}lKVs>UI(yW{1u3)W9`L7)YSH~| z%SPkb6sy2`l8Ej?12FLCKUb30-xgm2azDO-Be@;A&fBdQ>V{P%Mv^E@6QRXJJdvu z&99#d6&lv%N;bX+HYXi=LG!0YC7Mv}d&B`k`DCjC@{G)0;5b{k5n5bQN0<2eR6OzY zA6cUR?qtshEAKhqPCXn|4TQ=MK6h!9PefQ(zw8!(2-%CL=j#j;lw5Ij{0&)TXiwxQ zk*s6OK

kQ%il(VXl$Bd07*SsPq$==E@SBYR2AmTzTcwS}F(q#Q-e1@Tbb{GG1o3 zch=09e-H4UWos*F|Km*yohIYW@aS@yb5=T_I}jcLhcIi<@vuUJE^y0YQ@$;PWV(!1 z$FQ4xO}2kglbBBS{B<`({O6*f(=5&%s#^Ky7P_W--pcUv?sg|AQ5}2X{1;{{qcc*6 zvh4NYwkZDX3~JWF0g(ys>p%X_88AUf$i19j_dh6O>Sqsbf<02AlPO$BIDSe5CK!#5 zwNT>65l7HuwxMnBq^ZKE$8J_4+y!=}hOvCPOxiee#j3{os}v(@>}(%;s@nAa(yb-s zKmIAfy~38cHNyHswgAf6L1; zv-oiWk|eSyG@L$8h>-qNTl7bKxQ&tNZxf&JiWwS+cSThF%*;M%2y)i}w-Iy#|WO^4axlGB;VK*JX0@=xs@Kidn`6}ab zRyo}&Wsa1}i?rV*sy_CH`nzC7@WOkWhZ(k3>#Yx~&BwL@e|bIV^wLf`>og-9aPPu# zfI4}4i9tQwbyD#*%&~a$-_oz#nowbE25zf4c24EFDc1PSd*dOXHb5_pO+)r;&D$PS z>9)N_1a#_^gO?UKkY_OF?uZZN(C)-!Dz0iB*#KK~h?Z_(6e|7leDIzpp}enz)s{zK zAA=6NMXjBsE1W6PT`Pon}z&>QKxk4s+_)_4T zr1=N;Aw3L~%lOAsi48@Q;Ura1mB$;BaWxO$y(?C$xr@)QK9A_;lBBmD#-M=uCZ(y` zV&6Fh6ZMaSrpFoy$5$+pPSnwf$=cl~o%~iNbGT0rE>@hhTiPWgt%K&fGC*bURUcf! z*L9>$(}a)fwq$SJ|DDC!GaXjXy0h8VO589bPGxl}B{HEfTUTI2r6Uc&l44vyo%NM# zbMYq!JyHfZ2={<}H^_Z~9l{wf*-<@X^bbB~7q;|b)anfSZ!VT29bmExtr`EfRjp-{ zfN9ZYr@zR8ZVCLCJ|BjXB$+&vcQhtE|+r1T~ucO?}-WP{otyn?K1Xu+3x z-RK2?&7^?q0VlF(Yy-?$qqAIIusT4-K`1#xtrVy((d6JNl+yNer*!j-2iooQ@l~st zQjdCW&#UgVWj6sEdcUuBUi`oXl$7n8ukPozmnzwNoc4@o!#_S=UjM!W2mz*8lHaBC z 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 literal 0 HcmV?d00001 diff --git a/src/Steinerd.AudioSwitcherPlugin/metadata/LoupedeckPackage.yaml b/src/Steinerd.AudioSwitcherPlugin/metadata/LoupedeckPackage.yaml new file mode 100644 index 0000000..c96752b --- /dev/null +++ b/src/Steinerd.AudioSwitcherPlugin/metadata/LoupedeckPackage.yaml @@ -0,0 +1,80 @@ +# ================================================================================================== +# GENERAL SETTINGS +# ================================================================================================== + +# Package type. Must be plugin4 for plugins. +type: plugin4 + +# Name that identifies the plugin. +name: AudioSwitcher + +# Plugin name that is shown to the user. +displayName: AudioSwitcher + +# Short description of the plugin. +description: A simple audio switcher plugin for Loupedeck. + +# Name of the plugin library file. +pluginFileName: Steinerd.AudioSwitcherPlugin.dll + +# Plugin version. +version: 2.0 + +# Author of the plugin. The author can be a company or an individual developer. +author: Steinerd.com + +# Copyright information. +copyright: Copyright © 2024 Steinerd.com. All rights reserved. + + +# ================================================================================================== +# PLUGIN PROPERTIES +# ================================================================================================== + +# Location of plugin files on Windows (relative to the plugin base directory). +# This parameter is required to support Windows. +pluginFolderWin: .\bin\win\ + +# Location of plugin files on macOS (relative to the plugin base directory). +# This parameter is required to support Mac. +#pluginFolderMac: . + +# List of devices the plugin is optimized for. +supportedDevices: + # LoupedeckCtFamily covers the following devices: Loupedeck CT, Live and Live S, + # Razer Stream Controller, and Razer Stream Controller X. + - LoupedeckCtFamily + + # LoupedeckPlusFamily covers Loupedeck+ device. Uncomment the following line to support Loupedeck+. + #- LoupedeckPlusFamily + +# List of plugin capabilities. +pluginCapabilities: + # Uncomment the following line if this plugin is an application plugin. + - HasApplication + + # Uncomment the following line if the plugin sends keyboard shortcuts to the target application. + #- ActivatesApplication + +# Minimum Loupedeck version supported by the plugin. +minimumLoupedeckVersion: 6.0 + + +# ================================================================================================== +# LOUPEDECK MARKETPLACE SETTINGS +# ================================================================================================== + +# Name of the license that the plugin is licensed under. Select the one that you prefer. +# NOTE: GPL license is not compatible with Loupedeck Marketplace. +license: MIT + +# URL of the plugin license. +licenseUrl: https://opensource.org/licenses/MIT + +# URL of the support page where the users can send improvement suggestions and report bugs. +# The URL is shown in Loupedeck Marketplace. The page can be for example a GitHub issues page. +# NOTE: This setting is recommended when publishing the plugin in Loupedeck Marketplace. +supportPageUrl: https://github.com/Steinerd/Loupedeck.AudioSwitcherPlugin/issues + +# URL of the plugin homepage. The URL is shown in Loupedeck Marketplace. +homePageUrl: https://github.com/Steinerd/Loupedeck.AudioSwitcherPlugin