Skip to main content
Inspiring
February 8, 2024
Answered

Problem with AEGP_GetLayerNumEffects and AEGP_GetEffectMatchName

  • February 8, 2024
  • 1 reply
  • 341 views

Hi

 

In an AEGP I'm building a function which can loop through all layers and effects in a given composition. 

The problem is that my effectsLen (number of effects on a layer) will return a very high number of several thousands even though there are only one effect in my test project.

What is weird is, if I exclude this line:

 

 

ERR(suites.EffectSuite4()->AEGP_GetEffectMatchName(installedKey, &effectMatchName));

 

 

... it will work and effectsLen will correctly be 1. If I add it, effectLen will be wrong. I fail to see what these have to do with each other? The error message I get is actually a "Plugin ID is invalid".

 

 

static PF_Err
LoopThroughEffects
(
	AEGP_CompH		compH,
	AEGP_GlobalRefcon	plugin_refconP)
{
	PF_Err			err = PF_Err_NONE;
	AEGP_SuiteHandler	suites(sP);
	AEGP_PluginID		plugin_id;

	A_long				layersLen;

	ERR(suites.UtilitySuite6()->AEGP_RegisterWithAEGP(plugin_refconP, STR(StrID_Name), &plugin_id));
	ERR(suites.LayerSuite8()->AEGP_GetCompNumLayers(compH, &layersLen));

	for (A_long i = 0; i < layersLen; i++)
	{
		AEGP_LayerH				layer;
		A_long					effectsLen;

		ERR(suites.LayerSuite8()->AEGP_GetCompLayerByIndex(compH, i, &layer));
		ERR(suites.EffectSuite4()->AEGP_GetLayerNumEffects(layer, &effectsLen));

		for (A_long e = 0; e < effectsLen; e++)
		{
			AEGP_EffectRefH			effectRef;
			AEGP_InstalledEffectKey installedKey;
			A_char					effectMatchName;

			ERR(suites.EffectSuite4()->AEGP_GetLayerEffectByIndex(plugin_id, layer, e, &effectRef));
			ERR(suites.EffectSuite4()->AEGP_GetInstalledKeyFromLayerEffect(effectRef, &installedKey));
			ERR(suites.EffectSuite4()->AEGP_GetEffectMatchName(installedKey, &effectMatchName)); // This is the problem

			if (effectRef) ERR(suites.EffectSuite4()->AEGP_DisposeEffect(effectRef));
		}
	}

	return err;
}

 

 

Any help will be greatly appreciated.

- Jakob 

 

Update after more tests:

I have tried with AEGP_GetEffectName also. Same result.

I have put in a break point to check the values. Effects name will be "77 'M'" which also is wrong. Maybe a hint?

EffectsLen will change to "1869366048". 

When continuing I get the pluginID error. I have also tried with NULL as pluginID.

This topic has been closed for replies.
Correct answer Jakob Wagner 2048

I have now found the problem. This line:

A_char	effectName;

Should be:

A_char	effectName[AEGP_MAX_ITEM_NAME_SIZE] = { '\0' };

I still don't understand why that would lead to a change in effectsLen. Non the less, the fully functioning function:

static PF_Err
LoopThroughEffects
(
	AEGP_CompH			compH)
{
	PF_Err				err = PF_Err_NONE;
	AEGP_SuiteHandler	suites(sP);

	A_long				layersLen;
	
	ERR(suites.LayerSuite8()->AEGP_GetCompNumLayers(compH, &layersLen));

	for (A_long i = 0; i < layersLen; i++)
	{
		AEGP_LayerH				layer;
		A_long					effectsLen;

		ERR(suites.LayerSuite8()->AEGP_GetCompLayerByIndex(compH, i, &layer));
		ERR(suites.EffectSuite4()->AEGP_GetLayerNumEffects(layer, &effectsLen));
		
		for (A_long e = 0; e < effectsLen; e++)
		{
			AEGP_EffectRefH			effectRef = NULL;
			AEGP_InstalledEffectKey installedKey;
			A_char					effectName[AEGP_MAX_ITEM_NAME_SIZE] = { '\0' };
			A_char					effectMatchName[AEGP_MAX_EFFECT_MATCH_NAME_SIZE] = { '\0' };

			ERR(suites.EffectSuite4()->AEGP_GetLayerEffectByIndex(S_my_id, layer, e, &effectRef));

			if (!err && effectRef)
			{
				ERR(suites.EffectSuite4()->AEGP_GetInstalledKeyFromLayerEffect(effectRef, &installedKey));
				ERR(suites.EffectSuite4()->AEGP_GetEffectMatchName(installedKey, effectMatchName));
				ERR(suites.EffectSuite4()->AEGP_GetEffectName(installedKey, effectName));
			}

			if (effectRef) ERR(suites.EffectSuite4()->AEGP_DisposeEffect(effectRef));
		}
	}

	return err;
}

 

- Jakob

1 reply

Inspiring
February 19, 2024

I still have problems with this. And I can't figure it out. The function now looks like this:

static PF_Err
LoopThroughEffects
(
	AEGP_CompH			compH)
{
	PF_Err				err = PF_Err_NONE;
	AEGP_SuiteHandler	suites(sP);

	A_long				layersLen;

	ERR(suites.LayerSuite8()->AEGP_GetCompNumLayers(compH, &layersLen));

	for (A_long i = 0; i < layersLen; i++)
	{
		AEGP_LayerH				layer;
		A_long					effectsLen;

		ERR(suites.LayerSuite8()->AEGP_GetCompLayerByIndex(compH, i, &layer));
		ERR(suites.EffectSuite4()->AEGP_GetLayerNumEffects(layer, &effectsLen));

		for (A_long e = 0; e < effectsLen; e++)
		{
			AEGP_EffectRefH			effectRef;
			AEGP_InstalledEffectKey installedKey;
			A_char					effectName;

			ERR(suites.EffectSuite4()->AEGP_GetLayerEffectByIndex(S_my_id, layer, e, &effectRef));
			ERR(suites.EffectSuite4()->AEGP_GetInstalledKeyFromLayerEffect(effectRef, &installedKey));
			ERR(suites.EffectSuite4()->AEGP_GetEffectName(installedKey, &effectName));

			if (effectRef) ERR(suites.EffectSuite4()->AEGP_DisposeEffect(effectRef));
		}
	}

	return err;
}

It is called in the IdleHook in the AEGP for every 200th IdleHook call. I figured the correct pluginID is already served as a variable "S_my_id", so I don't get the PluginID error now. I do still get the problem with both layersLen and effectsLen changing to very high numbers as soon as I call this line:

ERR(suites.EffectSuite4()->AEGP_GetEffectName(installedKey, &effectName));

This will lead to a runtime error: "Internal verification error, sorry. {effect_indexL out of range}". If I exclude that line from the loop, I get no errors.

 

- Jakob

Jakob Wagner 2048AuthorCorrect answer
Inspiring
February 20, 2024

I have now found the problem. This line:

A_char	effectName;

Should be:

A_char	effectName[AEGP_MAX_ITEM_NAME_SIZE] = { '\0' };

I still don't understand why that would lead to a change in effectsLen. Non the less, the fully functioning function:

static PF_Err
LoopThroughEffects
(
	AEGP_CompH			compH)
{
	PF_Err				err = PF_Err_NONE;
	AEGP_SuiteHandler	suites(sP);

	A_long				layersLen;
	
	ERR(suites.LayerSuite8()->AEGP_GetCompNumLayers(compH, &layersLen));

	for (A_long i = 0; i < layersLen; i++)
	{
		AEGP_LayerH				layer;
		A_long					effectsLen;

		ERR(suites.LayerSuite8()->AEGP_GetCompLayerByIndex(compH, i, &layer));
		ERR(suites.EffectSuite4()->AEGP_GetLayerNumEffects(layer, &effectsLen));
		
		for (A_long e = 0; e < effectsLen; e++)
		{
			AEGP_EffectRefH			effectRef = NULL;
			AEGP_InstalledEffectKey installedKey;
			A_char					effectName[AEGP_MAX_ITEM_NAME_SIZE] = { '\0' };
			A_char					effectMatchName[AEGP_MAX_EFFECT_MATCH_NAME_SIZE] = { '\0' };

			ERR(suites.EffectSuite4()->AEGP_GetLayerEffectByIndex(S_my_id, layer, e, &effectRef));

			if (!err && effectRef)
			{
				ERR(suites.EffectSuite4()->AEGP_GetInstalledKeyFromLayerEffect(effectRef, &installedKey));
				ERR(suites.EffectSuite4()->AEGP_GetEffectMatchName(installedKey, effectMatchName));
				ERR(suites.EffectSuite4()->AEGP_GetEffectName(installedKey, effectName));
			}

			if (effectRef) ERR(suites.EffectSuite4()->AEGP_DisposeEffect(effectRef));
		}
	}

	return err;
}

 

- Jakob