Projects
Multimedia
obs-studio
Sign Up
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 131
View file
obs-studio.changes
Changed
@@ -1,4 +1,30 @@ ------------------------------------------------------------------- +Fri Dec 05 23:39:04 UTC 2025 - darix <packman@nordisch.org> + +- Update to version 32.0.3: + * libobs: Update version to 32.0.3 + * frontend: Remove crash handler earlier in shutdown + * frontend: Fix recursion during canvas removal causing crashes + * cmake: Fix order of frontend targets + * frontend: Adjust application shutdown logic + * libobs: Add devices_match to null monitor + * CI: Prepare more space for Flatpak jobs + * frontend: Rename scrollbar in Acri theme + * frontend: Rename scrollbar in Classic theme + * libobs: Monitoring deduplication for default devices + * libobs: Enable retrieval of macOS default audio output capture device + * libobs: Don't use removed sources + * rtmp-services: Add additional SharePlay.tv servers + * rtmp-services: Rename Dolby Millicast to Dolby OptiView Real-time + * rtmp-services: Change the server URL of AfreecaTV to SOOP Korea + * rtmp-services: Add SOOP Global + * libobs: Trigger monitoring deduplication when fader is at minimum + * libobs: Additional monitoring deduplication check with pulse + * libobs: Check tracks for monitoring deduplication + * rtmp-services: Remove defunct servers/services +- refresh 12328.patch + +------------------------------------------------------------------- Wed Oct 29 09:25:35 UTC 2025 - darix <packman@nordisch.org> - Add https://patch-diff.githubusercontent.com/raw/obsproject/obs-studio/pull/12328.patch
View file
obs-studio.spec
Changed
@@ -39,7 +39,7 @@ %endif Name: obs-studio -Version: 32.0.2 +Version: 32.0.3 Release: 0 Summary: A recording/broadcasting program Group: Productivity/Multimedia/Video/Editors and Convertors
View file
12328.patch
Changed
@@ -17,8 +17,8 @@ =================================================================== --- obs-studio.orig/frontend/cmake/os-freebsd.cmake +++ obs-studio/frontend/cmake/os-freebsd.cmake -@@ -3,7 +3,11 @@ target_sources( - PRIVATE utility/platform-x11.cpp utility/system-info-posix.cpp utility/CrashHandler_FreeBSD.cpp +@@ -7,7 +7,11 @@ target_sources( + utility/system-info-posix.cpp ) target_compile_definitions(obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}") -target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus procstat) @@ -34,7 +34,7 @@ =================================================================== --- obs-studio.orig/frontend/cmake/os-linux.cmake +++ obs-studio/frontend/cmake/os-linux.cmake -@@ -3,7 +3,11 @@ target_compile_definitions( +@@ -10,7 +10,11 @@ target_compile_definitions( obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}" $<$<BOOL:${ENABLE_PORTABLE_CONFIG}>:ENABLE_PORTABLE_CONFIG> )
View file
_service
Changed
@@ -1,7 +1,7 @@ <services> <service name="tar_scm" mode="manual"> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">32.0.2</param> + <param name="revision">32.0.3</param> <param name="url">https://github.com/obsproject/obs-studio.git</param> <param name="versionrewrite-pattern">(\.\d+)-(a-z.*)</param> <param name="versionrewrite-replacement">\1~\2</param>
View file
_servicedata
Changed
@@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/obsproject/obs-studio.git</param> - <param name="changesrevision">c025f210d36ada93c6b9ef2affd0f671b34c9775</param> + <param name="changesrevision">9a8470355ffcd38a797f06dca70cfcc8f7c89100</param> </service> </servicedata> \ No newline at end of file
View file
obs-studio-32.0.2.tar.xz/.github/workflows/build-project.yaml -> obs-studio-32.0.3.tar.xz/.github/workflows/build-project.yaml
Changed
@@ -251,7 +251,51 @@ container: image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.8 options: --privileged + volumes: + - /usr/local/lib/android:/to_clean/android + - /opt/hostedtoolcache/CodeQL:/to_clean/codeql + - /usr/local/.ghcup:/to_clean/ghcup + - /opt/hostedtoolcache/Python:/to_clean/python + - /usr/share/swift:/to_clean/swift + - /usr/share/dotnet:/to_clean/dotnet steps: + - name: Prepare build space + shell: bash + run: | + : Prepare build space + + echo ::group::Available storage + df -h + echo ::endgroup:: + + echo ::group::Remove Android stuff + rm -rf /to_clean/android/* + echo ::endgroup:: + + echo ::group::Remove CodeQL stuff + rm -rf /to_clean/codeql/* + echo ::endgroup:: + + echo ::group::Remove GHCup stuff + rm -rf /to_clean/ghcup/* + echo ::endgroup:: + + echo ::group::Remove Python stuff + rm -rf /to_clean/python/* + echo ::endgroup:: + + echo ::group::Remove Swift stuff + rm -rf /to_clean/swift/* + echo ::endgroup:: + + echo ::group::Remove .NET stuff + rm -rf /to_clean/dotnet/* + echo ::endgroup:: + + echo ::group::Available storage + df -h + echo ::endgroup:: + - uses: actions/checkout@v4 with: submodules: recursive
View file
obs-studio-32.0.2.tar.xz/.github/workflows/publish.yaml -> obs-studio-32.0.3.tar.xz/.github/workflows/publish.yaml
Changed
@@ -89,10 +89,54 @@ container: image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.8 options: --privileged + volumes: + - /usr/local/lib/android:/to_clean/android + - /opt/hostedtoolcache/CodeQL:/to_clean/codeql + - /usr/local/.ghcup:/to_clean/ghcup + - /opt/hostedtoolcache/Python:/to_clean/python + - /usr/share/swift:/to_clean/swift + - /usr/share/dotnet:/to_clean/dotnet strategy: matrix: branch: ${{ fromJSON(needs.check-tag.outputs.flatpakMatrix) }} steps: + - name: Prepare build space + shell: bash + run: | + : Prepare build space + + echo ::group::Available storage + df -h + echo ::endgroup:: + + echo ::group::Remove Android stuff + rm -rf /to_clean/android/* + echo ::endgroup:: + + echo ::group::Remove CodeQL stuff + rm -rf /to_clean/codeql/* + echo ::endgroup:: + + echo ::group::Remove GHCup stuff + rm -rf /to_clean/ghcup/* + echo ::endgroup:: + + echo ::group::Remove Python stuff + rm -rf /to_clean/python/* + echo ::endgroup:: + + echo ::group::Remove Swift stuff + rm -rf /to_clean/swift/* + echo ::endgroup:: + + echo ::group::Remove .NET stuff + rm -rf /to_clean/dotnet/* + echo ::endgroup:: + + echo ::group::Available storage + df -h + echo ::endgroup:: + - uses: actions/checkout@v4 with: submodules: recursive
View file
obs-studio-32.0.2.tar.xz/frontend/OBSApp.cpp -> obs-studio-32.0.3.tar.xz/frontend/OBSApp.cpp
Changed
@@ -42,9 +42,8 @@ #include <QFile> #endif -#ifdef _WIN32 #include <QSessionManager> -#else +#ifndef _WIN32 #include <QSocketNotifier> #endif @@ -78,6 +77,7 @@ #ifndef _WIN32 int OBSApp::sigintFd2; +int OBSApp::sigtermFd2; #endif // GPU hint exports for AMD/NVIDIA laptops @@ -868,6 +868,8 @@ profilerNameStore(store), appLaunchUUID_(QUuid::createUuid()) { + installNativeEventFilter(new OBS::NativeEventFilter); + /* fix float handling */ #if defined(Q_OS_UNIX) if (!setlocale(LC_NUMERIC, "C")) @@ -879,9 +881,14 @@ socketpair(AF_UNIX, SOCK_STREAM, 0, sigintFd); snInt = new QSocketNotifier(sigintFd1, QSocketNotifier::Read, this); connect(snInt, &QSocketNotifier::activated, this, &OBSApp::ProcessSigInt); -#else - connect(qApp, &QGuiApplication::commitDataRequest, this, &OBSApp::commitData); + + /* Handle SIGTERM */ + socketpair(AF_UNIX, SOCK_STREAM, 0, sigtermFd); + snTerm = new QSocketNotifier(sigtermFd1, QSocketNotifier::Read, this); + connect(snTerm, &QSocketNotifier::activated, this, &OBSApp::ProcessSigTerm); #endif + connect(qApp, &QGuiApplication::commitDataRequest, this, &OBSApp::commitData, Qt::DirectConnection); + if (multi) { crashHandler_ = std::make_unique<OBS::CrashHandler>(); } else { @@ -1229,10 +1236,24 @@ mainWindow = new OBSBasic(); mainWindow->setAttribute(Qt::WA_DeleteOnClose, true); - connect(mainWindow, &OBSBasic::destroyed, this, &OBSApp::quit); + + connect(QApplication::instance(), &QApplication::aboutToQuit, this, this() { + /* Ensure OBSMainWindow gets closed */ + if (mainWindow) { + mainWindow->close(); + delete mainWindow; + } + + if (libobs_initialized) { + applicationShutdown(); + } + }); mainWindow->OBSInit(); + connect(OBSBasic::Get(), &OBSBasic::mainWindowClosed, crashHandler_.get(), + &OBS::CrashHandler::applicationShutdownHandler); + connect(this, &QGuiApplication::applicationStateChanged, this(Qt::ApplicationState state) { ResetHotkeyState(state == Qt::ApplicationActive); }); ResetHotkeyState(applicationState() == Qt::ApplicationActive); @@ -1748,6 +1769,14 @@ char a = 1; send(sigintFd0, &a, sizeof(a), 0); } + +void OBSApp::SigTermSignalHandler(int s) +{ + UNUSED_PARAMETER(s); + + char a = 1; + send(sigtermFd0, &a, sizeof(a), 0); +} #endif void OBSApp::ProcessSigInt(void) @@ -1759,20 +1788,39 @@ recv(sigintFd1, &tmp, sizeof(tmp), 0); OBSBasic *main = OBSBasic::Get(); - if (main) + if (main) { + main->saveAll(); main->close(); + } +#endif +} + +void OBSApp::ProcessSigTerm(void) +{ +#ifndef _WIN32 + char tmp; + recv(sigtermFd1, &tmp, sizeof(tmp), 0); + + OBSBasic *main = OBSBasic::Get(); + if (main) { + main->saveAll(); + } + + quit(); #endif } -#ifdef _WIN32 void OBSApp::commitData(QSessionManager &manager) { - if (auto main = App()->GetMainWindow()) { - QMetaObject::invokeMethod(main, "close", Qt::QueuedConnection); - manager.cancel(); + OBSBasic *main = OBSBasic::Get(); + if (main) { + main->saveAll(); + + if (manager.allowsInteraction() && main->shouldPromptForClose()) { + manager.cancel(); + } } } -#endif void OBSApp::applicationShutdown() noexcept { @@ -1784,6 +1832,10 @@ delete snInt; close(sigintFd0); close(sigintFd1); + + delete snTerm; + close(sigtermFd0); + close(sigtermFd1); #endif #ifdef __APPLE__
View file
obs-studio-32.0.2.tar.xz/frontend/OBSApp.hpp -> obs-studio-32.0.3.tar.xz/frontend/OBSApp.hpp
Changed
@@ -18,6 +18,7 @@ #pragma once #include <utility/OBSTheme.hpp> +#include <utility/NativeEventFilter.hpp> #include <widgets/OBSMainWindow.hpp> #include <obs-frontend-api.h> @@ -25,6 +26,7 @@ #include <util/profiler.hpp> #include <util/util.hpp> +#include <QAbstractNativeEventFilter> #include <QApplication> #include <QPalette> #include <QPointer> @@ -61,6 +63,8 @@ class OBSApp : public QApplication { Q_OBJECT + friend class OBS::NativeEventFilter; + private: QUuid appLaunchUUID_; std::unique_ptr<OBS::CrashHandler> crashHandler_; @@ -117,12 +121,13 @@ #ifndef _WIN32 static int sigintFd2; QSocketNotifier *snInt = nullptr; -#else -private slots: - void commitData(QSessionManager &manager); + + static int sigtermFd2; + QSocketNotifier *snTerm = nullptr; #endif private slots: + void commitData(QSessionManager &manager); void addLogLine(int logLevel, const QString &message); void themeFileChanged(const QString &); void applicationShutdown() noexcept; @@ -212,6 +217,7 @@ inline void PopUITranslation() { translatorHooks.pop_front(); } #ifndef _WIN32 static void SigIntSignalHandler(int); + static void SigTermSignalHandler(int); #endif void loadAppModules(struct obs_module_failure_info &mfi); @@ -222,6 +228,7 @@ public slots: void Exec(VoidFunc func); void ProcessSigInt(); + void ProcessSigTerm(); signals: void logLineAdded(int logLevel, const QString &message);
View file
obs-studio-32.0.2.tar.xz/frontend/cmake/feature-idian-playground.cmake -> obs-studio-32.0.3.tar.xz/frontend/cmake/feature-idian-playground.cmake
Changed
@@ -3,7 +3,7 @@ if(ENABLE_IDIAN_PLAYGROUND) target_sources( obs-studio - PRIVATE forms/OBSIdianPlayground.ui dialogs/OBSIdianPlayground.hpp dialogs/OBSIdianPlayground.cpp + PRIVATE dialogs/OBSIdianPlayground.hpp dialogs/OBSIdianPlayground.cpp forms/OBSIdianPlayground.ui ) target_enable_feature(obs-studio "Idian Playground" ENABLE_IDIAN_PLAYGROUND) else()
View file
obs-studio-32.0.2.tar.xz/frontend/cmake/feature-macos-update.cmake -> obs-studio-32.0.3.tar.xz/frontend/cmake/feature-macos-update.cmake
Changed
@@ -9,16 +9,16 @@ target_sources( obs-studio PRIVATE + utility/WhatsNewBrowserInitThread.cpp + utility/WhatsNewBrowserInitThread.hpp + utility/WhatsNewInfoThread.cpp + utility/WhatsNewInfoThread.hpp utility/crypto-helpers-mac.mm utility/crypto-helpers.hpp utility/models/branches.hpp utility/models/whatsnew.hpp utility/update-helpers.cpp utility/update-helpers.hpp - utility/WhatsNewBrowserInitThread.cpp - utility/WhatsNewBrowserInitThread.hpp - utility/WhatsNewInfoThread.cpp - utility/WhatsNewInfoThread.hpp ) target_link_libraries(
View file
obs-studio-32.0.2.tar.xz/frontend/cmake/feature-whatsnew.cmake -> obs-studio-32.0.3.tar.xz/frontend/cmake/feature-whatsnew.cmake
Changed
@@ -20,15 +20,15 @@ target_sources( obs-studio PRIVATE + utility/WhatsNewBrowserInitThread.cpp + utility/WhatsNewBrowserInitThread.hpp + utility/WhatsNewInfoThread.cpp + utility/WhatsNewInfoThread.hpp utility/crypto-helpers-mbedtls.cpp utility/crypto-helpers.hpp utility/models/whatsnew.hpp utility/update-helpers.cpp utility/update-helpers.hpp - utility/WhatsNewBrowserInitThread.cpp - utility/WhatsNewBrowserInitThread.hpp - utility/WhatsNewInfoThread.cpp - utility/WhatsNewInfoThread.hpp ) endif()
View file
obs-studio-32.0.2.tar.xz/frontend/cmake/os-freebsd.cmake -> obs-studio-32.0.3.tar.xz/frontend/cmake/os-freebsd.cmake
Changed
@@ -1,6 +1,10 @@ target_sources( obs-studio - PRIVATE utility/platform-x11.cpp utility/system-info-posix.cpp utility/CrashHandler_FreeBSD.cpp + PRIVATE + utility/CrashHandler_FreeBSD.cpp + utility/NativeEventFilter.cpp + utility/platform-x11.cpp + utility/system-info-posix.cpp ) target_compile_definitions(obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}") target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus procstat)
View file
obs-studio-32.0.2.tar.xz/frontend/cmake/os-linux.cmake -> obs-studio-32.0.3.tar.xz/frontend/cmake/os-linux.cmake
Changed
@@ -1,4 +1,11 @@ -target_sources(obs-studio PRIVATE utility/platform-x11.cpp utility/system-info-posix.cpp utility/CrashHandler_Linux.cpp) +target_sources( + obs-studio + PRIVATE + utility/CrashHandler_Linux.cpp + utility/NativeEventFilter.cpp + utility/platform-x11.cpp + utility/system-info-posix.cpp +) target_compile_definitions( obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}" $<$<BOOL:${ENABLE_PORTABLE_CONFIG}>:ENABLE_PORTABLE_CONFIG>
View file
obs-studio-32.0.2.tar.xz/frontend/cmake/os-macos.cmake -> obs-studio-32.0.3.tar.xz/frontend/cmake/os-macos.cmake
Changed
@@ -7,6 +7,7 @@ dialogs/OBSPermissions.hpp forms/OBSPermissions.ui utility/CrashHandler_MacOS.mm + utility/NativeEventFilter.cpp utility/platform-osx.mm utility/system-info-macos.mm )
View file
obs-studio-32.0.2.tar.xz/frontend/cmake/os-windows.cmake -> obs-studio-32.0.3.tar.xz/frontend/cmake/os-windows.cmake
Changed
@@ -25,6 +25,11 @@ utility/AutoUpdateThread.cpp utility/AutoUpdateThread.hpp utility/CrashHandler_Windows.cpp + utility/NativeEventFilter_Windows.cpp + utility/WhatsNewBrowserInitThread.cpp + utility/WhatsNewBrowserInitThread.hpp + utility/WhatsNewInfoThread.cpp + utility/WhatsNewInfoThread.hpp utility/crypto-helpers-mbedtls.cpp utility/crypto-helpers.hpp utility/models/branches.hpp @@ -33,10 +38,6 @@ utility/system-info-windows.cpp utility/update-helpers.cpp utility/update-helpers.hpp - utility/WhatsNewBrowserInitThread.cpp - utility/WhatsNewBrowserInitThread.hpp - utility/WhatsNewInfoThread.cpp - utility/WhatsNewInfoThread.hpp utility/win-dll-blocklist.c )
View file
obs-studio-32.0.2.tar.xz/frontend/cmake/ui-models.cmake -> obs-studio-32.0.3.tar.xz/frontend/cmake/ui-models.cmake
Changed
@@ -1,1 +1,1 @@ -target_sources(obs-studio PRIVATE models/SceneCollection.cpp models/SceneCollection.hpp models/Rect.cpp models/Rect.hpp) +target_sources(obs-studio PRIVATE models/Rect.cpp models/Rect.hpp models/SceneCollection.cpp models/SceneCollection.hpp)
View file
obs-studio-32.0.2.tar.xz/frontend/cmake/ui-qt.cmake -> obs-studio-32.0.3.tar.xz/frontend/cmake/ui-qt.cmake
Changed
@@ -46,8 +46,8 @@ forms/OBSMissingFiles.ui forms/OBSRemux.ui forms/StatusBarWidget.ui - forms/obs.qrc forms/PluginManagerWindow.ui + forms/obs.qrc forms/source-toolbar/browser-source-toolbar.ui forms/source-toolbar/color-source-toolbar.ui forms/source-toolbar/device-select-toolbar.ui
View file
obs-studio-32.0.2.tar.xz/frontend/cmake/ui-utility.cmake -> obs-studio-32.0.3.tar.xz/frontend/cmake/ui-utility.cmake
Changed
@@ -3,14 +3,11 @@ PRIVATE utility/AdvancedOutput.cpp utility/AdvancedOutput.hpp - utility/audio-encoders.cpp - utility/audio-encoders.hpp utility/BaseLexer.hpp utility/BasicOutputHandler.cpp utility/BasicOutputHandler.hpp utility/CrashHandler.cpp utility/CrashHandler.hpp - utility/display-helpers.hpp utility/FFmpegCodec.cpp utility/FFmpegCodec.hpp utility/FFmpegFormat.cpp @@ -22,19 +19,15 @@ utility/GoLiveAPI_Network.hpp utility/GoLiveAPI_PostData.cpp utility/GoLiveAPI_PostData.hpp - utility/item-widget-helpers.cpp - utility/item-widget-helpers.hpp utility/MissingFilesModel.cpp utility/MissingFilesModel.hpp utility/MissingFilesPathItemDelegate.cpp utility/MissingFilesPathItemDelegate.hpp - utility/models/multitrack-video.hpp utility/MultitrackVideoError.cpp utility/MultitrackVideoError.hpp utility/MultitrackVideoOutput.cpp utility/MultitrackVideoOutput.hpp - utility/obf.c - utility/obf.h + utility/NativeEventFilter.hpp utility/OBSCanvas.cpp utility/OBSCanvas.hpp utility/OBSEventFilter.hpp @@ -44,7 +37,6 @@ utility/OBSThemeVariable.hpp utility/OBSTranslator.cpp utility/OBSTranslator.hpp - utility/platform.hpp utility/QuickTransition.cpp utility/QuickTransition.hpp utility/RemoteTextThread.cpp @@ -64,10 +56,19 @@ utility/SimpleOutput.hpp utility/StartMultiTrackVideoStreamingGuard.hpp utility/SurfaceEventFilter.hpp - utility/system-info.hpp - utility/undo_stack.cpp - utility/undo_stack.hpp utility/VCamConfig.hpp utility/VolumeMeterTimer.cpp utility/VolumeMeterTimer.hpp + utility/audio-encoders.cpp + utility/audio-encoders.hpp + utility/display-helpers.hpp + utility/item-widget-helpers.cpp + utility/item-widget-helpers.hpp + utility/models/multitrack-video.hpp + utility/obf.c + utility/obf.h + utility/platform.hpp + utility/system-info.hpp + utility/undo_stack.cpp + utility/undo_stack.hpp )
View file
obs-studio-32.0.2.tar.xz/frontend/data/locale/en-US.ini -> obs-studio-32.0.3.tar.xz/frontend/data/locale/en-US.ini
Changed
@@ -397,8 +397,8 @@ ConfirmBWTest.Text="You have OBS configured in bandwidth test mode. This mode allows for network testing without your channel going live. Once you are done testing, you will need to disable it in order for viewers to be able to see your stream.\n\nDo you want to continue?" # confirm exit dialog box -ConfirmExit.Title="Exit OBS?" -ConfirmExit.Text="OBS is currently active. All streams/recordings will be shut down. Are you sure you wish to exit?" +ConfirmExit.Title="Active Outputs" +ConfirmExit.Text="OBS is still currently active. All streams/recordings will be shut down." # confirm delete dialog box ConfirmRemove.Title="Confirm Remove"
View file
obs-studio-32.0.2.tar.xz/frontend/data/themes/Yami_Acri.ovt -> obs-studio-32.0.3.tar.xz/frontend/data/themes/Yami_Acri.ovt
Changed
@@ -54,7 +54,7 @@ --tab_border_focus: var(--input_border_focus); --tab_border_selected: var(--primary); - --scrollbar: var(--grey5); + --scrollbar_handle: var(--grey5); --scrollbar_hover: var(--primary_light); --scrollbar_down: var(--grey5); --scrollbar_border: var(--grey5);
View file
obs-studio-32.0.2.tar.xz/frontend/data/themes/Yami_Classic.ovt -> obs-studio-32.0.3.tar.xz/frontend/data/themes/Yami_Classic.ovt
Changed
@@ -72,7 +72,7 @@ --tab_border_focus: var(--grey1); --tab_border_selected: var(--primary); - --scrollbar: var(--grey4); + --scrollbar_handle: var(--grey4); --scrollbar_hover: var(--grey3); --scrollbar_down: var(--grey8); --scrollbar_border: var(--grey2);
View file
obs-studio-32.0.2.tar.xz/frontend/docks/OBSDock.cpp -> obs-studio-32.0.3.tar.xz/frontend/docks/OBSDock.cpp
Changed
@@ -28,7 +28,7 @@ }; bool warned = config_get_bool(App()->GetUserConfig(), "General", "WarnedAboutClosingDocks"); - if (!OBSBasic::Get()->Closing() && !warned) { + if (!OBSBasic::Get()->isClosing() && !warned) { QMetaObject::invokeMethod(App(), "Exec", Qt::QueuedConnection, Q_ARG(VoidFunc, msgBox)); }
View file
obs-studio-32.0.2.tar.xz/frontend/obs-main.cpp -> obs-studio-32.0.3.tar.xz/frontend/obs-main.cpp
Changed
@@ -858,13 +858,22 @@ #ifndef _WIN32 signal(SIGPIPE, SIG_IGN); - struct sigaction sig_handler; + struct sigaction sigint_handler; - sig_handler.sa_handler = OBSApp::SigIntSignalHandler; - sigemptyset(&sig_handler.sa_mask); - sig_handler.sa_flags = 0; + sigint_handler.sa_handler = OBSApp::SigIntSignalHandler; + sigemptyset(&sigint_handler.sa_mask); + sigint_handler.sa_flags = 0; - sigaction(SIGINT, &sig_handler, NULL); + sigaction(SIGINT, &sigint_handler, NULL); + + struct sigaction sigterm_handler; + + sigterm_handler.sa_handler = OBSApp::SigTermSignalHandler; + sigemptyset(&sigterm_handler.sa_mask); + sigterm_handler.sa_flags = 0; + + sigaction(SIGTERM, &sigterm_handler, NULL); + sigaction(SIGHUP, &sigterm_handler, NULL); /* Block SIGPIPE in all threads, this can happen if a thread calls write on a closed pipe. */ @@ -890,6 +899,14 @@ load_debug_privilege(); base_set_crash_handler(main_crash_handler, nullptr); + /* Shutdown priority value is a range from 0 - 4FF with higher values getting first priority. + * 000 - 0FF and 400 - 4FF are reserved system ranges. + * Processes start at shutdown level 0x280 by default. + * We set the main OBS application to a higher priority to ensure it tries to close before + * any subprocesses such as CEF. + */ + SetProcessShutdownParameters(0x300, SHUTDOWN_NORETRY); + const HMODULE hRtwq = LoadLibrary(L"RTWorkQ.dll"); if (hRtwq) { typedef HRESULT(STDAPICALLTYPE * PFN_RtwqStartup)();
View file
obs-studio-32.0.3.tar.xz/frontend/utility/NativeEventFilter.cpp
Added
@@ -0,0 +1,27 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include "NativeEventFilter.hpp" + +namespace OBS { + +bool NativeEventFilter::nativeEventFilter(const QByteArray &, void *, qintptr *) +{ + // Stub file for operating systems that do not need nativeEventFilter + return false; +} +} // namespace OBS
View file
obs-studio-32.0.3.tar.xz/frontend/utility/NativeEventFilter.hpp
Added
@@ -0,0 +1,29 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#pragma once + +#include <QAbstractNativeEventFilter> + +namespace OBS { + +class NativeEventFilter : public QAbstractNativeEventFilter { + +public: + bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result); +}; +} // namespace OBS
View file
obs-studio-32.0.3.tar.xz/frontend/utility/NativeEventFilter_Windows.cpp
Added
@@ -0,0 +1,66 @@ +/****************************************************************************** + Copyright (C) 2025 by Taylor Giampaolo <warchamp7@obsproject.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +******************************************************************************/ + +#include "NativeEventFilter.hpp" + +#include <widgets/OBSBasic.hpp> + +#include <sstream> +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +namespace OBS { + +bool NativeEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) +{ + if (eventType == "windows_generic_MSG") { + MSG *msg = static_cast<MSG *>(message); + + OBSBasic *main = OBSBasic::Get(); + if (!main) { + return false; + } + + switch (msg->message) { + case WM_QUERYENDSESSION: + main->saveAll(); + if (msg->lParam == ENDSESSION_CRITICAL) { + break; + } + + if (main->shouldPromptForClose()) { + if (result) { + *result = FALSE; + } + QTimer::singleShot(1, main, &OBSBasic::close); + return true; + } + + return false; + case WM_ENDSESSION: + if (msg->wParam == TRUE) { + // Session is ending, start closing the main window now with no checks or prompts. + main->closeWindow(); + } + + return true; + } + } + + return false; +} +} // namespace OBS
View file
obs-studio-32.0.2.tar.xz/frontend/widgets/OBSBasic.cpp -> obs-studio-32.0.3.tar.xz/frontend/widgets/OBSBasic.cpp
Changed
@@ -558,6 +558,7 @@ connect(ui->scenes, &SceneTree::scenesReordered, () { OBSProjector::UpdateMultiviewProjectors(); }); connect(App(), &OBSApp::StyleChanged, this, this() { OnEvent(OBS_FRONTEND_EVENT_THEME_CHANGED); }); + connect(App(), &OBSApp::aboutToQuit, this, &OBSBasic::closeWindow); QActionGroup *actionGroup = new QActionGroup(this); actionGroup->addAction(ui->actionSceneListMode); @@ -1372,8 +1373,8 @@ OBSBasic::~OBSBasic() { - if (!handledShutdown) { - applicationShutdown(); + if (!isClosing()) { + closeWindow(); } } @@ -1457,19 +1458,6 @@ * expect or want it to. */ QApplication::sendPostedEvents(nullptr); - config_set_int(App()->GetAppConfig(), "General", "LastVersion", LIBOBS_API_VER); - config_save_safe(App()->GetAppConfig(), "tmp", nullptr); - - config_set_bool(App()->GetUserConfig(), "BasicWindow", "PreviewEnabled", previewEnabled); - config_set_bool(App()->GetUserConfig(), "BasicWindow", "AlwaysOnTop", ui->actionAlwaysOnTop->isChecked()); - config_set_bool(App()->GetUserConfig(), "BasicWindow", "SceneDuplicationMode", sceneDuplicationMode); - config_set_bool(App()->GetUserConfig(), "BasicWindow", "SwapScenesMode", swapScenesMode); - config_set_bool(App()->GetUserConfig(), "BasicWindow", "EditPropertiesMode", editPropertiesMode); - config_set_bool(App()->GetUserConfig(), "BasicWindow", "PreviewProgramMode", IsPreviewProgramMode()); - config_set_bool(App()->GetUserConfig(), "BasicWindow", "DocksLocked", ui->lockDocks->isChecked()); - config_set_bool(App()->GetUserConfig(), "BasicWindow", "SideDocks", ui->sideDocks->isChecked()); - config_save_safe(App()->GetUserConfig(), "tmp", nullptr); - #ifdef BROWSER_AVAILABLE DestroyPanelCookieManager(); delete cef; @@ -1658,127 +1646,61 @@ return obs_reset_audio2(&ai); } -void OBSBasic::closeEvent(QCloseEvent *event) +void OBSBasic::close() { - /* Wait for multitrack video stream to start/finish processing in the background */ - if (setupStreamingGuard.valid() && - setupStreamingGuard.wait_for(std::chrono::seconds{0}) != std::future_status::ready) { - QTimer::singleShot(1000, this, &OBSBasic::close); - event->ignore(); + if (isClosePromptOpen() || isClosing()) { return; } - /* Do not close window if inside of a temporary event loop because we - * could be inside of an Auth::LoadUI call. Keep trying once per - * second until we've exit any known sub-loops. */ - if (os_atomic_load_long(&insideEventLoop) != 0) { - QTimer::singleShot(1000, this, &OBSBasic::close); - event->ignore(); - return; - } + OBSMainWindow::close(); +} -#ifdef YOUTUBE_ENABLED - /* Also don't close the window if the youtube stream check is active */ - if (youtubeStreamCheckThread) { - QTimer::singleShot(1000, this, &OBSBasic::close); - event->ignore(); +void OBSBasic::closeEvent(QCloseEvent *event) +{ + if (isClosePromptOpen() || isClosing()) { return; } -#endif - if (isVisible()) + if (isVisible()) { config_set_string(App()->GetUserConfig(), "BasicWindow", "geometry", saveGeometry().toBase64().constData()); + } - bool confirmOnExit = config_get_bool(App()->GetUserConfig(), "General", "ConfirmOnExit"); - - if (confirmOnExit && outputHandler && outputHandler->Active() && !clearingFailed) { - SetShowing(true); - - QMessageBox::StandardButton button = - OBSMessageBox::question(this, QTStr("ConfirmExit.Title"), QTStr("ConfirmExit.Text")); + if (!isReadyToClose()) { + event->ignore(); - if (button == QMessageBox::No) { - event->ignore(); - restart = false; - return; - } + QTimer::singleShot(1000, this, &OBSBasic::close); + return; } if (remux && !remux->close()) { event->ignore(); restart = false; - return; - } - QWidget::closeEvent(event); - if (!event->isAccepted()) return; - - blog(LOG_INFO, SHUTDOWN_SEPARATOR); - - closing = true; - - /* While closing, a resize event to OBSQTDisplay could be triggered. - * The graphics thread on macOS dispatches a lambda function to be - * executed asynchronously in the main thread. However, the display is - * sometimes deleted before the lambda function is actually executed. - * To avoid such a case, destroy displays earlier than others such as - * deleting browser docks. */ - ui->preview->DestroyDisplay(); - if (program) - program->DestroyDisplay(); - - if (outputHandler->VirtualCamActive()) - outputHandler->StopVirtualCam(); - - if (introCheckThread) - introCheckThread->wait(); - if (whatsNewInitThread) - whatsNewInitThread->wait(); - if (updateCheckThread) - updateCheckThread->wait(); - if (logUploadThread) - logUploadThread->wait(); - if (devicePropertiesThread && devicePropertiesThread->isRunning()) { - devicePropertiesThread->wait(); - devicePropertiesThread.reset(); } - QApplication::sendPostedEvents(nullptr); - - signalHandlers.clear(); - - Auth::Save(); - SaveProjectNow(); - auth.reset(); - - delete extraBrowsers; - - config_set_string(App()->GetUserConfig(), "BasicWindow", "DockState", saveState().toBase64().constData()); - -#ifdef BROWSER_AVAILABLE - if (cef) - SaveExtraBrowserDocks(); - - ClearExtraBrowserDocks(); -#endif - - OnEvent(OBS_FRONTEND_EVENT_SCRIPTING_SHUTDOWN); + if (shouldPromptForClose()) { + event->ignore(); + restart = false; - disableSaving++; + if (!isClosePromptOpen()) { + bool shouldClose = promptToClose(); - /* Clear all scene data (dialogs, widgets, widget sub-items, scenes, - * sources, etc) so that all references are released before shutdown */ - ClearSceneData(); + if (shouldClose) { + closeWindow(); + } + } - OnEvent(OBS_FRONTEND_EVENT_EXIT); + return; + } - // Destroys the frontend API so plugins can't continue calling it - obs_frontend_set_callbacks_internal(nullptr); - api = nullptr; + QWidget::closeEvent(event); + if (!event->isAccepted()) { + return; + } - QMetaObject::invokeMethod(App(), "quit", Qt::QueuedConnection); + closeWindow(); } bool OBSBasic::nativeEvent(const QByteArray &, void *message, qintptr *) @@ -1899,6 +1821,162 @@ return activeConfiguration; }
View file
obs-studio-32.0.2.tar.xz/frontend/widgets/OBSBasic.hpp -> obs-studio-32.0.3.tar.xz/frontend/widgets/OBSBasic.hpp
Changed
@@ -259,7 +259,8 @@ std::vector<OBSSignal> signalHandlers; bool loaded = false; - bool closing = false; + bool isClosing_ = false; + bool isClosePromptOpen_ = false; bool handledShutdown = false; // TODO: Remove, orphaned variable @@ -300,6 +301,7 @@ void LoadProject(); public slots: + void close(); void UpdatePatronJson(const QString &text, const QString &error); void UpdateEditMenu(); void applicationShutdown() noexcept; @@ -325,13 +327,23 @@ void SetDisplayAffinity(QWindow *window); - inline bool Closing() { return closing; } + void saveAll(); + bool shouldPromptForClose(); + inline bool isClosing() { return isClosing_; } + inline bool isClosePromptOpen() { return isClosePromptOpen_; } + void closeWindow(); protected: + bool isReadyToClose(); + bool promptToClose(); + virtual void closeEvent(QCloseEvent *event) override; virtual bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result) override; virtual void changeEvent(QEvent *event) override; +signals: + void mainWindowClosed(); + /* ------------------------------------- * MARK: - OAuth * ------------------------------------- @@ -1123,6 +1135,7 @@ std::vector<OBS::Canvas> canvases; static void CanvasRemoved(void *data, calldata_t *params); + void ClearCanvases(); public: const std::vector<OBS::Canvas> &GetCanvases() const noexcept { return canvases; }
View file
obs-studio-32.0.2.tar.xz/frontend/widgets/OBSBasic_Canvases.cpp -> obs-studio-32.0.3.tar.xz/frontend/widgets/OBSBasic_Canvases.cpp
Changed
@@ -33,15 +33,30 @@ bool OBSBasic::RemoveCanvas(OBSCanvas canvas) { + bool removed = false; if (!canvas) - return false; + return removed; auto canvas_it = std::find(std::begin(canvases), std::end(canvases), canvas); if (canvas_it != std::end(canvases)) { + // Move canvas to a temporary object to delay removal of the canvas and calls to its signal handlers + // until after erase() completes. This is to avoid issues with recursion coming from the + // CanvasRemoved() signal handler. + OBS::Canvas tmp = std::move(*canvas_it); canvases.erase(canvas_it); - OnEvent(OBS_FRONTEND_EVENT_CANVAS_REMOVED); - return true; + removed = true; } - return false; + if (removed) + OnEvent(OBS_FRONTEND_EVENT_CANVAS_REMOVED); + + return removed; +} + +void OBSBasic::ClearCanvases() +{ + // Delete canvases one-by-one to ensure OBS_FRONTEND_EVENT_CANVAS_REMOVED is sent for each + while (!canvases.empty()) { + RemoveCanvas(OBSCanvas(canvases.back())); + } }
View file
obs-studio-32.0.2.tar.xz/frontend/widgets/OBSBasic_SceneCollections.cpp -> obs-studio-32.0.3.tar.xz/frontend/widgets/OBSBasic_SceneCollections.cpp
Changed
@@ -1539,7 +1539,7 @@ obs_canvas_enum_scenes(canvas, cb, nullptr); } - canvases.clear(); + ClearCanvases(); OnEvent(OBS_FRONTEND_EVENT_SCENE_COLLECTION_CLEANUP);
View file
obs-studio-32.0.2.tar.xz/frontend/widgets/OBSBasic_Updater.cpp -> obs-studio-32.0.3.tar.xz/frontend/widgets/OBSBasic_Updater.cpp
Changed
@@ -63,8 +63,9 @@ void OBSBasic::ReceivedIntroJson(const QString &text) { #ifdef WHATSNEW_ENABLED - if (closing) + if (isClosing()) { return; + } WhatsNewList items; try { @@ -153,8 +154,9 @@ void OBSBasic::ShowWhatsNew(const QString &url) { #ifdef BROWSER_AVAILABLE - if (closing) + if (isClosing()) { return; + } if (obsWhatsNew) { obsWhatsNew->close();
View file
obs-studio-32.0.2.tar.xz/libobs/audio-monitoring/null/null-audio-monitoring.c -> obs-studio-32.0.3.tar.xz/libobs/audio-monitoring/null/null-audio-monitoring.c
Changed
@@ -26,3 +26,10 @@ { UNUSED_PARAMETER(monitor); } + +bool devices_match(const char *id1, const char *id2) +{ + UNUSED_PARAMETER(id1); + UNUSED_PARAMETER(id2); + return false; +}
View file
obs-studio-32.0.2.tar.xz/libobs/audio-monitoring/osx/coreaudio-enum-devices.c -> obs-studio-32.0.3.tar.xz/libobs/audio-monitoring/osx/coreaudio-enum-devices.c
Changed
@@ -176,3 +176,51 @@ return match; } + +static inline bool device_is_input(const char *device) +{ + return astrstri(device, "soundflower") == NULL && astrstri(device, "wavtap") == NULL && + astrstri(device, "soundsiphon") == NULL && astrstri(device, "ishowu") == NULL && + astrstri(device, "blackhole") == NULL && astrstri(device, "loopback") == NULL && + astrstri(device, "groundcontrol") == NULL && astrstri(device, "vbcable") == NULL; +} + +static bool find_loopback_cb(void *param, const char *name, const char *id) +{ + UNUSED_PARAMETER(name); + char **p_id = param; + + if (!device_is_input(id)) { + *p_id = bstrdup(id); + return false; + } + return true; +} + +void get_desktop_default_id(char **p_id) +{ + if (*p_id) + return; + + AudioObjectPropertyAddress addr = {kAudioHardwarePropertyDefaultSystemOutputDevice, + kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMain}; + + AudioDeviceID id = 0; + UInt32 size = sizeof(id); + OSStatus stat = AudioObjectGetPropertyData(kAudioObjectSystemObject, &addr, 0, NULL, &size, &id); + + if (success(stat, "AudioObjectGetPropertyData")) { + /* Try system default output first */ + obs_enum_audio_monitoring_device(alloc_default_id, p_id, id, false); + + /* If not a loopback, try to find a virtual (non-input) device instead */ + if (*p_id && device_is_input(*p_id)) { + bfree(*p_id); + *p_id = NULL; + enum_audio_devices(find_loopback_cb, p_id, false); + } + } + + if (!*p_id) + *p_id = bzalloc(1); +}
View file
obs-studio-32.0.2.tar.xz/libobs/obs-audio.c -> obs-studio-32.0.3.tar.xz/libobs/obs-audio.c
Changed
@@ -48,30 +48,52 @@ !(source->info.output_flags & OBS_SOURCE_COMPOSITE); } +extern bool devices_match(const char *id1, const char *id2); + static inline void check_audio_output_source_is_monitoring_device(obs_source_t *s, void *p) { struct obs_core_audio *audio = p; if (!audio->monitoring_device_name) return; - if (strcmp(s->info.id, "wasapi_output_capture") == 0 || strcmp(s->info.id, "pulse_output_capture") == 0 || - strcmp(s->info.id, "coreaudio_output_capture") == 0) { - const char *dev_id = NULL; - obs_data_t *settings = obs_source_get_settings(s); - if (settings) { - dev_id = obs_data_get_string(settings, "device_id"); - if (strcmp(dev_id, audio->monitoring_device_id) == 0) { - audio->prevent_monitoring_duplication = true; - audio->monitoring_duplicating_source = s; - if (!audio->monitoring_duplication_prevented_on_prev_tick) - blog(LOG_INFO, - "Device for 'Audio Output Capture' source is also used for audio" - " monitoring:\nDeduplication logic is being applied to all monitored" - " sources.\n"); - } - obs_data_release(settings); - } + const char *id = s->info.id; + if (strcmp(id, "wasapi_output_capture") != 0 && strcmp(id, "pulse_output_capture") != 0 && + strcmp(id, "coreaudio_output_capture") != 0) + return; + + obs_data_t *settings = obs_source_get_settings(s); + if (!settings) + return; + + const char *device_id = obs_data_get_string(settings, "device_id"); + const char *mon_id = audio->monitoring_device_id; + bool id_match = false; + +#ifdef __APPLE__ + extern void get_desktop_default_id(char **p_id); + if (device_id && strcmp(device_id, "default") == 0) { + char *def_id = NULL; + get_desktop_default_id(&def_id); + id_match = devices_match(def_id, mon_id); + if (def_id) + bfree(def_id); + } else { + id_match = devices_match(device_id, mon_id); + } +#else + id_match = devices_match(device_id, mon_id); +#endif + + if (id_match) { + audio->prevent_monitoring_duplication = true; + audio->monitoring_duplicating_source = s; + if (!audio->monitoring_duplication_prevented_on_prev_tick) + blog(LOG_INFO, "Device for 'Audio Output Capture' source is also used for audio" + " monitoring:\nDeduplication logic is being applied to all monitored" + " sources.\n"); } + + obs_data_release(settings); } /* @@ -84,6 +106,9 @@ */ static void push_audio_tree2(obs_source_t *parent, obs_source_t *source, void *p) { + if (obs_source_removed(source)) + return; + struct obs_core_audio *audio = p; size_t idx = da_find(audio->render_order, &source, 0); @@ -546,7 +571,8 @@ if (!audio->monitoring_duplicating_source) return false; - bool output_capture_unmuted = !audio->monitoring_duplicating_source->user_muted; + bool fader_muted = close_float(audio->monitoring_duplicating_source->volume, 0.0f, 0.0001f); + bool output_capture_unmuted = !audio->monitoring_duplicating_source->user_muted && !fader_muted; if (audio->prevent_monitoring_duplication && output_capture_unmuted) { if (source->monitoring_type == OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT && @@ -557,13 +583,22 @@ return false; } -static inline void clear_audio_output_buf(obs_source_t *source) +static inline void clear_audio_output_buf(obs_source_t *source, struct obs_core_audio *audio) { + if (!audio->monitoring_duplicating_source) + return; + + uint32_t aoc_mixers = audio->monitoring_duplicating_source->audio_mixers; + uint32_t source_mixers = source->audio_mixers; + for (size_t mix = 0; mix < MAX_AUDIO_MIXES; mix++) { - for (size_t ch = 0; ch < MAX_AUDIO_CHANNELS; ch++) { - float *buf = source->audio_output_bufmixch; - if (buf) - memset(buf, 0, AUDIO_OUTPUT_FRAMES * sizeof(float)); + uint32_t mix_and_val = (1 << mix); + if ((aoc_mixers & mix_and_val) && (source_mixers & mix_and_val)) { + for (size_t ch = 0; ch < MAX_AUDIO_CHANNELS; ch++) { + float *buf = source->audio_output_bufmixch; + if (buf) + memset(buf, 0, AUDIO_OUTPUT_FRAMES * sizeof(float)); + } } } } @@ -614,6 +649,8 @@ continue; if (!obs_source_active(source)) continue; + if (obs_source_removed(source)) + continue; /* first, add top - level sources as root_nodes */ if (obs->video.mixes.arrayj->mix_audio) @@ -636,7 +673,9 @@ source = data->first_audio_source; while (source) { - push_audio_tree(NULL, source, audio); + if (!obs_source_removed(source)) { + push_audio_tree(NULL, source, audio); + } source = (struct obs_source *)source->next_audio_source; } @@ -648,7 +687,7 @@ obs_source_t *source = audio->render_order.arrayi; obs_source_audio_render(source, mixers, channels, sample_rate, audio_size); if (should_silence_monitored_source(source, audio)) - clear_audio_output_buf(source); + clear_audio_output_buf(source, audio); /* if a source has gone backward in time and we can no * longer buffer, drop some or all of its audio */
View file
obs-studio-32.0.2.tar.xz/libobs/obs-config.h -> obs-studio-32.0.3.tar.xz/libobs/obs-config.h
Changed
@@ -41,7 +41,7 @@ * * Reset to zero each major or minor version */ -#define LIBOBS_API_PATCH_VER 2 +#define LIBOBS_API_PATCH_VER 3 #define MAKE_SEMANTIC_VERSION(major, minor, patch) ((major << 24) | (minor << 16) | patch)
View file
obs-studio-32.0.2.tar.xz/libobs/obs-video.c -> obs-studio-32.0.3.tar.xz/libobs/obs-video.c
Changed
@@ -64,7 +64,7 @@ source = data->sources; while (source) { - obs_source_t *s = obs_source_get_ref(source); + obs_source_t *s = obs_source_removed(source) ? NULL : obs_source_get_ref(source); if (s) da_push_back(data->sources_to_tick, &s); source = (struct obs_source *)source->context.hh_uuid.next; @@ -77,9 +77,11 @@ for (size_t i = 0; i < data->sources_to_tick.num; i++) { obs_source_t *s = data->sources_to_tick.arrayi; - const uint64_t start = source_profiler_source_tick_start(); - obs_source_video_tick(s, seconds); - source_profiler_source_tick_end(s, start); + if (!obs_source_removed(s)) { + const uint64_t start = source_profiler_source_tick_start(); + obs_source_video_tick(s, seconds); + source_profiler_source_tick_end(s, start); + } obs_source_release(s); }
View file
obs-studio-32.0.2.tar.xz/plugins/rtmp-services/data/package.json -> obs-studio-32.0.3.tar.xz/plugins/rtmp-services/data/package.json
Changed
@@ -1,11 +1,11 @@ { "$schema": "schema/package-schema.json", "url": "https://obsproject.com/obs2_update/rtmp-services/v5", - "version": 276, + "version": 281, "files": { "name": "services.json", - "version": 276 + "version": 281 } }
View file
obs-studio-32.0.2.tar.xz/plugins/rtmp-services/data/services.json -> obs-studio-32.0.3.tar.xz/plugins/rtmp-services/data/services.json
Changed
@@ -855,35 +855,36 @@ }, { - "name": "AfreecaTV", + "name": "SOOP Korea", "alt_names": + "AfreecaTV", "아프리카TV", "Afreeca.TV" , "servers": { "name": "Asia : Korea", - "url": "rtmp://rtmpmanager-freecat.afreeca.tv/app" + "url": "rtmp://stream.sooplive.co.kr/app/" }, { "name": "North America : US East", - "url": "rtmp://rtmp-esu.afreecatv.com/app" + "url": "rtmp://rtmp-esu.sooplive.co.kr/app/" }, { "name": "North America : US West", - "url": "rtmp://rtmp-wsu.afreecatv.com/app" + "url": "rtmp://rtmp-wsu.sooplive.co.kr/app/" }, { "name": "South America : Brazil", - "url": "rtmp://rtmp-brz.afreecatv.com/app" + "url": "rtmp://rtmp-brz.sooplive.co.kr/app/" }, { "name": "Europe : UK", - "url": "rtmp://rtmp-uk.afreecatv.com/app" + "url": "rtmp://rtmp-uk.sooplive.co.kr/app/" }, { "name": "Asia : Singapore", - "url": "rtmp://rtmp-sgp.afreecatv.com/app" + "url": "rtmp://rtmp-sgp.sooplive.co.kr/app/" } , "recommended": { @@ -970,18 +971,6 @@ }, { - "name": "Livestream", - "servers": - { - "name": "Primary", - "url": "rtmp://rtmpin.livestreamingest.com/rtmpin" - } - , - "supported video codecs": - "h264" - - }, - { "name": "Uscreen", "servers": { @@ -2631,8 +2620,56 @@ "stream_key_link": "https://playstudio.shareplay.tv/stream/settings", "servers": { + "name": "Default (Auto Detect)", + "url": "rtmp://stream.shareplay.tv" + }, + { "name": "Atlanta, Georgia, USA", "url": "rtmp://live-us-atl-stream.shareplay.tv" + }, + { + "name": "Chicago, Illinois, USA", + "url": "rtmp://live-us-ord-stream.shareplay.tv" + }, + { + "name": "Dallas, Texas, USA", + "url": "rtmp://live-us-dfw-stream.shareplay.tv" + }, + { + "name": "Los Angeles, California, USA", + "url": "rtmp://live-us-lax-stream.shareplay.tv" + }, + { + "name": "Miami, Florida, USA", + "url": "rtmp://live-us-mia-stream.shareplay.tv" + }, + { + "name": "Seattle, Washington, USA", + "url": "rtmp://live-us-sea-stream.shareplay.tv" + }, + { + "name": "Washington D.C., USA", + "url": "rtmp://live-us-iad-stream.shareplay.tv" + }, + { + "name": "Toronto, Canada", + "url": "rtmp://live-ca-yyz-stream.shareplay.tv" + }, + { + "name": "Paris, France", + "url": "rtmp://live-fr-par-stream.shareplay.tv" + }, + { + "name": "London, UK", + "url": "rtmp://live-uk-lhr-stream.shareplay.tv" + }, + { + "name": "Milan, Italy", + "url": "rtmp://live-it-mil-stream.shareplay.tv" + }, + { + "name": "Sydney, Australia", + "url": "rtmp://live-au-syd-stream.shareplay.tv" } , "supported video codecs": @@ -3349,13 +3386,16 @@ } }, { - "name": "Dolby Millicast", + "name": "Dolby OptiView Real-time", + "alt_names": + "Dolby Millicast" + , "common": false, - "more_info_link": "https://docs.optiview.dolby.com/millicast/using-obs/", + "more_info_link": "https://optiview.dolby.com/docs/millicast/using-obs/", "stream_key_link": "https://streaming.dolby.io", "multitrack_video_configuration_url": "https://director.millicast.com/api/multitrackvideo/configuration", "multitrack_video_name": "Enhanced Broadcasting", - "multitrack_video_learn_more_link": "https://docs.optiview.dolby.com/millicast/obs-enhanced-broadcasting-multitrack-video/", + "multitrack_video_learn_more_link": "https://optiview.dolby.com/docs/millicast/obs-enhanced-broadcasting-multitrack-video/", "servers": { "name": "Global (RTMPS)", @@ -3478,6 +3518,81 @@ "keyint": 1, "max video bitrate": 6000 } + }, + { + "name": "SOOP Global", + "common": false, + "more_info_link": "https://sooplive.helpshift.com/hc/en/3-soop/faq/20", + "stream_key_link": "https://www.sooplive.com/dashboard", + "servers": + { + "name": "Default", + "url": "rtmp://global-stream.sooplive.com/app" + } + , + "protocol": "RTMP", + "supported video codecs": + "h264" + , + "supported audio codecs": + "aac" + , + "recommended": { + "keyint": 1, + "profile": "main", + "bframes": 0, + "supported resolutions": + "1920x1080", + "1280x720", + "960x540", + "640x360" + , + "bitrate matrix": + { + "res": "640x360", + "fps": 30, + "max bitrate": 500 + }, + { + "res": "640x360", + "fps": 60, + "max bitrate": 1000 + }, + { + "res": "960x540", + "fps": 30, + "max bitrate": 2000 + }, + { + "res": "960x540", + "fps": 60, + "max bitrate": 2000 + }, + { + "res": "1280x720", + "fps": 30, + "max bitrate": 4000 + }, + {
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.