| 1841 | } |
| 1842 | |
| 1843 | static bool FrameRateChanged(QWidget *widget, const char *name, |
| 1844 | OBSData &settings) |
| 1845 | { |
| 1846 | auto w = qobject_cast<OBSFrameRatePropertyWidget *>(widget); |
| 1847 | if (!w) |
| 1848 | return false; |
| 1849 | |
| 1850 | auto variant = w->modeSelect->currentData(); |
| 1851 | if (!variant.canConvert<frame_rate_tag>()) |
| 1852 | return false; |
| 1853 | |
| 1854 | auto StopUpdating = [&](void *) { |
| 1855 | w->updating = false; |
| 1856 | }; |
| 1857 | unique_ptr<void, decltype(StopUpdating)> signalGuard( |
| 1858 | static_cast<void *>(w), StopUpdating); |
| 1859 | w->updating = true; |
| 1860 | |
| 1861 | if (!obs_data_has_user_value(settings, name)) |
| 1862 | obs_data_set_obj(settings, name, nullptr); |
| 1863 | |
| 1864 | unique_ptr<obs_data_item_t> obj{obs_data_item_byname(settings, name)}; |
| 1865 | auto obj_ptr = obj.get(); |
| 1866 | auto CheckObj = [&]() { |
| 1867 | if (!obj_ptr) |
| 1868 | obj.release(); |
| 1869 | }; |
| 1870 | |
| 1871 | const char *option = nullptr; |
| 1872 | obs_data_item_get_frames_per_second(obj.get(), nullptr, &option); |
| 1873 | |
| 1874 | media_frames_per_second fps{}; |
| 1875 | media_frames_per_second *valid_fps = nullptr; |
| 1876 | if (obs_data_item_get_frames_per_second(obj.get(), &fps, nullptr)) |
| 1877 | valid_fps = &fps; |
| 1878 | |
| 1879 | auto tag = variant.value<frame_rate_tag>(); |
| 1880 | switch (tag.type) { |
| 1881 | case frame_rate_tag::SIMPLE: |
| 1882 | if (!FrameRateChangedCommon(w, obj_ptr, valid_fps)) |
| 1883 | return false; |
| 1884 | break; |
| 1885 | |
| 1886 | case frame_rate_tag::RATIONAL: |
| 1887 | if (!FrameRateChangedRational(w, obj_ptr, valid_fps)) |
| 1888 | return false; |
| 1889 | break; |
| 1890 | |
| 1891 | case frame_rate_tag::USER: |
| 1892 | if (tag.val && option && strcmp(tag.val, option) == 0) |
| 1893 | return false; |
| 1894 | |
| 1895 | obs_data_item_set_frames_per_second(&obj_ptr, {}, tag.val); |
| 1896 | break; |
| 1897 | } |
| 1898 | |
| 1899 | UpdateFPSLabels(w); |
| 1900 | CheckObj(); |
no test coverage detected