Skip to content

Commit

Permalink
Adding additional safety checks, allowing partial functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
SteffeyDev committed Feb 24, 2020
1 parent 5d49e2f commit e1888d0
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 98 deletions.
209 changes: 111 additions & 98 deletions atemOSC/AppDelegate.mm
Original file line number Diff line number Diff line change
Expand Up @@ -257,12 +257,7 @@ - (void)connectBMD
- (void)switcherConnected
{
HRESULT result;
IBMDSwitcherMixEffectBlockIterator* iterator = NULL;
IBMDSwitcherMediaPlayerIterator* mediaPlayerIterator = NULL;
IBMDSwitcherSuperSourceBoxIterator* superSourceIterator = NULL;
IBMDSwitcherInputIterator* inputIterator = NULL;
IBMDSwitcherAudioInputIterator* audioInputIterator = NULL;
IBMDSwitcherHyperDeckIterator* hyperDeckIterator = NULL;

isConnectedToATEM = YES;

if ([[NSProcessInfo processInfo] respondsToSelector:@selector(beginActivityWithOptions:reason:)])
Expand All @@ -277,34 +272,35 @@ - (void)switcherConnected
[newMsg addFloat:0.0];
[outPort sendThisMessage:newMsg];

NSString* productName;
NSString* productName = @"N/A";
if (FAILED(mSwitcher->GetProductName((CFStringRef*)&productName)))
{
[self logMessage:@"Could not get switcher product name"];
return;
}

[(SettingsWindow *)window showSwitcherConnected:productName];

mSwitcher->AddCallback(mSwitcherMonitor);

// Get the mix effect block iterator
result = mSwitcher->CreateIterator(IID_IBMDSwitcherMixEffectBlockIterator, (void**)&iterator);
if (FAILED(result))
IBMDSwitcherMixEffectBlockIterator* iterator = NULL;
if (SUCCEEDED(mSwitcher->CreateIterator(IID_IBMDSwitcherMixEffectBlockIterator, (void**)&iterator)))
{
[self logMessage:@"Could not create IBMDSwitcherMixEffectBlockIterator iterator"];
return;
// Use the first Mix Effect Block
if (S_OK != iterator->Next(&mMixEffectBlock))
{
[self logMessage:@"Could not get the first IBMDSwitcherMixEffectBlock"];
}
}

// Use the first Mix Effect Block
if (S_OK != iterator->Next(&mMixEffectBlock))
else
{
[self logMessage:@"Could not get the first IBMDSwitcherMixEffectBlock"];
return;
[self logMessage:@"Could not create IBMDSwitcherMixEffectBlockIterator iterator"];
}


// Create an InputMonitor for each input so we can catch any changes to input names
result = mSwitcher->CreateIterator(IID_IBMDSwitcherInputIterator, (void**)&inputIterator);
if (SUCCEEDED(result))
IBMDSwitcherInputIterator* inputIterator = NULL;
if (SUCCEEDED(mSwitcher->CreateIterator(IID_IBMDSwitcherInputIterator, (void**)&inputIterator)))
{
IBMDSwitcherInput* input = NULL;

Expand Down Expand Up @@ -334,13 +330,16 @@ - (void)switcherConnected
inputIterator->Release();
inputIterator = NULL;
}
else
{
[self logMessage:@"Could not create IBMDSwitcherInputIterator iterator"];
}


//Upstream Keyer
IBMDSwitcherKeyIterator* keyIterator = NULL;
result = mMixEffectBlock->CreateIterator(IID_IBMDSwitcherKeyIterator, (void**)&keyIterator);
IBMDSwitcherKey* key = NULL;
if (SUCCEEDED(result))
if (SUCCEEDED(mMixEffectBlock->CreateIterator(IID_IBMDSwitcherKeyIterator, (void**)&keyIterator)))
{
while (S_OK == keyIterator->Next(&key))
{
Expand All @@ -358,144 +357,158 @@ - (void)switcherConnected
keyIterator->Release();
keyIterator = NULL;
}
else
{
[self logMessage:@"Could not create IBMDSwitcherKeyIterator iterator"];
}


//Downstream Keyer
IBMDSwitcherDownstreamKeyIterator* dskIterator = NULL;
result = mSwitcher->CreateIterator(IID_IBMDSwitcherDownstreamKeyIterator, (void**)&dskIterator);
IBMDSwitcherDownstreamKey* downstreamKey = NULL;
if (SUCCEEDED(result))
if (SUCCEEDED(mSwitcher->CreateIterator(IID_IBMDSwitcherDownstreamKeyIterator, (void**)&dskIterator)))
{
while (S_OK == dskIterator->Next(&downstreamKey))
{
dsk.push_back(downstreamKey);
downstreamKey->AddCallback(mDownstreamKeyerMonitor);
}
dskIterator->Release();
dskIterator = NULL;
}
else
{
[self logMessage:@"Could not create IBMDSwitcherDownstreamKeyIterator iterator"];
}
dskIterator->Release();
dskIterator = NULL;


// Media Players
result = mSwitcher->CreateIterator(IID_IBMDSwitcherMediaPlayerIterator, (void**)&mediaPlayerIterator);
if (FAILED(result))
IBMDSwitcherMediaPlayerIterator* mediaPlayerIterator = NULL;
if (SUCCEEDED(mSwitcher->CreateIterator(IID_IBMDSwitcherMediaPlayerIterator, (void**)&mediaPlayerIterator)))
{
[self logMessage:@"Could not create IBMDSwitcherMediaPlayerIterator iterator"];
return;
IBMDSwitcherMediaPlayer* mediaPlayer = NULL;
while (S_OK == mediaPlayerIterator->Next(&mediaPlayer))
{
mMediaPlayers.push_back(mediaPlayer);
}
mediaPlayerIterator->Release();
mediaPlayerIterator = NULL;
}

IBMDSwitcherMediaPlayer* mediaPlayer = NULL;
while (S_OK == mediaPlayerIterator->Next(&mediaPlayer))
else
{
mMediaPlayers.push_back(mediaPlayer);
[self logMessage:@"Could not create IBMDSwitcherMediaPlayerIterator iterator"];
}
mediaPlayerIterator->Release();
mediaPlayerIterator = NULL;

// get media pool
result = mSwitcher->QueryInterface(IID_IBMDSwitcherMediaPool, (void**)&mMediaPool);
if (FAILED(result))
if (FAILED(mSwitcher->QueryInterface(IID_IBMDSwitcherMediaPool, (void**)&mMediaPool)))
{
[self logMessage:@"Could not get IBMDSwitcherMediaPool interface"];
return;
}

// get macro pool
result = mSwitcher->QueryInterface(IID_IBMDSwitcherMacroPool, (void**)&mMacroPool);
if (FAILED(result))
if (SUCCEEDED(mSwitcher->QueryInterface(IID_IBMDSwitcherMacroPool, (void**)&mMacroPool)))
{
mMacroPool->AddCallback(mMacroPoolMonitor);
}
else
{
[self logMessage:@"Could not get IID_IBMDSwitcherMacroPool interface"];
return;
}
mMacroPool->AddCallback(mMacroPoolMonitor);

// get macro controller
result = mSwitcher->QueryInterface(IID_IBMDSwitcherMacroControl, (void**)&mMacroControl);
if (FAILED(result))
if (FAILED(mSwitcher->QueryInterface(IID_IBMDSwitcherMacroControl, (void**)&mMacroControl)))
{
[self logMessage:@"Could not get IID_IBMDSwitcherMacroControl interface"];
return;
}

// Super source
if (mSuperSource) {
result = mSuperSource->CreateIterator(IID_IBMDSwitcherSuperSourceBoxIterator, (void**)&superSourceIterator);
if (FAILED(result))
if (SUCCEEDED(mSwitcher->CreateIterator(IID_IBMDSwitcherInputSuperSource, (void**)&mSuperSource))) {
IBMDSwitcherSuperSourceBoxIterator* superSourceIterator = NULL;
if (SUCCEEDED(mSuperSource->CreateIterator(IID_IBMDSwitcherSuperSourceBoxIterator, (void**)&superSourceIterator)))
{
[self logMessage:@"Could not create IBMDSwitcherSuperSourceBoxIterator iterator"];
return;
IBMDSwitcherSuperSourceBox* superSourceBox = NULL;
while (S_OK == superSourceIterator->Next(&superSourceBox))
{
mSuperSourceBoxes.push_back(superSourceBox);
}
superSourceIterator->Release();
superSourceIterator = NULL;
}
IBMDSwitcherSuperSourceBox* superSourceBox = NULL;
while (S_OK == superSourceIterator->Next(&superSourceBox))
else
{
mSuperSourceBoxes.push_back(superSourceBox);
[self logMessage:@"Could not create IBMDSwitcherSuperSourceBoxIterator iterator"];
}
superSourceIterator->Release();
superSourceIterator = NULL;
}
else
{
[self logMessage:@"Could not get IBMDSwitcherInputSuperSource interface"];
}

// Audio Mixer (Output)
mAudioMixer = NULL;
result = mSwitcher->QueryInterface(IID_IBMDSwitcherAudioMixer, (void**)&mAudioMixer);
if (FAILED(result))
if (SUCCEEDED(mSwitcher->QueryInterface(IID_IBMDSwitcherAudioMixer, (void**)&mAudioMixer)))
{
mAudioMixer->AddCallback(mAudioMixerMonitor);
}
else
{
[self logMessage:@"Could not get IBMDSwitcherAudioMixer interface"];
return;
}
mAudioMixer->AddCallback(mAudioMixerMonitor);

// Audio Inputs
result = mAudioMixer->CreateIterator(IID_IBMDSwitcherAudioInputIterator, (void**)&audioInputIterator);
if (FAILED(result))
IBMDSwitcherAudioInputIterator* audioInputIterator = NULL;
if (SUCCEEDED(mAudioMixer->CreateIterator(IID_IBMDSwitcherAudioInputIterator, (void**)&audioInputIterator)))
{
IBMDSwitcherAudioInput* audioInput = NULL;
while (S_OK == audioInputIterator->Next(&audioInput))
{
BMDSwitcherAudioInputId inputId;
audioInput->GetAudioInputId(&inputId);
mAudioInputs.insert(std::make_pair(inputId, audioInput));
AudioInputMonitor *monitor = new AudioInputMonitor(self, inputId);
audioInput->AddCallback(monitor);
mMonitors.push_back(monitor);
mAudioInputMonitors.insert(std::make_pair(inputId, monitor));
}
audioInputIterator->Release();
audioInputIterator = NULL;
}
else
{
[self logMessage:[NSString stringWithFormat:@"Could not create IBMDSwitcherAudioInputIterator iterator. code: %d", HRESULT_CODE(result)]];
return;
}

IBMDSwitcherAudioInput* audioInput = NULL;
while (S_OK == audioInputIterator->Next(&audioInput))
switcherTransitionParameters = NULL;
if (mMixEffectBlock)
{
BMDSwitcherAudioInputId inputId;
audioInput->GetAudioInputId(&inputId);
mAudioInputs.insert(std::make_pair(inputId, audioInput));
AudioInputMonitor *monitor = new AudioInputMonitor(self, inputId);
audioInput->AddCallback(monitor);
mMonitors.push_back(monitor);
mAudioInputMonitors.insert(std::make_pair(inputId, monitor));
mMixEffectBlock->QueryInterface(IID_IBMDSwitcherTransitionParameters, (void**)&switcherTransitionParameters);
switcherTransitionParameters->AddCallback(mTransitionParametersMonitor);
mMixEffectBlock->AddCallback(mMixEffectBlockMonitor);
}
audioInputIterator->Release();
audioInputIterator = NULL;

switcherTransitionParameters = NULL;
mMixEffectBlock->QueryInterface(IID_IBMDSwitcherTransitionParameters, (void**)&switcherTransitionParameters);
switcherTransitionParameters->AddCallback(mTransitionParametersMonitor);

mMixEffectBlock->AddCallback(mMixEffectBlockMonitor);

self->mMixEffectBlockMonitor->updateSliderPosition();

// Hyperdeck Setup
result = mSwitcher->CreateIterator(IID_IBMDSwitcherHyperDeckIterator, (void**)&hyperDeckIterator);
if (FAILED(result))
IBMDSwitcherHyperDeckIterator* hyperDeckIterator = NULL;
if (SUCCEEDED(mSwitcher->CreateIterator(IID_IBMDSwitcherHyperDeckIterator, (void**)&hyperDeckIterator)))
{
[self logMessage:[NSString stringWithFormat:@"Could not create IBMDSwitcherHyperDeckIterator iterator. code: %d", HRESULT_CODE(result)]];
return;
IBMDSwitcherHyperDeck* hyperdeck = NULL;
while (S_OK == hyperDeckIterator->Next(&hyperdeck))
{
BMDSwitcherHyperDeckId hyperdeckId;
hyperdeck->GetId(&hyperdeckId);
mHyperdecks.insert(std::make_pair(hyperdeckId, hyperdeck));
HyperDeckMonitor *monitor = new HyperDeckMonitor(self, hyperdeckId);
hyperdeck->AddCallback(monitor);
mMonitors.push_back(monitor);
mHyperdeckMonitors.insert(std::make_pair(hyperdeckId, monitor));
}
hyperDeckIterator->Release();
hyperDeckIterator = NULL;
}

IBMDSwitcherHyperDeck* hyperdeck = NULL;
while (S_OK == hyperDeckIterator->Next(&hyperdeck))
else
{
BMDSwitcherHyperDeckId hyperdeckId;
hyperdeck->GetId(&hyperdeckId);
mHyperdecks.insert(std::make_pair(hyperdeckId, hyperdeck));
HyperDeckMonitor *monitor = new HyperDeckMonitor(self, hyperdeckId);
hyperdeck->AddCallback(monitor);
mMonitors.push_back(monitor);
mHyperdeckMonitors.insert(std::make_pair(hyperdeckId, monitor));
[self logMessage:[NSString stringWithFormat:@"Could not create IBMDSwitcherHyperDeckIterator iterator. code: %d", HRESULT_CODE(result)]];
}
hyperDeckIterator->Release();
hyperDeckIterator = NULL;


dispatch_async(dispatch_get_main_queue(), ^{
[helpPanel setupWithDelegate: self];
});
Expand Down
18 changes: 18 additions & 0 deletions atemOSC/OSCReceiver.mm
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ - (instancetype) initWithDelegate:(AppDelegate *) delegate
validators = [[NSMutableDictionary alloc] init];

NSLog(@"Setting up validators");

[validators setObject:[^bool(NSDictionary *d, OSCValue *v) {
if ([appDel mMixEffectBlock])
return true;
[appDel logMessage:@"No mix effect block"];
return false;
} copy] forKey:@"/atem/transition"];

[validators setObject:[^bool(NSDictionary *d, OSCValue *v) {
int key = [[d objectForKey:@"<key>"] intValue];
Expand All @@ -29,6 +36,12 @@ - (instancetype) initWithDelegate:(AppDelegate *) delegate
int key = [[d objectForKey:@"<key>"] intValue];
NSString *address = [d objectForKey:@"address"];

if (![appDel switcherTransitionParameters])
{
[appDel logMessage:@"No switcher transition parameters"];
return false;
}

// Normal USK
if (key > 0 && key <= [appDel keyers].size())
return true;
Expand Down Expand Up @@ -834,6 +847,11 @@ - (IBMDSwitcherKeyDVEParameters *) getUSKDVEParams:(int)t

- (void) changeTransitionSelection:(int)t select:(bool) select
{
if ([appDel switcherTransitionParameters] == nil)
{
return;
}

uint32_t currentTransitionSelection;
[appDel switcherTransitionParameters]->GetNextTransitionSelection(&currentTransitionSelection);

Expand Down

0 comments on commit e1888d0

Please sign in to comment.