Add project files.
63
.gitattributes
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
#
|
||||
# This is need for earlier builds of msysgit that does not have it on by
|
||||
# default for csharp files.
|
||||
# Note: This is only used by command line
|
||||
###############################################################################
|
||||
#*.cs diff=csharp
|
||||
|
||||
###############################################################################
|
||||
# Set the merge driver for project and solution files
|
||||
#
|
||||
# Merging from the command prompt will add diff markers to the files if there
|
||||
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||
# the diff markers are never inserted). Diff markers may cause the following
|
||||
# file extensions to fail to load in VS. An alternative would be to treat
|
||||
# these files as binary and thus will always conflict and require user
|
||||
# intervention with every merge. To do so, just uncomment the entries below
|
||||
###############################################################################
|
||||
#*.sln merge=binary
|
||||
#*.csproj merge=binary
|
||||
#*.vbproj merge=binary
|
||||
#*.vcxproj merge=binary
|
||||
#*.vcproj merge=binary
|
||||
#*.dbproj merge=binary
|
||||
#*.fsproj merge=binary
|
||||
#*.lsproj merge=binary
|
||||
#*.wixproj merge=binary
|
||||
#*.modelproj merge=binary
|
||||
#*.sqlproj merge=binary
|
||||
#*.wwaproj merge=binary
|
||||
|
||||
###############################################################################
|
||||
# behavior for image files
|
||||
#
|
||||
# image files are treated as binary by default.
|
||||
###############################################################################
|
||||
#*.jpg binary
|
||||
#*.png binary
|
||||
#*.gif binary
|
||||
|
||||
###############################################################################
|
||||
# diff behavior for common document formats
|
||||
#
|
||||
# Convert binary document formats to text before diffing them. This feature
|
||||
# is only available from the command line. Turn it on by uncommenting the
|
||||
# entries below.
|
||||
###############################################################################
|
||||
#*.doc diff=astextplain
|
||||
#*.DOC diff=astextplain
|
||||
#*.docx diff=astextplain
|
||||
#*.DOCX diff=astextplain
|
||||
#*.dot diff=astextplain
|
||||
#*.DOT diff=astextplain
|
||||
#*.pdf diff=astextplain
|
||||
#*.PDF diff=astextplain
|
||||
#*.rtf diff=astextplain
|
||||
#*.RTF diff=astextplain
|
363
.gitignore
vendored
Normal file
@ -0,0 +1,363 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Oo]ut/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
23
INSTALL.md
Normal file
@ -0,0 +1,23 @@
|
||||
# Step by step
|
||||
|
||||
These instructions should work for both Debug/Release builds. In this case we target Release x64.
|
||||
|
||||
![Release][release]
|
||||
|
||||
Open up project properties.<br>
|
||||
![Properties][properties]
|
||||
|
||||
In advanced properties ensure `Character Set` is set to `Not Set`
|
||||
![Character Set][char_set]
|
||||
|
||||
Check that `_CRT_SECURE_NO_DEPRECATE` and if targeting an x64 build `VB_X64` are in the preprocessor definitions.
|
||||
![Preprocessor Definitions][pp_def]
|
||||
|
||||
Ensure `Ws2_32.lib` is included as an additional dependency.
|
||||
![Linker dependencies][linker]
|
||||
|
||||
[release]: vmr_streamer/img/vm1-inst.png
|
||||
[properties]: vmr_streamer/img/vm2-inst.png
|
||||
[char_set]: vmr_streamer/img/vm3-inst.png
|
||||
[pp_def]: vmr_streamer/img/vm4-inst.png
|
||||
[linker]: vmr_streamer/img/vm5-inst.png
|
22
LICENSE
Normal file
@ -0,0 +1,22 @@
|
||||
MIT License (with one restriction)
|
||||
|
||||
Copyright (c) 2021 Vincent Burel
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software and the created Software Application
|
||||
must interact with the VoicemeeterRemote API.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
14
README.md
Normal file
@ -0,0 +1,14 @@
|
||||
# Voicemeeter Streamer View App
|
||||
|
||||
Source files for [Voicemeeter Streamer View App][streamer_view_app] which can be found in the [applications SDK](https://github.com/vburel2018/Voicemeeter-SDK).
|
||||
|
||||
### Build
|
||||
|
||||
For a step-by-step follow [these instructions][install].
|
||||
|
||||
### Special Thanks
|
||||
|
||||
Vincent Burel for creating Voicemeeter, its SDK and the various apps released as part of it.
|
||||
|
||||
[install]: INSTALL.md
|
||||
[streamer_view_app]: https://voicemeeter.com/the-voicemeeter-streamer-view-app-overview/
|
31
vmr_streamer.sln
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.6.33723.286
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmr_streamer", "vmr_streamer\vmr_streamer.vcxproj", "{CB959FDD-2AA4-4ECD-8A50-41777BF38EEA}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{CB959FDD-2AA4-4ECD-8A50-41777BF38EEA}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{CB959FDD-2AA4-4ECD-8A50-41777BF38EEA}.Debug|x64.Build.0 = Debug|x64
|
||||
{CB959FDD-2AA4-4ECD-8A50-41777BF38EEA}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{CB959FDD-2AA4-4ECD-8A50-41777BF38EEA}.Debug|x86.Build.0 = Debug|Win32
|
||||
{CB959FDD-2AA4-4ECD-8A50-41777BF38EEA}.Release|x64.ActiveCfg = Release|x64
|
||||
{CB959FDD-2AA4-4ECD-8A50-41777BF38EEA}.Release|x64.Build.0 = Release|x64
|
||||
{CB959FDD-2AA4-4ECD-8A50-41777BF38EEA}.Release|x86.ActiveCfg = Release|Win32
|
||||
{CB959FDD-2AA4-4ECD-8A50-41777BF38EEA}.Release|x86.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {00B208A7-9AA5-482F-9929-0DE2CB5EA336}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
30
vmr_streamer/Resource.h
Normal file
@ -0,0 +1,30 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by vmr_streamer.rc
|
||||
|
||||
#define IDS_APP_TITLE 103
|
||||
|
||||
#define IDR_MAINFRAME 128
|
||||
#define IDD_VMRSTREAMER_DIALOG 102
|
||||
#define IDD_ABOUTBOX 103
|
||||
#define IDM_ABOUT 104
|
||||
#define IDM_EXIT 105
|
||||
#define IDI_VMRSTREAMER 107
|
||||
#define IDI_SMALL 108
|
||||
#define IDC_VMRSTREAMER 109
|
||||
#define IDC_MYICON 2
|
||||
#ifndef IDC_STATIC
|
||||
#define IDC_STATIC -1
|
||||
#endif
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
#define _APS_NO_MFC 130
|
||||
#define _APS_NEXT_RESOURCE_VALUE 129
|
||||
#define _APS_NEXT_COMMAND_VALUE 32771
|
||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||
#define _APS_NEXT_SYMED_VALUE 110
|
||||
#endif
|
||||
#endif
|
15
vmr_streamer/framework.h
Normal file
@ -0,0 +1,15 @@
|
||||
// header.h : include file for standard system include files,
|
||||
// or project specific include files
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "targetver.h"
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
// Windows Header Files
|
||||
#include <windows.h>
|
||||
// C RunTime Header Files
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <memory.h>
|
||||
#include <tchar.h>
|
BIN
vmr_streamer/img/vm1-inst.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
vmr_streamer/img/vm2-inst.png
Normal file
After Width: | Height: | Size: 918 KiB |
BIN
vmr_streamer/img/vm3-inst.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
vmr_streamer/img/vm4-inst.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
vmr_streamer/img/vm5-inst.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
vmr_streamer/small.ico
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
vmr_streamer/source/SourceCodeOrganization.jpg
Normal file
After Width: | Height: | Size: 174 KiB |
BIN
vmr_streamer/source/StripCTL_Design.jpg
Normal file
After Width: | Height: | Size: 110 KiB |
BIN
vmr_streamer/source/Thumbs.db
Normal file
974
vmr_streamer/source/VoicemeeterRemote.h
Normal file
@ -0,0 +1,974 @@
|
||||
/******************************************************************************/
|
||||
/* Voicemeeter Remote API. V.Burel©2015-2021 */
|
||||
/******************************************************************************/
|
||||
/* This Library allows communication with Voicemeeter applications */
|
||||
/* 4 Client Applications can be connected to remote Voicemeeter. */
|
||||
/* it also allows communication with MacroButtons application. */
|
||||
/******************************************************************************/
|
||||
/* */
|
||||
/* OFFICIAL LINK : WWW.VOICEMEETER.COM */
|
||||
/* */
|
||||
/******************************************************************************/
|
||||
/* COPYRIGHT: Vincent Burel(c)2015-2021 All Rights Reserved */
|
||||
/******************************************************************************/
|
||||
/* */
|
||||
/* LICENSING: VoicemeeterRemote.dll usage is driven by a license agreement */
|
||||
/* given in VoicemeeterRemoteAPI.pdf or readme.txt */
|
||||
/* */
|
||||
/******************************************************************************/
|
||||
/* long = 32 bit integer */
|
||||
/******************************************************************************/
|
||||
|
||||
|
||||
#ifndef __VOICEMEETER_REMOTE_H__
|
||||
#define __VOICEMEETER_REMOTE_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#define VBVMR_RESULT_OK 0
|
||||
|
||||
/******************************************************************************/
|
||||
/* */
|
||||
/* Login */
|
||||
/* */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @name Communication Login / logout
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
@brief Open Communication Pipe With Voicemeeter (typically called on software startup).
|
||||
@return : 0: OK (no error).
|
||||
1: OK but Voicemeeter Application not launched.
|
||||
-1: cannot get client (unexpected)
|
||||
-2: unexpected login (logout was expected before).
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_Login(void);
|
||||
|
||||
/**
|
||||
@brief Close Communication Pipe With Voicemeeter (typically called on software end).
|
||||
@return : 0 if ok.
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_Logout(void);
|
||||
|
||||
|
||||
/**
|
||||
@brief Run Voicemeeter Application (get installation directory and run Voicemeeter Application).
|
||||
@param vType : Voicemeeter type (1 = Voicemeeter, 2= Voicemeeter Banana, 3= Voicemeeter Potato, 6 = Potato x64 bits).
|
||||
@return : 0: Ok.
|
||||
-1: not installed (UninstallString not found in registry).
|
||||
-2: unknown vType number
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_RunVoicemeeter(long vType);
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* */
|
||||
/* General Information */
|
||||
/* */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @name General Information
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
@brief Get Voicemeeter Type
|
||||
@param pType : Pointer on 32bit long receiving the type (1 = Voicemeeter, 2= Voicemeeter Banana, 3 Potato).
|
||||
|
||||
VOICEMEETER STRIP/BUS INDEX ASSIGNMENT
|
||||
|
||||
| Strip 1 | Strip 2 |Virtual Input| BUS A | BUS B |
|
||||
+---------+---------+-------------+---------+---------+
|
||||
| 0 | 1 | 2 | 0 | 1 |
|
||||
|
||||
VOICEMEETER BANANA STRIP/BUS INDEX ASSIGNMENT
|
||||
|
||||
| Strip 1 | Strip 2 | Strip 2 |Virtual Input|Virtual AUX|BUS A1|BUS A2|BUS A3|BUS B1|BUS B2|
|
||||
+---------+---------+---------+-------------+-----------+------+------+------+------+------+
|
||||
| 0 | 1 | 2 | 3 | 4 | 0 | 1 | 2 | 3 | 4 |
|
||||
|
||||
VOICEMEETER POTATO STRIP/BUS INDEX ASSIGNMENT
|
||||
|
||||
| Strip 1 | Strip 2 | Strip 2 | Strip 2 | Strip 2 |Virtual Input|Virtual AUX| VAIO3 |BUS A1|BUS A2|BUS A3|BUS A4|BUS A5|BUS B1|BUS B2|BUS B3|
|
||||
+---------+---------+---------+---------+---------+-------------+-----------+-----------+------+------+------+------+------+------+------+------+
|
||||
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
||||
|
||||
|
||||
@return : 0: OK (no error).
|
||||
-1: cannot get client (unexpected)
|
||||
-2: no server.
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_GetVoicemeeterType(long * pType);
|
||||
|
||||
/**
|
||||
@brief Get Voicemeeter Version
|
||||
@param pType : Pointer on 32bit integer receiving the version (v1.v2.v3.v4)
|
||||
v1 = (version & 0xFF000000)>>24;
|
||||
v2 = (version & 0x00FF0000)>>16;
|
||||
v3 = (version & 0x0000FF00)>>8;
|
||||
v4 = version & 0x000000FF;
|
||||
|
||||
@return : 0: OK (no error).
|
||||
-1: cannot get client (unexpected)
|
||||
-2: no server.
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_GetVoicemeeterVersion(long * pVersion);
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* */
|
||||
/* Get parameters */
|
||||
/* */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @name Getting Parameters
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
@brief Check if parameters have changed.
|
||||
Call this function periodically (typically every 10 or 20ms).
|
||||
(this function must be called from one thread only)
|
||||
|
||||
@return: 0: no new paramters.
|
||||
1: New parameters -> update your display.
|
||||
-1: error (unexpected)
|
||||
-2: no server.
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_IsParametersDirty(void);
|
||||
|
||||
/**
|
||||
@brief get parameter value.
|
||||
@param szParamName : Null Terminal ASCII String giving the name of the parameter (see parameters name table)
|
||||
@param pValue : Pointer on float (32bit float by reference) receiving the wanted value.
|
||||
@return : 0: OK (no error).
|
||||
-1: error
|
||||
-2: no server.
|
||||
-3: unknown parameter
|
||||
-5: structure mismatch
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_GetParameterFloat(char * szParamName, float * pValue);
|
||||
|
||||
/**
|
||||
@brief get parameter value.
|
||||
@param szParamName : Null Terminal ASCII String giving the name of the parameter (see parameters name table)
|
||||
@param pValue : Pointer on String (512 char or wchar) receiving the wanted value.
|
||||
@return : 0: OK (no error).
|
||||
-1: error
|
||||
-2: no server.
|
||||
-3: unknown parameter
|
||||
-5: structure mismatch
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_GetParameterStringA(char * szParamName, char * szString);
|
||||
long __stdcall VBVMR_GetParameterStringW(char * szParamName, unsigned short * wszString);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* */
|
||||
/* Get levels */
|
||||
/* */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @name Getting RT Data
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
@brief Get Current levels.
|
||||
(this function must be called from one thread only)
|
||||
|
||||
@param nType: 0= pre fader input levels.
|
||||
1= post fader input levels.
|
||||
2= post Mute input levels.
|
||||
3= output levels.
|
||||
|
||||
@param nuChannel: audio channel zero based index
|
||||
for input 0 = in#1 left, 1= in#1 Right, etc...
|
||||
for output 0 = busA ch1, 1 = busA ch2...
|
||||
|
||||
VOICEMEETER CHANNEL ASSIGNMENT
|
||||
|
||||
| Strip 1 | Strip 2 | Virtual Input |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
|
||||
|
||||
| Output A1 / A2 | Virtual Output |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 |
|
||||
|
||||
VOICEMEETER BANANA CHANNEL ASSIGNMENT
|
||||
|
||||
| Strip 1 | Strip 2 | Strip 3 | Virtual Input | Virtual Input AUX |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
|
||||
|
||||
| Output A1 | Output A2 | Output A3 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
|
||||
|
||||
| Virtual Output B1 | Virtual Output B2 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
|
||||
|
||||
VOICEMEETER POTATO CHANNEL ASSIGNMENT
|
||||
|
||||
| Strip 1 | Strip 2 | Strip 3 | Strip 4 | Strip 5 | Virtual Input | Virtual Input AUX | VAIO3 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
|
||||
|
||||
| Output A1 | Output A2 | Output A3 | Output A4 | Output A5 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 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 |
|
||||
|
||||
| Virtual Output B1 | Virtual Output B2 | Virtual Output B3 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
|
||||
|
||||
|
||||
@return : 0: OK (no error).
|
||||
-1: error
|
||||
-2: no server.
|
||||
-3: no level available
|
||||
-4: out of range
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_GetLevel(long nType, long nuChannel, float * pValue);
|
||||
|
||||
|
||||
/**
|
||||
@brief Get MIDI message from M.I.D.I. input device used by Voicemeeter M.I.D.I. mapping.
|
||||
(this function must be called from one thread only)
|
||||
|
||||
@param pMIDIBuffer: pointer on MIDI Buffer. Expected message size is below 4 bytes,
|
||||
but it's recommended to use 1024 Bytes local buffer to receive
|
||||
possible multiple M.I.D.I. event message in optimal way:
|
||||
unsigned char pBuffer[1024];
|
||||
|
||||
|
||||
@return : >0: number of bytes placed in buffer (2 or 3 byte for usual M.I.D.I. message)
|
||||
-1: error
|
||||
-2: no server.
|
||||
-5: no MIDI data
|
||||
-6: no MIDI data
|
||||
*/
|
||||
|
||||
|
||||
long __stdcall VBVMR_GetMidiMessage(unsigned char *pMIDIBuffer, long nbByteMax);
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* */
|
||||
/* Set Parameters */
|
||||
/* */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @name Setting Parameters
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
@brief Set a single float 32 bits parameters .
|
||||
@param szParamName : Null Terminal ASCII String giving the name of the parameter (see parameters name table)
|
||||
example:
|
||||
Strip[1].gain
|
||||
Strip[0].mute
|
||||
Bus[0].gain
|
||||
Bus[0].eq.channel[0].cell[0].gain
|
||||
|
||||
@param pValue : float 32bit containing the new value.
|
||||
@return : 0: OK (no error).
|
||||
-1: error
|
||||
-2: no server.
|
||||
-3: unknown parameter
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_SetParameterFloat(char * szParamName, float Value);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@brief Set a single string parameters .
|
||||
@param szParamName : Null Terminal ASCII String giving the name of the parameter (see parameters name table)
|
||||
example:
|
||||
Strip[1].name
|
||||
Strip[0].device.mme
|
||||
Bus[0].device.asio
|
||||
|
||||
@param szString : zero terminal string.
|
||||
@return : 0: OK (no error).
|
||||
-1: error
|
||||
-2: no server.
|
||||
-3: unknown parameter
|
||||
|
||||
*/
|
||||
|
||||
|
||||
long __stdcall VBVMR_SetParameterStringA(char * szParamName, char * szString);
|
||||
long __stdcall VBVMR_SetParameterStringW(char * szParamName, unsigned short * wszString);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@brief Set one or several parameters by a script ( < 48 kB ).
|
||||
@param szParamName : Null Terminal ASCII String giving the script
|
||||
(script allows to change several parameters in the same time - SYNCHRO).
|
||||
Possible Instuction separators: ',' ';' or '\n'(CR)
|
||||
EXAMPLE:
|
||||
"Strip[0].gain = -6.0
|
||||
Strip[0].A1 = 0
|
||||
Strip[0].B1 = 1
|
||||
Strip[1].gain = -6.0
|
||||
Strip[2].gain = 0.0
|
||||
Strip[3].name = "Skype Caller" "
|
||||
|
||||
@return : 0: OK (no error).
|
||||
>0: number of line causing script error.
|
||||
-1: error
|
||||
-2: no server.
|
||||
-3: unexpected error
|
||||
-4: unexpected error
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_SetParameters(char * szParamScript);
|
||||
long __stdcall VBVMR_SetParametersW(unsigned short * szParamScript);
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* DEVICES ENUMERATOR */
|
||||
/******************************************************************************/
|
||||
|
||||
|
||||
/** @name Device Enumeration Functions
|
||||
* @{ */
|
||||
|
||||
#define VBVMR_DEVTYPE_MME 1
|
||||
#define VBVMR_DEVTYPE_WDM 3
|
||||
#define VBVMR_DEVTYPE_KS 4
|
||||
#define VBVMR_DEVTYPE_ASIO 5
|
||||
|
||||
/**
|
||||
@brief Get number of Audio Output Device available on the system
|
||||
@return : return number of device found.
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_Output_GetDeviceNumber(void);
|
||||
|
||||
/**
|
||||
@brief Return pointer on Output Device Descriptor according index
|
||||
@param zindex : zero based index
|
||||
@param nType : Pointer on 32bit long receiving the type (pointer can be NULL).
|
||||
@param szName : Pointer on string (256 char min) receiving the device name (pointer can be NULL).
|
||||
@param szHardwareId : Pointer on string (256 char min) receiving the hardware ID (pointer can be NULL).
|
||||
@return : 0: OK (no error).
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_Output_GetDeviceDescA(long zindex, long * nType, char * szDeviceName, char * szHardwareId);
|
||||
long __stdcall VBVMR_Output_GetDeviceDescW(long zindex, long * nType, unsigned short * wszDeviceName, unsigned short * wszHardwareId);
|
||||
|
||||
/**
|
||||
@brief Get number of Audio Input Device available on the system
|
||||
@return : return number of device found.
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_Input_GetDeviceNumber(void);
|
||||
|
||||
/**
|
||||
@brief Return pointer on Input Device Descriptor according index
|
||||
@param zindex : zero based index
|
||||
@param nType : Pointer on 32bit long receiving the type (pointer can be NULL).
|
||||
@param szName : Pointer on string (256 char min) receiving the device name (pointer can be NULL).
|
||||
@param szHardwareId : Pointer on string (256 char min) receiving the hardware ID (pointer can be NULL).
|
||||
@return : 0: OK (no error).
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_Input_GetDeviceDescA(long zindex, long * nType, char * szDeviceName, char * szHardwareId);
|
||||
long __stdcall VBVMR_Input_GetDeviceDescW(long zindex, long * nType, unsigned short * wszDeviceName, unsigned short * wszHardwareId);
|
||||
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* VB-AUDIO CALLBACK */
|
||||
/******************************************************************************/
|
||||
/* 4x Functions to process all voicemeeter audio input and output channels */
|
||||
/* */
|
||||
/* VBVMR_AudioCallbackRegister :to register your audio callback(s) */
|
||||
/* VBVMR_AudioCallbackStart :to start the audio stream */
|
||||
/* VBVMR_AudioCallbackStop :to stop the audio stream */
|
||||
/* VBVMR_AudioCallbackUnregister :to unregister / Release callback(s) */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @name VB-Audio Callback Functions
|
||||
* @{ */
|
||||
|
||||
|
||||
typedef struct tagVBVMR_AUDIOINFO
|
||||
{
|
||||
long samplerate;
|
||||
long nbSamplePerFrame;
|
||||
} VBVMR_T_AUDIOINFO, *VBVMR_PT_AUDIOINFO, *VBVMR_LPT_AUDIOINFO;
|
||||
|
||||
|
||||
typedef struct tagVBVMR_AUDIOBUFFER
|
||||
{
|
||||
long audiobuffer_sr; //Sampling Rate
|
||||
long audiobuffer_nbs; //number of sample per frame
|
||||
long audiobuffer_nbi; //number of inputs
|
||||
long audiobuffer_nbo; //number of outputs
|
||||
float * audiobuffer_r[128]; //nbi input pointers containing frame of nbs sample (of 32bits float)
|
||||
float * audiobuffer_w[128]; //nbo output pointers containing frame of nbs sample (of 32bits float)
|
||||
} VBVMR_T_AUDIOBUFFER, *VBVMR_PT_AUDIOBUFFER, *VBVMR_LPT_AUDIOBUFFER;
|
||||
|
||||
|
||||
/**
|
||||
@brief VB-AUDIO Callback is called for different task to Initialize, perform and end your process.
|
||||
VB-AUDIO Callback is part of single TIME CRITICAL Thread.
|
||||
VB-AUDIO Callback is non re-entrant (cannot be called while in process)
|
||||
VB-AUDIO Callback is supposed to be REAL TIME when called to process buffer.
|
||||
(it means that the process has to be performed as fast as possible, waiting cycles are forbidden.
|
||||
do not use O/S synchronization object, even Critical_Section can generate waiting cycle. Do not use
|
||||
system functions that can generate waiting cycle like display, disk or communication functions for example).
|
||||
|
||||
@param lpUser: User pointer given on callback registration.
|
||||
@param ncommand: reason why the callback is called.
|
||||
@param lpData: pointer on structure, pending on nCommand.
|
||||
@param nnn: additional data, unused
|
||||
|
||||
@return : 0: always 0 (unused).
|
||||
*/
|
||||
|
||||
|
||||
typedef long (__stdcall *T_VBVMR_VBAUDIOCALLBACK)(void * lpUser, long nCommand, void * lpData, long nnn);
|
||||
|
||||
|
||||
#define VBVMR_CBCOMMAND_STARTING 1 //command to initialize data according SR and buffer size
|
||||
//info = (VBVMR_LPT_AUDIOINFO)lpData
|
||||
|
||||
#define VBVMR_CBCOMMAND_ENDING 2 //command to release data
|
||||
#define VBVMR_CBCOMMAND_CHANGE 3 //If change in audio stream, you will have to restart audio
|
||||
|
||||
#define VBVMR_CBCOMMAND_BUFFER_IN 10 //input insert
|
||||
#define VBVMR_CBCOMMAND_BUFFER_OUT 11 //bus output insert
|
||||
#define VBVMR_CBCOMMAND_BUFFER_MAIN 20 //all i/o
|
||||
//audiobuffer = (VBVMR_LPT_AUDIOBUFFER)lpData
|
||||
//nnn = synchro = 1 if synchro with Voicemeeter
|
||||
|
||||
/*
|
||||
-----------------------------------------------------
|
||||
AUDIO BUFFER for VBVMR_CBCOMMAND_BUFFER_IN
|
||||
-----------------------------------------------------
|
||||
VOICEMEETER
|
||||
|
||||
| Strip 1 | Strip 2 | Virtual Input |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
|
||||
|
||||
VOICEMEETER BANANA
|
||||
|
||||
| Strip 1 | Strip 2 | Strip 3 | Virtual Input | Virtual Input AUX |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
|
||||
|
||||
VOICEMEETER 8
|
||||
|
||||
| Strip 1 | Strip 2 | Strip 3 | Strip 4 | Strip 5 | Virtual Input | Virtual Input AUX | Virtual Input 8 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
|
||||
|
||||
|
||||
-----------------------------------------------------
|
||||
AUDIO BUFFER for VBVMR_CBCOMMAND_BUFFER_OUT
|
||||
-----------------------------------------------------
|
||||
VOICEMEETER
|
||||
|
||||
| Output A1 / A2 | Virtual Output |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 |
|
||||
|
||||
VOICEMEETER BANANA
|
||||
|
||||
| Output A1 | Output A2 | Output A3 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
|
||||
|
||||
| Virtual Output B1 | Virtual Output B2 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
|
||||
|
||||
|
||||
VOICEMEETER 8
|
||||
|
||||
| Output A1 | Output A2 | Output A3 | Output A4 | Output A5 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 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 |
|
||||
|
||||
| Virtual Output B1 | Virtual Output B2 | Virtual Output B3 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
|
||||
|
||||
|
||||
-----------------------------------------------------
|
||||
AUDIO BUFFER for VBVMR_CBCOMMAND_BUFFER_MAIN
|
||||
-----------------------------------------------------
|
||||
VOICEMEETER
|
||||
|
||||
| Strip 1 | Strip 2 | Virtual Input |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
|
||||
|
||||
| Output A1 / A2 | Virtual Output |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
|
||||
Output buffer provides outputs only:
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 |
|
||||
|
||||
VOICEMEETER BANANA
|
||||
|
||||
| Strip 1 | Strip 2 | Strip 3 | Virtual Input | Virtual Input AUX |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
|
||||
|
||||
| Output A1 | Output A2 | Output A3 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
|
||||
Output buffer provides outputs only:
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
|
||||
|
||||
| Virtual Output B1 | Virtual Output B2 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 |
|
||||
Output buffer provides outputs only:
|
||||
| 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
|
||||
|
||||
|
||||
VOICEMEETER 8
|
||||
|
||||
| Strip 1 | Strip 2 | Strip 3 | Strip 4 | Strip 5 | Virtual Input | Virtual Input AUX | Virtual Input 8 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
|
||||
|
||||
| Output A1 | Output A2 | Output A3 | Output A4 | Output A5 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 |
|
||||
Output buffer provides outputs only:
|
||||
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 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 |
|
||||
|
||||
| Virtual Output B1 | Virtual Output B2 | Virtual Output B3 |
|
||||
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|
||||
| 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 |
|
||||
Output buffer provides outputs only:
|
||||
| 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
@brief register your audio callback function to receive real time audio buffer
|
||||
it's possible to register up to 3x different Audio Callback in the same application or in
|
||||
3x different applications. In the same application, this is possible because Voicemeeter
|
||||
provides 3 kind of audio Streams:
|
||||
- AUDIO INPUT INSERT (to process all Voicemeeter inputs as insert)
|
||||
- AUDIO OUTPUT INSERT (to process all Voicemeeter BUS outputs as insert)
|
||||
- ALL AUDIO I/O (to process all Voicemeeter i/o).
|
||||
Note: a single callback can be used to receive the 3 possible audio streams.
|
||||
|
||||
@param mode : callback type (main, input or bus output) see define below
|
||||
@param pCallback : Pointer on your callback function.
|
||||
@param lpUser : user pointer (pointer that will be passed in callback first argument).
|
||||
@param szClientName[64]: IN: Name of the application registering the Callback.
|
||||
OUT: Name of the application already registered.
|
||||
@return : 0: OK (no error).
|
||||
-1: error
|
||||
1: callback already registered (by another application).
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_AudioCallbackRegister(long mode, T_VBVMR_VBAUDIOCALLBACK pCallback, void * lpUser, char szClientName[64]);
|
||||
|
||||
#define VBVMR_AUDIOCALLBACK_IN 0x00000001 //to process input insert
|
||||
#define VBVMR_AUDIOCALLBACK_OUT 0x00000002 //to process output bus insert
|
||||
#define VBVMR_AUDIOCALLBACK_MAIN 0x00000004 //to receive all i/o
|
||||
|
||||
/**
|
||||
@brief Start / Stop Audio processing
|
||||
|
||||
he Callback will be called with
|
||||
@return : 0: OK (no error).
|
||||
-1: error
|
||||
-2: no callback registred.
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_AudioCallbackStart(void);
|
||||
long __stdcall VBVMR_AudioCallbackStop(void);
|
||||
|
||||
|
||||
/**
|
||||
@brief unregister your callback to release voicemeeter virtual driver
|
||||
(this function will automatically call VBVMR_AudioCallbackStop() function)
|
||||
@param pCallback : Pointer on your callback function.
|
||||
@return : 0: OK (no error).
|
||||
-1: error
|
||||
1: callback already unregistered.
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_AudioCallbackUnregister(void);
|
||||
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* */
|
||||
/* Macro Buttons */
|
||||
/* */
|
||||
/******************************************************************************/
|
||||
|
||||
/** @name Macro Buttons functions
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
@brief Check if Macro Buttons states changed.
|
||||
Call this function periodically (typically every 50 or 500ms) to know if something happen on MacroButton states .
|
||||
(this function must be called from one thread only)
|
||||
|
||||
@return: 0: no new status.
|
||||
>0: last nu logical button status changed.
|
||||
-1: error (unexpected)
|
||||
-2: no server.
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_MacroButton_IsDirty(void);
|
||||
|
||||
/**
|
||||
@brief get current status of a given button.
|
||||
@param nuLogicalButton : button index: 0 to 79)
|
||||
@param pValue : Pointer on float (32bit float by reference) receiving the wanted value (0.0 = OFF / 1.0 = ON).
|
||||
@param bitmode: define what kind of value you want to read (see MACROBUTTON_MODE below)
|
||||
@return : 0: OK (no error).
|
||||
-1: error
|
||||
-2: no server.
|
||||
-3: unknown parameter
|
||||
-5: structure mismatch
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_MacroButton_GetStatus(long nuLogicalButton, float * pValue, long bitmode);
|
||||
|
||||
/**
|
||||
@brief set current button value.
|
||||
@param nuLogicalButton : button index: 0 to 79)
|
||||
@param fValue : float 32 bit value giving the status (0.0 = OFF / 1.0 = ON).
|
||||
@param bitmode: define what kind of value you want to write/modify (see MACROBUTTON_MODE below)
|
||||
@return : 0: OK (no error).
|
||||
-1: error
|
||||
-2: no server.
|
||||
-3: unknown parameter
|
||||
-5: structure mismatch
|
||||
*/
|
||||
|
||||
long __stdcall VBVMR_MacroButton_SetStatus(long nuLogicalButton, float fValue, long bitmode);
|
||||
|
||||
#define VBVMR_MACROBUTTON_MODE_DEFAULT 0x00000000 //PUSH or RELEASE button
|
||||
#define VBVMR_MACROBUTTON_MODE_STATEONLY 0x00000002 //change Displayed State only
|
||||
#define VBVMR_MACROBUTTON_MODE_TRIGGER 0x00000003 //change Trigger State
|
||||
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* 'C' STRUCTURED INTERFACE */
|
||||
/******************************************************************************/
|
||||
|
||||
typedef long (__stdcall *T_VBVMR_Login)(void);
|
||||
typedef long (__stdcall *T_VBVMR_Logout)(void);
|
||||
typedef long (__stdcall *T_VBVMR_RunVoicemeeter)(long vType);
|
||||
|
||||
typedef long (__stdcall *T_VBVMR_GetVoicemeeterType)(long * pType);
|
||||
typedef long (__stdcall *T_VBVMR_GetVoicemeeterVersion)(long * pVersion);
|
||||
|
||||
typedef long (__stdcall *T_VBVMR_IsParametersDirty)(void);
|
||||
typedef long (__stdcall *T_VBVMR_GetParameterFloat)(char * szParamName, float * pValue);
|
||||
typedef long (__stdcall *T_VBVMR_GetParameterStringA)(char * szParamName, char * szString);
|
||||
typedef long (__stdcall *T_VBVMR_GetParameterStringW)(char * szParamName, unsigned short * wszString);
|
||||
|
||||
|
||||
typedef long (__stdcall *T_VBVMR_GetLevel)(long nType, long nuChannel, float * pValue);
|
||||
typedef long (__stdcall *T_VBVMR_GetMidiMessage)(unsigned char *pMIDIBuffer, long nbByteMax);
|
||||
|
||||
typedef long (__stdcall *T_VBVMR_SetParameterFloat)(char * szParamName, float Value);
|
||||
typedef long (__stdcall *T_VBVMR_SetParameters)(char * szParamScript);
|
||||
typedef long (__stdcall *T_VBVMR_SetParametersW)(unsigned short * szParamScript);
|
||||
typedef long (__stdcall *T_VBVMR_SetParameterStringA)(char * szParamName, char * szString);
|
||||
typedef long (__stdcall *T_VBVMR_SetParameterStringW)(char * szParamName, unsigned short * wszString);
|
||||
|
||||
typedef long (__stdcall *T_VBVMR_Output_GetDeviceNumber)(void);
|
||||
typedef long (__stdcall *T_VBVMR_Output_GetDeviceDescA)(long zindex, long * nType, char * szDeviceName, char * szHardwareId);
|
||||
typedef long (__stdcall *T_VBVMR_Output_GetDeviceDescW)(long zindex, long * nType, unsigned short * wszDeviceName, unsigned short * wszHardwareId);
|
||||
typedef long (__stdcall *T_VBVMR_Input_GetDeviceNumber)(void);
|
||||
typedef long (__stdcall *T_VBVMR_Input_GetDeviceDescA)(long zindex, long * nType, char * szDeviceName, char * szHardwareId);
|
||||
typedef long (__stdcall *T_VBVMR_Input_GetDeviceDescW)(long zindex, long * nType, unsigned short * wszDeviceName, unsigned short * wszHardwareId);
|
||||
|
||||
typedef long (__stdcall *T_VBVMR_AudioCallbackRegister)(long mode, T_VBVMR_VBAUDIOCALLBACK pCallback, void * lpUser, char szClientName[64]);
|
||||
typedef long (__stdcall *T_VBVMR_AudioCallbackStart)(void);
|
||||
typedef long (__stdcall *T_VBVMR_AudioCallbackStop)(void);
|
||||
typedef long (__stdcall *T_VBVMR_AudioCallbackUnregister)(void);
|
||||
|
||||
typedef long (__stdcall *T_VBVMR_MacroButton_IsDirty)(void);
|
||||
typedef long (__stdcall *T_VBVMR_MacroButton_GetStatus)(long nuLogicalButton, float * pValue, long bitmode);
|
||||
typedef long (__stdcall *T_VBVMR_MacroButton_SetStatus)(long nuLogicalButton, float fValue, long bitmode);
|
||||
|
||||
|
||||
|
||||
typedef struct tagVBVMR_INTERFACE
|
||||
{
|
||||
T_VBVMR_Login VBVMR_Login;
|
||||
T_VBVMR_Logout VBVMR_Logout;
|
||||
T_VBVMR_RunVoicemeeter VBVMR_RunVoicemeeter;
|
||||
T_VBVMR_GetVoicemeeterType VBVMR_GetVoicemeeterType;
|
||||
T_VBVMR_GetVoicemeeterVersion VBVMR_GetVoicemeeterVersion;
|
||||
T_VBVMR_IsParametersDirty VBVMR_IsParametersDirty;
|
||||
T_VBVMR_GetParameterFloat VBVMR_GetParameterFloat;
|
||||
T_VBVMR_GetParameterStringA VBVMR_GetParameterStringA;
|
||||
T_VBVMR_GetParameterStringW VBVMR_GetParameterStringW;
|
||||
|
||||
T_VBVMR_GetLevel VBVMR_GetLevel;
|
||||
T_VBVMR_GetMidiMessage VBVMR_GetMidiMessage;
|
||||
|
||||
T_VBVMR_SetParameterFloat VBVMR_SetParameterFloat;
|
||||
T_VBVMR_SetParameters VBVMR_SetParameters;
|
||||
T_VBVMR_SetParametersW VBVMR_SetParametersW;
|
||||
T_VBVMR_SetParameterStringA VBVMR_SetParameterStringA;
|
||||
T_VBVMR_SetParameterStringW VBVMR_SetParameterStringW;
|
||||
|
||||
T_VBVMR_Output_GetDeviceNumber VBVMR_Output_GetDeviceNumber;
|
||||
T_VBVMR_Output_GetDeviceDescA VBVMR_Output_GetDeviceDescA;
|
||||
T_VBVMR_Output_GetDeviceDescW VBVMR_Output_GetDeviceDescW;
|
||||
T_VBVMR_Input_GetDeviceNumber VBVMR_Input_GetDeviceNumber;
|
||||
T_VBVMR_Input_GetDeviceDescA VBVMR_Input_GetDeviceDescA;
|
||||
T_VBVMR_Input_GetDeviceDescW VBVMR_Input_GetDeviceDescW;
|
||||
|
||||
T_VBVMR_AudioCallbackRegister VBVMR_AudioCallbackRegister;
|
||||
T_VBVMR_AudioCallbackStart VBVMR_AudioCallbackStart;
|
||||
T_VBVMR_AudioCallbackStop VBVMR_AudioCallbackStop;
|
||||
T_VBVMR_AudioCallbackUnregister VBVMR_AudioCallbackUnregister;
|
||||
|
||||
T_VBVMR_MacroButton_IsDirty VBVMR_MacroButton_IsDirty;
|
||||
T_VBVMR_MacroButton_GetStatus VBVMR_MacroButton_GetStatus;
|
||||
T_VBVMR_MacroButton_SetStatus VBVMR_MacroButton_SetStatus;
|
||||
|
||||
} T_VBVMR_INTERFACE, *PT_VBVMR_INTERFACE, *LPT_VBVMR_INTERFACE;
|
||||
|
||||
#ifdef VBUSE_LOCALLIB
|
||||
// internal used (not public)
|
||||
void __stdcall VBVMR_SetHinstance(HINSTANCE hinst);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* VBAN RT PACKET */
|
||||
/******************************************************************************/
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
// COMPATIBILITY: defined structure cannot be changed.
|
||||
// some field could be added at the end of the structure to keep the compatibility in the time.
|
||||
|
||||
typedef struct tagVBAN_VMRT_PACKET
|
||||
{
|
||||
unsigned char voicemeeterType; // 1 = Voicemeeter, 2= Voicemeeter Banana, 3 Potato
|
||||
unsigned char reserved; // unused
|
||||
unsigned short buffersize; // main stream buffer size
|
||||
unsigned long voicemeeterVersion; // version like for VBVMR_GetVoicemeeterVersion() functino
|
||||
unsigned long optionBits; // unused
|
||||
unsigned long samplerate; // main stream samplerate
|
||||
short inputLeveldB100[34]; // pre fader input peak level in dB * 100
|
||||
short outputLeveldB100[64]; // bus output peak level in dB * 100
|
||||
unsigned long TransportBit; // Transport Status
|
||||
unsigned long stripState[8]; // Strip Buttons Status (see MODE bits below)
|
||||
unsigned long busState[8]; // Bus Buttons Status (see MODE bits below)
|
||||
short stripGaindB100Layer1[8]; // Strip Gain in dB * 100
|
||||
short stripGaindB100Layer2[8];
|
||||
short stripGaindB100Layer3[8];
|
||||
short stripGaindB100Layer4[8];
|
||||
short stripGaindB100Layer5[8];
|
||||
short stripGaindB100Layer6[8];
|
||||
short stripGaindB100Layer7[8];
|
||||
short stripGaindB100Layer8[8];
|
||||
short busGaindB100[8]; // Bus Gain in dB * 100
|
||||
char stripLabelUTF8c60[8][60]; // Strip Label
|
||||
char busLabelUTF8c60[8][60]; // Bus Label
|
||||
} T_VBAN_VMRT_PACKET, *PT_VBAN_VMRT_PACKET, *LPT_VBAN_VMRT_PACKET;
|
||||
|
||||
#define expected_size_T_VBAN_VMRT_PACKET 1384 //1436 max
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#define VMRTSTATE_MODE_MUTE 0x00000001
|
||||
#define VMRTSTATE_MODE_SOLO 0x00000002
|
||||
#define VMRTSTATE_MODE_MONO 0x00000004
|
||||
#define VMRTSTATE_MODE_MUTEC 0x00000008
|
||||
|
||||
#define VMRTSTATE_MODE_MIXDOWN 0x00000010
|
||||
#define VMRTSTATE_MODE_REPEAT 0x00000020
|
||||
#define VMRTSTATE_MODE_MIXDOWNB 0x00000030
|
||||
#define VMRTSTATE_MODE_COMPOSITE 0x00000040
|
||||
#define VMRTSTATE_MODE_UPMIXTV 0x00000050
|
||||
#define VMRTSTATE_MODE_UPMIX2 0x00000060
|
||||
#define VMRTSTATE_MODE_UPMIX4 0x00000070
|
||||
#define VMRTSTATE_MODE_UPMIX6 0x00000080
|
||||
#define VMRTSTATE_MODE_CENTER 0x00000090
|
||||
#define VMRTSTATE_MODE_LFE 0x000000A0
|
||||
#define VMRTSTATE_MODE_REAR 0x000000B0
|
||||
|
||||
#define VMRTSTATE_MODE_MASK 0x000000F0
|
||||
|
||||
#define VMRTSTATE_MODE_EQ 0x00000100
|
||||
#define VMRTSTATE_MODE_CROSS 0x00000200
|
||||
#define VMRTSTATE_MODE_EQB 0x00000800
|
||||
|
||||
#define VMRTSTATE_MODE_BUSA 0x00001000
|
||||
#define VMRTSTATE_MODE_BUSA1 0x00001000
|
||||
#define VMRTSTATE_MODE_BUSA2 0x00002000
|
||||
#define VMRTSTATE_MODE_BUSA3 0x00004000
|
||||
#define VMRTSTATE_MODE_BUSA4 0x00008000
|
||||
#define VMRTSTATE_MODE_BUSA5 0x00080000
|
||||
|
||||
#define VMRTSTATE_MODE_BUSB 0x00010000
|
||||
#define VMRTSTATE_MODE_BUSB1 0x00010000
|
||||
#define VMRTSTATE_MODE_BUSB2 0x00020000
|
||||
#define VMRTSTATE_MODE_BUSB3 0x00040000
|
||||
|
||||
#define VMRTSTATE_MODE_PAN0 0x00000000
|
||||
#define VMRTSTATE_MODE_PANCOLOR 0x00100000
|
||||
#define VMRTSTATE_MODE_PANMOD 0x00200000
|
||||
#define VMRTSTATE_MODE_PANMASK 0x00F00000
|
||||
|
||||
#define VMRTSTATE_MODE_POSTFX_R 0x01000000
|
||||
#define VMRTSTATE_MODE_POSTFX_D 0x02000000
|
||||
#define VMRTSTATE_MODE_POSTFX1 0x04000000
|
||||
#define VMRTSTATE_MODE_POSTFX2 0x08000000
|
||||
|
||||
#define VMRTSTATE_MODE_SEL 0x10000000
|
||||
#define VMRTSTATE_MODE_MONITOR 0x20000000
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* LOCAL FUNCTIONS */
|
||||
/******************************************************************************/
|
||||
|
||||
long VBVMR_LocalInit(void);
|
||||
long VBVMR_LocalEnd(void);
|
||||
void * VBVMR_GetRequestVB0STREAMPTR(void);
|
||||
|
||||
long VBVMR_SetParametersWEx(unsigned short * szParamScript, long fCopyToClient);
|
||||
|
||||
long VBVMR_LoginEx(long properties);
|
||||
|
||||
long VBVMR_MB_PushSettings(void * lpParam);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*__VOICEMEETER_REMOTE_H__*/
|
||||
|
||||
|
1924
vmr_streamer/source/streamer_ctrl.c
Normal file
199
vmr_streamer/source/streamer_ctrl.h
Normal file
@ -0,0 +1,199 @@
|
||||
/**********************************************************************************/
|
||||
/* VMSCTL V.Burel */
|
||||
/**********************************************************************************/
|
||||
/* Contains our custom windows control for vmr_streamer project */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* */
|
||||
/* COMPILATION DIRECTIVES: */
|
||||
/* */
|
||||
/* To compile With Microsoft VC2005 or higher, you need to create an */
|
||||
/* empty Win32 project with the following options: */
|
||||
/* - Configuration Properties / General : Char Set = NOT SET */
|
||||
/* - Configuration Properties / C/C++ / Preprocessor : _CRT_SECURE_NO_DEPRECATE */
|
||||
/* */
|
||||
/* This source code can be compiled for 32bit or 64 bits targets as well */
|
||||
/* WARNING: FOR 64x COMPILATION, ADD PREPROCESSOR DEFINE: VB_X64 */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* */
|
||||
/* LICENSING: VoicemeeterRemote.dll usage is driven by a license agreement */
|
||||
/* given in VoicemeeterRemoteAPI.pdf or readme.txt */
|
||||
/* This Source Code can be used only in a program using Voicemeeter */
|
||||
/* Remote API anyway */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
#ifndef __VMSCTL_H__
|
||||
#define __VMSCTL_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// if compiling for x64 target define this
|
||||
//#define VB_X64
|
||||
|
||||
|
||||
#define VMSCTL_MAX_NBSTRIP 8
|
||||
#define VMSCTL_MAX_NBBUS 8
|
||||
|
||||
|
||||
#define VMSCTL_CLASSNAME_STRIP "VMStreamerCtrl_Strip"
|
||||
#define VMSCTL_CLASSNAME_BUS "VMStreamerCtrl_BUS"
|
||||
|
||||
|
||||
//Initialize library
|
||||
long VMSCTL_InitLib(HINSTANCE hinst);
|
||||
void VMSCTL_EndLib(void);
|
||||
|
||||
|
||||
typedef struct tagVMSCTL_RT_DATA
|
||||
{
|
||||
float dbLevel[8];
|
||||
} T_VMSCTL_RT_DATA, *PT_VMSCTL_RT_DATA, *LPT_VMSCTL_RT_DATA;
|
||||
|
||||
/*---------------------------------------------------------------*/
|
||||
/* STRIP CTL */
|
||||
/*---------------------------------------------------------------*/
|
||||
typedef void (__stdcall *VMSCTL_LPT_SBCALLBACK)(void * lpuser,long Ident, long ICtl, float value);
|
||||
|
||||
|
||||
#define VMSCTL_STRIP_ID_MUTE 100
|
||||
#define VMSCTL_STRIP_ID_NAME 101
|
||||
#define VMSCTL_STRIP_ID_METER 102
|
||||
#define VMSCTL_STRIP_ID_GAIN 132
|
||||
#define VMSCTL_STRIP_ID_ASSIGN 148
|
||||
|
||||
typedef struct tagVMSCTL_STRIPPARAM
|
||||
{
|
||||
HFONT font0;
|
||||
HFONT font1;
|
||||
HFONT font2;
|
||||
float vmin,vmax;
|
||||
HBRUSH bkg0_brush;
|
||||
HBRUSH bkg1_brush;
|
||||
|
||||
HPEN assignbus_pen;
|
||||
COLORREF assignbus_color;
|
||||
COLORREF name_color;
|
||||
|
||||
HPEN slider_pen_green;
|
||||
HPEN slider_pen_red;
|
||||
HBRUSH slider_brush_green;
|
||||
HBRUSH slider_brush_red;
|
||||
|
||||
HBRUSH meter_brush1;
|
||||
HBRUSH meter_brush2;
|
||||
HBRUSH meter_brush3;
|
||||
|
||||
COLORREF mutered_color;
|
||||
HPEN mutered_pen;
|
||||
COLORREF assigned_color;
|
||||
HPEN assigned_pen;
|
||||
|
||||
VMSCTL_LPT_SBCALLBACK lpCallback;
|
||||
void * lpuser;
|
||||
} T_VMSCTL_STRIPPARAM, *PT_VMSCTL_STRIPPARAM, *LPT_VMSCTL_STRIPPARAM;
|
||||
|
||||
HWND VMSCTL_CreateSTRIP(HWND hParent, long Ident, long x0,long y0, LPT_VMSCTL_STRIPPARAM lpparam);
|
||||
|
||||
long VMSCTL_PositionSTRIP(HWND hw, long x0,long y0, long dx, long dy, long fShow);
|
||||
|
||||
|
||||
typedef struct tagVMSCTL_STRIP_DATA
|
||||
{
|
||||
WCHAR strip_namew[64];
|
||||
char strip_nickname[8];
|
||||
float strip_gain[VMSCTL_MAX_NBBUS];
|
||||
long strip_mute;
|
||||
char strip_assignmentbit[VMSCTL_MAX_NBBUS]; //0x10 bus activated / 0x01 bus assigned
|
||||
long strip_nbBusDisplayed;
|
||||
long strip_fMultiLayer;
|
||||
char ** strip_pBUSNameList;
|
||||
} T_VMSCTL_STRIP_DATA, *PT_VMSCTL_STRIP_DATA, *LPT_VMSCTL_STRIP_DATA;
|
||||
|
||||
long VMSCTL_SetDataSTRIP(HWND hw, LPT_VMSCTL_STRIP_DATA pData, long fUpdateAll);
|
||||
long VMSCTL_ResetDataSTRIP(HWND hw);
|
||||
|
||||
long VMSCTL_SetRTDataSTRIP(HWND hw, LPT_VMSCTL_RT_DATA pRTData);
|
||||
|
||||
long VMSCTL_GetIndexSTRIP(HWND hw,long nuVisibleSlider);
|
||||
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------------*/
|
||||
/* BUS CTL */
|
||||
/*---------------------------------------------------------------*/
|
||||
|
||||
#define VMSCTL_BUS_ID_MUTE 200
|
||||
#define VMSCTL_BUS_ID_NAME 201
|
||||
#define VMSCTL_BUS_ID_METER 202
|
||||
#define VMSCTL_BUS_ID_GAIN 203
|
||||
#define VMSCTL_BUS_ID_MONITOR 204
|
||||
|
||||
typedef struct tagVMSCTL_BUSPARAM
|
||||
{
|
||||
HFONT font0;
|
||||
HFONT font1;
|
||||
HFONT font2;
|
||||
float vmin,vmax;
|
||||
|
||||
HBRUSH bkg0_brush;
|
||||
HBRUSH bkg1_brush;
|
||||
HPEN assignbus_pen;
|
||||
COLORREF assignbus_color;
|
||||
COLORREF name_color;
|
||||
|
||||
HPEN slider_pen_green;
|
||||
HPEN slider_pen_red;
|
||||
HBRUSH slider_brush_green;
|
||||
HBRUSH slider_brush_red;
|
||||
|
||||
HBRUSH meter_brush1;
|
||||
HBRUSH meter_brush2;
|
||||
HBRUSH meter_brush3;
|
||||
|
||||
COLORREF mutered_color;
|
||||
HPEN mutered_pen;
|
||||
|
||||
HBRUSH monitor_brush;
|
||||
HPEN monitor_pen;
|
||||
|
||||
VMSCTL_LPT_SBCALLBACK lpCallback;
|
||||
void * lpuser;
|
||||
} T_VMSCTL_BUSPARAM, *PT_VMSCTL_BUSPARAM, *LPT_VMSCTL_BUSPARAM;
|
||||
|
||||
HWND VMSCTL_CreateBUS(HWND hParent, long Ident, long x0,long y0, LPT_VMSCTL_BUSPARAM lpparam);
|
||||
|
||||
long VMSCTL_PositionBUS(HWND hw, long x0,long y0, long dx, long dy, long fShow);
|
||||
|
||||
|
||||
typedef struct tagVMSCTL_BUS_DATA
|
||||
{
|
||||
WCHAR bus_namew[64];
|
||||
char bus_nickname[8];
|
||||
float bus_gain;
|
||||
long bus_mute;
|
||||
long bus_monitor;
|
||||
long bus_fMonitorSupport;
|
||||
} T_VMSCTL_BUS_DATA, *PT_VMSCTL_BUS_DATA, *LPT_VMSCTL_BUS_DATA;
|
||||
|
||||
long VMSCTL_SetDataBUS(HWND hw, LPT_VMSCTL_BUS_DATA pData, long fUpdateAll);
|
||||
long VMSCTL_ResetDataBUS(HWND hw);
|
||||
|
||||
long VMSCTL_SetRTDataBUS(HWND hw, LPT_VMSCTL_RT_DATA pRTData);
|
||||
|
||||
|
||||
//End Of Header.
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*__VMSCTL_H__*/
|
||||
|
||||
|
600
vmr_streamer/source/vban_cmd.c
Normal file
@ -0,0 +1,600 @@
|
||||
/**********************************************************************************/
|
||||
/* VBAN COMMAND V.Burel(c)2015-2021 */
|
||||
/**********************************************************************************/
|
||||
/* */
|
||||
/* THIS PROGRAM PROVIDES A MINIMAL VBAN-SERVICE */
|
||||
/* PROVIDES A FUNCTION TO SEND VBAN-TEXT REQUEST */
|
||||
/* PROVIDES A METHOD TO MANAGE VBAN RT-PACKET */
|
||||
/* */
|
||||
/* This program example shows */
|
||||
/* - How to use Windows Socket */
|
||||
/* - How to send and recieve VBAN request */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* */
|
||||
/* COMPILATION DIRECTIVES: */
|
||||
/* */
|
||||
/* To compile With Microsoft VC2005 or higher, you need to create an */
|
||||
/* empty Win32 project with the following options: */
|
||||
/* - Configuration Properties / General : Char Set = NOT SET */
|
||||
/* - Configuration Properties / C/C++ / Preprocessor : _CRT_SECURE_NO_DEPRECATE */
|
||||
/* */
|
||||
/* LINKER: Ws2_32.lib */
|
||||
/* */
|
||||
/* This source code can be compiled for 32bit or 64 bits targets as well */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* */
|
||||
/* LICENSING: VoicemeeterRemote.dll usage is driven by a license agreement */
|
||||
/* given in VoicemeeterRemoteAPI.pdf or readme.txt */
|
||||
/* THIS SOURCE CODE CAN BE USED ONLY IN A PROGRAM USING VOICEMEETER */
|
||||
/* REMOTE API */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#ifndef __cplusplus
|
||||
#ifndef STRICT
|
||||
#define STRICT
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
//#include <math.h>
|
||||
#include <windows.h>
|
||||
//#include <tchar.h>
|
||||
#include <winsock.h>
|
||||
|
||||
#include "vban_cmd.h"
|
||||
#include "VoicemeeterRemote.h"
|
||||
|
||||
|
||||
|
||||
typedef struct tagVBANCMD_CONTEXT
|
||||
{
|
||||
long mode;
|
||||
BOOL ThreadStarted, finitlib;
|
||||
HANDLE Thread_handle;
|
||||
DWORD Thread_ident;
|
||||
BOOL Thread_flagOK;
|
||||
long WSAStartupReply;
|
||||
WSADATA WSAData;
|
||||
SOCKET vban_socket;
|
||||
unsigned long IPv4Address;
|
||||
unsigned short UDPport;
|
||||
long fPortUsedByOtherApplication;
|
||||
CRITICAL_SECTION ctc_section;
|
||||
T_VBAN_VMRT_PACKET CurrentRTPPacket;
|
||||
long CurrentRTPPacket_dirtyflag;
|
||||
DWORD CurrentRTPPacket_counter;
|
||||
T_VBAN_VMRT_PACKET PublicRTPPacket;
|
||||
unsigned char last_voicemeeterType;
|
||||
|
||||
T_VBAN_HEADER VBANHeader;
|
||||
|
||||
} T_VBANCMD_CONTEXT, * PT_VBANCMD_CONTEXT, * LPT_VBANCMD_CONTEXT;
|
||||
|
||||
|
||||
static T_VBANCMD_CONTEXT G_vban_ctx = { 0, 0, 0, NULL };
|
||||
|
||||
|
||||
long VBANCMD_GetIncomingRequestCounter(void)
|
||||
{
|
||||
return G_vban_ctx.CurrentRTPPacket_counter;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* SOCKET TOOL */
|
||||
/******************************************************************************/
|
||||
|
||||
|
||||
static long VBAN_CloseSocket(SOCKET* psocket)
|
||||
{
|
||||
long rep;
|
||||
if (*psocket != INVALID_SOCKET)
|
||||
{
|
||||
shutdown(*psocket, 2);
|
||||
rep = closesocket(*psocket);
|
||||
*psocket = INVALID_SOCKET;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static long VBAN_SetSocketNonblocking(SOCKET socket)
|
||||
{
|
||||
u_long flags;
|
||||
flags = 1;
|
||||
return ioctlsocket(socket, FIONBIO, &flags);
|
||||
}
|
||||
|
||||
static long VBAN_InitSocket(LPT_VBANCMD_CONTEXT lpctx, SOCKET* psocket, unsigned short nuPort, long SocketBufferSize)
|
||||
{
|
||||
SOCKADDR_IN local_sin;
|
||||
long rep, nnn;
|
||||
long nsize, nbByte;
|
||||
long nError;
|
||||
|
||||
*psocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if (*psocket == INVALID_SOCKET) return -1;
|
||||
//set non blocking socket
|
||||
rep = VBAN_SetSocketNonblocking(*psocket);
|
||||
if (rep != 0)
|
||||
{
|
||||
closesocket(*psocket);
|
||||
*psocket = INVALID_SOCKET;
|
||||
return -2;
|
||||
}
|
||||
//disable debug mode
|
||||
nsize = sizeof(rep);
|
||||
nnn = getsockopt(*psocket, SOL_SOCKET, SO_DEBUG, (char*)&(rep), &nsize);
|
||||
if (nnn == 0)
|
||||
{
|
||||
if (rep != 0)
|
||||
{
|
||||
rep = 0;
|
||||
nsize = sizeof(rep);
|
||||
setsockopt(*psocket, SOL_SOCKET, SO_DEBUG, (char*)&rep, nsize);
|
||||
}
|
||||
}
|
||||
//set Time Out = ZERO.
|
||||
rep = 0;
|
||||
nsize = sizeof(rep);
|
||||
setsockopt(*psocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&rep, nsize);
|
||||
setsockopt(*psocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&rep, nsize);
|
||||
|
||||
//set Socket buffer size
|
||||
nsize = sizeof(SocketBufferSize);
|
||||
setsockopt(*psocket, SOL_SOCKET, SO_RCVBUF, (char*)&SocketBufferSize, nsize);
|
||||
|
||||
//128 kB buffer is senough to send VBAN-TEXT request
|
||||
nbByte = 1024 * 128;
|
||||
nsize = sizeof(nbByte);
|
||||
setsockopt(*psocket, SOL_SOCKET, SO_SNDBUF, (char*)&nbByte, nsize);
|
||||
|
||||
//define socket port and ipaddress to
|
||||
memset(&local_sin, 0, sizeof(SOCKADDR_IN));
|
||||
local_sin.sin_family = AF_INET;
|
||||
local_sin.sin_port = htons((unsigned short)nuPort);
|
||||
local_sin.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
|
||||
lpctx->fPortUsedByOtherApplication = 0;
|
||||
if (bind(*psocket, (struct sockaddr*)&(local_sin), sizeof(local_sin)) == SOCKET_ERROR)
|
||||
{
|
||||
nError = WSAGetLastError();
|
||||
if (nError == WSAEADDRINUSE)
|
||||
{
|
||||
lpctx->fPortUsedByOtherApplication = 1;
|
||||
}
|
||||
closesocket(*psocket);
|
||||
*psocket = INVALID_SOCKET;
|
||||
return -5;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* FUNCTIONS REQUEST */
|
||||
/******************************************************************************/
|
||||
|
||||
long VBANCMD_SendRequest_String(char* pString)
|
||||
{
|
||||
SOCKADDR_IN dest;
|
||||
LPT_VBAN_HEADER lpHeader;
|
||||
char Buffer[2048];
|
||||
long rep, nbByte;
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
if (lpctx->ThreadStarted == 0) return -9;
|
||||
if (pString == NULL) return -10;
|
||||
|
||||
lpHeader = (LPT_VBAN_HEADER)Buffer;
|
||||
// build VBAN Header from our current VBAN Header
|
||||
*lpHeader = lpctx->VBANHeader;
|
||||
lpctx->VBANHeader.nuFrame++;
|
||||
strcpy((char*)(lpHeader + 1), pString);
|
||||
//send request
|
||||
memset(&dest, 0, sizeof(SOCKADDR_IN));
|
||||
dest.sin_family = AF_INET;
|
||||
dest.sin_port = htons(lpctx->UDPport);
|
||||
dest.sin_addr.s_addr = lpctx->IPv4Address;
|
||||
|
||||
nbByte = sizeof(T_VBAN_HEADER) + (long)strlen(pString);
|
||||
rep = sendto(lpctx->vban_socket, Buffer, nbByte, 0, (struct sockaddr*)&dest, sizeof(dest));
|
||||
if (rep == SOCKET_ERROR) return -20;
|
||||
return 0;
|
||||
}
|
||||
|
||||
long VBANCMD_SendRequest_Float(char* szParam, float value)
|
||||
{
|
||||
char String[512];
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
|
||||
if (szParam == NULL) return -1;
|
||||
if (szParam[0] == 0) return -2;
|
||||
|
||||
sprintf(String, "%s = %f;", szParam, value);
|
||||
return VBANCMD_SendRequest_String(String);
|
||||
}
|
||||
|
||||
|
||||
|
||||
long VBANCMD_SendRequest_RegisterRTPacket(unsigned char sTimeOut, char* szVBANStreamName)
|
||||
{
|
||||
SOCKADDR_IN dest;
|
||||
T_VBAN_HEADER Header;
|
||||
long rep, nbByte;
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
if (lpctx->ThreadStarted == 0) return -9;
|
||||
|
||||
Header.vban = 'NABV';
|
||||
Header.format_SR = 0x60;
|
||||
Header.format_nbs = 0;
|
||||
Header.format_nbc = VBAN_SERVICE_RTPACKETREGISTER;
|
||||
Header.format_bit = sTimeOut & 0x000000FF;
|
||||
if (szVBANStreamName != NULL) strcpy(Header.streamname, "Register RTP");
|
||||
else strncpy(Header.streamname, szVBANStreamName, 16);
|
||||
Header.nuFrame = 0;
|
||||
|
||||
|
||||
//send request
|
||||
memset(&dest, 0, sizeof(SOCKADDR_IN));
|
||||
dest.sin_family = AF_INET;
|
||||
dest.sin_port = htons(lpctx->UDPport);
|
||||
dest.sin_addr.s_addr = lpctx->IPv4Address;
|
||||
|
||||
nbByte = sizeof(T_VBAN_HEADER);
|
||||
rep = sendto(lpctx->vban_socket, (char*)&Header, nbByte, 0, (struct sockaddr*)&dest, sizeof(dest));
|
||||
if (rep == SOCKET_ERROR) return -20;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* CURRENT PARAMETERS FUNCTIONS */
|
||||
/******************************************************************************/
|
||||
|
||||
long VBANCMD_IsParameterDirty(void)
|
||||
{
|
||||
unsigned char vmType;
|
||||
long reply;
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
reply = lpctx->CurrentRTPPacket_dirtyflag;
|
||||
if (reply != 0)
|
||||
{
|
||||
// if dirty we copy our buffer in public structure
|
||||
EnterCriticalSection(&(lpctx->ctc_section));
|
||||
lpctx->PublicRTPPacket = lpctx->CurrentRTPPacket;
|
||||
LeaveCriticalSection(&(lpctx->ctc_section));
|
||||
}
|
||||
// to fit the same behavior than the remote API function
|
||||
vmType = lpctx->PublicRTPPacket.voicemeeterType;
|
||||
if (vmType == 0) reply = -1;
|
||||
if (lpctx->last_voicemeeterType != vmType) reply = -2;
|
||||
lpctx->last_voicemeeterType = vmType;
|
||||
return reply;
|
||||
}
|
||||
|
||||
// then all information will come directly from our public RTPacket structure
|
||||
|
||||
long VBANCMD_GetVoicemeeterType(unsigned long* pType)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
*pType = (unsigned long)(lpctx->PublicRTPPacket.voicemeeterType);
|
||||
return 0;
|
||||
}
|
||||
|
||||
long VBANCMD_GetVoicemeeterVersion(unsigned long* pVersion)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
*pVersion = lpctx->PublicRTPPacket.voicemeeterVersion;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void TOOL_ConvertUTF8ToWCHAR(char* UTF8_String, WCHAR* wString, long nbCharMax)
|
||||
{
|
||||
if (UTF8_String[0] == 0)
|
||||
{
|
||||
wString[0] = 0;
|
||||
return;
|
||||
}
|
||||
memset(wString, 0, nbCharMax * sizeof(WCHAR));
|
||||
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)UTF8_String, (int)strlen(UTF8_String), wString, nbCharMax);
|
||||
wString[nbCharMax - 1] = 0;
|
||||
}
|
||||
|
||||
|
||||
long VBANCMD_GetBusLabel(long index, WCHAR* pwsz)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
TOOL_ConvertUTF8ToWCHAR(lpctx->PublicRTPPacket.busLabelUTF8c60[index], pwsz, 64);
|
||||
return 0;
|
||||
}
|
||||
|
||||
long VBANCMD_GetBusGain(long index, float* pValue)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
*pValue = ((float)lpctx->PublicRTPPacket.busGaindB100[index]) * 0.01f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
long VBANCMD_GetBusSel(long index, float* pValue)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
if ((lpctx->PublicRTPPacket.busState[index] & VMRTSTATE_MODE_SEL) != 0) *pValue = 1.0f;
|
||||
else *pValue = 0.0f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
long VBANCMD_GetBusMute(long index, float* pValue)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
if ((lpctx->PublicRTPPacket.busState[index] & VMRTSTATE_MODE_MUTE) != 0) *pValue = 1.0f;
|
||||
else *pValue = 0.0f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
long VBANCMD_GetBusMonitor(long index, float* pValue)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
if ((lpctx->PublicRTPPacket.busState[index] & VMRTSTATE_MODE_MONITOR) != 0) *pValue = 1.0f;
|
||||
else *pValue = 0.0f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
long VBANCMD_GetStripLabel(long index, WCHAR* pwsz)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
TOOL_ConvertUTF8ToWCHAR(lpctx->PublicRTPPacket.stripLabelUTF8c60[index], pwsz, 64);
|
||||
return 0;
|
||||
}
|
||||
|
||||
long VBANCMD_GetStripGain(long index, float* pValue)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
*pValue = ((float)lpctx->PublicRTPPacket.stripGaindB100Layer1[index]) * 0.01f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
long VBANCMD_GetStripGainLayer(long index, long layer, float* pValue)
|
||||
{
|
||||
short* pGain;
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
|
||||
pGain = lpctx->PublicRTPPacket.stripGaindB100Layer1;
|
||||
pGain = pGain + (layer * 8);
|
||||
*pValue = ((float)pGain[index]) * 0.01f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
long VBANCMD_GetStripMute(long index, float* pValue)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
if ((lpctx->PublicRTPPacket.stripState[index] & VMRTSTATE_MODE_MUTE) != 0) *pValue = 1.0f;
|
||||
else *pValue = 0.0f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static long G_MaskBusAssign_v1[8] = { VMRTSTATE_MODE_BUSA1, VMRTSTATE_MODE_BUSB1, 0, 0, 0, 0, 0, 0 };
|
||||
static long G_MaskBusAssign_v2[8] = { VMRTSTATE_MODE_BUSA1, VMRTSTATE_MODE_BUSA2, VMRTSTATE_MODE_BUSA3, VMRTSTATE_MODE_BUSB1, VMRTSTATE_MODE_BUSB2, 0, 0, 0 };
|
||||
static long G_MaskBusAssign_v3[8] = { VMRTSTATE_MODE_BUSA1, VMRTSTATE_MODE_BUSA2, VMRTSTATE_MODE_BUSA3, VMRTSTATE_MODE_BUSA4, VMRTSTATE_MODE_BUSA5, VMRTSTATE_MODE_BUSB1, VMRTSTATE_MODE_BUSB2, VMRTSTATE_MODE_BUSB3 };
|
||||
|
||||
long VBANCMD_GetStripAssignation(long index, long nBus, float* pValue)
|
||||
{
|
||||
long* pMask;
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
pMask = NULL;
|
||||
if (lpctx->PublicRTPPacket.voicemeeterType == 1) pMask = G_MaskBusAssign_v1;
|
||||
if (lpctx->PublicRTPPacket.voicemeeterType == 2) pMask = G_MaskBusAssign_v2;
|
||||
if (lpctx->PublicRTPPacket.voicemeeterType == 3) pMask = G_MaskBusAssign_v3;
|
||||
|
||||
if ((lpctx->PublicRTPPacket.stripState[index] & pMask[nBus]) != 0) *pValue = 1.0f;
|
||||
else *pValue = 0.0f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
long VBANCMD_GetLevel(long index, long nuChannel, float* pLevelDB)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
switch (index)
|
||||
{
|
||||
case 0:
|
||||
*pLevelDB = ((float)lpctx->PublicRTPPacket.inputLeveldB100[nuChannel]) * 0.01f;
|
||||
return 0;
|
||||
case 3:
|
||||
*pLevelDB = ((float)lpctx->PublicRTPPacket.outputLeveldB100[nuChannel]) * 0.01f;
|
||||
return 0;
|
||||
default:
|
||||
*pLevelDB = -100.0f;
|
||||
break;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* START / STOP VBAN CLIENT */
|
||||
/******************************************************************************/
|
||||
|
||||
|
||||
static DWORD WINAPI VBANCMD_Thread(LPT_VBANCMD_CONTEXT lpctx)
|
||||
{
|
||||
SOCKADDR_IN from;
|
||||
LPT_VBAN_HEADER lpHeader;
|
||||
long rep, datasize, nbByte, mstemp, fromlen;
|
||||
char Buffer[2048];
|
||||
unsigned char protocol;
|
||||
DWORD current_ipv4;
|
||||
HANDLE h_t;
|
||||
h_t = GetCurrentThread();
|
||||
SetThreadPriority(h_t, THREAD_PRIORITY_HIGHEST);
|
||||
CloseHandle(h_t);
|
||||
lpHeader = (LPT_VBAN_HEADER)Buffer;
|
||||
current_ipv4 = lpctx->IPv4Address;
|
||||
while (lpctx->Thread_flagOK == TRUE)
|
||||
{
|
||||
mstemp = 1;
|
||||
fromlen = sizeof(SOCKADDR_IN);
|
||||
rep = recvfrom(lpctx->vban_socket, Buffer, 2048, 0, (struct sockaddr*)&from, &fromlen);
|
||||
if (rep != SOCKET_ERROR)
|
||||
{
|
||||
mstemp = 0;
|
||||
// if we recieve something
|
||||
datasize = rep;
|
||||
if ((datasize > sizeof(T_VBAN_HEADER)) && (from.sin_addr.S_un.S_addr == current_ipv4))
|
||||
{
|
||||
// if it's a VBAN packet
|
||||
if (lpHeader->vban == 'NABV')
|
||||
{
|
||||
protocol = lpHeader->format_SR & VBAN_PROTOCOL_MASK;
|
||||
// if it's a VBAN-SERVICE packet
|
||||
if (protocol == VBAN_PROTOCOL_SERVICE)
|
||||
{
|
||||
if (lpHeader->format_nbc == VBAN_SERVICE_RTPACKET)
|
||||
{
|
||||
// if it's a RTPacket
|
||||
nbByte = datasize - sizeof(T_VBAN_HEADER);
|
||||
if (nbByte >= sizeof(T_VBAN_VMRT_PACKET))
|
||||
{
|
||||
// just copy it into our context structure and set dirty flag
|
||||
EnterCriticalSection(&(lpctx->ctc_section));
|
||||
memcpy(&(lpctx->CurrentRTPPacket), lpHeader + 1, sizeof(T_VBAN_VMRT_PACKET));
|
||||
lpctx->CurrentRTPPacket_dirtyflag = 1;
|
||||
lpctx->CurrentRTPPacket_counter++;
|
||||
LeaveCriticalSection(&(lpctx->ctc_section));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// if we did nothing we wait for 1 ms, otherwise we wait for next O/S scheduler cycle
|
||||
Sleep(mstemp);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
long VBANCMD_StopThread(void)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
if (lpctx->finitlib == 0) return -1;
|
||||
|
||||
lpctx->ThreadStarted = 0;
|
||||
// Stop Thread
|
||||
lpctx->Thread_flagOK = FALSE;
|
||||
if (lpctx->Thread_handle != NULL)
|
||||
{
|
||||
WaitForSingleObject(lpctx->Thread_handle, INFINITE);
|
||||
CloseHandle(lpctx->Thread_handle);
|
||||
lpctx->Thread_handle = NULL;
|
||||
}
|
||||
// Close Soccket
|
||||
VBAN_CloseSocket(&(lpctx->vban_socket));
|
||||
|
||||
memset(&(lpctx->CurrentRTPPacket), 0, sizeof(T_VBAN_VMRT_PACKET));
|
||||
memset(&(lpctx->PublicRTPPacket), 0, sizeof(T_VBAN_VMRT_PACKET));
|
||||
lpctx->CurrentRTPPacket_dirtyflag = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
long VBANCMD_StartThread(char* szVBANStreamName, char* szIPAddressTo, unsigned short UDPport)
|
||||
{
|
||||
long rep, reply = 0;
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
if (lpctx->finitlib == 0) return -1;
|
||||
VBANCMD_StopThread();
|
||||
|
||||
// build our header to send VBAN-TEXT request
|
||||
lpctx->VBANHeader.vban = 'NABV';
|
||||
lpctx->VBANHeader.format_SR = 0x52;
|
||||
lpctx->VBANHeader.format_nbs = 0;
|
||||
lpctx->VBANHeader.format_nbc = 0;
|
||||
lpctx->VBANHeader.format_bit = 0x10;
|
||||
if (szVBANStreamName == NULL) strcpy(lpctx->VBANHeader.streamname, "Command1");
|
||||
else strncpy(lpctx->VBANHeader.streamname, szVBANStreamName, 16);
|
||||
lpctx->VBANHeader.nuFrame = 0;
|
||||
|
||||
// Init Socket with 2 MB on RCV buffer
|
||||
lpctx->IPv4Address = inet_addr(szIPAddressTo);
|
||||
lpctx->UDPport = UDPport;
|
||||
rep = VBAN_InitSocket(lpctx, &(lpctx->vban_socket), UDPport, 1024 * 1024 * 2);
|
||||
if (rep != 0) return -2;
|
||||
|
||||
// Start Thread
|
||||
lpctx->Thread_flagOK = TRUE;
|
||||
lpctx->Thread_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)VBANCMD_Thread, (void*)lpctx, 0, &(lpctx->Thread_ident));
|
||||
if (lpctx->Thread_handle == NULL)
|
||||
{
|
||||
reply = -100;
|
||||
}
|
||||
// we set STARTED flag only if all is good.
|
||||
lpctx->ThreadStarted = 1;
|
||||
return reply;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* INIT / END LIB */
|
||||
/******************************************************************************/
|
||||
|
||||
long VBANCMD_EndLib(void)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
|
||||
if (lpctx->finitlib == 0) return 0;
|
||||
VBANCMD_StopThread();
|
||||
|
||||
DeleteCriticalSection(&(lpctx->ctc_section));
|
||||
memset(lpctx, 0, sizeof(T_VBANCMD_CONTEXT));
|
||||
return 0;
|
||||
}
|
||||
|
||||
long VBANCMD_InitLib(long mode)
|
||||
{
|
||||
LPT_VBANCMD_CONTEXT lpctx;
|
||||
lpctx = &G_vban_ctx;
|
||||
memset(lpctx, 0, sizeof(T_VBANCMD_CONTEXT));
|
||||
lpctx->mode = mode;
|
||||
lpctx->finitlib = 1;
|
||||
lpctx->WSAStartupReply = WSAStartup(MAKEWORD(1, 1), &(lpctx->WSAData));
|
||||
InitializeCriticalSection(&(lpctx->ctc_section));
|
||||
lpctx->vban_socket = INVALID_SOCKET;
|
||||
return 0;
|
||||
}
|
||||
|
121
vmr_streamer/source/vban_cmd.h
Normal file
@ -0,0 +1,121 @@
|
||||
/**********************************************************************************/
|
||||
/* VBAN COMMAND V.Burel(c)2015-2021 */
|
||||
/**********************************************************************************/
|
||||
/* */
|
||||
/* THIS PROGRAM PROVIDES A MINIMAL VBAN-SERVICE */
|
||||
/* PROVIDES A FUNCTION TO SEND VBAN-TEXT REQUEST */
|
||||
/* PROVIDES A METHOD TO MANAGE VBAN RT-PACKET */
|
||||
/* */
|
||||
/* This program example shows */
|
||||
/* - How to use Windows Socket */
|
||||
/* - How to send and recieve VBAN request */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* */
|
||||
/* COMPILATION DIRECTIVES: */
|
||||
/* */
|
||||
/* To compile With Microsoft VC2005 or higher, you need to create an */
|
||||
/* empty Win32 project with the following options: */
|
||||
/* - Configuration Properties / General : Char Set = NOT SET */
|
||||
/* - Configuration Properties / C/C++ / Preprocessor : _CRT_SECURE_NO_DEPRECATE */
|
||||
/* */
|
||||
/* LINKER: Ws2_32.lib */
|
||||
/* */
|
||||
/* This source code can be compiled for 32bit or 64 bits targets as well */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* */
|
||||
/* LICENSING: VoicemeeterRemote.dll usage is driven by a license agreement */
|
||||
/* given in VoicemeeterRemoteAPI.pdf or readme.txt */
|
||||
/* THIS SOURCE CODE CAN BE USED ONLY IN A PROGRAM USING VOICEMEETER */
|
||||
/* REMOTE API */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef __VBAN_CMD_H__
|
||||
#define __VBAN_CMD_H__
|
||||
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
struct tagVBAN_HEADER
|
||||
{
|
||||
unsigned long vban; // contains 'V' 'B', 'A', 'N'
|
||||
unsigned char format_SR; // SR index (see SRList above)
|
||||
unsigned char format_nbs; // nb sample per frame (1 to 256)
|
||||
unsigned char format_nbc; // nb channel (1 to 256)
|
||||
unsigned char format_bit; // mask = 0x07 (see DATATYPE table below)
|
||||
char streamname[16]; // stream name
|
||||
unsigned long nuFrame; // growing frame number
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
typedef struct tagVBAN_HEADER T_VBAN_HEADER;
|
||||
typedef struct tagVBAN_HEADER* PT_VBAN_HEADER;
|
||||
typedef struct tagVBAN_HEADER* LPT_VBAN_HEADER;
|
||||
|
||||
|
||||
#define VBAN_PROTOCOL_MASK 0xE0
|
||||
#define VBAN_PROTOCOL_SERVICE 0x60
|
||||
|
||||
#define VBAN_SERVICE_RTPACKETREGISTER 32
|
||||
#define VBAN_SERVICE_RTPACKET 33
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* FUNCTIONS */
|
||||
/******************************************************************************/
|
||||
|
||||
long VBANCMD_SendRequest_String(char* pString);
|
||||
long VBANCMD_SendRequest_Float(char* szParam, float value);
|
||||
|
||||
long VBANCMD_SendRequest_RegisterRTPacket(unsigned char sTimeOut, char* szVBANStreamName);
|
||||
|
||||
// to check the VBAN connection works
|
||||
long VBANCMD_GetIncomingRequestCounter(void);
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* CURRENT PARAMETERS FUNCTIONS */
|
||||
/******************************************************************************/
|
||||
// we provide same function than Voicemeeter Remote API to simplify the process
|
||||
|
||||
long VBANCMD_IsParameterDirty(void);
|
||||
|
||||
long VBANCMD_GetVoicemeeterType(unsigned long* pType);
|
||||
long VBANCMD_GetVoicemeeterVersion(unsigned long* pVersion);
|
||||
|
||||
long VBANCMD_GetBusLabel(long index, WCHAR* pwsz);
|
||||
long VBANCMD_GetBusGain(long index, float* pValue);
|
||||
long VBANCMD_GetBusSel(long index, float* pValue);
|
||||
long VBANCMD_GetBusMute(long index, float* pValue);
|
||||
long VBANCMD_GetBusMonitor(long index, float* pValue);
|
||||
|
||||
|
||||
long VBANCMD_GetStripLabel(long index, WCHAR* pwsz);
|
||||
long VBANCMD_GetStripGain(long index, float* pValue);
|
||||
long VBANCMD_GetStripGainLayer(long index, long layer, float* pValue);
|
||||
long VBANCMD_GetStripMute(long index, float* pValue);
|
||||
long VBANCMD_GetStripAssignation(long index, long nBus, float* pValue);
|
||||
|
||||
long VBANCMD_GetLevel(long index, long nuChannel, float* pLevelDB);
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* START / STOP THREAD */
|
||||
/******************************************************************************/
|
||||
|
||||
long VBANCMD_StartThread(char* szVBANStreamName, char* szIPAddressTo, unsigned short UDPport);
|
||||
long VBANCMD_StopThread(void);
|
||||
|
||||
/******************************************************************************/
|
||||
/* INIT / END LIB */
|
||||
/******************************************************************************/
|
||||
|
||||
long VBANCMD_EndLib(void);
|
||||
long VBANCMD_InitLib(long mode);
|
||||
|
||||
|
||||
#endif /* __VBAN_CMD_H__*/
|
2768
vmr_streamer/source/vmr_streamer.c
Normal file
83
vmr_streamer/source/vmr_streamer.h
Normal file
@ -0,0 +1,83 @@
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* VMR example: Voicemeeter Custom GUI for Streamers */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* 'C' Sample Code to make a Voicemeeter Custom GUI V.Burel (c)2016-2021 */
|
||||
/* */
|
||||
/* THIS PROGRAM PROVIDES A GUI TO CONTROL VOICEMEETER */
|
||||
/* PROVIDES A SIMPLIFIED GUI WITH ONLY USED STRIP/BUS */
|
||||
/* PROVIDES A RESIZABLE GRAPHIC USER INTERFACE */
|
||||
/* */
|
||||
/* This program example shows */
|
||||
/* - How to link VoicemeeterRemote.dll */
|
||||
/* - How to Login / logout */
|
||||
/* - How to Manage regular parameters to make a custom controller. */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* */
|
||||
/* COMPILATION DIRECTIVES: */
|
||||
/* */
|
||||
/* To compile With Microsoft VC2005 or higher, you need to create an */
|
||||
/* empty Win32 project with the following options: */
|
||||
/* - Configuration Properties / General : Char Set = NOT SET */
|
||||
/* - Configuration Properties / C/C++ / Preprocessor : _CRT_SECURE_NO_DEPRECATE */
|
||||
/* */
|
||||
/* This source code can be compiled for 32bit or 64 bits targets as well */
|
||||
/* WARNING: FOR 64x COMPILATION, ADD PREPROCESSOR DEFINE: VB_X64 */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* */
|
||||
/* LICENSING: VoicemeeterRemote.dll usage is driven by a license agreement */
|
||||
/* given in VoicemeeterRemoteAPI.pdf or readme.txt */
|
||||
/* THIS SOURCE CODE CAN BE USED ONLY IN A PROGRAM USING VOICEMEETER */
|
||||
/* REMOTE API */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef __VMR_STREAMER_H__
|
||||
#define __VMR_STREAMER_H__
|
||||
|
||||
//to prevent to launch the same application twice (single instance app)
|
||||
#define APP_UNIQUEMUTEX "VB-AudioVMRStreamerViewExample_VoicemeeterCustomGUI"
|
||||
|
||||
//version information (for program)
|
||||
#define SZPUBLICVERSION "1.0.0.2" //displayed version in about box
|
||||
#define SZPUBLICNAME "VM-Streamer View (Voicemeeter Custom GUI Example)" //displayed title in main window
|
||||
|
||||
//Information for Main window
|
||||
#define UI_WIN_DX 800
|
||||
#define UI_WIN_DY 600
|
||||
|
||||
//version information (used in resource file)
|
||||
#define __FILEVERSION__ 1,0,0,2
|
||||
#define __PRODUCTVERSION__ 1,0,0,2
|
||||
#define __SZFILEVERSION__ "1, 0, 0, 2\0"
|
||||
#define __SZPRODUCTVERSION__ "1, 0, 0, 2\0"
|
||||
|
||||
#define __COMMENTS__ "Example of custom GUI mae for Voicemeeter with the Voicemeeter Remote API"
|
||||
#define __COMPANYNAME__ "Audio Mechanic & Sound Breeder\0"
|
||||
#define __FILEDESCRIPTION__ "Custom GUI for Streamers, Remoting Voicemeeter potato\0"
|
||||
#define __INTERNALNAME__ "vmr_streamer"
|
||||
#define __LEGALCOPYRIGHT__ "Copyright V.Burel©2015-2021\0"
|
||||
#define __ORIGINALFILENAME__ "vmr_streamer.EXE\0"
|
||||
#define __PRODUCTNAME__ "vmr_streamer\0"
|
||||
|
||||
|
||||
|
||||
//definitions for MENU
|
||||
|
||||
#define IDM_QUIT 100
|
||||
#define IDM_ABOUT 101
|
||||
|
||||
#define IDM_UPDATE_ALL_CONTROL 200
|
||||
|
||||
#define IDMSYS_LINK_DIRECT 300
|
||||
#define IDMSYS_LINK_VBAN1 301
|
||||
#define IDMSYS_LINK_VBAN2 302
|
||||
#define IDMSYS_LINK_VBAN3 303
|
||||
#define IDMSYS_LINK_VBAN4 304
|
||||
|
||||
#define IDMSYS_VBAN_CONFIG 350
|
||||
|
||||
#endif /*__VMR_STREAMER_H__*/
|
||||
|
||||
|
BIN
vmr_streamer/source/vmr_streamer.ico
Normal file
After Width: | Height: | Size: 7.2 KiB |
78
vmr_streamer/source/vmr_streamer.rc
Normal file
@ -0,0 +1,78 @@
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* VMR example: Voicemeeter Custom GUI for Streamers */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* 'C' Sample Code to make a Voicemeeter Custom GUI V.Burel (c)2016-2021 */
|
||||
/* */
|
||||
/* THIS PROGRAM PROVIDES A GUI TO CONTROL VOICEMEETER */
|
||||
/* PROVIDES A SIMPLIFIED GUI WITH ONLY USED STRIP/BUS */
|
||||
/* PROVIDES A RESIZABLE GRAPHIC USER INTERFACE */
|
||||
/* */
|
||||
/* This program example shows */
|
||||
/* - How to link VoicemeeterRemote.dll */
|
||||
/* - How to Login / logout */
|
||||
/* - How to Manage regular parameters to make a custom controller. */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* */
|
||||
/* COMPILATION DIRECTIVES: */
|
||||
/* */
|
||||
/* To compile With Microsoft VC2005 or higher, you need to create an */
|
||||
/* empty Win32 project with the following options: */
|
||||
/* - Configuration Properties / General : Char Set = NOT SET */
|
||||
/* - Configuration Properties / C/C++ / Preprocessor : _CRT_SECURE_NO_DEPRECATE */
|
||||
/* */
|
||||
/* This source code can be compiled for 32bit or 64 bits targets as well */
|
||||
/* WARNING: FOR 64x COMPILATION, ADD PREPROCESSOR DEFINE: VB_X64 */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
/* */
|
||||
/* LICENSING: VoicemeeterRemote.dll usage is driven by a license agreement */
|
||||
/* given in VoicemeeterRemoteAPI.pdf or readme.txt */
|
||||
/* */
|
||||
/*--------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include "vmr_streamer.h"
|
||||
|
||||
100 ICON "vmr_streamer.ico"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
1 VERSIONINFO
|
||||
FILEVERSION __FILEVERSION__
|
||||
PRODUCTVERSION __PRODUCTVERSION__
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x0L
|
||||
FILETYPE 0x1L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "000004b0"
|
||||
BEGIN
|
||||
VALUE "Comments", __COMMENTS__
|
||||
VALUE "CompanyName", __COMPANYNAME__
|
||||
VALUE "FileDescription", __FILEDESCRIPTION__
|
||||
VALUE "FileVersion", __SZFILEVERSION__
|
||||
VALUE "InternalName", __INTERNALNAME__
|
||||
VALUE "LegalCopyright", __LEGALCOPYRIGHT__
|
||||
VALUE "OriginalFilename", __ORIGINALFILENAME__
|
||||
VALUE "ProductName", __PRODUCTNAME__
|
||||
VALUE "ProductVersion", __SZPRODUCTVERSION__
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x0, 1200
|
||||
END
|
||||
END
|
||||
|
||||
|
6
vmr_streamer/targetver.h
Normal file
@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
// // Including SDKDDKVer.h defines the highest available Windows platform.
|
||||
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
|
||||
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
|
||||
#include <SDKDDKVer.h>
|
180
vmr_streamer/vmr_streamer.cpp
Normal file
@ -0,0 +1,180 @@
|
||||
// vmr_streamer.cpp : Defines the entry point for the application.
|
||||
//
|
||||
|
||||
#include "framework.h"
|
||||
#include "vmr_streamer.h"
|
||||
|
||||
#define MAX_LOADSTRING 100
|
||||
|
||||
// Global Variables:
|
||||
HINSTANCE hInst; // current instance
|
||||
WCHAR szTitle[MAX_LOADSTRING]; // The title bar text
|
||||
WCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
|
||||
|
||||
// Forward declarations of functions included in this code module:
|
||||
ATOM MyRegisterClass(HINSTANCE hInstance);
|
||||
BOOL InitInstance(HINSTANCE, int);
|
||||
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
|
||||
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
|
||||
|
||||
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
|
||||
_In_opt_ HINSTANCE hPrevInstance,
|
||||
_In_ LPWSTR lpCmdLine,
|
||||
_In_ int nCmdShow)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(hPrevInstance);
|
||||
UNREFERENCED_PARAMETER(lpCmdLine);
|
||||
|
||||
// TODO: Place code here.
|
||||
|
||||
// Initialize global strings
|
||||
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
|
||||
LoadStringW(hInstance, IDC_VMRSTREAMER, szWindowClass, MAX_LOADSTRING);
|
||||
MyRegisterClass(hInstance);
|
||||
|
||||
// Perform application initialization:
|
||||
if (!InitInstance (hInstance, nCmdShow))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_VMRSTREAMER));
|
||||
|
||||
MSG msg;
|
||||
|
||||
// Main message loop:
|
||||
while (GetMessage(&msg, nullptr, 0, 0))
|
||||
{
|
||||
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
|
||||
return (int) msg.wParam;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// FUNCTION: MyRegisterClass()
|
||||
//
|
||||
// PURPOSE: Registers the window class.
|
||||
//
|
||||
ATOM MyRegisterClass(HINSTANCE hInstance)
|
||||
{
|
||||
WNDCLASSEXW wcex;
|
||||
|
||||
wcex.cbSize = sizeof(WNDCLASSEX);
|
||||
|
||||
wcex.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wcex.lpfnWndProc = WndProc;
|
||||
wcex.cbClsExtra = 0;
|
||||
wcex.cbWndExtra = 0;
|
||||
wcex.hInstance = hInstance;
|
||||
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_VMRSTREAMER));
|
||||
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
|
||||
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_VMRSTREAMER);
|
||||
wcex.lpszClassName = szWindowClass;
|
||||
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
|
||||
|
||||
return RegisterClassExW(&wcex);
|
||||
}
|
||||
|
||||
//
|
||||
// FUNCTION: InitInstance(HINSTANCE, int)
|
||||
//
|
||||
// PURPOSE: Saves instance handle and creates main window
|
||||
//
|
||||
// COMMENTS:
|
||||
//
|
||||
// In this function, we save the instance handle in a global variable and
|
||||
// create and display the main program window.
|
||||
//
|
||||
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
|
||||
{
|
||||
hInst = hInstance; // Store instance handle in our global variable
|
||||
|
||||
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
|
||||
|
||||
if (!hWnd)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ShowWindow(hWnd, nCmdShow);
|
||||
UpdateWindow(hWnd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//
|
||||
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
|
||||
//
|
||||
// PURPOSE: Processes messages for the main window.
|
||||
//
|
||||
// WM_COMMAND - process the application menu
|
||||
// WM_PAINT - Paint the main window
|
||||
// WM_DESTROY - post a quit message and return
|
||||
//
|
||||
//
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WM_COMMAND:
|
||||
{
|
||||
int wmId = LOWORD(wParam);
|
||||
// Parse the menu selections:
|
||||
switch (wmId)
|
||||
{
|
||||
case IDM_ABOUT:
|
||||
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
|
||||
break;
|
||||
case IDM_EXIT:
|
||||
DestroyWindow(hWnd);
|
||||
break;
|
||||
default:
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case WM_PAINT:
|
||||
{
|
||||
PAINTSTRUCT ps;
|
||||
HDC hdc = BeginPaint(hWnd, &ps);
|
||||
// TODO: Add any drawing code that uses hdc here...
|
||||
EndPaint(hWnd, &ps);
|
||||
}
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
default:
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Message handler for about box.
|
||||
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(lParam);
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
return (INT_PTR)TRUE;
|
||||
|
||||
case WM_COMMAND:
|
||||
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
|
||||
{
|
||||
EndDialog(hDlg, LOWORD(wParam));
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return (INT_PTR)FALSE;
|
||||
}
|
165
vmr_streamer/vmr_streamer.vcxproj
Normal file
@ -0,0 +1,165 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{cb959fdd-2aa4-4ecd-8a50-41777bf38eea}</ProjectGuid>
|
||||
<RootNamespace>vmrstreamer</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>NotSet</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>NotSet</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;Ws2_32.lib ;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;VB_X64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="framework.h" />
|
||||
<ClInclude Include="Resource.h" />
|
||||
<ClInclude Include="source\streamer_ctrl.h" />
|
||||
<ClInclude Include="source\vban_cmd.h" />
|
||||
<ClInclude Include="source\vmr_streamer.h" />
|
||||
<ClInclude Include="targetver.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="source\streamer_ctrl.c" />
|
||||
<ClCompile Include="source\vban_cmd.c" />
|
||||
<ClCompile Include="source\vmr_streamer.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="source\vmr_streamer.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="source\vmr_streamer.rc" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
58
vmr_streamer/vmr_streamer.vcxproj.filters
Normal file
@ -0,0 +1,58 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="framework.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="targetver.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Resource.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="source\vban_cmd.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="source\vmr_streamer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="source\streamer_ctrl.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="source\streamer_ctrl.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="source\vban_cmd.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="source\vmr_streamer.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="source\vmr_streamer.ico">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Image>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="source\vmr_streamer.rc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|