| @@ -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; | ||||