├── VBAudioRouter ├── Usings.cs ├── Assets │ ├── WindowIcon.ico │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── SplashScreen.scale-100.png │ ├── SplashScreen.scale-125.png │ ├── SplashScreen.scale-150.png │ ├── SplashScreen.scale-200.png │ ├── SplashScreen.scale-400.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ ├── Wide310x150Logo.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-48.png │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-24.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ └── Square44x44Logo.altform-lightunplated_targetsize-48.png ├── NativeMethods.txt ├── Properties │ └── launchsettings.json ├── Utils │ ├── GainControl.cs │ ├── SliderTimeSpanValueConverter.cs │ ├── MediaTransportControlsWrapper.cs │ └── Extensions.cs ├── GraphControl │ ├── NodeConnection.cs │ ├── FaderData.cs │ ├── AudioGraphHelper.cs │ ├── IAudioNodeControl.cs │ └── ConnectionHelper.cs ├── Helpers │ └── ResourceExtensions.cs ├── Dialogs │ ├── ErrorDialog.xaml.cs │ └── ErrorDialog.xaml ├── Controls │ ├── Nodes │ │ ├── INodeControl.cs │ │ ├── OutputNodeControl.xaml.cs │ │ ├── OutputNodeControl.xaml │ │ ├── NodeControl.xaml │ │ ├── FileInputNodeControl.xaml │ │ ├── NodeControl.xaml.cs │ │ ├── ProcessInputNodeControl.xaml │ │ ├── FileInputNodeControl.xaml.cs │ │ └── ProcessInputNodeControl.xaml.cs │ ├── ConnectorControl.xaml │ ├── EQDragControl.xaml │ ├── FaderControl.xaml.cs │ ├── EQDragControl.xaml.cs │ └── AudioSessionControl.xaml ├── UI │ ├── MainPage.xaml.cs │ ├── MixViewPage.xaml.cs │ ├── MainPage.xaml │ ├── MixViewPage.xaml │ ├── SpeakerControlPage.xaml │ └── GraphViewPage.xaml.cs ├── AudioInterfaceActivator.cs ├── MainWindow.xaml ├── app.manifest ├── App.xaml ├── MainWindow.xaml.cs ├── App.xaml.cs ├── VBAudioRouter.csproj └── Strings │ └── en-us │ └── Resources.resw ├── Branding ├── logo.xcf ├── audio_black.png ├── audio_blue.png └── audio_white.png ├── VBAudioRouter.UWP ├── HelpPage.xaml.vb ├── Assets │ ├── StoreLogo.backup.png │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── SplashScreen.scale-100.png │ ├── SplashScreen.scale-125.png │ ├── SplashScreen.scale-150.png │ ├── SplashScreen.scale-200.png │ ├── SplashScreen.scale-400.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ ├── Wide310x150Logo.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-48.png │ ├── Fonts │ │ └── FluentIcons │ │ │ ├── Segoe Fluent Icons.ttf │ │ │ └── EULA.txt │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-24.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-48.png │ └── Square44x44Logo.altform-lightunplated_targetsize-256.png ├── AudioGraphControl │ ├── GraphState.vb │ ├── Serialization │ │ ├── IAudioNodeSerializable.vb │ │ └── SerializationHelper.vb │ ├── NodeConnection.vb │ ├── IAudioNodeControl.vb │ └── ConnectionHelper.vb ├── Dialogs │ ├── CloseConfirmDialog.xaml.vb │ ├── OutputDeviceSelectDialog.xaml │ ├── CloseConfirmDialog.xaml │ ├── ErrorDialog.xaml.vb │ ├── ErrorDialog.xaml │ └── OutputDeviceSelectDialog.xaml.vb ├── Utils │ ├── GainControl.vb │ ├── Utils.vb │ ├── SliderTimeSpanValueConverter.vb │ └── ElementWrapper.vb ├── Controls │ ├── Nodes │ │ ├── INodeControl.vb │ │ ├── NodeControl.xaml │ │ ├── SpectrumNodeControl.xaml │ │ ├── OutputNodeControl.xaml │ │ ├── GainNodeControl.xaml.vb │ │ ├── FileInputNodeControl.xaml │ │ ├── SpectrumNodeControl.xaml.vb │ │ ├── MicInputNodeControl.xaml │ │ ├── ProcessInputNodeControl.xaml │ │ ├── GainNodeControl.xaml │ │ ├── LimiterNodeControl.xaml.vb │ │ ├── EQNodeControl.xaml │ │ ├── EchoNodeControl.xaml.vb │ │ ├── OutputNodeControl.xaml.vb │ │ ├── TextToSpeechInputNodeControl.xaml.vb │ │ ├── LimiterNodeControl.xaml │ │ ├── EQNodeControl.xaml.vb │ │ └── TextToSpeechInputNodeControl.xaml │ ├── ConnectorControl.xaml │ ├── EQDragControl.xaml │ ├── EQDragControl.xaml.vb │ └── AudioSessionControl.xaml ├── Program.vb ├── HelpPage.xaml ├── Interop │ ├── IAudioEndpointVolumeCallback.vb │ ├── IAudioSessionEnumerator.vb │ ├── IAudioMeterInformation.vb │ ├── IAudioEndpointVolume.vb │ └── IAudioSessionManager.vb ├── AudioControlPage.xaml ├── My Project │ ├── AssemblyInfo.vb │ └── Default.rd.xml ├── AudioControlPage.xaml.vb ├── WelcomePage.xaml.vb ├── App.xaml ├── SpeakerControlPage.xaml └── Package.appxmanifest ├── VBAudioRouter.Package ├── Assets │ ├── StoreLogo.backup.png │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── SplashScreen.scale-100.png │ ├── SplashScreen.scale-125.png │ ├── SplashScreen.scale-150.png │ ├── SplashScreen.scale-200.png │ ├── SplashScreen.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ ├── Wide310x150Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-48.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-24.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ └── Square44x44Logo.altform-lightunplated_targetsize-48.png └── Package.appxmanifest ├── VBAudioRouter.Capture ├── NativeMethods.txt └── VBAudioRouter.Capture.csproj ├── ShortDev.DirectShow.VirtualDevices.Package ├── Images │ ├── StoreLogo.png │ ├── SplashScreen.scale-200.png │ ├── LockScreenLogo.scale-200.png │ ├── Square44x44Logo.scale-200.png │ ├── Wide310x150Logo.scale-200.png │ ├── Square150x150Logo.scale-200.png │ └── Square44x44Logo.targetsize-24_altform-unplated.png └── Package.appxmanifest ├── VBAudioRouter.Core ├── Contracts │ └── Services │ │ └── IFileService.cs ├── README.md ├── VBAudioRouter.Core.csproj └── Services │ └── FileService.cs ├── Solution.props ├── .vsconfig ├── README.md ├── LICENSE └── .gitattributes /VBAudioRouter/Usings.cs: -------------------------------------------------------------------------------- 1 | global using WinUIEx; 2 | -------------------------------------------------------------------------------- /Branding/logo.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/Branding/logo.xcf -------------------------------------------------------------------------------- /Branding/audio_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/Branding/audio_black.png -------------------------------------------------------------------------------- /Branding/audio_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/Branding/audio_blue.png -------------------------------------------------------------------------------- /Branding/audio_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/Branding/audio_white.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/HelpPage.xaml.vb: -------------------------------------------------------------------------------- 1 | 2 | Public NotInheritable Class HelpPage 3 | Inherits Page 4 | 5 | End Class 6 | -------------------------------------------------------------------------------- /VBAudioRouter/Assets/WindowIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/WindowIcon.ico -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/StoreLogo.backup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/StoreLogo.backup.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/LargeTile.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/LargeTile.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/LargeTile.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/LargeTile.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/LargeTile.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/SmallTile.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/SmallTile.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/SmallTile.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/SmallTile.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/SmallTile.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/StoreLogo.backup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/StoreLogo.backup.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/LargeTile.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/LargeTile.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/LargeTile.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/LargeTile.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/LargeTile.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/SmallTile.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/SmallTile.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/SmallTile.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/SmallTile.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/SmallTile.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/LargeTile.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/LargeTile.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/LargeTile.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/LargeTile.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/LargeTile.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/SmallTile.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/SmallTile.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/SmallTile.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/SmallTile.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/SmallTile.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /VBAudioRouter.Capture/NativeMethods.txt: -------------------------------------------------------------------------------- 1 | IMemoryBufferByteAccess 2 | IActivateAudioInterfaceAsyncOperation 3 | IActivateAudioInterfaceCompletionHandler 4 | ActivateAudioInterfaceAsync -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/AudioGraphControl/GraphState.vb: -------------------------------------------------------------------------------- 1 | Namespace AudioGraphControl 2 | 3 | Public Enum GraphState 4 | Started 5 | Stopped 6 | End Enum 7 | 8 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter/NativeMethods.txt: -------------------------------------------------------------------------------- 1 | IAudioEndpointVolume 2 | IAudioMeterInformation 3 | IAudioSessionManager 4 | IAudioSessionManager2 5 | ActivateAudioInterfaceAsync 6 | IMemoryBufferByteAccess -------------------------------------------------------------------------------- /ShortDev.DirectShow.VirtualDevices.Package/Images/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/ShortDev.DirectShow.VirtualDevices.Package/Images/StoreLogo.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Fonts/FluentIcons/Segoe Fluent Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Fonts/FluentIcons/Segoe Fluent Icons.ttf -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Dialogs/CloseConfirmDialog.xaml.vb: -------------------------------------------------------------------------------- 1 | Namespace Dialogs 2 | 3 | Public NotInheritable Class CloseConfirmDialog 4 | Inherits ContentDialog 5 | End Class 6 | 7 | End Namespace 8 | -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.altform-unplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.altform-unplated_targetsize-24.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-24.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /ShortDev.DirectShow.VirtualDevices.Package/Images/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/ShortDev.DirectShow.VirtualDevices.Package/Images/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /VBAudioRouter/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /ShortDev.DirectShow.VirtualDevices.Package/Images/LockScreenLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/ShortDev.DirectShow.VirtualDevices.Package/Images/LockScreenLogo.scale-200.png -------------------------------------------------------------------------------- /ShortDev.DirectShow.VirtualDevices.Package/Images/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/ShortDev.DirectShow.VirtualDevices.Package/Images/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /ShortDev.DirectShow.VirtualDevices.Package/Images/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/ShortDev.DirectShow.VirtualDevices.Package/Images/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.altform-unplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.altform-unplated_targetsize-24.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /ShortDev.DirectShow.VirtualDevices.Package/Images/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/ShortDev.DirectShow.VirtualDevices.Package/Images/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /VBAudioRouter.Package/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/VBAudioRouter.Package/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /ShortDev.DirectShow.VirtualDevices.Package/Images/Square44x44Logo.targetsize-24_altform-unplated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShortDevelopment/VB-Audio-Router/HEAD/ShortDev.DirectShow.VirtualDevices.Package/Images/Square44x44Logo.targetsize-24_altform-unplated.png -------------------------------------------------------------------------------- /VBAudioRouter/Properties/launchsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "VBAudioRouter (Package)": { 4 | "commandName": "MsixPackage" 5 | }, 6 | "VBAudioRouter (Unpackaged)": { 7 | "commandName": "Project" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /VBAudioRouter/Utils/GainControl.cs: -------------------------------------------------------------------------------- 1 | namespace VBAudioRouter.Utils; 2 | 3 | internal static class GainControl 4 | { 5 | // These are the same values as the ones in xapofx.h 6 | public const double fxeq_min_gain = 0.126; 7 | public const double fxeq_max_gain = 7.94; 8 | } 9 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/AudioGraphControl/Serialization/IAudioNodeSerializable.vb: -------------------------------------------------------------------------------- 1 | Namespace AudioGraphControl.Serialization 2 | 3 | Public Interface IAudioNodeSerializable 4 | Inherits IAudioNodeControl 5 | 6 | Sub ReloadSettings() 7 | 8 | End Interface 9 | 10 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Utils/GainControl.vb: -------------------------------------------------------------------------------- 1 | Namespace Utils 2 | 3 | Public Class GainControl 4 | ' These are the same values as the ones in xapofx.h 5 | Public Const fxeq_min_gain As Double = 0.126 6 | Public Const fxeq_max_gain As Double = 7.94 7 | End Class 8 | 9 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/INodeControl.vb: -------------------------------------------------------------------------------- 1 | Namespace Controls.Nodes 2 | 3 | Public Interface INodeControl 4 | Property TitleBrush As Brush 5 | Property Title As String 6 | 7 | Property NodeContent As UIElement 8 | Property NodePosition As Point 9 | End Interface 10 | 11 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.Core/Contracts/Services/IFileService.cs: -------------------------------------------------------------------------------- 1 | namespace VBAudioRouter.Core.Contracts.Services; 2 | 3 | public interface IFileService 4 | { 5 | T Read(string folderPath, string fileName); 6 | 7 | void Save(string folderPath, string fileName, T content); 8 | 9 | void Delete(string folderPath, string fileName); 10 | } 11 | -------------------------------------------------------------------------------- /VBAudioRouter.Core/README.md: -------------------------------------------------------------------------------- 1 | *Recommended Markdown Viewer: [Markdown Editor](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.MarkdownEditor2)* 2 | 3 | ## Getting Started 4 | 5 | The Core project contains code that can be [reused across multiple application projects](https://docs.microsoft.com/dotnet/standard/net-standard#net-5-and-net-standard). 6 | -------------------------------------------------------------------------------- /VBAudioRouter/GraphControl/NodeConnection.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Shapes; 2 | using VBAudioRouter.Controls; 3 | 4 | namespace VBAudioRouter.GraphControl; 5 | internal struct NodeConnection 6 | { 7 | public ConnectorControl SourceConnector { get; set; } 8 | public ConnectorControl DestinationConnector { get; set; } 9 | public Line Line { get; set; } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /VBAudioRouter/Helpers/ResourceExtensions.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Windows.ApplicationModel.Resources; 2 | 3 | namespace VBAudioRouter.Helpers; 4 | 5 | public static class ResourceExtensions 6 | { 7 | private static readonly ResourceLoader _resourceLoader = new(); 8 | 9 | public static string GetLocalized(this string resourceKey) => _resourceLoader.GetString(resourceKey); 10 | } 11 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/AudioGraphControl/NodeConnection.vb: -------------------------------------------------------------------------------- 1 | Imports VBAudioRouter.Controls 2 | Imports Windows.UI.Xaml.Shapes 3 | 4 | Namespace AudioGraphControl 5 | 6 | Public Structure NodeConnection 7 | Public Property SourceConnector As ConnectorControl 8 | Public Property DestinationConnector As ConnectorControl 9 | Public Property Line As Line 10 | End Structure 11 | 12 | 13 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.Core/VBAudioRouter.Core.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net7.0 4 | VBAudioRouter.Core 5 | x86;x64;arm64;AnyCPU 6 | enable 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Solution.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | $(SolutionDir)\obj\$(Platform)\$(Configuration)\$(MSBuildProjectName)\ 5 | $(SolutionDir)\bin\$(Platform)\$(Configuration)\$(MSBuildProjectName)\ 6 | $(IntDir)Generated Files\ 7 | 8 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Program.vb: -------------------------------------------------------------------------------- 1 | Imports ShortDev.Uwp.FullTrust.Xaml 2 | 3 | Partial Public Class Program 4 | 5 | 6 | Shared Sub Main(ByVal args() As String) 7 | Application.Start(Function(p) New App()) 8 | End Sub 9 | 10 | Public Shared Sub Win32Main(args As String()) 11 | FullTrustApplication.Start(Function(p) New App(), New XamlWindowConfig("VBAudioRouter")) 12 | End Sub 13 | 14 | End Class -------------------------------------------------------------------------------- /VBAudioRouter/Dialogs/ErrorDialog.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Controls; 2 | 3 | namespace VBAudioRouter.Dialogs; 4 | 5 | internal sealed partial class ErrorDialog : ContentDialog 6 | { 7 | public Exception Exception 8 | { 9 | get; 10 | } 11 | 12 | public ErrorDialog(Exception exception) 13 | { 14 | InitializeComponent(); 15 | 16 | Exception = exception; 17 | DataContext = this; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Utils/Utils.vb: -------------------------------------------------------------------------------- 1 | Namespace Utils 2 | 3 | Public Class Utils 4 | 5 | Public Shared Sub CloseAllDialogs() 6 | For Each popup In VisualTreeHelper.GetOpenPopups(Window.Current) 7 | Dim legacyDialog As ContentDialog = TryCast(popup?.Child, ContentDialog) 8 | If legacyDialog IsNot Nothing Then 9 | legacyDialog.Hide() 10 | End If 11 | Next 12 | End Sub 13 | 14 | End Class 15 | 16 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter/GraphControl/FaderData.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | using System.Collections.ObjectModel; 3 | using Windows.Media.Audio; 4 | 5 | namespace VBAudioRouter.GraphControl; 6 | internal sealed class FaderData(AudioGraph graph) : ObservableObject 7 | { 8 | public AudioGraph AudioGraph { get; } = graph; 9 | public AudioSubmixNode ConnectionNode { get; } = graph.CreateSubmixNode(); 10 | 11 | public ObservableCollection> AudioNodes { get; } = []; 12 | } 13 | -------------------------------------------------------------------------------- /VBAudioRouter/Controls/Nodes/INodeControl.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | using Microsoft.UI.Xaml.Media; 3 | using Windows.Foundation; 4 | 5 | namespace VBAudioRouter.Controls.Nodes; 6 | internal interface INodeControl 7 | { 8 | Brush TitleBrush 9 | { 10 | get; set; 11 | } 12 | string Title 13 | { 14 | get; set; 15 | } 16 | 17 | UIElement NodeContent 18 | { 19 | get; set; 20 | } 21 | DependencyObject Parent 22 | { 23 | get; 24 | } 25 | Point NodePosition 26 | { 27 | get; set; 28 | } 29 | } -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Assets/Fonts/FluentIcons/EULA.txt: -------------------------------------------------------------------------------- 1 | You may use the Segoe and icon fonts, or glyphs included in this file (“Software”) solely to design, develop and test your programs that run on a Microsoft Platform, a Microsoft Platform includes but is not limited to any hardware or software product or service branded by trademark, trade dress, copyright or some other recognized means, as a product or service of Microsoft. This license does not grant you the right to distribute or sublicense all or part of the Software to any third party. By using the Software, you agree to these terms. If you do not agree to these terms, do not use the Software. -------------------------------------------------------------------------------- /VBAudioRouter/UI/MainPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Controls; 2 | using Windows.System; 3 | 4 | namespace VBAudioRouter.UI; 5 | 6 | public sealed partial class MainPage : Page 7 | { 8 | public MainPage() 9 | { 10 | InitializeComponent(); 11 | } 12 | 13 | private void NavigationView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args) 14 | { 15 | 16 | } 17 | 18 | private async void NewInstanceNavigationViewItem_Tapped(object sender, Microsoft.UI.Xaml.Input.TappedRoutedEventArgs e) 19 | { 20 | await Launcher.LaunchUriAsync(new Uri("vb-audio-router://")); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/HelpPage.xaml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.vsconfig: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "components": [ 4 | "Microsoft.Component.MSBuild", 5 | "Microsoft.NetCore.Component.Runtime.7.0", 6 | "Microsoft.NetCore.Component.SDK", 7 | "Microsoft.VisualStudio.Component.ManagedDesktop.Core", 8 | "Microsoft.VisualStudio.Component.ManagedDesktop.Prerequisites", 9 | "Microsoft.VisualStudio.Component.NuGet", 10 | "Microsoft.VisualStudio.Component.Windows10SDK.19041", 11 | "Microsoft.VisualStudio.Component.Windows10SDK", 12 | "Microsoft.VisualStudio.ComponentGroup.MSIX.Packaging", 13 | "Microsoft.VisualStudio.ComponentGroup.WindowsAppSDK.Cs", 14 | "Microsoft.VisualStudio.Workload.ManagedDesktop" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Interop/IAudioEndpointVolumeCallback.vb: -------------------------------------------------------------------------------- 1 | Imports System.Runtime.InteropServices 2 | 3 | Namespace Interop 4 | 5 | ''' 6 | '''
7 | ''' 8 | '''
9 | 10 | Public Interface IAudioEndpointVolumeCallback 11 | Sub OnNotify(ByVal notifyData As IntPtr) 12 | End Interface 13 | 14 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.Capture/VBAudioRouter.Capture.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net7.0-windows10.0.22621.0 4 | 10.0.17763.0 5 | true 6 | 12 7 | 8 | 9 | 10 | all 11 | runtime; build; native; contentfiles; analyzers; buildtransitive 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /VBAudioRouter/AudioInterfaceActivator.cs: -------------------------------------------------------------------------------- 1 | using VBAudioRouter.Capture; 2 | using Windows.Win32; 3 | 4 | namespace VBAudioRouter; 5 | internal static class AudioInterfaceActivator 6 | { 7 | public static ValueTask ActivateAudioInterfaceAsync(string deviceId) where T : class 8 | { 9 | ActivateAudioInterfaceCompletionHandler handler = new(); 10 | PInvoke.ActivateAudioInterfaceAsync(deviceId, typeof(T).GUID, activationParams: null, handler, out var resultHandler); 11 | handler.WaitForCompletion(); 12 | 13 | resultHandler.GetActivateResult(out var hres, out var result); 14 | hres.ThrowOnFailure(); 15 | 16 | return ValueTask.FromResult((T)result); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /VBAudioRouter/MainWindow.xaml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /VBAudioRouter/Controls/ConnectorControl.xaml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/ConnectorControl.xaml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /VBAudioRouter/Utils/SliderTimeSpanValueConverter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Data; 2 | 3 | namespace VBAudioRouter.Utils; 4 | 5 | internal sealed class SliderTimeSpanValueConverter : IValueConverter 6 | { 7 | public object Convert(object value, Type targetType, object parameter, string language) 8 | { 9 | if (targetType == typeof(string)) 10 | return TimeSpan.FromMilliseconds(System.Convert.ToDouble(value)).ToString(@"mm\:ss"); 11 | 12 | if (value is TimeSpan timespan) 13 | return timespan.TotalMilliseconds; 14 | 15 | throw new NotImplementedException(); 16 | } 17 | 18 | public object ConvertBack(object value, Type targetType, object parameter, string language) 19 | => Convert(value, targetType, parameter, language); 20 | } 21 | -------------------------------------------------------------------------------- /VBAudioRouter/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | true/PM 12 | PerMonitorV2, PerMonitor 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Dialogs/OutputDeviceSelectDialog.xaml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Interop/IAudioSessionEnumerator.vb: -------------------------------------------------------------------------------- 1 | Imports System.Runtime.InteropServices 2 | Imports NAudio.CoreAudioApi.Interfaces 3 | 4 | Namespace Interop 5 | 6 | ''' 7 | ''' Documentation
8 | ''' Implementation 9 | '''
10 | 11 | Public Interface IAudioSessionEnumerator 12 | Function GetCount() As Integer 13 | Function GetSession(ByVal sessionCount As Integer) As IAudioSessionControl 14 | End Interface 15 | 16 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Dialogs/CloseConfirmDialog.xaml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | 16 | Do you really want to close the application?! 17 | Closing the application might end in a lose of data! 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /VBAudioRouter/Controls/EQDragControl.xaml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/EQDragControl.xaml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Dialogs/ErrorDialog.xaml.vb: -------------------------------------------------------------------------------- 1 | Namespace Dialogs 2 | 3 | Public NotInheritable Class ErrorDialog 4 | Inherits ContentDialog 5 | 6 | Public Property Exception As Exception 7 | 8 | Public Sub New(exception As Exception) 9 | InitializeComponent() 10 | 11 | Me.Exception = exception 12 | DataContext = Me 13 | End Sub 14 | 15 | Public Shadows Property Title As String 16 | Get 17 | Return DirectCast(MyBase.Title, String) 18 | End Get 19 | Set(value As String) 20 | MyBase.Title = value 21 | ' Call Dispatcher.RunIdleAsync(Sub() DirectCast(DirectCast(FindName("Title"), FrameworkElement).FindName("TitleTextBlock"), TextBlock).Text = value) 22 | 'TitleTextBlock.Text = value 23 | End Set 24 | End Property 25 | 26 | End Class 27 | 28 | 29 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Interop/IAudioMeterInformation.vb: -------------------------------------------------------------------------------- 1 | Imports System.Runtime.InteropServices 2 | 3 | Namespace Interop 4 | 5 | ''' 6 | ''' Documentation
7 | ''' Implementation 8 | '''
9 | 10 | Public Interface IAudioMeterInformation 11 | Function GetPeakValue() As Single 12 | Function GetMeteringChannelCount() As Integer 13 | Function GetChannelsPeakValues(ByVal u32ChannelCount As Integer, <[In]> ByVal afPeakValues As IntPtr) As Integer 14 | Function QueryHardwareSupport( ByRef pdwHardwareSupportMask As Integer) As Integer 15 | End Interface 16 | 17 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.UWP/AudioGraphControl/IAudioNodeControl.vb: -------------------------------------------------------------------------------- 1 | 2 | Imports VBAudioRouter.Controls 3 | Imports Windows.Media.Audio 4 | 5 | Namespace AudioGraphControl 6 | 7 | Public Interface IAudioNodeControl 8 | ReadOnly Property BaseAudioNode As IAudioNode 9 | 10 | #Region "State" 11 | Function Initialize(graph As AudioGraph) As Task 12 | Sub OnStateChanged(state As GraphState) 13 | #End Region 14 | 15 | Property Canvas As Canvas 16 | End Interface 17 | 18 | Public Interface IAudioNodeControlInput 19 | Inherits IAudioNodeControl 20 | 21 | ReadOnly Property IncomingConnector As ConnectorControl 22 | End Interface 23 | 24 | Public Interface IAudioNodeControlEffect 25 | Inherits IAudioNodeControl 26 | End Interface 27 | 28 | Public Interface IAudioNodeControlOutput 29 | Inherits IAudioNodeControl 30 | 31 | ReadOnly Property OutgoingConnector As ConnectorControl 32 | End Interface 33 | 34 | End Namespace 35 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/AudioControlPage.xaml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Utils/SliderTimeSpanValueConverter.vb: -------------------------------------------------------------------------------- 1 | Namespace Utils 2 | 3 | Public Class SliderTimeSpanValueConverter 4 | Implements IValueConverter 5 | 6 | Public Function Convert(value As Object, targetType As Type, parameter As Object, language As String) As Object Implements IValueConverter.Convert 7 | If targetType = GetType(String) Then 8 | Return TimeSpan.FromMilliseconds(CType(value, Double)).ToString("mm\:ss") 9 | ElseIf value.GetType() = GetType(TimeSpan) Then 10 | Return DirectCast(value, TimeSpan).TotalMilliseconds 11 | Else 12 | Throw New NotImplementedException() 13 | End If 14 | End Function 15 | 16 | Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, language As String) As Object Implements IValueConverter.ConvertBack 17 | Return Convert(value, targetType, parameter, language) 18 | End Function 19 | End Class 20 | 21 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter/Controls/Nodes/OutputNodeControl.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Controls; 2 | using VBAudioRouter.GraphControl; 3 | using Windows.Media.Audio; 4 | 5 | namespace VBAudioRouter.Controls.Nodes; 6 | 7 | internal sealed partial class OutputNodeControl : UserControl, IAudioOutputNodeControl, IAudioNodeControlFactory 8 | { 9 | public IAudioNode GraphNode { get; } 10 | public OutputNodeControl(IAudioNode node) 11 | { 12 | GraphNode = node; 13 | 14 | InitializeComponent(); 15 | } 16 | 17 | public Canvas? Canvas { get; set; } 18 | 19 | public ConnectorControl IncomingConnector => IncomingConnectorControl; 20 | 21 | public static async ValueTask CreateAsync(AudioGraph graph) 22 | { 23 | var result = await graph.CreateDeviceOutputNodeAsync(); 24 | if (result.Status != AudioDeviceNodeCreationStatus.Success) 25 | throw result.ExtendedError; 26 | 27 | return new(result.DeviceOutputNode); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VB-Audio-Router 2 | VB-Audio-Router is an advanced audio routing application build with UWP and the WinRT Audio Graph API. 3 | Learn more in the [Wiki](https://github.com/ShortDevelopment/VB-Audio-Rooter/wiki). 4 | 5 | [![grafik](https://img.shields.io/static/v1?label=Microsoft%20Store&message=Download&color=0078D6&style=for-the-badge&logo=microsoft)](https://www.microsoft.com/store/apps/9P2XZ0G2C9PD) 6 | 7 | ## Features 8 | - Audio Routing 9 | - Inputs 10 | - Mic. 11 | - File 12 | - TTS 13 | - **Single app capture** 14 | - Effects 15 | - EQ (Windows impl) 16 | - Reverb (Windows impl) 17 | - Echo (Windows impl) 18 | - Limiter (Windows impl) 19 | - Transforms 20 | - Gain 21 | - Output 22 | - Selected speaker (currently only one) 23 | - Spectrum 24 | 25 | ## Upcoming features (No ETA) 26 | - File output 27 | - Better EQ 28 | - Multiple outputs 29 | - Network streaming 30 | - **Virtual devices** (Virtual audio cable) 31 | 32 | ## Contribute 33 | Contributions are welcome! 34 | Just open a PR. 35 | -------------------------------------------------------------------------------- /VBAudioRouter/Controls/FaderControl.xaml.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | using Microsoft.UI.Xaml; 3 | using Microsoft.UI.Xaml.Controls; 4 | using VBAudioRouter.GraphControl; 5 | using VBAudioRouter.UI; 6 | 7 | namespace VBAudioRouter.Controls; 8 | 9 | [ObservableObject] 10 | internal sealed partial class FaderControl : UserControl 11 | { 12 | public FaderControl() 13 | { 14 | InitializeComponent(); 15 | } 16 | 17 | [ObservableProperty] 18 | private FaderData? _faderData = null; 19 | 20 | private async void OpenGraphButton_Click(object sender, RoutedEventArgs e) 21 | { 22 | if (FaderData is null) 23 | throw new InvalidOperationException("No fader data assigned"); 24 | 25 | await new ContentDialog() 26 | { 27 | XamlRoot = XamlRoot, 28 | Content = new GraphViewPage(FaderData), 29 | HorizontalAlignment = HorizontalAlignment.Stretch, 30 | VerticalAlignment = VerticalAlignment.Stretch 31 | }.ShowAsync(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /VBAudioRouter/GraphControl/AudioGraphHelper.cs: -------------------------------------------------------------------------------- 1 | using Windows.Devices.Enumeration; 2 | using Windows.Media.Audio; 3 | using Windows.Media.Render; 4 | 5 | namespace VBAudioRouter.GraphControl; 6 | 7 | internal static class AudioGraphHelper 8 | { 9 | public static async ValueTask CreateGraphAsync(DeviceInformation? renderDevice = null, AudioRenderCategory category = AudioRenderCategory.Media) 10 | { 11 | AudioGraphSettings settings = new(category) 12 | { 13 | QuantumSizeSelectionMode = QuantumSizeSelectionMode.LowestLatency, 14 | PrimaryRenderDevice = renderDevice 15 | }; 16 | return await CreateGraphAsync(settings); 17 | } 18 | 19 | public static async ValueTask CreateGraphAsync(AudioGraphSettings settings) 20 | { 21 | var result = await AudioGraph.CreateAsync(settings); 22 | if (result.Status != AudioGraphCreationStatus.Success) 23 | throw result.ExtendedError; 24 | 25 | var graph = result.Graph; 26 | graph.Start(); 27 | return graph; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 ShortDevelopment 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/My Project/AssemblyInfo.vb: -------------------------------------------------------------------------------- 1 | Imports System 2 | Imports System.Reflection 3 | Imports System.Runtime.InteropServices 4 | 5 | ' Allgemeine Informationen über eine Assembly werden über die folgende 6 | ' Attributgruppe gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, 7 | ' die einer Assembly zugeordnet sind. 8 | 9 | ' Werte der Assemblyattribute überprüfen 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | ' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: 19 | ' 20 | ' Hauptversion 21 | ' Nebenversion 22 | ' Buildnummer 23 | ' Revision 24 | ' 25 | ' Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, 26 | ' indem Sie "*" wie unten gezeigt eingeben: 27 | ' 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /VBAudioRouter/App.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | #232323 12 | #272727 13 | #333333 14 | #9E343E 15 | #8D802F 16 | #89D185 17 | #D97C6A 18 | #3F3F3F 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /VBAudioRouter/UI/MixViewPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | using Microsoft.UI.Xaml.Controls; 3 | using System.Collections.ObjectModel; 4 | using VBAudioRouter.GraphControl; 5 | using Windows.Media.Audio; 6 | 7 | namespace VBAudioRouter.UI; 8 | 9 | internal sealed partial class MixViewPage : Page 10 | { 11 | public MixViewPage() 12 | { 13 | InitializeComponent(); 14 | } 15 | 16 | AudioGraph _graph = null!; 17 | AudioDeviceOutputNode _outputNode = null!; 18 | private async void MixViewPage_Loaded(object sender, RoutedEventArgs e) 19 | { 20 | _graph = await AudioGraphHelper.CreateGraphAsync(); 21 | var result = await _graph.CreateDeviceOutputNodeAsync(); 22 | if (result.Status != AudioDeviceNodeCreationStatus.Success) 23 | throw result.ExtendedError; 24 | 25 | _outputNode = result.DeviceOutputNode; 26 | } 27 | 28 | public ObservableCollection Faders { get; } = []; 29 | private void AddFaderButton_Click(object sender, RoutedEventArgs e) 30 | { 31 | FaderData faderData = new(_graph); 32 | faderData.ConnectionNode.AddOutgoingConnection(_outputNode); 33 | Faders.Add(faderData); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/AudioControlPage.xaml.vb: -------------------------------------------------------------------------------- 1 | 2 | Imports Windows.Devices.Enumeration 3 | Imports Windows.Media.Devices 4 | 5 | Public NotInheritable Class AudioControlPage 6 | Inherits Page 7 | 8 | Private Property AudioRenderDevices As DeviceInformationCollection 9 | Private Async Sub OutputDeviceSelectDialog_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 10 | If DesignMode.DesignModeEnabled Or DesignMode.DesignMode2Enabled Then Exit Sub 11 | AudioRenderDevices = Await DeviceInformation.FindAllAsync(MediaDevice.GetAudioRenderSelector()) 12 | OutputDevicesComboBox.ItemsSource = AudioRenderDevices.Select(Function(device) device.Name).ToList() 13 | 14 | For i As Integer = 0 To AudioRenderDevices.Count - 1 15 | If AudioRenderDevices(i).IsDefault Then 16 | OutputDevicesComboBox.SelectedIndex = i 17 | Exit For 18 | End If 19 | Next 20 | End Sub 21 | 22 | Private Sub OutputDevicesComboBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) 23 | ContentFrame.Navigate(GetType(SpeakerControlPage), AudioRenderDevices(OutputDevicesComboBox.SelectedIndex).Id) 24 | End Sub 25 | End Class 26 | -------------------------------------------------------------------------------- /VBAudioRouter/Dialogs/ErrorDialog.xaml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Dialogs/ErrorDialog.xaml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /VBAudioRouter.Core/Services/FileService.cs: -------------------------------------------------------------------------------- 1 | using System.Text; 2 | 3 | using Newtonsoft.Json; 4 | 5 | using VBAudioRouter.Core.Contracts.Services; 6 | 7 | namespace VBAudioRouter.Core.Services; 8 | 9 | public class FileService : IFileService 10 | { 11 | public T Read(string folderPath, string fileName) 12 | { 13 | var path = Path.Combine(folderPath, fileName); 14 | if (File.Exists(path)) 15 | { 16 | var json = File.ReadAllText(path); 17 | return JsonConvert.DeserializeObject(json); 18 | } 19 | 20 | return default; 21 | } 22 | 23 | public void Save(string folderPath, string fileName, T content) 24 | { 25 | if (!Directory.Exists(folderPath)) 26 | { 27 | Directory.CreateDirectory(folderPath); 28 | } 29 | 30 | var fileContent = JsonConvert.SerializeObject(content); 31 | File.WriteAllText(Path.Combine(folderPath, fileName), fileContent, Encoding.UTF8); 32 | } 33 | 34 | public void Delete(string folderPath, string fileName) 35 | { 36 | if (fileName != null && File.Exists(Path.Combine(folderPath, fileName))) 37 | { 38 | File.Delete(Path.Combine(folderPath, fileName)); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /VBAudioRouter/Controls/Nodes/OutputNodeControl.xaml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/EQDragControl.xaml.vb: -------------------------------------------------------------------------------- 1 | 2 | Namespace Controls 3 | Public NotInheritable Class EQDragControl 4 | Inherits UserControl 5 | 6 | Public Property Canvas As Canvas 7 | Public Property Index As Integer 8 | 9 | Public Event ValueChanged As EventHandler(Of Point) 10 | 11 | Public Sub SetPosition(p As Point) 12 | Dim maxX = Canvas.ActualWidth - Me.ActualWidth 13 | Dim maxY = Canvas.ActualHeight - Me.ActualHeight 14 | positionTransform.TranslateX = p.X * maxX 15 | positionTransform.TranslateY = (1 - p.Y) * maxY 16 | End Sub 17 | 18 | Private Sub Grid_ManipulationDelta(sender As Object, e As ManipulationDeltaRoutedEventArgs) 19 | Dim maxX = Canvas.ActualWidth - Me.ActualWidth 20 | Dim maxY = Canvas.ActualHeight - Me.ActualHeight 21 | positionTransform.TranslateX = Math.Min(Math.Max(positionTransform.TranslateX + e.Delta.Translation.X, 0), maxX) 22 | positionTransform.TranslateY = Math.Min(Math.Max(positionTransform.TranslateY + e.Delta.Translation.Y, 0), maxY) 23 | RaiseEvent ValueChanged(Me, New Point(positionTransform.TranslateX / maxX, 1 - (positionTransform.TranslateY / maxY))) 24 | End Sub 25 | End Class 26 | 27 | End Namespace 28 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/NodeControl.xaml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /VBAudioRouter/MainWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using VBAudioRouter.Helpers; 2 | 3 | using Windows.UI.ViewManagement; 4 | 5 | namespace VBAudioRouter; 6 | 7 | public sealed partial class MainWindow : WindowEx 8 | { 9 | private Microsoft.UI.Dispatching.DispatcherQueue dispatcherQueue; 10 | 11 | private UISettings settings; 12 | 13 | public MainWindow() 14 | { 15 | InitializeComponent(); 16 | 17 | AppWindow.SetIcon(Path.Combine(AppContext.BaseDirectory, "Assets/WindowIcon.ico")); 18 | Title = "AppDisplayName".GetLocalized(); 19 | 20 | // Theme change code picked from https://github.com/microsoft/WinUI-Gallery/pull/1239 21 | dispatcherQueue = Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread(); 22 | settings = new UISettings(); 23 | settings.ColorValuesChanged += Settings_ColorValuesChanged; // cannot use FrameworkElement.ActualThemeChanged event 24 | } 25 | 26 | // this handles updating the caption button colors correctly when indows system theme is changed 27 | // while the app is open 28 | private void Settings_ColorValuesChanged(UISettings sender, object args) 29 | { 30 | // This calls comes off-thread, hence we will need to dispatch it to current app's thread 31 | dispatcherQueue.TryEnqueue(() => 32 | { 33 | TitleBarHelper.ApplySystemThemeToCaptionButtons(); 34 | }); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /VBAudioRouter/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | 3 | namespace VBAudioRouter; 4 | 5 | // To learn more about WinUI 3, see https://docs.microsoft.com/windows/apps/winui/winui3/. 6 | public partial class App : Application 7 | { 8 | // The .NET Generic Host provides dependency injection, configuration, logging, and other services. 9 | // https://docs.microsoft.com/dotnet/core/extensions/generic-host 10 | // https://docs.microsoft.com/dotnet/core/extensions/dependency-injection 11 | // https://docs.microsoft.com/dotnet/core/extensions/configuration 12 | // https://docs.microsoft.com/dotnet/core/extensions/logging 13 | 14 | public static WindowEx MainWindow { get; } = new MainWindow(); 15 | 16 | public static UIElement? AppTitlebar 17 | { 18 | get; set; 19 | } 20 | 21 | public App() 22 | { 23 | InitializeComponent(); 24 | 25 | UnhandledException += App_UnhandledException; 26 | } 27 | 28 | private void App_UnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e) 29 | { 30 | // TODO: Log and handle exceptions as appropriate. 31 | // https://docs.microsoft.com/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.application.unhandledexception. 32 | } 33 | 34 | protected override void OnLaunched(LaunchActivatedEventArgs args) 35 | { 36 | base.OnLaunched(args); 37 | 38 | MainWindow.Activate(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/WelcomePage.xaml.vb: -------------------------------------------------------------------------------- 1 | Imports System.Runtime.InteropServices 2 | Imports Windows.System 3 | 4 | Public NotInheritable Class WelcomePage 5 | Inherits Page 6 | 7 | Public Sub New() 8 | InitializeComponent() 9 | End Sub 10 | 11 | Private Sub NavigationView_SelectionChanged(sender As Microsoft.UI.Xaml.Controls.NavigationView, args As Microsoft.UI.Xaml.Controls.NavigationViewSelectionChangedEventArgs) 12 | Dim navOptions As New FrameNavigationOptions() 13 | navOptions.TransitionInfoOverride = args.RecommendedNavigationTransitionInfo 14 | 15 | Select Case DirectCast(DirectCast(args.SelectedItem, Microsoft.UI.Xaml.Controls.NavigationViewItem).Tag, String) 16 | Case "Home" 17 | Throw New NotImplementedException() 18 | Case "Edit" 19 | ContentFrame.NavigateToType(GetType(GraphViewPage), Nothing, navOptions) 20 | Case "AudioControl" 21 | ContentFrame.NavigateToType(GetType(AudioControlPage), Nothing, navOptions) 22 | Case "VirtualDevices" 23 | Throw New NotImplementedException() 24 | Case "Help" 25 | ContentFrame.NavigateToType(GetType(HelpPage), Nothing, navOptions) 26 | End Select 27 | End Sub 28 | 29 | Private Async Sub NewInstance_Tapped(sender As Object, e As TappedRoutedEventArgs) 30 | Await Launcher.LaunchUriAsync(New Uri("vb-audio-router://")) 31 | End Sub 32 | End Class 33 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/SpectrumNodeControl.xaml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/My Project/Default.rd.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /VBAudioRouter/Controls/Nodes/NodeControl.xaml: -------------------------------------------------------------------------------- 1 | 15 | 16 | 17 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Dialogs/OutputDeviceSelectDialog.xaml.vb: -------------------------------------------------------------------------------- 1 | Imports Windows.Devices.Enumeration 2 | Imports Windows.Media.Devices 3 | 4 | Namespace Dialogs 5 | 6 | Public NotInheritable Class OutputDeviceSelectDialog 7 | Inherits ContentDialog 8 | 9 | Private Property AudioRenderDevices As DeviceInformationCollection 10 | Private Async Sub OutputDeviceSelectDialog_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 11 | If DesignMode.DesignModeEnabled Or DesignMode.DesignMode2Enabled Then Exit Sub 12 | AudioRenderDevices = Await DeviceInformation.FindAllAsync(MediaDevice.GetAudioRenderSelector()) 13 | OutputDevicesComboBox.ItemsSource = AudioRenderDevices.Select(Function(device) device.Name).ToList() 14 | 15 | For i As Integer = 0 To AudioRenderDevices.Count - 1 16 | If AudioRenderDevices.Item(i).IsDefault Then 17 | OutputDevicesComboBox.SelectedIndex = i 18 | Exit For 19 | End If 20 | Next 21 | End Sub 22 | 23 | Public Property SelectedRenderDevice As DeviceInformation 24 | 25 | Private Sub ContentDialog_PrimaryButtonClick(sender As ContentDialog, args As ContentDialogButtonClickEventArgs) 26 | If OutputDevicesComboBox.SelectedIndex < 0 Then Exit Sub 27 | SelectedRenderDevice = AudioRenderDevices(OutputDevicesComboBox.SelectedIndex) 28 | End Sub 29 | 30 | 31 | End Class 32 | 33 | 34 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/OutputNodeControl.xaml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /VBAudioRouter/GraphControl/IAudioNodeControl.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Controls; 2 | using System.Text; 3 | using VBAudioRouter.Controls; 4 | using Windows.Media.Audio; 5 | 6 | namespace VBAudioRouter.GraphControl; 7 | 8 | internal interface IAudioNodeControl where TNode : IAudioNode 9 | { 10 | TNode? GraphNode { get; } 11 | Canvas? Canvas { get; set; } 12 | } 13 | 14 | internal interface IAudioNodeControlFactory where TSelf : IAudioNodeControl 15 | { 16 | static abstract ValueTask CreateAsync(AudioGraph graph); 17 | static virtual string DisplayName 18 | { 19 | get 20 | { 21 | var typeName = typeof(TSelf).GetType().Name.AsSpan(); 22 | 23 | StringBuilder builder = new(); 24 | for (int i = 0; i < typeName.Length; i++) 25 | { 26 | char c = typeName[i]; 27 | 28 | if (c == 'N') // ToDo: Better check for "NodeControl" 29 | break; 30 | 31 | if (char.IsUpper(c)) 32 | builder.Append(' '); 33 | 34 | builder.Append(c); 35 | } 36 | 37 | return builder.ToString(); 38 | } 39 | } 40 | } 41 | 42 | internal interface IAudioInputNodeControl : IAudioNodeControl 43 | where TNode : IAudioInputNode 44 | { 45 | ConnectorControl OutgoingConnector { get; } 46 | } 47 | 48 | internal interface IAudioEffectNodeControl : IAudioNodeControl 49 | { 50 | } 51 | 52 | internal interface IAudioOutputNodeControl : IAudioNodeControl 53 | where TNode : IAudioNode 54 | { 55 | ConnectorControl IncomingConnector { get; } 56 | } -------------------------------------------------------------------------------- /VBAudioRouter/Controls/EQDragControl.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Globalization; 5 | using System.IO; 6 | using System.Linq; 7 | using System.Reflection; 8 | using System.Runtime.CompilerServices; 9 | using System.Security; 10 | using System.Text; 11 | using System.Threading.Tasks; 12 | using Microsoft.UI.Xaml.Controls; 13 | using Microsoft.UI.Xaml.Input; 14 | using Microsoft.VisualBasic; 15 | using Windows.Foundation; 16 | 17 | namespace VBAudioRouter.Controls; 18 | 19 | public sealed partial class EQDragControl : UserControl 20 | { 21 | public Canvas Canvas 22 | { 23 | get; set; 24 | } 25 | public int Index 26 | { 27 | get; set; 28 | } 29 | 30 | public event EventHandler ValueChanged; 31 | 32 | public void SetPosition(Point p) 33 | { 34 | var maxX = Canvas.ActualWidth - ActualWidth; 35 | var maxY = Canvas.ActualHeight - ActualHeight; 36 | positionTransform.TranslateX = p.X * maxX; 37 | positionTransform.TranslateY = (1 - p.Y) * maxY; 38 | } 39 | 40 | private void Grid_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) 41 | { 42 | var maxX = Canvas.ActualWidth - ActualWidth; 43 | var maxY = Canvas.ActualHeight - ActualHeight; 44 | positionTransform.TranslateX = Math.Min(Math.Max(positionTransform.TranslateX + e.Delta.Translation.X, 0), maxX); 45 | positionTransform.TranslateY = Math.Min(Math.Max(positionTransform.TranslateY + e.Delta.Translation.Y, 0), maxY); 46 | ValueChanged?.Invoke(this, new Point(positionTransform.TranslateX / (double)maxX, 1 - (positionTransform.TranslateY / (double)maxY))); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /VBAudioRouter/UI/MainPage.xaml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Utils/ElementWrapper.vb: -------------------------------------------------------------------------------- 1 | Imports System.Reflection 2 | 3 | Namespace Utils 4 | 5 | Public Class ElementWrapper(Of T As FrameworkElement) 6 | 7 | #Region "Constructor" 8 | Public ReadOnly Property BaseControl As T 9 | 10 | Public Sub New(control As T) 11 | Me.BaseControl = control 12 | End Sub 13 | #End Region 14 | 15 | Public Sub Initialize() 16 | Dim fields = Me.GetType().GetFields(BindingFlags.NonPublic Or BindingFlags.CreateInstance Or BindingFlags.Instance) 17 | Dim filteredFields = fields.AsParallel().Where(Function(x) x.GetCustomAttributes(False).Select(Function(attr) attr.GetType()).Contains(GetType(ElementChildReferenceAttribute))).ToArray() 18 | 19 | For Each field As FieldInfo In filteredFields 20 | '' WithEvents fields are translated to properties with the same name 21 | '' The attribute remains on the backing field with the prefix "_" 22 | ' Calculate the real property name and therefor the name of the element 23 | Dim propName As String = field.Name.Replace("_", "") 24 | ' Find property 25 | Dim [property] As PropertyInfo = Me.GetType().GetProperty(propName, BindingFlags.CreateInstance Or BindingFlags.Instance Or BindingFlags.NonPublic) 26 | ' Find element in VisualTree (by name) 27 | Dim obj As FrameworkElement = BaseControl.FindNameRecursive(propName) 28 | ' Set value of property and let the (compiler generated) property update all the events 29 | [property].SetValue(Me, obj) 30 | Next 31 | End Sub 32 | End Class 33 | 34 | 35 | Friend Class ElementChildReferenceAttribute 36 | Inherits Attribute 37 | End Class 38 | 39 | End Namespace -------------------------------------------------------------------------------- /ShortDev.DirectShow.VirtualDevices.Package/Package.appxmanifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 13 | 14 | 15 | ShortDev.DirectShow.VirtualDevices.Package 16 | lukas 17 | Images\StoreLogo.png 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /VBAudioRouter/Controls/Nodes/FileInputNodeControl.xaml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/EQNodeControl.xaml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/EchoNodeControl.xaml.vb: -------------------------------------------------------------------------------- 1 | 2 | Imports VBAudioRouter.AudioGraphControl 3 | Imports VBAudioRouter.AudioGraphControl.Serialization 4 | Imports Windows.Media.Audio 5 | 6 | Namespace Controls.Nodes 7 | 8 | Public NotInheritable Class EchoNodeControl 9 | Inherits UserControl 10 | Implements IAudioNodeControl, IAudioNodeControlInput, IAudioNodeControlEffect, IAudioNodeControlOutput, IAudioNodeSerializable 11 | 12 | Public Sub New() 13 | InitializeComponent() 14 | End Sub 15 | 16 | #Region "Identity" 17 | Public Property Canvas As Canvas Implements IAudioNodeControl.Canvas 18 | Public ReadOnly Property BaseAudioNode As IAudioNode Implements IAudioNodeControl.BaseAudioNode 19 | 20 | Public ReadOnly Property OutgoingConnector As ConnectorControl Implements IAudioNodeControlOutput.OutgoingConnector 21 | Get 22 | Return OutgoingConnectorControl 23 | End Get 24 | End Property 25 | Public ReadOnly Property IncomingConnector As ConnectorControl Implements IAudioNodeControlInput.IncomingConnector 26 | Get 27 | Return IncomingConnectorControl 28 | End Get 29 | End Property 30 | #End Region 31 | 32 | Public Property EchoEffect As EchoEffectDefinition 33 | 34 | Dim isInitialized As Boolean = False 35 | Public Async Function Initialize(graph As AudioGraph) As Task Implements IAudioNodeControl.Initialize 36 | _BaseAudioNode = graph.CreateSubmixNode() 37 | EchoEffect = New EchoEffectDefinition(graph) 38 | BaseAudioNode.EffectDefinitions.Add(EchoEffect) 39 | 40 | ReloadSettings() 41 | 42 | ' Important because the value changed event will otherwise override default settings! 43 | isInitialized = True 44 | End Function 45 | 46 | Public Sub ReloadSettings() Implements IAudioNodeSerializable.ReloadSettings 47 | DelayTimeRadialGauge.Value = EchoEffect.Delay 48 | FeedbackTimeRadialGauge.Value = EchoEffect.Feedback 49 | 50 | DryWetSlider.Value = EchoEffect.WetDryMix * 100 51 | End Sub 52 | 53 | Public Sub OnStateChanged(state As GraphState) Implements IAudioNodeControl.OnStateChanged : End Sub 54 | 55 | Private Sub RadialGauge_ValueChanged(sender As Object, e As RangeBaseValueChangedEventArgs) 56 | If EchoEffect Is Nothing Or Not isInitialized Then Exit Sub 57 | 58 | EchoEffect.Delay = DelayTimeRadialGauge.Value 59 | EchoEffect.Feedback = FeedbackTimeRadialGauge.Value 60 | 61 | EchoEffect.WetDryMix = DryWetSlider.Value / 100 62 | End Sub 63 | End Class 64 | 65 | End Namespace 66 | -------------------------------------------------------------------------------- /VBAudioRouter/GraphControl/ConnectionHelper.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | using Microsoft.UI.Xaml.Controls; 3 | using VBAudioRouter.Controls.Nodes; 4 | using Windows.Media.Audio; 5 | 6 | namespace VBAudioRouter.GraphControl; 7 | internal static class ConnectionHelper 8 | { 9 | public static void DeleteConnection(NodeConnection connection) 10 | { 11 | // Get graph nodes 12 | var sourceNode = connection.SourceConnector.AttachedNode.GraphNode as IAudioInputNode; 13 | var destinationNode = connection.DestinationConnector.AttachedNode.GraphNode; 14 | // Remove graph connection 15 | if (destinationNode != null) 16 | sourceNode?.RemoveOutgoingConnection(destinationNode); 17 | 18 | // Remove visual 19 | ((Canvas)connection.Line.Parent).Children.Remove(connection.Line); 20 | // Remove reference 21 | connection.SourceConnector.Connections.Remove(connection); 22 | connection.DestinationConnector.Connections.Remove(connection); 23 | } 24 | 25 | public static void DisposeNode(INodeControl nodeControl) 26 | { 27 | var node = (IAudioNodeControl)nodeControl.NodeContent; 28 | 29 | List connections = []; 30 | 31 | if (nodeControl.NodeContent is IAudioOutputNodeControl inputNode) 32 | connections.AddRange(inputNode.IncomingConnector.Connections); 33 | 34 | if (nodeControl.NodeContent is IAudioInputNodeControl outputNode) 35 | connections.AddRange(outputNode.OutgoingConnector.Connections); 36 | 37 | foreach (var connection in connections) 38 | DeleteConnection(connection); 39 | 40 | // Dispose audio node 41 | node?.DisposeAudioNode(); 42 | 43 | // Remove visual node 44 | ((Panel)nodeControl.Parent).Children.Remove((UIElement)nodeControl); 45 | } 46 | 47 | public static void DisposeAudioNode(this IAudioNodeControl nodeControl) 48 | { 49 | using var node = nodeControl.GraphNode; 50 | node?.Stop(); 51 | 52 | if (nodeControl.GraphNode is not IAudioInputNode inputNode) 53 | return; 54 | 55 | foreach (var connection in inputNode.OutgoingConnections) 56 | inputNode.RemoveOutgoingConnection(connection.Destination); 57 | } 58 | 59 | public static void ReconnectAudioNode(this IAudioInputNodeControl nodeControl) 60 | { 61 | foreach (var connection in nodeControl.OutgoingConnector.Connections) 62 | { 63 | var node = connection.DestinationConnector.AttachedNode.GraphNode; 64 | if (node is null) 65 | continue; 66 | 67 | nodeControl.GraphNode?.AddOutgoingConnection(node); 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/OutputNodeControl.xaml.vb: -------------------------------------------------------------------------------- 1 | Imports VBAudioRouter.AudioGraphControl 2 | Imports VBAudioRouter.Capture 3 | Imports Windows.Devices.Enumeration 4 | Imports Windows.Media.Audio 5 | Imports Windows.Media.Devices 6 | 7 | Namespace Controls.Nodes 8 | 9 | Public NotInheritable Class OutputNodeControl 10 | Inherits UserControl 11 | Implements IAudioNodeControl, IAudioNodeControlInput 12 | 13 | Property AudioRenderDevices As DeviceInformationCollection 14 | Private Async Sub OutputNodeControl_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 15 | If DesignMode.DesignModeEnabled Or DesignMode.DesignMode2Enabled Then Exit Sub 16 | AudioRenderDevices = Await DeviceInformation.FindAllAsync(MediaDevice.GetAudioRenderSelector()) 17 | OutputDevices.ItemsSource = AudioRenderDevices.Select(Function(device) device.Name).ToList() 18 | For i As Integer = 0 To AudioRenderDevices.Count - 1 19 | If AudioRenderDevices.Item(i).IsDefault Then 20 | OutputDevices.SelectedIndex = i 21 | Exit For 22 | End If 23 | Next 24 | End Sub 25 | 26 | #Region "Identity" 27 | Public Property Canvas As Canvas Implements IAudioNodeControl.Canvas 28 | Public ReadOnly Property BaseAudioNode As IAudioNode Implements IAudioNodeControl.BaseAudioNode 29 | Public ReadOnly Property IncomingConnector As ConnectorControl Implements IAudioNodeControlInput.IncomingConnector 30 | Get 31 | Return IncomingConnectorControl 32 | End Get 33 | End Property 34 | #End Region 35 | 36 | Dim Graph As AudioGraph 37 | Public Async Function Initialize(graph As AudioGraph) As Task Implements IAudioNodeControl.Initialize 38 | Me.Graph = graph 39 | If BaseAudioNode IsNot Nothing Then 40 | BaseAudioNode.Stop() 41 | _BaseAudioNode = Nothing 42 | End If 43 | Dim result = Await graph.CreateDeviceOutputNodeAsync() 44 | If Not result.Status = AudioDeviceNodeCreationStatus.Success Then Throw result.ExtendedError 45 | _BaseAudioNode = result.DeviceOutputNode 46 | 47 | 'Dim processCapture As New ProcessAudioCapture(Process.GetProcessesByName("Microsoft.Media.Player")(0)) 48 | 'Dim audioNode = processCapture.CreateAudioNode(graph) 49 | 'audioNode.AddOutgoingConnection(BaseAudioNode) 50 | End Function 51 | 52 | Public Sub OnStateChanged(state As GraphState) Implements IAudioNodeControl.OnStateChanged : End Sub 53 | 54 | Private Sub OutputDevices_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) 55 | 56 | End Sub 57 | End Class 58 | 59 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter/UI/SpeakerControlPage.xaml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 28 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /VBAudioRouter/Utils/Extensions.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | using Microsoft.UI.Xaml.Controls; 3 | using Microsoft.UI.Xaml.Media; 4 | using Windows.UI; 5 | 6 | namespace VBAudioRouter.Utils; 7 | 8 | internal static class Extensions 9 | { 10 | /// 11 | /// https://stackoverflow.com/a/14353572/15213858 12 | /// 13 | /// 14 | public static double Map(this double value, double fromSource, double toSource, double fromTarget, double toTarget) 15 | { 16 | return (value - fromSource) / (toSource - fromSource) * (toTarget - fromTarget) + fromTarget; 17 | } 18 | 19 | public static T? FindNameRecursive(this FrameworkElement ele, string name) where T : FrameworkElement 20 | { 21 | for (var child_index = 0; child_index <= VisualTreeHelper.GetChildrenCount(ele) - 1; child_index++) 22 | { 23 | FrameworkElement child = (FrameworkElement)VisualTreeHelper.GetChild(ele, child_index); 24 | 25 | var search = (T?)child.FindName(name); 26 | if (search != null) 27 | return search; 28 | 29 | var recursion = child.FindNameRecursive(name); 30 | if (recursion != null) 31 | return recursion; 32 | } 33 | return null; 34 | } 35 | 36 | public static FrameworkElement FindNameRecursive(this FrameworkElement ele, string name) 37 | => ele.FindNameRecursive(name); 38 | 39 | /// 40 | /// https://stackoverflow.com/a/24120993/15213858 41 | /// 42 | /// 43 | public static void BringToFront(this FrameworkElement @this) 44 | { 45 | if (@this.Parent is not Panel parent) 46 | return; 47 | 48 | int currentIndex = Canvas.GetZIndex(@this); 49 | int maxZ = 0; 50 | foreach (var child in parent.Children) 51 | { 52 | if (child == @this) 53 | continue; 54 | 55 | var zIndex = Canvas.GetZIndex(child); 56 | maxZ = Math.Max(maxZ, zIndex); 57 | 58 | if (zIndex >= currentIndex) 59 | Canvas.SetZIndex(child, zIndex - 1); 60 | } 61 | 62 | Canvas.SetZIndex(@this, maxZ); 63 | } 64 | } 65 | 66 | internal static class ColorTranslator 67 | { 68 | /// 69 | /// http://joeljoseph.net/converting-hex-to-color-in-universal-windows-platform-uwp/ 70 | /// 71 | public static Color FromHex(string hex) 72 | { 73 | hex = hex.Replace("#", string.Empty); 74 | byte a = 255; 75 | byte r = System.Convert.ToByte(Convert.ToUInt32(hex.Substring(0, 2), 16)); 76 | byte g = System.Convert.ToByte(Convert.ToUInt32(hex.Substring(2, 2), 16)); 77 | byte b = System.Convert.ToByte(Convert.ToUInt32(hex.Substring(4, 2), 16)); 78 | return Color.FromArgb(a, r, g, b); 79 | } 80 | } -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/TextToSpeechInputNodeControl.xaml.vb: -------------------------------------------------------------------------------- 1 | 2 | Imports VBAudioRouter.AudioGraphControl 3 | Imports Windows.Media.Audio 4 | Imports Windows.Media.Core 5 | Imports Windows.Media.SpeechSynthesis 6 | 7 | Namespace Controls.Nodes 8 | 9 | Public NotInheritable Class TextToSpeechInputNodeControl 10 | Inherits UserControl 11 | Implements IAudioNodeControl, IAudioNodeControlOutput 12 | 13 | Public ReadOnly Property AllVoices As New Dictionary(Of String, VoiceInformation) 14 | Public Sub New() 15 | InitializeComponent() 16 | 17 | AllVoices = SpeechSynthesizer.AllVoices.ToDictionary(Function(x) x.Id) 18 | VoiceSelection.ItemsSource = AllVoices.Values.Select(Function(x) $"{x.DisplayName} | {x.Gender} | {x.Language}").ToArray() 19 | VoiceSelection.SelectedIndex = 0 20 | End Sub 21 | 22 | #Region "Identity" 23 | Public Property Canvas As Canvas Implements IAudioNodeControl.Canvas 24 | Public ReadOnly Property BaseAudioNode As IAudioNode Implements IAudioNodeControl.BaseAudioNode 25 | 26 | Public ReadOnly Property OutgoingConnector As ConnectorControl Implements IAudioNodeControlOutput.OutgoingConnector 27 | Get 28 | Return OutgoingConnectorControl 29 | End Get 30 | End Property 31 | #End Region 32 | 33 | Dim Graph As AudioGraph 34 | Public Async Function Initialize(graph As AudioGraph) As Task Implements IAudioNodeControl.Initialize 35 | Me.Graph = graph 36 | End Function 37 | 38 | Public ReadOnly Property Synthesizer As New SpeechSynthesizer() 39 | Private Async Function CreateAudioNode() As Task 40 | If BaseAudioNode IsNot Nothing Then Me.DisposeAudioNode() 41 | 42 | Synthesizer.Voice = AllVoices.Values(VoiceSelection.SelectedIndex) 43 | Synthesizer.Options.SpeakingRate = SpeedSlider.Value 44 | Synthesizer.Options.AudioVolume = VolumeSlider.Value / 100.0 45 | 46 | Dim source As MediaSource 47 | Using stream = Await Synthesizer.SynthesizeTextToStreamAsync(InputTextBox.Text) 48 | source = MediaSource.CreateFromStream(stream, stream.ContentType) 49 | End Using 50 | 51 | Dim result = Await Graph.CreateMediaSourceAudioInputNodeAsync(source) 52 | If Not result.Status = AudioDeviceNodeCreationStatus.Success Then Throw result.ExtendedError 53 | _BaseAudioNode = result.Node 54 | 55 | Me.ReconnectAudioNode() 56 | End Function 57 | 58 | Public Async Sub OnStateChanged(state As GraphState) Implements IAudioNodeControl.OnStateChanged : End Sub 59 | 60 | Private Async Sub PlayButton_Click(sender As Object, e As RoutedEventArgs) Handles PlayButton.Click 61 | Await CreateAudioNode() 62 | End Sub 63 | End Class 64 | 65 | End Namespace 66 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Interop/IAudioSessionManager.vb: -------------------------------------------------------------------------------- 1 | 2 | Imports System.Runtime.InteropServices 3 | Imports NAudio.CoreAudioApi.Interfaces 4 | 5 | Namespace Interop 6 | 7 | ''' 8 | ''' 9 | ''' 10 | 11 | Public Interface IAudioSessionManager 12 | 13 | Function GetAudioSessionControl( 14 | <[In], [Optional]> 15 | ByVal sessionId As Guid, 16 | <[In]> 17 | ByVal streamFlags As UInt32, 18 | ByRef sessionControl As IAudioSessionControl) As Integer 19 | 20 | Function GetSimpleAudioVolume( 21 | <[In], [Optional]> 22 | ByVal sessionId As Guid, 23 | <[In]> 24 | ByVal streamFlags As UInt32, 25 | ByRef audioVolume As Object) As Integer 'ISimpleAudioVolume 26 | End Interface 27 | 28 | 29 | Public Interface IAudioSessionManager2 30 | Inherits IAudioSessionManager 31 | 32 | 33 | Overloads Function GetAudioSessionControl( 34 | <[In], [Optional]> 35 | ByVal sessionId As Guid, 36 | <[In]> 37 | ByVal streamFlags As UInt32, 38 | ByRef sessionControl As IAudioSessionControl) As Integer 39 | 40 | Overloads Function GetSimpleAudioVolume( 41 | <[In], [Optional]> 42 | ByVal sessionId As Guid, 43 | <[In]> 44 | ByVal streamFlags As UInt32, 45 | ByRef audioVolume As Object) As Integer ' ISimpleAudioVolume 46 | 47 | Function GetSessionEnumerator() As IAudioSessionEnumerator 48 | 49 | Function RegisterSessionNotification(ByVal sessionNotification As IAudioSessionNotification) As Integer 50 | 51 | Function UnregisterSessionNotification(ByVal sessionNotification As IAudioSessionNotification) As Integer 52 | 53 | Function RegisterDuckNotification(ByVal sessionId As String, ByVal audioVolumeDuckNotification As IAudioSessionNotification) As Integer 54 | 55 | Function UnregisterDuckNotification(ByVal audioVolumeDuckNotification As IntPtr) As Integer 56 | End Interface 57 | 58 | 59 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.UWP/SpeakerControlPage.xaml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 29 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/LimiterNodeControl.xaml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 38 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/EQNodeControl.xaml.vb: -------------------------------------------------------------------------------- 1 | 2 | Imports VBAudioRouter.AudioGraphControl 3 | Imports VBAudioRouter.AudioGraphControl.Serialization 4 | Imports VBAudioRouter.Utils 5 | Imports VBAudioRouter.Utils.GainControl 6 | Imports Windows.Media.Audio 7 | 8 | Namespace Controls.Nodes 9 | 10 | Public NotInheritable Class EQNodeControl 11 | Inherits UserControl 12 | Implements IAudioNodeControl, IAudioNodeControlInput, IAudioNodeControlEffect, IAudioNodeControlOutput, IAudioNodeSerializable 13 | 14 | #Region "Indentity" 15 | Public Property Canvas As Canvas Implements IAudioNodeControl.Canvas 16 | Public ReadOnly Property BaseAudioNode As IAudioNode Implements IAudioNodeControl.BaseAudioNode 17 | 18 | Public ReadOnly Property OutgoingConnector As ConnectorControl Implements IAudioNodeControlOutput.OutgoingConnector 19 | Get 20 | Return OutgoingConnectorControl 21 | End Get 22 | End Property 23 | 24 | Public ReadOnly Property IncomingConnector As ConnectorControl Implements IAudioNodeControlInput.IncomingConnector 25 | Get 26 | Return IncomingConnectorControl 27 | End Get 28 | End Property 29 | #End Region 30 | 31 | Dim EQEffect As EqualizerEffectDefinition 32 | 33 | Public Const MinFreq As Integer = 100 34 | Public Const MaxFreq As Integer = 12000 35 | 36 | Public Async Function Initialize(graph As AudioGraph) As Task Implements IAudioNodeControl.Initialize 37 | _BaseAudioNode = graph.CreateSubmixNode() 38 | EQEffect = New EqualizerEffectDefinition(graph) 39 | BaseAudioNode.EffectDefinitions.Add(EQEffect) 40 | DirectCast(BaseAudioNode, AudioSubmixNode).EnableEffectsByDefinition(EQEffect) 41 | 42 | ReloadSettings() 43 | End Function 44 | 45 | Public Sub ReloadSettings() Implements IAudioNodeSerializable.ReloadSettings 46 | EQDrag1.SetPosition(New Point(EQEffect.Bands(0).FrequencyCenter.Map(MinFreq, MaxFreq, 0.0, 1.0), EQEffect.Bands(0).Gain.Map(fxeq_min_gain, fxeq_max_gain, 0.0, 1.0))) 47 | EQDrag2.SetPosition(New Point(EQEffect.Bands(1).FrequencyCenter.Map(MinFreq, MaxFreq, 0.0, 1.0), EQEffect.Bands(1).Gain.Map(fxeq_min_gain, fxeq_max_gain, 0.0, 1.0))) 48 | EQDrag3.SetPosition(New Point(EQEffect.Bands(2).FrequencyCenter.Map(MinFreq, MaxFreq, 0.0, 1.0), EQEffect.Bands(2).Gain.Map(fxeq_min_gain, fxeq_max_gain, 0.0, 1.0))) 49 | EQDrag4.SetPosition(New Point(EQEffect.Bands(3).FrequencyCenter.Map(MinFreq, MaxFreq, 0.0, 1.0), EQEffect.Bands(3).Gain.Map(fxeq_min_gain, fxeq_max_gain, 0.0, 1.0))) 50 | End Sub 51 | 52 | Private Sub EQDrag_ValueChanged(sender As Object, e As Point) 53 | If EQEffect Is Nothing Then Exit Sub 54 | Dim band = EQEffect.Bands(DirectCast(sender, EQDragControl).Index) 55 | band.FrequencyCenter = e.X.Map(0.0, 1.0, MinFreq, MaxFreq) 56 | band.Gain = e.Y.Map(0.0, 1.0, fxeq_min_gain, fxeq_max_gain) 57 | End Sub 58 | 59 | Public Sub OnStateChanged(state As GraphState) Implements IAudioNodeControl.OnStateChanged : End Sub 60 | 61 | End Class 62 | 63 | End Namespace 64 | -------------------------------------------------------------------------------- /VBAudioRouter/UI/GraphViewPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml; 2 | using Microsoft.UI.Xaml.Controls; 3 | using Microsoft.UI.Xaml.Input; 4 | using VBAudioRouter.Controls.Nodes; 5 | using VBAudioRouter.GraphControl; 6 | using Windows.Media.Audio; 7 | using NodeFactoryProc = System.Func< 8 | Windows.Media.Audio.AudioGraph, 9 | System.Threading.Tasks.Task<( 10 | string displayName, 11 | VBAudioRouter.GraphControl.IAudioNodeControl 12 | )> 13 | >; 14 | 15 | namespace VBAudioRouter.UI; 16 | internal sealed partial class GraphViewPage : Page 17 | { 18 | public AudioGraph CurrentAudioGraph => _faderData.AudioGraph; 19 | 20 | readonly FaderData _faderData; 21 | public GraphViewPage(FaderData faderData) 22 | { 23 | _faderData = faderData; 24 | InitializeComponent(); 25 | 26 | AddNode("Output", new OutputNodeControl(faderData.ConnectionNode)); 27 | } 28 | 29 | static readonly Dictionary FactoryLookup = new() { 30 | { nameof(FileInputNodeControl), PrepareNodeFactory() }, 31 | { nameof(ProcessInputNodeControl), PrepareNodeFactory() } 32 | }; 33 | 34 | static NodeFactoryProc PrepareNodeFactory() 35 | where TFactory : IAudioNodeControlFactory, IAudioNodeControl 36 | { 37 | return static async (AudioGraph graph) => (TFactory.DisplayName, await TFactory.CreateAsync(graph)); 38 | } 39 | 40 | private async void MenuFlyoutItem_Click(object sender, RoutedEventArgs e) 41 | { 42 | try 43 | { 44 | string tag = (string)((MenuFlyoutItem)sender).Tag; 45 | if (string.IsNullOrEmpty(tag) || CurrentAudioGraph is null) 46 | return; 47 | 48 | var factory = FactoryLookup[tag] ?? throw new InvalidOperationException("Could not find audio node factory"); 49 | var (displayName, contentEle) = await factory.Invoke(CurrentAudioGraph); 50 | 51 | AddNode(displayName, contentEle); 52 | } 53 | catch (Exception ex) 54 | { 55 | Dialogs.ErrorDialog dialog = new(ex) 56 | { 57 | Title = "Failed to add node" 58 | }; 59 | await dialog.ShowAsync(); 60 | } 61 | } 62 | 63 | void AddNode(string displayName, IAudioNodeControl nodeControl) 64 | { 65 | NodeControl nodeContainer = new() 66 | { 67 | HorizontalAlignment = HorizontalAlignment.Left, 68 | VerticalAlignment = VerticalAlignment.Top, 69 | Title = displayName 70 | }; 71 | 72 | nodeControl.Canvas = ConnectionCanvas; 73 | 74 | // Assign content to container ("window") 75 | nodeContainer.NodeContent = (UIElement)nodeControl; 76 | NodeContainer.Children.Add(nodeContainer); 77 | } 78 | 79 | private void Grid_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) 80 | { 81 | return; 82 | if (e.OriginalSource != ViewPort) 83 | return; 84 | ViewPortTransform.TranslateX += e.Delta.Translation.X; 85 | ViewPortTransform.TranslateY += e.Delta.Translation.Y; 86 | } 87 | } 88 | 89 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Controls/Nodes/TextToSpeechInputNodeControl.xaml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /VBAudioRouter/Strings/en-us/Resources.resw: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | text/microsoft-resx 51 | 52 | 53 | 2.0 54 | 55 | 56 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 57 | 58 | 59 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 60 | 61 | 62 | VBAudioRouter 63 | 64 | 65 | VBAudioRouter 66 | 67 | 68 | Main 69 | Page title for MainPage 70 | 71 | 72 | -------------------------------------------------------------------------------- /VBAudioRouter.Package/Package.appxmanifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 17 | 18 | 19 | 20 | 21 | VB Audio Router 22 | ShortDevelopment 23 | Assets\StoreLogo.png 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 40 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | Assets\StoreLogo.png 59 | 60 | .audiograph 61 | 62 | 63 | 64 | 65 | 66 | Assets\StoreLogo.png 67 | VB Audio Router 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /VBAudioRouter.UWP/AudioGraphControl/ConnectionHelper.vb: -------------------------------------------------------------------------------- 1 | Imports VBAudioRouter.Controls.Nodes 2 | Imports Windows.Media.Audio 3 | 4 | Namespace AudioGraphControl 5 | 6 | Public Class ConnectionHelper 7 | 8 | Public Shared Sub DeleteConnection(connection As NodeConnection) 9 | ' Get graph nodes 10 | Dim sourceNode As IAudioInputNode = DirectCast(connection.SourceConnector.AttachedNode.BaseAudioNode, IAudioInputNode) 11 | Dim destinationNode As IAudioNode = connection.DestinationConnector.AttachedNode.BaseAudioNode 12 | ' Remove graph connection 13 | If sourceNode IsNot Nothing Then 14 | sourceNode.RemoveOutgoingConnection(destinationNode) 15 | End If 16 | 17 | ' Remove visual 18 | DirectCast(connection.Line.Parent, Canvas).Children.Remove(connection.Line) 19 | ' Remove reference 20 | connection.SourceConnector.Connections.Remove(connection) 21 | connection.DestinationConnector.Connections.Remove(connection) 22 | End Sub 23 | 24 | Public Shared Sub DisposeNode(nodeControl As NodeControl) 25 | Dim node = DirectCast(nodeControl.NodeContent, IAudioNodeControl) 26 | 27 | #Region "' Remove visual & graph connections" 28 | Dim connections As New List(Of NodeConnection) 29 | 30 | Dim inputNode = TryCast(nodeControl.NodeContent, IAudioNodeControlInput) 31 | If inputNode IsNot Nothing Then 32 | connections.AddRange(inputNode.IncomingConnector.Connections) 33 | End If 34 | 35 | Dim outputNode = TryCast(nodeControl.NodeContent, IAudioNodeControlOutput) 36 | If outputNode IsNot Nothing Then 37 | connections.AddRange(outputNode.OutgoingConnector.Connections) 38 | End If 39 | 40 | For Each connection In connections 41 | DeleteConnection(connection) 42 | Next 43 | #End Region 44 | 45 | ' Dispose audio node 46 | If Not node.BaseAudioNode Is Nothing Then 47 | node.BaseAudioNode.Stop() 48 | node.BaseAudioNode.Dispose() 49 | End If 50 | 51 | ' Remove visual node 52 | DirectCast(nodeControl.Parent, Grid).Children.Remove(nodeControl) 53 | End Sub 54 | 55 | End Class 56 | 57 | Public Module ConnectionExtensions 58 | 59 | 60 | Public Sub DisposeAudioNode(ByRef nodeControl As IAudioNodeControl) 61 | Dim node As IAudioInputNode = DirectCast(nodeControl.BaseAudioNode, IAudioInputNode) 62 | Try 63 | node.Stop() 64 | For Each connection In node.OutgoingConnections.ToArray() 65 | node.RemoveOutgoingConnection(connection.Destination) 66 | Next 67 | node.Dispose() 68 | Catch : End Try 69 | End Sub 70 | 71 | 72 | Public Sub ReconnectAudioNode(ByRef nodeControl As IAudioNodeControlOutput) 73 | For Each connection In nodeControl.OutgoingConnector.Connections 74 | Dim node As IAudioNode = connection.DestinationConnector.AttachedNode.BaseAudioNode 75 | DirectCast(nodeControl.BaseAudioNode, IAudioInputNode).AddOutgoingConnection(node) 76 | Next 77 | End Sub 78 | 79 | End Module 80 | 81 | End Namespace -------------------------------------------------------------------------------- /VBAudioRouter.UWP/Package.appxmanifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | 17 | 18 | 19 | 20 | 21 | VB Audio Router 22 | ShortDevelopment 23 | Assets\StoreLogo.png 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 39 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | Assets\StoreLogo.png 58 | 59 | .audiograph 60 | 61 | 62 | 63 | 64 | 65 | Assets\StoreLogo.png 66 | VB Audio Router 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | --------------------------------------------------------------------------------