@@ -4,6 +4,27 @@ JUCE breaking changes | |||||
Develop Branch | Develop Branch | ||||
============= | ============= | ||||
Change | |||||
------ | |||||
A new FrameRateType fps23976 has been added to AudioPlayHead | |||||
Possible Issues | |||||
--------------- | |||||
Previously JUCE would report the FrameRateType fps24 for both 24 and | |||||
23.976 fps. If your code uses switch statements (or similar) to handle | |||||
all possible frame rate types, then this change may cause it to fall | |||||
through. | |||||
Workaround | |||||
---------- | |||||
Add fps23976 to your switch statement and handle it appropriately. | |||||
Rationale | |||||
--------- | |||||
JUCE should be able to handle all popular frame rate codes but was | |||||
missing support for 23.976. | |||||
Change | Change | ||||
------ | ------ | ||||
The String (bool) constructor and operator<< (String&, bool) have been | The String (bool) constructor and operator<< (String&, bool) have been | ||||
@@ -46,14 +46,15 @@ public: | |||||
/** Frame rate types. */ | /** Frame rate types. */ | ||||
enum FrameRateType | enum FrameRateType | ||||
{ | { | ||||
fps24 = 0, | |||||
fps25 = 1, | |||||
fps2997 = 2, | |||||
fps30 = 3, | |||||
fps2997drop = 4, | |||||
fps30drop = 5, | |||||
fps60 = 6, | |||||
fps60drop = 7, | |||||
fps23976 = 0, | |||||
fps24 = 1, | |||||
fps25 = 2, | |||||
fps2997 = 3, | |||||
fps30 = 4, | |||||
fps2997drop = 5, | |||||
fps30drop = 6, | |||||
fps60 = 7, | |||||
fps60drop = 8, | |||||
fpsUnknown = 99 | fpsUnknown = 99 | ||||
}; | }; | ||||
@@ -900,7 +900,7 @@ namespace AAXClasses | |||||
case AAX_eFrameRate_2997DropFrame: info.frameRate = AudioPlayHead::fps2997drop; framesPerSec = 30.0 * 1000.0 / 1001.0; break; | case AAX_eFrameRate_2997DropFrame: info.frameRate = AudioPlayHead::fps2997drop; framesPerSec = 30.0 * 1000.0 / 1001.0; break; | ||||
case AAX_eFrameRate_30NonDrop: info.frameRate = AudioPlayHead::fps30; framesPerSec = 30.0; break; | case AAX_eFrameRate_30NonDrop: info.frameRate = AudioPlayHead::fps30; framesPerSec = 30.0; break; | ||||
case AAX_eFrameRate_30DropFrame: info.frameRate = AudioPlayHead::fps30drop; framesPerSec = 30.0; break; | case AAX_eFrameRate_30DropFrame: info.frameRate = AudioPlayHead::fps30drop; framesPerSec = 30.0; break; | ||||
case AAX_eFrameRate_23976: info.frameRate = AudioPlayHead::fps24; framesPerSec = 24.0 * 1000.0 / 1001.0; break; | |||||
case AAX_eFrameRate_23976: info.frameRate = AudioPlayHead::fps23976; framesPerSec = 24.0 * 1000.0 / 1001.0; break; | |||||
default: break; | default: break; | ||||
} | } | ||||
@@ -932,6 +932,7 @@ public: | |||||
switch (lastTimeStamp.mSMPTETime.mType) | switch (lastTimeStamp.mSMPTETime.mType) | ||||
{ | { | ||||
case kSMPTETimeType2398: info.frameRate = AudioPlayHead::fps23976; break; | |||||
case kSMPTETimeType24: info.frameRate = AudioPlayHead::fps24; break; | case kSMPTETimeType24: info.frameRate = AudioPlayHead::fps24; break; | ||||
case kSMPTETimeType25: info.frameRate = AudioPlayHead::fps25; break; | case kSMPTETimeType25: info.frameRate = AudioPlayHead::fps25; break; | ||||
case kSMPTETimeType30Drop: info.frameRate = AudioPlayHead::fps30drop; break; | case kSMPTETimeType30Drop: info.frameRate = AudioPlayHead::fps30drop; break; | ||||
@@ -884,6 +884,7 @@ public: | |||||
switch (lastTimeStamp.mSMPTETime.mType) | switch (lastTimeStamp.mSMPTETime.mType) | ||||
{ | { | ||||
case kSMPTETimeType2398: info.frameRate = AudioPlayHead::fps23976; break; | |||||
case kSMPTETimeType24: info.frameRate = AudioPlayHead::fps24; break; | case kSMPTETimeType24: info.frameRate = AudioPlayHead::fps24; break; | ||||
case kSMPTETimeType25: info.frameRate = AudioPlayHead::fps25; break; | case kSMPTETimeType25: info.frameRate = AudioPlayHead::fps25; break; | ||||
case kSMPTETimeType2997: info.frameRate = AudioPlayHead::fps2997; break; | case kSMPTETimeType2997: info.frameRate = AudioPlayHead::fps2997; break; | ||||
@@ -764,7 +764,7 @@ public: | |||||
case ficFrameRate_2997DropFrame: info.frameRate = AudioPlayHead::fps2997drop; framesPerSec = 30.0 * 1000.0 / 1001.0; break; | case ficFrameRate_2997DropFrame: info.frameRate = AudioPlayHead::fps2997drop; framesPerSec = 30.0 * 1000.0 / 1001.0; break; | ||||
case ficFrameRate_30NonDrop: info.frameRate = AudioPlayHead::fps30; framesPerSec = 30.0; break; | case ficFrameRate_30NonDrop: info.frameRate = AudioPlayHead::fps30; framesPerSec = 30.0; break; | ||||
case ficFrameRate_30DropFrame: info.frameRate = AudioPlayHead::fps30drop; framesPerSec = 30.0; break; | case ficFrameRate_30DropFrame: info.frameRate = AudioPlayHead::fps30drop; framesPerSec = 30.0; break; | ||||
case ficFrameRate_23976: info.frameRate = AudioPlayHead::fps24; framesPerSec = 24.0 * 1000.0 / 1001.0; break; | |||||
case ficFrameRate_23976: info.frameRate = AudioPlayHead::fps23976; framesPerSec = 24.0 * 1000.0 / 1001.0; break; | |||||
default: info.frameRate = AudioPlayHead::fpsUnknown; break; | default: info.frameRate = AudioPlayHead::fpsUnknown; break; | ||||
} | } | ||||
@@ -656,6 +656,7 @@ public: | |||||
switch (ti->smpteRate) | switch (ti->smpteRate) | ||||
{ | { | ||||
case vstSmpteRateFps239: rate = AudioPlayHead::fps23976; fps = 24.0 * 1000.0 / 1001.0; break; | |||||
case vstSmpteRateFps24: rate = AudioPlayHead::fps24; fps = 24.0; break; | case vstSmpteRateFps24: rate = AudioPlayHead::fps24; fps = 24.0; break; | ||||
case vstSmpteRateFps25: rate = AudioPlayHead::fps25; fps = 25.0; break; | case vstSmpteRateFps25: rate = AudioPlayHead::fps25; fps = 25.0; break; | ||||
case vstSmpteRateFps2997: rate = AudioPlayHead::fps2997; fps = 30.0 * 1000.0 / 1001.0; break; | case vstSmpteRateFps2997: rate = AudioPlayHead::fps2997; fps = 30.0 * 1000.0 / 1001.0; break; | ||||
@@ -666,7 +667,6 @@ public: | |||||
case vstSmpteRate16mmFilm: | case vstSmpteRate16mmFilm: | ||||
case vstSmpteRate35mmFilm: fps = 24.0; break; | case vstSmpteRate35mmFilm: fps = 24.0; break; | ||||
case vstSmpteRateFps239: fps = 24.0 * 1000.0 / 1001.0; break; | |||||
case vstSmpteRateFps249: fps = 25.0 * 1000.0 / 1001.0; break; | case vstSmpteRateFps249: fps = 25.0 * 1000.0 / 1001.0; break; | ||||
case vstSmpteRateFps599: fps = 60.0 * 1000.0 / 1001.0; break; | case vstSmpteRateFps599: fps = 60.0 * 1000.0 / 1001.0; break; | ||||
case vstSmpteRateFps60: fps = 60; break; | case vstSmpteRateFps60: fps = 60; break; | ||||
@@ -1669,7 +1669,14 @@ public: | |||||
{ | { | ||||
switch (processContext.frameRate.framesPerSecond) | switch (processContext.frameRate.framesPerSecond) | ||||
{ | { | ||||
case 24: info.frameRate = AudioPlayHead::fps24; break; | |||||
case 24: | |||||
{ | |||||
if ((processContext.frameRate.flags & Vst::FrameRate::kPullDownRate) != 0) | |||||
info.frameRate = AudioPlayHead::fps23976; | |||||
else | |||||
info.frameRate = AudioPlayHead::fps24; | |||||
} | |||||
break; | |||||
case 25: info.frameRate = AudioPlayHead::fps25; break; | case 25: info.frameRate = AudioPlayHead::fps25; break; | ||||
case 29: info.frameRate = AudioPlayHead::fps30drop; break; | case 29: info.frameRate = AudioPlayHead::fps30drop; break; | ||||
@@ -207,6 +207,7 @@ static void toProcessContext (Vst::ProcessContext& context, AudioPlayHead* playH | |||||
switch (position.frameRate) | switch (position.frameRate) | ||||
{ | { | ||||
case AudioPlayHead::fps23976: fr.framesPerSecond = 24; fr.flags = FrameRate::kPullDownRate; break; | |||||
case AudioPlayHead::fps24: fr.framesPerSecond = 24; fr.flags = 0; break; | case AudioPlayHead::fps24: fr.framesPerSecond = 24; fr.flags = 0; break; | ||||
case AudioPlayHead::fps25: fr.framesPerSecond = 25; fr.flags = 0; break; | case AudioPlayHead::fps25: fr.framesPerSecond = 25; fr.flags = 0; break; | ||||
case AudioPlayHead::fps2997: fr.framesPerSecond = 30; fr.flags = FrameRate::kPullDownRate; break; | case AudioPlayHead::fps2997: fr.framesPerSecond = 30; fr.flags = FrameRate::kPullDownRate; break; | ||||
@@ -1703,6 +1703,7 @@ private: | |||||
case AudioPlayHead::fps30: setHostTimeFrameRate (vstSmpteRateFps30, 30.0, position.timeInSeconds); break; | case AudioPlayHead::fps30: setHostTimeFrameRate (vstSmpteRateFps30, 30.0, position.timeInSeconds); break; | ||||
case AudioPlayHead::fps60: setHostTimeFrameRate (vstSmpteRateFps60, 60.0, position.timeInSeconds); break; | case AudioPlayHead::fps60: setHostTimeFrameRate (vstSmpteRateFps60, 60.0, position.timeInSeconds); break; | ||||
case AudioPlayHead::fps23976: setHostTimeFrameRateDrop (vstSmpteRateFps239, 24.0, position.timeInSeconds); break; | |||||
case AudioPlayHead::fps2997: setHostTimeFrameRateDrop (vstSmpteRateFps2997, 30.0, position.timeInSeconds); break; | case AudioPlayHead::fps2997: setHostTimeFrameRateDrop (vstSmpteRateFps2997, 30.0, position.timeInSeconds); break; | ||||
case AudioPlayHead::fps2997drop: setHostTimeFrameRateDrop (vstSmpteRateFps2997drop, 30.0, position.timeInSeconds); break; | case AudioPlayHead::fps2997drop: setHostTimeFrameRateDrop (vstSmpteRateFps2997drop, 30.0, position.timeInSeconds); break; | ||||
case AudioPlayHead::fps30drop: setHostTimeFrameRateDrop (vstSmpteRateFps30drop, 30.0, position.timeInSeconds); break; | case AudioPlayHead::fps30drop: setHostTimeFrameRateDrop (vstSmpteRateFps30drop, 30.0, position.timeInSeconds); break; | ||||