Skip to content

Commit 0e45306

Browse files
committed
UI: Add multiviewAudioMeter
1 parent 5b2e2a9 commit 0e45306

File tree

121 files changed

+6542
-1012
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

121 files changed

+6542
-1012
lines changed

.clang-format

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ ReferenceAlignment: Right
181181
RemoveSemicolon: false
182182
RequiresClausePosition: WithPreceding
183183
RequiresExpressionIndentation: OuterScope
184-
SeparateDefinitionBlocks: Always
184+
SeparateDefinitionBlocks: Leave
185185
ShortNamespaceLines: 1
186186
SortIncludes: false
187187
#SortUsingDeclarations: LexicographicNumeric

.github/actions/windows-patches/action.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ runs:
3333
run: |
3434
# Download OBS release
3535
. ${env:GITHUB_ACTION_PATH}\Invoke-External.ps1
36-
Invoke-External gh release download "${{ inputs.tagName }}" -p "*-Windows.zip"
37-
Expand-Archive -Path "*-Windows.zip" -DestinationPath "${{ github.workspace }}/build"
36+
Invoke-External gh release download "${{ inputs.tagName }}" -p "OBS-Studio-${{ inputs.tagName }}-Windows.zip"
37+
Invoke-External gh attestation verify "OBS-Studio-${{ inputs.tagName }}-Windows.zip" --owner obsproject
38+
Expand-Archive -Path "OBS-Studio-${{ inputs.tagName }}-Windows.zip" -DestinationPath "${{ github.workspace }}/build"
3839
3940
- name: Setup bouf
4041
shell: pwsh

.github/scripts/utils.zsh/setup_ubuntu

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ mkdir -p ${_target} && pushd ${_target}
6262
XZ_OPT=-T0 tar --strip-components 1 -xJf ../${_filename} && log_status "${deps_label} extracted."
6363
popd
6464

65+
log_group 'Installing obs-studio build dependencies from apt...'
66+
6567
local suffix
6668
if [[ ${CPUTYPE} != ${target##*-} ]] {
6769
local -A arch_mappings=(

.github/workflows/build-project.yaml

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,10 @@ jobs:
170170

171171
ubuntu-build:
172172
name: Ubuntu 🐧
173-
runs-on: ubuntu-22.04
173+
strategy:
174+
matrix:
175+
os: [ubuntu-22.04, ubuntu-24.04]
176+
runs-on: ${{ matrix.os }}
174177
needs: check-event
175178
defaults:
176179
run:
@@ -185,9 +188,9 @@ jobs:
185188
id: ccache-cache
186189
with:
187190
path: ${{ github.workspace }}/.ccache
188-
key: ${{ runner.os }}-ccache-x86_64-${{ needs.check-event.outputs.config }}
191+
key: ${{ runner.os }}-${{ matrix.os }}-ccache-x86_64-${{ needs.check-event.outputs.config }}
189192
restore-keys: |
190-
${{ runner.os }}-ccache-x86_64-
193+
${{ runner.os }}-${{ matrix.os }}-ccache-x86_64-
191194
192195
- name: Build OBS Studio 🧱
193196
uses: ./.github/actions/build-obs
@@ -214,27 +217,27 @@ jobs:
214217
- name: Upload Source Tarball 🗜️
215218
uses: actions/upload-artifact@v4
216219
with:
217-
name: obs-studio-ubuntu-22.04-sources-${{ needs.check-event.outputs.commitHash }}
220+
name: obs-studio-${{ matrix.os }}-sources-${{ needs.check-event.outputs.commitHash }}
218221
path: ${{ github.workspace }}/build_ubuntu/obs-studio-*-sources.*
219222

220223
- name: Upload Artifacts 📡
221224
uses: actions/upload-artifact@v4
222225
with:
223-
name: obs-studio-ubuntu-22.04-x86_64-${{ needs.check-event.outputs.commitHash }}
226+
name: obs-studio-${{ matrix.os }}-x86_64-${{ needs.check-event.outputs.commitHash }}
224227
path: ${{ github.workspace }}/build_ubuntu/obs-studio-*-x86_64-ubuntu-gnu.*
225228

226229
- name: Upload Debug Symbol Artifacts 🪲
227230
uses: actions/upload-artifact@v4
228231
if: ${{ fromJSON(needs.check-event.outputs.package) }}
229232
with:
230-
name: obs-studio-ubuntu-22.04-x86_64-${{ needs.check-event.outputs.commitHash }}-dbgsym
233+
name: obs-studio-${{ matrix.os }}-x86_64-${{ needs.check-event.outputs.commitHash }}-dbgsym
231234
path: ${{ github.workspace }}/build_ubuntu/obs-studio-*-x86_64-ubuntu-gnu-dbgsym.ddeb
232235

233236
- uses: actions/cache/save@v4
234237
if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true'
235238
with:
236239
path: ${{ github.workspace }}/.ccache
237-
key: ${{ runner.os }}-ccache-x86_64-${{ needs.check-event.outputs.config }}
240+
key: ${{ runner.os }}-${{ matrix.os }}-ccache-x86_64-${{ needs.check-event.outputs.config }}
238241

239242
flatpak-build:
240243
name: Flatpak 📦

.github/workflows/push.yaml

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,13 @@ jobs:
207207

208208
sign-windows-build:
209209
name: Windows Signing ✍️
210-
uses: obsproject/obs-studio/.github/workflows/sign-windows.yaml@d7bf65a80b40bec6446dcb4a2f03629fb74cc3f9
210+
uses: obsproject/obs-studio/.github/workflows/sign-windows.yaml@b5b457d7b059397b70f6e3dd09b65e172ad734c3
211211
if: github.repository_owner == 'obsproject' && github.ref_type == 'tag'
212212
needs: build-project
213213
permissions:
214214
contents: 'read'
215215
id-token: 'write'
216+
attestations: 'write'
216217
secrets: inherit
217218

218219
create-release:
@@ -262,9 +263,11 @@ jobs:
262263
macos_arm64_dsym_artifact_name="obs-studio-macos-arm64-${commit_hash}-dSYMs"
263264
macos_intel_artifact_name="obs-studio-macos-x86_64-${commit_hash}"
264265
macos_intel_dsym_artifact_name="obs-studio-macos-x86_64-${commit_hash}-dSYMs"
265-
ubuntu_x86_64_artifact_name="obs-studio-ubuntu-22.04-x86_64-${commit_hash}"
266-
ubuntu_x86_64_debug_name="obs-studio-ubuntu-22.04-x86_64-${commit_hash}-dbgsym"
267-
ubuntu_sources_name="obs-studio-ubuntu-22.04-sources-${commit_hash}"
266+
ubuntu_2204_x86_64_artifact_name="obs-studio-ubuntu-22.04-x86_64-${commit_hash}"
267+
ubuntu_2204_x86_64_debug_name="obs-studio-ubuntu-22.04-x86_64-${commit_hash}-dbgsym"
268+
ubuntu_2404_x86_64_artifact_name="obs-studio-ubuntu-24.04-x86_64-${commit_hash}"
269+
ubuntu_2404_x86_64_debug_name="obs-studio-ubuntu-24.04-x86_64-${commit_hash}-dbgsym"
270+
ubuntu_2404_sources_name="obs-studio-ubuntu-24.04-sources-${commit_hash}"
268271
windows_artifact_name="obs-studio-windows-x64-${{ steps.check.outputs.version }}-signed"
269272
windows_installer_name="obs-studio-windows-x64-${{ steps.check.outputs.version }}-installer"
270273
windows_debug_name="obs-studio-windows-x64-${{ steps.check.outputs.version }}-pdbs"
@@ -278,11 +281,15 @@ jobs:
278281
"${root_dir}"/OBS-Studio-${{ steps.check.outputs.version }}-macOS-Intel.dmg
279282
mv -v "${macos_intel_dsym_artifact_name}/"obs-studio-*-macos-intel-dSYMs.tar.xz \
280283
"${root_dir}"/OBS-Studio-${{ steps.check.outputs.version }}-macOS-Intel-dSYMs.tar.xz
281-
mv -v "${ubuntu_x86_64_artifact_name}/"obs-studio-*-x86_64-linux-gnu.deb \
282-
"${root_dir}"/OBS-Studio-${{ steps.check.outputs.version }}-Ubuntu-x86_64.deb
283-
mv -v "${ubuntu_x86_64_debug_name}/"obs-studio-*-x86_64-linux-gnu-dbgsym.ddeb \
284-
"${root_dir}"/OBS-Studio-${{ steps.check.outputs.version }}-Ubuntu-x86_64-dbsym.ddeb
285-
mv -v "${ubuntu_sources_name}/"obs-studio-*-sources.tar.gz \
284+
mv -v "${ubuntu_2204_x86_64_artifact_name}/"obs-studio-*-x86_64-linux-gnu.deb \
285+
"${root_dir}"/OBS-Studio-${{ steps.check.outputs.version }}-Ubuntu-22.04-x86_64.deb
286+
mv -v "${ubuntu_2204_x86_64_debug_name}/"obs-studio-*-x86_64-linux-gnu-dbgsym.ddeb \
287+
"${root_dir}"/OBS-Studio-${{ steps.check.outputs.version }}-Ubuntu-22.04-x86_64-dbsym.ddeb
288+
mv -v "${ubuntu_2404_x86_64_artifact_name}/"obs-studio-*-x86_64-linux-gnu.deb \
289+
"${root_dir}"/OBS-Studio-${{ steps.check.outputs.version }}-Ubuntu-24.04-x86_64.deb
290+
mv -v "${ubuntu_2404_x86_64_debug_name}/"obs-studio-*-x86_64-linux-gnu-dbgsym.ddeb \
291+
"${root_dir}"/OBS-Studio-${{ steps.check.outputs.version }}-Ubuntu-24.04-x86_64-dbsym.ddeb
292+
mv -v "${ubuntu_2404_sources_name}/"obs-studio-*-sources.tar.gz \
286293
"${root_dir}"/OBS-Studio-${{ steps.check.outputs.version }}-Sources.tar.gz
287294
mv -v "${windows_installer_name}/"OBS-Studio-*.exe \
288295
"${root_dir}"/OBS-Studio-${{ steps.check.outputs.version }}-Windows-Installer.exe

.github/workflows/sign-windows.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ jobs:
5252
version: ${{ github.ref_name }}
5353
channel: ${{ steps.setup.outputs.channel }}
5454

55+
- name: Generate artifact attestation
56+
uses: actions/attest-build-provenance@v1
57+
with:
58+
subject-path: ${{ github.workspace }}/output/*-x64.zip
59+
5560
- name: Upload Signed Build
5661
uses: actions/upload-artifact@v4
5762
with:

UI/absolute-slider.cpp

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#include "absolute-slider.hpp"
2+
3+
AbsoluteSlider::AbsoluteSlider(QWidget *parent) : SliderIgnoreScroll(parent)
4+
{
5+
installEventFilter(this);
6+
setMouseTracking(true);
7+
}
8+
9+
AbsoluteSlider::AbsoluteSlider(Qt::Orientation orientation, QWidget *parent)
10+
: SliderIgnoreScroll(orientation, parent)
11+
{
12+
installEventFilter(this);
13+
setMouseTracking(true);
14+
}
15+
16+
void AbsoluteSlider::mousePressEvent(QMouseEvent *event)
17+
{
18+
dragging = (event->buttons() & Qt::LeftButton ||
19+
event->buttons() & Qt::MiddleButton);
20+
21+
if (dragging) {
22+
setSliderDown(true);
23+
setValue(posToRangeValue(event));
24+
emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
25+
}
26+
27+
event->accept();
28+
}
29+
30+
void AbsoluteSlider::mouseReleaseEvent(QMouseEvent *event)
31+
{
32+
dragging = false;
33+
setSliderDown(false);
34+
event->accept();
35+
}
36+
37+
void AbsoluteSlider::mouseMoveEvent(QMouseEvent *event)
38+
{
39+
int val = posToRangeValue(event);
40+
41+
if (val > maximum())
42+
val = maximum();
43+
else if (val < minimum())
44+
val = minimum();
45+
46+
emit absoluteSliderHovered(val);
47+
48+
if (dragging) {
49+
setValue(posToRangeValue(event));
50+
emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
51+
}
52+
53+
QSlider::mouseMoveEvent(event);
54+
event->accept();
55+
}
56+
57+
bool AbsoluteSlider::eventFilter(QObject *obj, QEvent *event)
58+
{
59+
if (event->type() == QEvent::KeyPress) {
60+
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
61+
62+
if (keyEvent->key() == Qt::Key_Up ||
63+
keyEvent->key() == Qt::Key_Down) {
64+
return true;
65+
}
66+
}
67+
68+
if (event->type() == QEvent::Wheel)
69+
return true;
70+
71+
return QSlider::eventFilter(obj, event);
72+
}
73+
74+
int AbsoluteSlider::posToRangeValue(QMouseEvent *event)
75+
{
76+
QStyleOptionSlider opt;
77+
initStyleOption(&opt);
78+
79+
int pos;
80+
int sliderMin;
81+
int sliderMax;
82+
int handleLength;
83+
84+
const QRect groove = style()->subControlRect(
85+
QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this);
86+
const QRect handle = style()->subControlRect(
87+
QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
88+
89+
if (orientation() == Qt::Horizontal) {
90+
pos = event->pos().x();
91+
handleLength = handle.width();
92+
sliderMin = groove.left() + (handleLength / 2);
93+
sliderMax = groove.right() - (handleLength / 2) + 1;
94+
} else {
95+
pos = event->pos().y();
96+
handleLength = handle.height();
97+
sliderMin = groove.top() + (handleLength / 2);
98+
sliderMax = groove.bottom() - (handleLength / 2) + 1;
99+
}
100+
101+
int sliderValue = style()->sliderValueFromPosition(
102+
minimum(), maximum(), pos - sliderMin, sliderMax - sliderMin,
103+
opt.upsideDown);
104+
105+
return sliderValue;
106+
}

UI/absolute-slider.hpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
#include <QMouseEvent>
4+
#include "slider-ignorewheel.hpp"
5+
6+
class AbsoluteSlider : public SliderIgnoreScroll {
7+
Q_OBJECT
8+
9+
public:
10+
AbsoluteSlider(QWidget *parent = nullptr);
11+
AbsoluteSlider(Qt::Orientation orientation, QWidget *parent = nullptr);
12+
13+
signals:
14+
void absoluteSliderHovered(int value);
15+
16+
protected:
17+
virtual void mouseMoveEvent(QMouseEvent *event) override;
18+
virtual void mousePressEvent(QMouseEvent *event) override;
19+
virtual void mouseReleaseEvent(QMouseEvent *event) override;
20+
virtual bool eventFilter(QObject *obj, QEvent *event) override;
21+
22+
int posToRangeValue(QMouseEvent *event);
23+
24+
private:
25+
bool dragging = false;
26+
};

UI/api-interface.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,23 @@ struct OBSStudioAPI : obs_frontend_callbacks {
337337
}
338338
}
339339

340+
bool obs_frontend_recording_add_chapter(const char *name) override
341+
{
342+
if (!os_atomic_load_bool(&recording_active) ||
343+
os_atomic_load_bool(&recording_paused))
344+
return false;
345+
346+
proc_handler_t *ph = obs_output_get_proc_handler(
347+
main->outputHandler->fileOutput);
348+
349+
calldata cd;
350+
calldata_init(&cd);
351+
calldata_set_string(&cd, "chapter_name", name);
352+
bool result = proc_handler_call(ph, "add_chapter", &cd);
353+
calldata_free(&cd);
354+
return result;
355+
}
356+
340357
void obs_frontend_replay_buffer_start(void) override
341358
{
342359
QMetaObject::invokeMethod(main, "StartReplayBuffer");

UI/auth-twitch.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ class BrowserDock;
1313
class TwitchAuth : public OAuthStreamKey {
1414
Q_OBJECT
1515

16-
friend class TwitchLogin;
17-
1816
bool uiLoaded = false;
1917

2018
std::string name;

0 commit comments

Comments
 (0)