From b623f16d60a7089adc27022159b3e606a7f81d57 Mon Sep 17 00:00:00 2001 From: SteffeyDev Date: Mon, 15 Nov 2021 09:45:01 -0500 Subject: [PATCH 01/21] Updating release process and notes --- README.md | 6 +++--- atemOSC/atemOSC.xcodeproj/project.pbxproj | 10 +++++---- generate-release.sh | 26 ++++++++++++++--------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 8ba5988..42e598f 100644 --- a/README.md +++ b/README.md @@ -441,7 +441,7 @@ I welcome pull requests, but recommend that you open an issue first so that we c ### Deployment 1. Bump the version in XCode -2. Build app from XCode -3. Run generate-release.sh to generate the installer -4. Run notarize-dmg.sh to notarize the installer +2. Archive app from XCode +3. Generate notarized app by using the "Distribute App" wizard: Developer ID > Upload > Automatically Manage Signing > Upload > Wait for notarization to complete > Export +3. Run generate-release.sh to generate the notarized installer (argument is path to exported atemOSC.app file from the last step) 5. Run upload-symbols.sh to upload the symbols to Bugsnag diff --git a/atemOSC/atemOSC.xcodeproj/project.pbxproj b/atemOSC/atemOSC.xcodeproj/project.pbxproj index 2defa7c..0b751d8 100644 --- a/atemOSC/atemOSC.xcodeproj/project.pbxproj +++ b/atemOSC/atemOSC.xcodeproj/project.pbxproj @@ -28,11 +28,12 @@ A9A9AA932594255A00890134 /* VVBasics.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = A9A9A9452594209100890134 /* VVBasics.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A9A9AA942594255A00890134 /* VVOSC.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = A9A9A9472594209100890134 /* VVOSC.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A9D0B4DF259FCE5D00FF0733 /* LogView.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9D0B4DE259FCE5D00FF0733 /* LogView.mm */; }; + A9EFFF1B2742A70700EA8FCE /* Bugsnag.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4DDB62711276E007E64DE /* Bugsnag.framework */; }; + A9EFFF1C2742A70700EA8FCE /* Bugsnag.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = A9F4DDB62711276E007E64DE /* Bugsnag.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A9F4DDB927112779007E64DE /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4DDB827112779007E64DE /* SystemConfiguration.framework */; }; A9F4DDBB27112788007E64DE /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4DDBA27112788007E64DE /* libc++.tbd */; }; A9F4DDBD2711278F007E64DE /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4DDBC2711278F007E64DE /* libz.tbd */; }; A9F4DDC027112835007E64DE /* BugsnagExceptionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = A9F4DDBF27112835007E64DE /* BugsnagExceptionHandler.m */; }; - A9F4DDC827112C69007E64DE /* Bugsnag.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4DDB62711276E007E64DE /* Bugsnag.framework */; }; A9F7906A1F89B83D003ACBCF /* OSCReceiver.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9F790691F89B83C003ACBCF /* OSCReceiver.mm */; }; A9FB8B5A25943693003B4581 /* VVBasics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9A9A9452594209100890134 /* VVBasics.framework */; }; A9FB8B5B25943693003B4581 /* VVOSC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9A9A9472594209100890134 /* VVOSC.framework */; }; @@ -47,6 +48,7 @@ files = ( A9A9AA932594255A00890134 /* VVBasics.framework in CopyFiles */, A9A9AA942594255A00890134 /* VVOSC.framework in CopyFiles */, + A9EFFF1C2742A70700EA8FCE /* Bugsnag.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -107,12 +109,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A9F4DDC827112C69007E64DE /* Bugsnag.framework in Frameworks */, A9F4DDBD2711278F007E64DE /* libz.tbd in Frameworks */, A9F4DDBB27112788007E64DE /* libc++.tbd in Frameworks */, A9F4DDB927112779007E64DE /* SystemConfiguration.framework in Frameworks */, A9FB8B5A25943693003B4581 /* VVBasics.framework in Frameworks */, A9FB8B5B25943693003B4581 /* VVOSC.framework in Frameworks */, + A9EFFF1B2742A70700EA8FCE /* Bugsnag.framework in Frameworks */, 333E3045161395CF0002287B /* IOKit.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, ); @@ -388,7 +390,7 @@ LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks @executable_path/../Frameworks"; MACH_O_TYPE = mh_execute; MACOSX_DEPLOYMENT_TARGET = 10.9; - MARKETING_VERSION = 4.2; + MARKETING_VERSION = 4.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.atemosc.atemOSC; PRODUCT_NAME = atemOSC; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -429,7 +431,7 @@ LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks @executable_path/../Frameworks"; MACH_O_TYPE = mh_execute; MACOSX_DEPLOYMENT_TARGET = 10.9; - MARKETING_VERSION = 4.2; + MARKETING_VERSION = 4.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.atemosc.atemOSC; PRODUCT_NAME = atemOSC; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/generate-release.sh b/generate-release.sh index 99129f6..0fce788 100755 --- a/generate-release.sh +++ b/generate-release.sh @@ -17,6 +17,14 @@ RED_COLOR="\033[0;31m" GREY_COLOR="\033[0;37m" NO_COLOR="\033[0m" +# +# Check arguments +# +if [[ -z $1 ]] ; then + echo -e "Pass in the path to the notarized atemOSC.app file as the first argument" + exit 1 +fi + # # Check if Github auth token exists # @@ -112,12 +120,6 @@ if [[ $? != 0 ]] ; then exit 1 fi -# Create tag if needed -if [ $(git tag -l "v$VERSION" | wc -l | xargs) -eq 0 ]; then - git tag -a "v$VERSION" -m "v$VERSION" - git push --tags -fi - # # Creating directory to work in # @@ -125,10 +127,6 @@ rm -rf temp_output mkdir -p temp_output cd temp_output -if [[ -z $1 ]] ; then - echo -e "Pass in the path to the notarized atemOSC.app file as the first argument" - exit 1 -fi cp -R "$1" . # @@ -146,6 +144,14 @@ FILENAME=$(find atemOSC_*.dmg) NEXT_RELEASE=$(echo $FILENAME | sed -E 's/atemOSC_(.*).dmg/\1/') echo -e "Generated: ${GREY_COLOR}${FILENAME}${NO_COLOR}" +# +# Create tag if needed +# +if [ $(git tag -l "v$NEXT_RELEASE" | wc -l | xargs) -eq 0 ]; then + git tag -a "v$NEXT_RELEASE" -m "v$NEXT_RELEASE" + git push --tags +fi + # # Notarize installer # From 372d22662697f61c4c6c1750e7edcd38b85a67ae Mon Sep 17 00:00:00 2001 From: reno- Date: Tue, 15 Feb 2022 10:32:35 +0100 Subject: [PATCH 02/21] No reason for having a 64bit big endian rather an int for the feedback of the Aux Selection Input --- atemOSC/FeedbackMonitors.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index 93872d2..9a2a035 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -247,7 +247,7 @@ { BMDSwitcherInputId source; switcher.mAuxInputs[inputId_]->GetInputSource(&source); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/aux/%lld", inputId_], [OSCValue createWithLongLong:source]); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/aux/%lld", inputId_], [OSCValue createWithInt:source]); } } From f4c2e38282f27783d357ed6e16ad80fd6156c42a Mon Sep 17 00:00:00 2001 From: reno- Date: Tue, 1 Mar 2022 23:05:04 +0100 Subject: [PATCH 03/21] Add OSC receivers for usk mask --- atemOSC/OSCReceiver.mm | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/atemOSC/OSCReceiver.mm b/atemOSC/OSCReceiver.mm index 933b1f0..9f5adef 100644 --- a/atemOSC/OSCReceiver.mm +++ b/atemOSC/OSCReceiver.mm @@ -553,6 +553,42 @@ - (instancetype) initWithDelegate:(AppDelegate *) delegate if (IBMDSwitcherKeyFlyParameters* flyParams = [weakSelf getUSKFlyParams:key forSwitcher:s andME:me]) flyParams->ResetDVEFull(); }]; + + [self addEndpoint:@"/me//usk//mask/enabled" label:@"Enable Mask for USK" valueType:OSCValBool handler:^void(Switcher *s, NSDictionary *d, OSCValue *v) { + int me = [[d objectForKey:@""] intValue]; + int key = [[d objectForKey:@""] intValue]; + [s keyers][me-1][key-1]->SetMasked([v boolValue]); + }]; + + [self addEndpoint:@"/me//usk//mask/left" label:@"Set Left Mask for USK" valueType:OSCValFloat handler:^void(Switcher *s, NSDictionary *d, OSCValue *v) { + int me = [[d objectForKey:@""] intValue]; + int key = [[d objectForKey:@""] intValue]; + [s keyers][me-1][key-1]->SetMaskLeft([v floatValue]); + }]; + + [self addEndpoint:@"/me//usk//mask/right" label:@"Set Right Mask for USK" valueType:OSCValFloat handler:^void(Switcher *s, NSDictionary *d, OSCValue *v) { + int me = [[d objectForKey:@""] intValue]; + int key = [[d objectForKey:@""] intValue]; + [s keyers][me-1][key-1]->SetMaskRight([v floatValue]); + }]; + + [self addEndpoint:@"/me//usk//mask/top" label:@"Set Top Mask for USK" valueType:OSCValFloat handler:^void(Switcher *s, NSDictionary *d, OSCValue *v) { + int me = [[d objectForKey:@""] intValue]; + int key = [[d objectForKey:@""] intValue]; + [s keyers][me-1][key-1]->SetMaskTop([v floatValue]); + }]; + + [self addEndpoint:@"/me//usk//mask/bottom" label:@"Set Bottom Mask for USK" valueType:OSCValFloat handler:^void(Switcher *s, NSDictionary *d, OSCValue *v) { + int me = [[d objectForKey:@""] intValue]; + int key = [[d objectForKey:@""] intValue]; + [s keyers][me-1][key-1]->SetMaskBottom([v floatValue]); + }]; + + [self addEndpoint:@"/me//usk//mask/reset" label:@"Reset Mask for USK" handler:^void(Switcher *s, NSDictionary *d, OSCValue *v) { + int me = [[d objectForKey:@""] intValue]; + int key = [[d objectForKey:@""] intValue]; + [s keyers][me-1][key-1]->ResetMask(); + }]; [self addEndpoint:@"/dsk//tie" label:@"Set DSK Tie" valueType:OSCValBool handler:^void(Switcher *s, NSDictionary *d, OSCValue *v) { From 95d89de6e11b72bc92a8cdea4efe601a5044b9b3 Mon Sep 17 00:00:00 2001 From: reno- Date: Wed, 2 Mar 2022 14:40:56 +0100 Subject: [PATCH 04/21] add Feedback for USK mask --- atemOSC/FeedbackMonitors.h | 5 +++ atemOSC/FeedbackMonitors.mm | 70 +++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/atemOSC/FeedbackMonitors.h b/atemOSC/FeedbackMonitors.h index 7f2e116..7469bad 100644 --- a/atemOSC/FeedbackMonitors.h +++ b/atemOSC/FeedbackMonitors.h @@ -120,6 +120,11 @@ class UpstreamKeyerMonitor : public GenericMonitor, pub void updateUSKInputFill() const; void updateUSKInputCut() const; void updateUSKType() const; + void updateUSKMasked() const; + void updateUSKMaskTop() const; + void updateUSKMaskBottom() const; + void updateUSKMaskRight() const; + void updateUSKMaskLeft() const; int me_; }; diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index 9a2a035..1a59259 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -350,6 +350,61 @@ } } +void UpstreamKeyerMonitor::updateUSKMasked() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + bool isMasked; + keyers[i]->GetMasked(&isMasked); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/mask/enabled",i+1], [OSCValue createWithInt:isMasked], me_); + } +} +void UpstreamKeyerMonitor::updateUSKMaskBottom() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + double MaskBottom; + keyers[i]->GetMaskBottom(&MaskBottom); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/mask/bottom",i+1], [OSCValue createWithFloat:MaskBottom], me_); + } +} +void UpstreamKeyerMonitor::updateUSKMaskTop() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + double MaskTop; + keyers[i]->GetMaskTop(&MaskTop); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/mask/top",i+1], [OSCValue createWithFloat:MaskTop], me_); + } +} +void UpstreamKeyerMonitor::updateUSKMaskLeft() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + double MaskLeft; + keyers[i]->GetMaskLeft(&MaskLeft); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/mask/left",i+1], [OSCValue createWithFloat:MaskLeft], me_); + } +} +void UpstreamKeyerMonitor::updateUSKMaskRight() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + double MaskRight; + keyers[i]->GetMaskRight(&MaskRight); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/mask/right",i+1], [OSCValue createWithFloat:MaskRight], me_); + } +} HRESULT UpstreamKeyerMonitor::Notify(BMDSwitcherKeyEventType eventType) { switch (eventType) @@ -366,6 +421,21 @@ case bmdSwitcherKeyEventTypeTypeChanged: updateUSKType(); break; + case bmdSwitcherKeyEventTypeMaskedChanged: + updateUSKMasked(); + break; + case bmdSwitcherKeyEventTypeMaskTopChanged: + updateUSKMaskTop(); + break; + case bmdSwitcherKeyEventTypeMaskBottomChanged: + updateUSKMaskBottom(); + break; + case bmdSwitcherKeyEventTypeMaskLeftChanged: + updateUSKMaskLeft(); + break; + case bmdSwitcherKeyEventTypeMaskRightChanged: + updateUSKMaskRight(); + break; default: // ignore other property changes not used for this app break; From e6afffae90e189158d7aebeb5a5fed6f27162f4e Mon Sep 17 00:00:00 2001 From: reno- Date: Wed, 2 Mar 2022 14:46:09 +0100 Subject: [PATCH 05/21] Fix on-air feedback for USK that was not including instance in the OSC address --- atemOSC/FeedbackMonitors.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index 1a59259..74f75b4 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -322,7 +322,7 @@ bool isOnAir; keyers[i]->GetOnAir(&isOnAir); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/on-air",i+1], [OSCValue createWithInt:isOnAir]); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/on-air",i+1], [OSCValue createWithInt:isOnAir], me_); } } From 14593ca80c7b51352686d1741ff1453e2f130c4b Mon Sep 17 00:00:00 2001 From: reno- Date: Thu, 10 Mar 2022 10:13:35 +0100 Subject: [PATCH 06/21] add to the UpstreamKeyerMonitor::sendStatus function, for consistency --- atemOSC/FeedbackMonitors.mm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index 74f75b4..699de56 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -475,6 +475,11 @@ updateUSKInputCut(); updateUSKInputFill(); updateUSKType(); + updateUSKMasked(); + updateUSKMaskTop(); + updateUSKMaskLeft(); + updateUSKMaskRight(); + updateUSKMaskBottom(); return 0.4; } From f898669b8d5139be426e8ec18eed714ff19a8bb2 Mon Sep 17 00:00:00 2001 From: reno- Date: Thu, 10 Mar 2022 10:14:01 +0100 Subject: [PATCH 07/21] Fix spaces, must be tab --- atemOSC/FeedbackMonitors.mm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index 699de56..ddf0e69 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -425,16 +425,16 @@ updateUSKMasked(); break; case bmdSwitcherKeyEventTypeMaskTopChanged: - updateUSKMaskTop(); + updateUSKMaskTop(); break; case bmdSwitcherKeyEventTypeMaskBottomChanged: - updateUSKMaskBottom(); + updateUSKMaskBottom(); break; case bmdSwitcherKeyEventTypeMaskLeftChanged: - updateUSKMaskLeft(); + updateUSKMaskLeft(); break; case bmdSwitcherKeyEventTypeMaskRightChanged: - updateUSKMaskRight(); + updateUSKMaskRight(); break; default: // ignore other property changes not used for this app From 3d1a041b5c78f7e9e3b03125f294601647a49010 Mon Sep 17 00:00:00 2001 From: reno- Date: Thu, 10 Mar 2022 10:19:20 +0100 Subject: [PATCH 08/21] Mask Parameters are now accessible with OSC messages --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 42e598f..d254de7 100644 --- a/README.md +++ b/README.md @@ -197,6 +197,18 @@ By default, commands will be sent to the first mix effect block (M/E). To send - **Reset Position, Size, & Rotation to defaults for Upstream Keyer $i** `/atem/usk/$i/fly/reset` - **Reset Position, Size, & Rotation to full screen with no rotation for Upstream Keyer $i** `/atem/usk/$i/fly/clear` + #### USK Mask Parameters + - **Set Mask ON/OFF for Upstream Keyer $i** `/atem/usk/$i/mask/enabled ` + - **Reset Mask Values for Upstream Keyer $i** `/atem/usk/$i/mask/reset + - **Set Top Mask Parameter for Upstream Keyer $i** `/atem/usk/$i/mask/top ` + - Float value should be between -9.0 and 9.0 + - **Set Bottom Mask Parameter for Upstream Keyer $i** `/atem/usk/$i/mask/bottom ` + - Float value should be between -9.0 and 9.0 +- **Set Left Mask Parameter for Upstream Keyer $i** `/atem/usk/$i/mask/left ` + - Float value should be between -16.0 and 16.0 +- **Set Right Mask Parameter for Upstream Keyer $i** `/atem/usk/$i/mask/right ` + - Float value should be between -16.0 and 16.0 + Where `$i` can be 1, 2, 3, or 4 depending on the capability of your ATEM switcher Feedback: Enabled for '/atem/usk/$i/on-air', '/atem/usk/$i/tie', '/atem/usk/$i/source/\*', '/atem/usk/$i/luma/\*', and '/atem/usk/$i/chroma/\*' From b70f465a38f0afe30dffe44d2f8445d410b6117d Mon Sep 17 00:00:00 2001 From: reno- Date: Mon, 21 Mar 2022 22:52:17 +0100 Subject: [PATCH 09/21] implement Feedback for UpStream Flying Keyer --- atemOSC/FeedbackMonitors.h | 22 ++++++ atemOSC/FeedbackMonitors.mm | 149 ++++++++++++++++++++++++++++++++++++ atemOSC/Switcher.h | 1 + atemOSC/Switcher.mm | 14 ++++ 4 files changed, 186 insertions(+) diff --git a/atemOSC/FeedbackMonitors.h b/atemOSC/FeedbackMonitors.h index 7469bad..f78340f 100644 --- a/atemOSC/FeedbackMonitors.h +++ b/atemOSC/FeedbackMonitors.h @@ -146,6 +146,28 @@ class UpstreamKeyerLumaParametersMonitor : public GenericMonitor, public SendStatusInterface +{ +public: + UpstreamKeyerFlyParametersMonitor(Switcher *switcher, int me) : GenericMonitor(switcher), me_(me) { } + HRESULT Notify (BMDSwitcherKeyFlyParametersEventType eventType); + float sendStatus() const; + +protected: + virtual ~UpstreamKeyerFlyParametersMonitor() { } + +private: + void updateUSKFlyedParameter() const; + void updateUSKCanFlyParameter() const; + void updateUSKFlyRateParameter() const; + void updateUSKFlySizeXParameter() const; + void updateUSKFlySizeYParameter() const; + void updateUSKFlyPositionXParameter() const; + void updateUSKFlyPositionYParameter() const; + void updateUSKFlyRotationParameter() const; + int me_; +}; + class UpstreamKeyerChromaParametersMonitor : public GenericMonitor, public SendStatusInterface { public: diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index ddf0e69..ee64e12 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -578,6 +578,155 @@ return 0.4; } +HRESULT UpstreamKeyerFlyParametersMonitor::Notify(BMDSwitcherKeyFlyParametersEventType eventType) +{ + switch (eventType) + { + case bmdSwitcherKeyFlyParametersEventTypeFlyChanged: + updateUSKFlyedParameter(); + break; + case bmdSwitcherKeyFlyParametersEventTypeCanFlyChanged: + updateUSKCanFlyParameter(); + break; + case bmdSwitcherKeyFlyParametersEventTypeRateChanged: + updateUSKFlyRateParameter(); + break; + case bmdSwitcherKeyFlyParametersEventTypeSizeXChanged: + updateUSKFlySizeXParameter(); + break; + case bmdSwitcherKeyFlyParametersEventTypeSizeYChanged: + updateUSKFlySizeYParameter(); + break; + case bmdSwitcherKeyFlyParametersEventTypePositionXChanged: + updateUSKFlyPositionXParameter(); + break; + case bmdSwitcherKeyFlyParametersEventTypePositionYChanged: + updateUSKFlyPositionYParameter(); + break; + default: + // ignore other property changes not used for this app + break; + } + return S_OK; +} + +void UpstreamKeyerFlyParametersMonitor::updateUSKFlyedParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyFlyParameters* flyParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams))) + { + bool isFlyKey; + flyParams->GetFly(&isFlyKey); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/enabled",i+1], [OSCValue createWithBool:isFlyKey], me_); + } + } +} +void UpstreamKeyerFlyParametersMonitor::updateUSKCanFlyParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyFlyParameters* flyParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams))) + { + bool canFly; + flyParams->GetCanFly(&canFly); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/can",i+1], [OSCValue createWithBool:canFly], me_); + } + } +} +void UpstreamKeyerFlyParametersMonitor::updateUSKFlyRateParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyFlyParameters* flyParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams))) + { + uint32_t frames; + flyParams->GetRate(&frames); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/rate",i+1], [OSCValue createWithInt:frames], me_); + } + } +} +void UpstreamKeyerFlyParametersMonitor::updateUSKFlySizeXParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyFlyParameters* flyParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams))) + { + double multiplierX; + flyParams->GetSizeX(&multiplierX); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/size-x",i+1], [OSCValue createWithFloat:multiplierX], me_); + } + } +} +void UpstreamKeyerFlyParametersMonitor::updateUSKFlySizeYParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyFlyParameters* flyParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams))) + { + double multiplierY; + flyParams->GetSizeY(&multiplierY); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/size-y",i+1], [OSCValue createWithFloat:multiplierY], me_); + } + } +} +void UpstreamKeyerFlyParametersMonitor::updateUSKFlyPositionXParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyFlyParameters* flyParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams))) + { + double offsetX; + flyParams->GetPositionX(&offsetX); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/size-x",i+1], [OSCValue createWithFloat:offsetX], me_); + } + } +} +void UpstreamKeyerFlyParametersMonitor::updateUSKFlyPositionYParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyFlyParameters* flyParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams))) + { + double offsetY; + flyParams->GetPositionY(&offsetY); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/size-y",i+1], [OSCValue createWithFloat:offsetY], me_); + } + } +} + +float UpstreamKeyerFlyParametersMonitor::sendStatus() const +{ + updateUSKFlyRateParameter(); + updateUSKFlySizeXParameter(); + updateUSKFlySizeYParameter(); + updateUSKFlyPositionXParameter(); + updateUSKFlyPositionYParameter(); + + return 0.4; +} + HRESULT UpstreamKeyerChromaParametersMonitor::Notify(BMDSwitcherKeyChromaParametersEventType eventType) { switch (eventType) diff --git a/atemOSC/Switcher.h b/atemOSC/Switcher.h index 072d999..b94ac93 100644 --- a/atemOSC/Switcher.h +++ b/atemOSC/Switcher.h @@ -26,6 +26,7 @@ NS_ASSUME_NONNULL_BEGIN std::map mUpstreamKeyerMonitors; std::map mUpstreamKeyerLumaParametersMonitors; std::map mUpstreamKeyerChromaParametersMonitors; + std::map mUpstreamKeyerFlyParametersMonitors; std::map mTransitionParametersMonitors; MacroPoolMonitor* mMacroPoolMonitor; MacroControlMonitor* mMacroControlMonitor; diff --git a/atemOSC/Switcher.mm b/atemOSC/Switcher.mm index 993dd21..586ed36 100644 --- a/atemOSC/Switcher.mm +++ b/atemOSC/Switcher.mm @@ -311,6 +311,14 @@ - (void)switcherConnected mMonitors.push_back(chromaMonitor); mUpstreamKeyerChromaParametersMonitors.insert(std::make_pair(meIndex, chromaMonitor)); } + IBMDSwitcherKeyFlyParameters* flyParams; + if (SUCCEEDED(key->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams))) + { + UpstreamKeyerFlyParametersMonitor *flyMonitor = new UpstreamKeyerFlyParametersMonitor(self, meIndex); + flyParams->AddCallback(flyMonitor); + mMonitors.push_back(flyMonitor); + mUpstreamKeyerFlyParametersMonitors.insert(std::make_pair(meIndex, flyMonitor)); + } } keyIterator->Release(); keyIterator = NULL; @@ -717,6 +725,11 @@ - (void)cleanUpConnection keyers[me].back()->QueryInterface(IID_IBMDSwitcherKeyChromaParameters, (void**)&chromaParams); if (chromaParams != nil) chromaParams->RemoveCallback(mUpstreamKeyerChromaParametersMonitors[me]); + + IBMDSwitcherKeyFlyParameters* flyParams = nil; + keyers[me].back()->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams); + if (flyParams != nil) + flyParams->RemoveCallback(mUpstreamKeyerFlyParametersMonitors[me]); keyers[me].pop_back(); } @@ -729,6 +742,7 @@ - (void)cleanUpConnection mUpstreamKeyerMonitors.clear(); mUpstreamKeyerLumaParametersMonitors.clear(); mUpstreamKeyerChromaParametersMonitors.clear(); + mUpstreamKeyerFlyParametersMonitors.clear(); for (auto const& it : mInputs) { From 83fc26b5d503622218f44b4b7bc2d1a89fbee5c7 Mon Sep 17 00:00:00 2001 From: reno- Date: Mon, 21 Mar 2022 22:52:42 +0100 Subject: [PATCH 10/21] Implement feedback for pattern parameters --- atemOSC/FeedbackMonitors.h | 20 ++++ atemOSC/FeedbackMonitors.mm | 208 ++++++++++++++++++++++++++++++++++++ atemOSC/Switcher.h | 1 + atemOSC/Switcher.mm | 14 +++ 4 files changed, 243 insertions(+) diff --git a/atemOSC/FeedbackMonitors.h b/atemOSC/FeedbackMonitors.h index f78340f..c8f8d8e 100644 --- a/atemOSC/FeedbackMonitors.h +++ b/atemOSC/FeedbackMonitors.h @@ -187,6 +187,26 @@ class UpstreamKeyerChromaParametersMonitor : public GenericMonitor, public SendStatusInterface +{ +public: + UpstreamKeyerPatternParametersMonitor(Switcher *switcher, int me) : GenericMonitor(switcher), me_(me) { } + HRESULT Notify (BMDSwitcherKeyPatternParametersEventType eventType); + float sendStatus() const; + +protected: + virtual ~UpstreamKeyerPatternParametersMonitor() { } + +private: + void updateUSKPatternStyleParameter() const; + void updateUSKPatternSizeParameter() const; + void updateUSKPatternSymmetryParameter() const; + void updateUSKPatternSoftnessParameter() const; + void updateUSKPatternHorizontalOffsetParameter() const; + void updateUSKPatternVerticalOffsetParameter() const; + int me_; +}; + class TransitionParametersMonitor : public GenericMonitor, public SendStatusInterface { public: diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index ee64e12..096a938 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -839,6 +839,214 @@ return 0.4; } + + + + + + + + + + + + + + + + + + + + + +HRESULT UpstreamKeyerPatternParametersMonitor::Notify(BMDSwitcherKeyPatternParametersEventType eventType) +{ + switch (eventType) + { + case bmdSwitcherKeyPatternParametersEventTypeStyleChanged: + updateUSKPatternStyleParameter(); + break; + case bmdSwitcherKeyPatternParametersEventTypeSizeChanged: + updateUSKPatternSizeParameter(); + break; + case bmdSwitcherKeyPatternParametersEventTypeSymmetryChanged: + updateUSKPatternSymmetryParameter(); + break; + case bmdSwitcherKeyPatternParametersEventTypeSoftnessChanged: + updateUSKPatternSoftnessParameter(); + break; + case bmdSwitcherKeyPatternParametersEventTypeInverseChanged: + updateUSKPatternInverseParameter(); + break; + case bmdSwitcherKeyPatternParametersEventTypeHorizontalOffsetChanged: + updateUSKPatternHorizontalOffsetParameter(); + break; + case bmdSwitcherKeyPatternParametersEventTypeVerticalOffsetChanged: + updateUSKPatternVerticalOffsetParameter(); + break; + default: + // ignore other property changes not used for this app + break; + } + return S_OK; +} + + + + +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternStyleParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + BMDSwitcherKeyPatternStyle style; + keyers[i]->GetStyle(&style); + + NSString *typeStr; + if (type == bmdSwitcherKeyTypeLuma) + styleStr = @"bar_left2right"; + if (type == bmdSwitcherKeyTypeChroma) + styleStr = @"bar_top2bottom"; + if (type == bmdSwitcherKeyTypePattern) + styleStr = @"barndoor_horizontal"; + if (type == bmdSwitcherKeyTypeDVE) + styleStr = @"barndoor_vertical"; + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/style",i+1], [OSCValue createWithString:styleStr], me_); + + // Support for legacy clients like TouchOSC + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/type/%@",i+1, styleStr], [OSCValue createWithFloat:1.0], me_); + } +} + + + + +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternSizeParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyPatternParameters* patternParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) + { + double size; + patternParams->GetSize(&size); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/size",i+1], [OSCValue createWithFloat:size], me_); + } + } +} +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternGainParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyPatternParameters* patternParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) + { + double gain; + patternParams->GetGain(&gain); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/gain",i+1], [OSCValue createWithFloat:gain], me_); + } + } +} +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternYSuppressParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyPatternParameters* patternParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) + { + double ySuppress; + patternParams->GetYSuppress(&ySuppress); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/y-suppress",i+1], [OSCValue createWithFloat:ySuppress], me_); + } + } +} +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternLiftParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyPatternParameters* patternParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) + { + double lift; + patternParams->GetLift(&lift); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/lift",i+1], [OSCValue createWithFloat:lift], me_); + } + } +} +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternNarrowParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyPatternParameters* patternParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) + { + bool narrow; + patternParams->GetNarrow(&narrow); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/narrow",i+1], [OSCValue createWithBool:narrow], me_); + } + } +} + +float UpstreamKeyerPatternParametersMonitor::sendStatus() const +{ + updateUSKPatternNarrowParameter(); + updateUSKPatternYSuppressParameter(); + updateUSKPatternGainParameter(); + updateUSKPatternHueParameter(); + updateUSKPatternLiftParameter(); + + return 0.4; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HRESULT TransitionParametersMonitor::Notify(BMDSwitcherTransitionParametersEventType eventType) { diff --git a/atemOSC/Switcher.h b/atemOSC/Switcher.h index b94ac93..7d49378 100644 --- a/atemOSC/Switcher.h +++ b/atemOSC/Switcher.h @@ -27,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN std::map mUpstreamKeyerLumaParametersMonitors; std::map mUpstreamKeyerChromaParametersMonitors; std::map mUpstreamKeyerFlyParametersMonitors; + std::map mUpstreamKeyerPatternParametersMonitors; std::map mTransitionParametersMonitors; MacroPoolMonitor* mMacroPoolMonitor; MacroControlMonitor* mMacroControlMonitor; diff --git a/atemOSC/Switcher.mm b/atemOSC/Switcher.mm index 586ed36..c8c2509 100644 --- a/atemOSC/Switcher.mm +++ b/atemOSC/Switcher.mm @@ -319,6 +319,14 @@ - (void)switcherConnected mMonitors.push_back(flyMonitor); mUpstreamKeyerFlyParametersMonitors.insert(std::make_pair(meIndex, flyMonitor)); } + IBMDSwitcherKeyPatternParameters* patternParams; + if (SUCCEEDED(key->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) + { + UpstreamKeyerPatternParametersMonitor *patternMonitor = new UpstreamKeyerPatternParametersMonitor(self, meIndex); + patternParams->AddCallback(patternMonitor); + mMonitors.push_back(patternMonitor); + mUpstreamKeyerPatternParametersMonitors.insert(std::make_pair(meIndex, patternMonitor)); + } } keyIterator->Release(); keyIterator = NULL; @@ -730,6 +738,11 @@ - (void)cleanUpConnection keyers[me].back()->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams); if (flyParams != nil) flyParams->RemoveCallback(mUpstreamKeyerFlyParametersMonitors[me]); + + IBMDSwitcherKeyPatternParameters* patternParams = nil; + keyers[me].back()->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams); + if (patternParams != nil) + patternParams->RemoveCallback(mUpstreamKeyerPatternParametersMonitors[me]); keyers[me].pop_back(); } @@ -743,6 +756,7 @@ - (void)cleanUpConnection mUpstreamKeyerLumaParametersMonitors.clear(); mUpstreamKeyerChromaParametersMonitors.clear(); mUpstreamKeyerFlyParametersMonitors.clear(); + mUpstreamKeyerPatternParametersMonitors.clear(); for (auto const& it : mInputs) { From 1f55f38bcc301290111c4f26d549d6ff0ae7bbfd Mon Sep 17 00:00:00 2001 From: reno- Date: Mon, 21 Mar 2022 23:48:40 +0100 Subject: [PATCH 11/21] Fix, declare function that cannot be forget --- atemOSC/FeedbackMonitors.h | 1 + 1 file changed, 1 insertion(+) diff --git a/atemOSC/FeedbackMonitors.h b/atemOSC/FeedbackMonitors.h index c8f8d8e..776614a 100644 --- a/atemOSC/FeedbackMonitors.h +++ b/atemOSC/FeedbackMonitors.h @@ -201,6 +201,7 @@ class UpstreamKeyerPatternParametersMonitor : public GenericMonitor Date: Mon, 21 Mar 2022 23:49:45 +0100 Subject: [PATCH 12/21] forget to commit that a few hours ago --- atemOSC/FeedbackMonitors.mm | 73 +++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index 096a938..67211c9 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -839,32 +839,12 @@ return 0.4; } - - - - - - - - - - - - - - - - - - - - HRESULT UpstreamKeyerPatternParametersMonitor::Notify(BMDSwitcherKeyPatternParametersEventType eventType) { switch (eventType) { - case bmdSwitcherKeyPatternParametersEventTypeStyleChanged: + case bmdSwitcherKeyPatternParametersEventTypePatternChanged: updateUSKPatternStyleParameter(); break; case bmdSwitcherKeyPatternParametersEventTypeSizeChanged: @@ -893,26 +873,52 @@ } - - void UpstreamKeyerPatternParametersMonitor::updateUSKPatternStyleParameter() const { std::vector keyers = [switcher keyers][me_]; for (int i = 0; i < keyers.size(); i++) { - BMDSwitcherKeyPatternStyle style; - keyers[i]->GetStyle(&style); - - NSString *typeStr; - if (type == bmdSwitcherKeyTypeLuma) + BMDSwitcherPatternStyle style; + keyers[i]->GetPattern(&style); + + NSString *styleStr; + if (style == bmdSwitcherPatternStyleLeftToRightBar) styleStr = @"bar_left2right"; - if (type == bmdSwitcherKeyTypeChroma) + if (style == bmdSwitcherPatternStyleTopToBottomBar) styleStr = @"bar_top2bottom"; - if (type == bmdSwitcherKeyTypePattern) + if (style == bmdSwitcherPatternStyleHorizontalBarnDoor) styleStr = @"barndoor_horizontal"; - if (type == bmdSwitcherKeyTypeDVE) + if (style == bmdSwitcherPatternStyleVerticalBarnDoor) styleStr = @"barndoor_vertical"; - + if (style == bmdSwitcherPatternStyleCornersInFourBox) + styleStr = @"corners"; + if (style == bmdSwitcherPatternStyleRectangleIris) + styleStr = @"iris_rectangle"; + if (style == bmdSwitcherPatternStyleDiamondIris) + styleStr = @"iris_diamond"; + if (style == bmdSwitcherPatternStyleCircleIris) + styleStr = @"iris_circle"; + if (style == bmdSwitcherPatternStyleTopLeftBox) + styleStr = @"box_topleft"; + if (style == bmdSwitcherPatternStyleTopRightBox) + styleStr = @"box_topright"; + if (style == bmdSwitcherPatternStyleBottomRightBox) + styleStr = @"box_bottomright"; + if (style == bmdSwitcherPatternStyleBottomLeftBox) + styleStr = @"box_bottomleft"; + if (style == bmdSwitcherPatternStyleTopCentreBox) + styleStr = @"box_topcenter"; + if (style == bmdSwitcherPatternStyleRightCentreBox) + styleStr = @"box_centerright"; + if (style == bmdSwitcherPatternStyleBottomCentreBox) + styleStr = @"box_centerbottom"; + if (style == bmdSwitcherPatternStyleLeftCentreBox) + styleStr = @"box_centerleft"; + if (style == bmdSwitcherPatternStyleTopLeftDiagonal) + styleStr = @"diagonal_topleft"; + if (style == bmdSwitcherPatternStyleTopRightDiagonal) + styleStr = @"diagonal_topright"; + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/style",i+1], [OSCValue createWithString:styleStr], me_); // Support for legacy clients like TouchOSC @@ -920,9 +926,6 @@ } } - - - void UpstreamKeyerPatternParametersMonitor::updateUSKPatternSizeParameter() const { std::vector keyers = [switcher keyers][me_]; From 60f9aeb33d595130286c1615d489f24683b94e89 Mon Sep 17 00:00:00 2001 From: reno- Date: Tue, 22 Mar 2022 00:15:04 +0100 Subject: [PATCH 13/21] some copy / paste that has not been corectly done --- atemOSC/FeedbackMonitors.mm | 98 ++++++++++++++----------------------- 1 file changed, 38 insertions(+), 60 deletions(-) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index 67211c9..c8ef25e 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -872,7 +872,6 @@ return S_OK; } - void UpstreamKeyerPatternParametersMonitor::updateUSKPatternStyleParameter() const { std::vector keyers = [switcher keyers][me_]; @@ -941,7 +940,7 @@ } } } -void UpstreamKeyerPatternParametersMonitor::updateUSKPatternGainParameter() const +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternSymmetryParameter() const { std::vector keyers = [switcher keyers][me_]; for (int i = 0; i < keyers.size(); i++) @@ -949,14 +948,14 @@ IBMDSwitcherKeyPatternParameters* patternParams; if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) { - double gain; - patternParams->GetGain(&gain); + double symmetry; + patternParams->GetSymmetry(&symmetry); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/gain",i+1], [OSCValue createWithFloat:gain], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/symmetry",i+1], [OSCValue createWithFloat:symmetry], me_); } } } -void UpstreamKeyerPatternParametersMonitor::updateUSKPatternYSuppressParameter() const +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternSoftnessParameter() const { std::vector keyers = [switcher keyers][me_]; for (int i = 0; i < keyers.size(); i++) @@ -964,14 +963,14 @@ IBMDSwitcherKeyPatternParameters* patternParams; if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) { - double ySuppress; - patternParams->GetYSuppress(&ySuppress); + double softness; + patternParams->GetSoftness(&softness); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/y-suppress",i+1], [OSCValue createWithFloat:ySuppress], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/y-suppress",i+1], [OSCValue createWithFloat:softness], me_); } } } -void UpstreamKeyerPatternParametersMonitor::updateUSKPatternLiftParameter() const +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternHorizontalOffsetParameter() const { std::vector keyers = [switcher keyers][me_]; for (int i = 0; i < keyers.size(); i++) @@ -979,14 +978,14 @@ IBMDSwitcherKeyPatternParameters* patternParams; if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) { - double lift; - patternParams->GetLift(&lift); + double positionX; + patternParams->GetHorizontalOffset(&positionX); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/lift",i+1], [OSCValue createWithFloat:lift], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/position-x",i+1], [OSCValue createWithFloat:positionX], me_); } } } -void UpstreamKeyerPatternParametersMonitor::updateUSKPatternNarrowParameter() const +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternVerticalOffsetParameter() const { std::vector keyers = [switcher keyers][me_]; for (int i = 0; i < keyers.size(); i++) @@ -994,63 +993,42 @@ IBMDSwitcherKeyPatternParameters* patternParams; if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) { - bool narrow; - patternParams->GetNarrow(&narrow); + double positionY; + patternParams->GetVerticalOffset(&positionY); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/position-y",i+1], [OSCValue createWithFloat:positionY], me_); + } + } +} +void UpstreamKeyerPatternParametersMonitor::updateUSKPatternInverseParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyPatternParameters* patternParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) + { + bool inverse; + patternParams->GetInverse(&inverse); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/narrow",i+1], [OSCValue createWithBool:narrow], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/inverse",i+1], [OSCValue createWithBool:inverse], me_); } } } float UpstreamKeyerPatternParametersMonitor::sendStatus() const { - updateUSKPatternNarrowParameter(); - updateUSKPatternYSuppressParameter(); - updateUSKPatternGainParameter(); - updateUSKPatternHueParameter(); - updateUSKPatternLiftParameter(); + updateUSKPatternInverseParameter(); + updateUSKPatternSizeParameter(); + updateUSKPatternStyleParameter(); + updateUSKPatternSoftnessParameter(); + updateUSKPatternSymmetryParameter(); + updateUSKPatternHorizontalOffsetParameter(); + updateUSKPatternVerticalOffsetParameter(); return 0.4; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - HRESULT TransitionParametersMonitor::Notify(BMDSwitcherTransitionParametersEventType eventType) { From 43aa95394dcc136c5e17fbae3b8e54adcd2f1b0f Mon Sep 17 00:00:00 2001 From: reno- Date: Tue, 22 Mar 2022 12:08:21 +0100 Subject: [PATCH 14/21] GetPattern is not a Keyer call --- atemOSC/FeedbackMonitors.mm | 94 +++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 45 deletions(-) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index c8ef25e..61f6537 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -877,51 +877,55 @@ std::vector keyers = [switcher keyers][me_]; for (int i = 0; i < keyers.size(); i++) { - BMDSwitcherPatternStyle style; - keyers[i]->GetPattern(&style); - - NSString *styleStr; - if (style == bmdSwitcherPatternStyleLeftToRightBar) - styleStr = @"bar_left2right"; - if (style == bmdSwitcherPatternStyleTopToBottomBar) - styleStr = @"bar_top2bottom"; - if (style == bmdSwitcherPatternStyleHorizontalBarnDoor) - styleStr = @"barndoor_horizontal"; - if (style == bmdSwitcherPatternStyleVerticalBarnDoor) - styleStr = @"barndoor_vertical"; - if (style == bmdSwitcherPatternStyleCornersInFourBox) - styleStr = @"corners"; - if (style == bmdSwitcherPatternStyleRectangleIris) - styleStr = @"iris_rectangle"; - if (style == bmdSwitcherPatternStyleDiamondIris) - styleStr = @"iris_diamond"; - if (style == bmdSwitcherPatternStyleCircleIris) - styleStr = @"iris_circle"; - if (style == bmdSwitcherPatternStyleTopLeftBox) - styleStr = @"box_topleft"; - if (style == bmdSwitcherPatternStyleTopRightBox) - styleStr = @"box_topright"; - if (style == bmdSwitcherPatternStyleBottomRightBox) - styleStr = @"box_bottomright"; - if (style == bmdSwitcherPatternStyleBottomLeftBox) - styleStr = @"box_bottomleft"; - if (style == bmdSwitcherPatternStyleTopCentreBox) - styleStr = @"box_topcenter"; - if (style == bmdSwitcherPatternStyleRightCentreBox) - styleStr = @"box_centerright"; - if (style == bmdSwitcherPatternStyleBottomCentreBox) - styleStr = @"box_centerbottom"; - if (style == bmdSwitcherPatternStyleLeftCentreBox) - styleStr = @"box_centerleft"; - if (style == bmdSwitcherPatternStyleTopLeftDiagonal) - styleStr = @"diagonal_topleft"; - if (style == bmdSwitcherPatternStyleTopRightDiagonal) - styleStr = @"diagonal_topright"; - - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/style",i+1], [OSCValue createWithString:styleStr], me_); - - // Support for legacy clients like TouchOSC - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/type/%@",i+1, styleStr], [OSCValue createWithFloat:1.0], me_); + IBMDSwitcherKeyPatternParameters* patternParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyPatternParameters, (void**)&patternParams))) + { + BMDSwitcherPatternStyle pattern; + patternParams->GetPattern(&pattern); + + NSString *styleStr; + if (pattern == bmdSwitcherPatternStyleLeftToRightBar) + styleStr = @"bar_left2right"; + if (pattern == bmdSwitcherPatternStyleTopToBottomBar) + styleStr = @"bar_top2bottom"; + if (pattern == bmdSwitcherPatternStyleHorizontalBarnDoor) + styleStr = @"barndoor_horizontal"; + if (pattern == bmdSwitcherPatternStyleVerticalBarnDoor) + styleStr = @"barndoor_vertical"; + if (pattern == bmdSwitcherPatternStyleCornersInFourBox) + styleStr = @"corners"; + if (pattern == bmdSwitcherPatternStyleRectangleIris) + styleStr = @"iris_rectangle"; + if (pattern == bmdSwitcherPatternStyleDiamondIris) + styleStr = @"iris_diamond"; + if (pattern == bmdSwitcherPatternStyleCircleIris) + styleStr = @"iris_circle"; + if (pattern == bmdSwitcherPatternStyleTopLeftBox) + styleStr = @"box_topleft"; + if (pattern == bmdSwitcherPatternStyleTopRightBox) + styleStr = @"box_topright"; + if (pattern == bmdSwitcherPatternStyleBottomRightBox) + styleStr = @"box_bottomright"; + if (pattern == bmdSwitcherPatternStyleBottomLeftBox) + styleStr = @"box_bottomleft"; + if (pattern == bmdSwitcherPatternStyleTopCentreBox) + styleStr = @"box_topcenter"; + if (pattern == bmdSwitcherPatternStyleRightCentreBox) + styleStr = @"box_centerright"; + if (pattern == bmdSwitcherPatternStyleBottomCentreBox) + styleStr = @"box_centerbottom"; + if (pattern == bmdSwitcherPatternStyleLeftCentreBox) + styleStr = @"box_centerleft"; + if (pattern == bmdSwitcherPatternStyleTopLeftDiagonal) + styleStr = @"diagonal_topleft"; + if (pattern == bmdSwitcherPatternStyleTopRightDiagonal) + styleStr = @"diagonal_topright"; + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/style",i+1], [OSCValue createWithString:styleStr], me_); + + // Support for legacy clients like TouchOSC + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/type/%@",i+1, styleStr], [OSCValue createWithFloat:1.0], me_); + } } } From 78d6dd3e5cb47ae35b0cb610bc347bb776f63319 Mon Sep 17 00:00:00 2001 From: reno- Date: Wed, 23 Mar 2022 22:23:23 +0100 Subject: [PATCH 15/21] Fix build issue thanks to @SteffeyDev --- atemOSC/FeedbackMonitors.h | 2 +- atemOSC/FeedbackMonitors.mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/atemOSC/FeedbackMonitors.h b/atemOSC/FeedbackMonitors.h index 776614a..862884e 100644 --- a/atemOSC/FeedbackMonitors.h +++ b/atemOSC/FeedbackMonitors.h @@ -150,7 +150,7 @@ class UpstreamKeyerFlyParametersMonitor : public GenericMonitor Date: Mon, 19 Sep 2022 14:29:33 +0200 Subject: [PATCH 16/21] Fix copy/paste error, for softness param of the pattern --- atemOSC/FeedbackMonitors.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index c04a403..c3a1e77 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -921,10 +921,10 @@ if (pattern == bmdSwitcherPatternStyleTopRightDiagonal) styleStr = @"diagonal_topright"; - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/style",i+1], [OSCValue createWithString:styleStr], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/style",i+1], [OSCValue createWithString:styleStr], me_); // Support for legacy clients like TouchOSC - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/type/%@",i+1, styleStr], [OSCValue createWithFloat:1.0], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/style/%@",i+1, styleStr], [OSCValue createWithFloat:1.0], me_); } } } From d8ef5272b522b01069c314ad1c6d2a59fd83d5de Mon Sep 17 00:00:00 2001 From: reno- <> Date: Mon, 19 Sep 2022 14:29:55 +0200 Subject: [PATCH 17/21] no message --- atemOSC/FeedbackMonitors.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index c3a1e77..fafcc07 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -970,7 +970,7 @@ double softness; patternParams->GetSoftness(&softness); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/y-suppress",i+1], [OSCValue createWithFloat:softness], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/pattern/softness",i+1], [OSCValue createWithFloat:softness], me_); } } } From 7905b5919b3b50ec61e417adfbf59724cfc8df77 Mon Sep 17 00:00:00 2001 From: reno- <> Date: Mon, 19 Sep 2022 18:15:15 +0200 Subject: [PATCH 18/21] Fix bad copy/paste from size to pos for Fly parameters --- atemOSC/FeedbackMonitors.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index fafcc07..549ea76 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -696,7 +696,7 @@ double offsetX; flyParams->GetPositionX(&offsetX); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/size-x",i+1], [OSCValue createWithFloat:offsetX], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/pos-x",i+1], [OSCValue createWithFloat:offsetX], me_); } } } @@ -711,7 +711,7 @@ double offsetY; flyParams->GetPositionY(&offsetY); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/size-y",i+1], [OSCValue createWithFloat:offsetY], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/pos-y",i+1], [OSCValue createWithFloat:offsetY], me_); } } } From 9fea1e8e1e8da72d21d9c41753606e497c59d91b Mon Sep 17 00:00:00 2001 From: reno- <> Date: Mon, 19 Sep 2022 18:23:10 +0200 Subject: [PATCH 19/21] Fix pos / position ortograph --- atemOSC/FeedbackMonitors.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index 549ea76..5f6fb3e 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -696,7 +696,7 @@ double offsetX; flyParams->GetPositionX(&offsetX); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/pos-x",i+1], [OSCValue createWithFloat:offsetX], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/position-x",i+1], [OSCValue createWithFloat:offsetX], me_); } } } @@ -711,7 +711,7 @@ double offsetY; flyParams->GetPositionY(&offsetY); - sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/pos-y",i+1], [OSCValue createWithFloat:offsetY], me_); + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/position-y",i+1], [OSCValue createWithFloat:offsetY], me_); } } } From d4f215fbb3f33bb6b3a2a8f9c57aa8d51c7fbd4c Mon Sep 17 00:00:00 2001 From: reno- <> Date: Mon, 19 Sep 2022 18:41:34 +0200 Subject: [PATCH 20/21] add Feedback For rotation parameter of Flying Key --- atemOSC/FeedbackMonitors.mm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/atemOSC/FeedbackMonitors.mm b/atemOSC/FeedbackMonitors.mm index 5f6fb3e..5eb59e6 100644 --- a/atemOSC/FeedbackMonitors.mm +++ b/atemOSC/FeedbackMonitors.mm @@ -603,6 +603,9 @@ case bmdSwitcherKeyFlyParametersEventTypePositionYChanged: updateUSKFlyPositionYParameter(); break; + case bmdSwitcherKeyFlyParametersEventTypeRotationChanged: + updateUSKFlyRotationParameter(); + break; default: // ignore other property changes not used for this app break; @@ -715,6 +718,21 @@ } } } +void UpstreamKeyerFlyParametersMonitor::updateUSKFlyRotationParameter() const +{ + std::vector keyers = [switcher keyers][me_]; + for (int i = 0; i < keyers.size(); i++) + { + IBMDSwitcherKeyFlyParameters* flyParams; + if (SUCCEEDED(keyers[i]->QueryInterface(IID_IBMDSwitcherKeyFlyParameters, (void**)&flyParams))) + { + double frames; + flyParams->GetRotation(&frames); + + sendFeedbackMessage(switcher, [NSString stringWithFormat:@"/usk/%d/fly/rotation",i+1], [OSCValue createWithFloat:frames], me_); + } + } +} float UpstreamKeyerFlyParametersMonitor::sendStatus() const { @@ -723,6 +741,7 @@ updateUSKFlySizeYParameter(); updateUSKFlyPositionXParameter(); updateUSKFlyPositionYParameter(); + updateUSKFlyRotationParameter(); return 0.4; } From a1371ce9189e644e27ab0769b5cf95ecee2dac9f Mon Sep 17 00:00:00 2001 From: reno- <> Date: Mon, 19 Sep 2022 18:50:43 +0200 Subject: [PATCH 21/21] update Feedback Info --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 682bcc8..e10026c 100644 --- a/README.md +++ b/README.md @@ -225,7 +225,7 @@ By default, commands will be sent to the first mix effect block (M/E). To send Where `$i` can be 1, 2, 3, or 4 depending on the capability of your ATEM switcher -Feedback: Enabled for '/atem/usk/$i/on-air', '/atem/usk/$i/tie', '/atem/usk/$i/source/\*', '/atem/usk/$i/luma/\*', and '/atem/usk/$i/chroma/\*' +Feedback: Enabled ### Downstream Keyers