Compare commits

...

No commits in common. "master" and "legacy" have entirely different histories.

352 changed files with 27831 additions and 10258 deletions

View File

@ -1,296 +0,0 @@
{
"projectName": "Soundux",
"projectOwner": "Soundux",
"repoType": "github",
"repoHost": "https://github.com",
"files": [
"README.md",
"i18n/LISEZMOI.md",
"i18n/ПРОЧТИМЕНЯ.md"
],
"imageSize": 50,
"commit": true,
"commitConvention": "none",
"contributors": [
{
"login": "Curve",
"name": "Noah",
"avatar_url": "https://avatars.githubusercontent.com/u/37805707?v=4",
"profile": "https://github.com/Curve",
"contributions": [
"bug",
"business",
"code",
"design",
"ideas",
"infra",
"maintenance",
"platform",
"projectManagement",
"question",
"review",
"test"
]
},
{
"login": "D3SOX",
"name": "Nico",
"avatar_url": "https://avatars.githubusercontent.com/u/24937357?v=4",
"profile": "https://github.com/D3SOX",
"contributions": [
"bug",
"business",
"code",
"design",
"ideas",
"infra",
"maintenance",
"platform",
"projectManagement",
"question",
"review",
"test",
"translation",
"a11y"
]
},
{
"login": "MrKingMichael",
"name": "Michael",
"avatar_url": "https://avatars.githubusercontent.com/u/30067605?v=4",
"profile": "https://github.com/MrKingMichael",
"contributions": [
"bug",
"ideas",
"translation",
"test"
]
},
{
"login": "BrandonKMLee",
"name": "BrandonKMLee",
"avatar_url": "https://avatars.githubusercontent.com/u/58927531?v=4",
"profile": "https://github.com/BrandonKMLee",
"contributions": [
"ideas"
]
},
{
"login": "Toadfield",
"name": "Toadfield",
"avatar_url": "https://avatars.githubusercontent.com/u/68649672?v=4",
"profile": "https://github.com/Toadfield",
"contributions": [
"ideas",
"bug"
]
},
{
"login": "fubka",
"name": "fubka",
"avatar_url": "https://avatars.githubusercontent.com/u/44064746?v=4",
"profile": "https://github.com/fubka",
"contributions": [
"bug"
]
},
{
"login": "TheOriginalTripleD",
"name": "TheOriginalTripleD",
"avatar_url": "https://avatars.githubusercontent.com/u/6907054?v=4",
"profile": "https://github.com/TheOriginalTripleD",
"contributions": [
"research"
]
},
{
"login": "UltraBlackLinux",
"name": "UltraBlackLinux",
"avatar_url": "https://avatars.githubusercontent.com/u/62404294?v=4",
"profile": "https://github.com/UltraBlackLinux",
"contributions": [
"bug"
]
},
{
"login": "bendem",
"name": "bendem",
"avatar_url": "https://avatars.githubusercontent.com/u/2681677?v=4",
"profile": "https://bendem.be/",
"contributions": [
"bug"
]
},
{
"login": "edgarogh",
"name": "Edgar Onghena",
"avatar_url": "https://avatars.githubusercontent.com/u/46636609?v=4",
"profile": "https://edgar.bzh/",
"contributions": [
"bug",
"research"
]
},
{
"login": "moggesmith10",
"name": "moggesmith10",
"avatar_url": "https://avatars.githubusercontent.com/u/33375517?v=4",
"profile": "https://github.com/moggesmith10",
"contributions": [
"ideas"
]
},
{
"login": "bilelmoussaoui",
"name": "Bilal Elmoussaoui",
"avatar_url": "https://avatars.githubusercontent.com/u/7660997?v=4",
"profile": "https://belmoussaoui.com/",
"contributions": [
"platform"
]
},
{
"login": "thomasfinstad",
"name": "Thomas Finstad Larsen",
"avatar_url": "https://avatars.githubusercontent.com/u/5358752?v=4",
"profile": "https://github.com/thomasfinstad",
"contributions": [
"ideas"
]
},
{
"login": "AMTitan",
"name": "Arthur Melton",
"avatar_url": "https://avatars.githubusercontent.com/u/29708070?v=4",
"profile": "http://arthurmelton.me",
"contributions": [
"ideas"
]
},
{
"login": "serkan-maker",
"name": "Serkan ÖNDER",
"avatar_url": "https://avatars.githubusercontent.com/u/63740626?v=4",
"profile": "https://github.com/serkan-maker",
"contributions": [
"translation"
]
},
{
"login": "pizzadude",
"name": "PizzaDude",
"avatar_url": "https://avatars.githubusercontent.com/u/1454420?v=4",
"profile": "https://github.com/pizzadude",
"contributions": [
"bug",
"research"
]
},
{
"login": "Kylianalex",
"name": "Kylianalex",
"avatar_url": "https://avatars.githubusercontent.com/u/66625058?v=4",
"profile": "https://github.com/Kylianalex",
"contributions": [
"bug"
]
},
{
"login": "gregersn",
"name": "Greger",
"avatar_url": "https://avatars.githubusercontent.com/u/1364443?v=4",
"profile": "http://gregerstoltnilsen.net/",
"contributions": [
"bug"
]
},
{
"login": "rivenirvana",
"name": "Arvin Verain",
"avatar_url": "https://avatars.githubusercontent.com/u/43519644?v=4",
"profile": "https://github.com/rivenirvana",
"contributions": [
"platform"
]
},
{
"login": "EinfachEinAlex",
"name": "EinfachEinAlex",
"avatar_url": "https://avatars.githubusercontent.com/u/20642291?v=4",
"profile": "http://einfacheinalex.eu/",
"contributions": [
"code",
"research",
"test"
]
},
{
"login": "MeblIkea",
"name": "MeblIkea",
"avatar_url": "https://avatars.githubusercontent.com/u/69876322?v=4",
"profile": "https://discord.gg/ubmTQnuM3Z",
"contributions": [
"translation"
]
},
{
"login": "NathanBnm",
"name": "Nathan Bonnemains",
"avatar_url": "https://avatars.githubusercontent.com/u/45366162?v=4",
"profile": "https://nathanbonnemains.squill.fr/",
"contributions": [
"translation"
]
},
{
"login": "lucasvbeek",
"name": "Lucas van Beek",
"avatar_url": "https://avatars.githubusercontent.com/u/29404838?v=4",
"profile": "https://github.com/lucasvbeek",
"contributions": [
"translation"
]
},
{
"login": "underhood",
"name": "Timotej S.",
"avatar_url": "https://avatars.githubusercontent.com/u/6674623?v=4",
"profile": "https://github.com/underhood",
"contributions": [
"bug",
"test"
]
},
{
"login": "3JlOy-PYCCKUi",
"name": "3JlOy_PYCCKUi",
"avatar_url": "https://avatars.githubusercontent.com/u/46464602?v=4",
"profile": "https://github.com/3JlOy-PYCCKUi",
"contributions": [
"translation"
]
},
{
"login": "FuRyQC",
"name": "FuRyQC",
"avatar_url": "https://avatars.githubusercontent.com/u/91005051?v=4",
"profile": "https://github.com/FuRyQC",
"contributions": [
"translation"
]
},
{
"login": "moralrecordings",
"name": "Scott Percival",
"avatar_url": "https://avatars.githubusercontent.com/u/16875700?v=4",
"profile": "https://moral.net.au",
"contributions": [
"bug",
"test",
"code"
]
}
],
"contributorsPerLine": 2,
"skipCi": true
}

View File

@ -1,119 +0,0 @@
---
Language: Cpp
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: true
AfterControlStatement: true
AfterEnum: true
AfterFunction: true
AfterNamespace: true
AfterObjCDeclaration: true
AfterStruct: true
AfterUnion: false
AfterExternBlock: true
BeforeCatch: true
BeforeElse: true
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Custom
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 120
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
IndentCaseLabels: false
IndentGotoLabels: true
IndentPPDirectives: None
IndentWidth: 4
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: All
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 1000
PointerAlignment: Right
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
Standard: Latest
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
UseCRLF: false
UseTab: Never
...

View File

@ -1,55 +0,0 @@
Checks: "*,\
-google-runtime-int,\
-google-explicit-constructor,\
-llvm-header-guard,\
-llvmlibc-*,\
-readability-magic-numbers,\
-cppcoreguidelines-avoid-magic-numbers,\
-cppcoreguidelines-pro-bounds-constant-array-index,\
-cppcoreguidelines-pro-bounds-pointer-arithmetic,\
-cppcoreguidelines-pro-type-reinterpret-cast,\
-cppcoreguidelines-no-malloc,\
-cppcoreguidelines-owning-memory,\
-cppcoreguidelines-macro-usage,\
-cppcoreguidelines-pro-type-vararg,\
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,\
-fuchsia-overloaded-operator,\
-fuchsia-default-arguments,\
-fuchsia-multiple-inheritance,\
-fuchsia-default-arguments-calls,\
-fuchsia-trailing-return,\
-modernize-use-trailing-return-type,\
-misc-definitions-in-headers,\
-cert-err58-cpp,\
-clang-diagnostic-padded,\
-modernize-concat-nested-namespaces,\
-altera-struct-pack-align,\
-modernize-use-nodiscard,\
-misc-non-private-member-variables-in-classes,\
-cppcoreguidelines-pro-type-member-init,\
-fuchsia-statically-constructed-objects,\
-cppcoreguidelines-avoid-non-const-global-variables,\
-readability-function-cognitive-complexity,\
-modernize-use-emplace,\
-cppcoreguidelines-interfaces-global-init,\
-modernize-loop-convert,\
-modernize-avoid-c-arrays,\
-cppcoreguidelines-avoid-c-arrays,\
-cert-env33-c,\
-abseil-*,\
-fuchsia-default-arguments-declarations,\
-readability-redundant-access-specifiers,\
-readability-convert-member-functions-to-static,\
-readability-implicit-bool-conversion,\
-bugprone-inaccurate-erase,\
-readability-uppercase-literal-suffix,\
-hicpp*,\
-readability-braces-around-statements,\
-google-readability-braces-around-statements,\
-cppcoreguidelines-non-private-member-variables-in-classes,\
-cppcoreguidelines-pro-type-union-access,\
-readability-static-accessed-through-instance,\
-cppcoreguidelines-special-member-functions,\
-readability-isolate-declaration,\
-google-default-arguments,\
-altera-*"

4
.github/FUNDING.yml vendored
View File

@ -1 +1,3 @@
ko_fi: soundux
# These are supported funding model platforms
custom: paypal.me/d3sox

31
.github/ISSUE_TEMPLATE/bug_report.md vendored Executable file
View File

@ -0,0 +1,31 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. Arch Linux]
- Version [e.g. 0.2-alpha]
**Additional context**
Add any other context about the problem here.

View File

@ -1,73 +0,0 @@
name: Bug Report
description: Create a report to help us improve Soundux
labels: ["bug"]
body:
- type: textarea
attributes:
label: ✍️ Bug Description
description: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
attributes:
label: 🔁 Steps to reproduce
description: Steps to reproduce the behavior.
validations:
required: true
- type: textarea
attributes:
label: 🖥️ Console Output
description: Everything that was printed to the console up until the problem occured. For more information see [Debugging](https://github.com/Soundux/Soundux/wiki/Debugging)
render: ""
validations:
required: true
- type: textarea
attributes:
label: ❔ Expected behaviour
description: A clear and concise description of what you expected to happen.
validations:
required: false
- type: textarea
attributes:
label: 👀 Screenshots
description: If applicable, add screenshots to help explain your problem.
validations:
required: false
- type: dropdown
attributes:
label: 🖥️ Operating System
description: The operating system the problem occured on.
options:
- Linux
- Windows 11
- Windows 10
- Windows 8.1
validations:
required: true
- type: input
attributes:
label: 🖥️ Distribution
description: "If you're using linux or a special windows version please state it here"
validations:
required: false
- type: checkboxes
attributes:
label: ✅ I confirm that...
description: Please confirm these things by clicking the checkboxes
options:
- label: I have collected all the required information and read all the comments in this document
required: true
- label: I searched for an existing bug report for this issue
required: true
- label: the problem does occur with the reproduction steps I provided
required: true
- label: what I described is indeed a problem
required: true

View File

@ -1,5 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: Discord
url: https://discord.gg/4HwSGN4Ec2
about: Join our Discord

5
.github/ISSUE_TEMPLATE/feature_request.md vendored Normal file → Executable file
View File

@ -2,7 +2,7 @@
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
labels: ''
assignees: ''
---
@ -18,6 +18,3 @@ A clear and concise description of any alternative solutions or features you've
**Additional context**
Add any other context or screenshots about the feature request here.
**Desktop (please complete the following information):**
- Environment: [Universal/Windows Installer/Portable or Linux Flathub/Snap/AUR/DEB/RPM/COPR/self-compiled]

View File

@ -1,27 +0,0 @@
<!--- Provide a general summary of your changes in the Title above -->
## Description
<!--- Describe your changes in detail -->
## Motivation and Context
<!--- Why is this change required? What problem does it solve? -->
<!--- If it fixes an open issue, please link to the issue here. -->
## How Has This Been Tested?
<!--- Please describe in detail how you tested your changes. -->
<!--- Include details of your testing environment, the tests you ran to -->
<!--- see how your change affects other areas of the code, etc. -->
## Screenshots (if appropriate):
## Types of Changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [ ] Bug fix (non-breaking change that fixes an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
- [ ] I followed the [Contributing Guidelines](https://github.com/Soundux/Soundux/blob/master/CONTRIBUTING.md#code) (including code style) of this project.
- [ ] My change requires a change to the documentation.

View File

@ -1,30 +0,0 @@
on:
push:
branches: [master]
paths-ignore:
- "**/README.md"
- "**/compile_windows.yml"
- "**/compile_linux.yml"
- "**/.all-contributorsrc"
- "**/upload_full_src.yml"
- "**/windows_debug.yml"
- "**/upload_binaries_to_draft.yml"
pull_request:
branches: [master]
name: Build Flatpak
jobs:
flatpak-builder:
runs-on: ubuntu-20.04
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-3.38
options: --privileged
steps:
- uses: actions/checkout@v2.3.4
with:
submodules: true
- uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v4
with:
cache-key: flatpak-builder-${{ github.sha }}
bundle: "soundux.flatpak"
manifest-path: "deployment/flatpak/io.github.Soundux.yml"

View File

@ -1,46 +0,0 @@
on:
push:
branches: [master]
paths-ignore:
- "**/README.md"
- "**/compile_windows.yml"
- "**/build_flatpak.yml"
- "**/.all-contributorsrc"
- "**/upload_full_src.yml"
- "**/windows_debug.yml"
- "**/upload_binaries_to_draft.yml"
pull_request:
branches: [master]
name: Build on Linux
jobs:
build-linux:
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
language: ["cpp"]
steps:
- name: Checkout
uses: actions/checkout@v2.3.4
with:
submodules: recursive
- name: Add PipeWire PPA
run: "sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream"
- name: Install build dependencies
run: "sudo apt-get update && sudo apt-get install git build-essential cmake libx11-dev libpipewire-0.3-dev libxi-dev libwnck-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev libpulse-dev"
- name: Compile
run: "mkdir build && cd build && cmake .. && cmake --build . --config Release"
- name: Build debian package
run: "cd build && make install DESTDIR=../deployment/debian/soundux && cd ../deployment/debian && dpkg-deb --build soundux"
- name: Upload deb package
uses: actions/upload-artifact@v2.2.4
with:
name: Deb package
path: deployment/debian/soundux.deb

View File

@ -1,70 +0,0 @@
on:
push:
branches: [master]
paths-ignore:
- "**/README.md"
- "**/compile_linux.yml"
- "**/build_flatpak.yml"
- "**/.all-contributorsrc"
- "**/upload_full_src.yml"
- "**/windows_debug.yml"
- "**/upload_binaries_to_draft.yml"
pull_request:
branches: [master]
name: Build on Windows
jobs:
build-windows:
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
language: ["cpp"]
steps:
- name: Setup NuGet.exe for use with actions
uses: NuGet/setup-nuget@v1.0.5
- name: Checkout
uses: actions/checkout@v2.3.4
with:
submodules: recursive
- name: Install OpenSSL
uses: crazy-max/ghaction-chocolatey@v1.6.0
with:
args: install openssl -y
- name: Compile Embed-Helper
run: "cd src/ui/impl/webview/lib/webviewpp/embed-helper && mkdir build && cd build && cmake .. && cmake --build . --config Release && cd Release && ./embed_helper ../../../../soundux-ui"
- name: Compile
run: "mkdir build && cd build && cmake .. -DEMBED_PATH=src/ui/impl/webview/lib/webviewpp/embed-helper/build/Release && cmake --build . --config Release"
- name: Upload Build Artifact
uses: actions/upload-artifact@v2.2.4
with:
name: Release
path: build/Release
- name: Install InnoSetup
uses: crazy-max/ghaction-chocolatey@v1.6.0
with:
args: install innosetup -y
- name: Install Sed
uses: crazy-max/ghaction-chocolatey@v1.6.0
with:
args: install sed -y
- name: Run Sed
run: '&"${Env:ProgramData}\chocolatey\bin\sed.exe" -i ''s%\$PATH%D:\\a\\Soundux\\Soundux%'' deployment/innosetup/Soundux.iss'
- name: Run InnoSetup
run: '&"${Env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe" deployment/innosetup/Soundux.iss'
- name: Upload Installer Artifact
uses: actions/upload-artifact@v2.2.4
with:
name: Installer
path: deployment/innosetup/Output/setup.exe

View File

@ -1,25 +0,0 @@
on: workflow_dispatch
name: Debug on Linux
jobs:
debug-linux:
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
language: ["cpp"]
steps:
- name: Install build dependencies
run: "sudo apt-get update && sudo apt-get install git build-essential cmake libx11-dev libxi-dev libwnck-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev libpulse-dev"
- name: Checkout
uses: actions/checkout@v2.3.4
with:
submodules: recursive
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
with:
limit-access-to-actor: true
continue-on-error: true

View File

@ -1,69 +0,0 @@
on: workflow_dispatch
name: Upload Release Binaries
jobs:
upload-binaries:
runs-on: ubuntu-20.04
strategy:
fail-fast: false
steps:
- name: Download Windows Artifacts
uses: dawidd6/action-download-artifact@v2
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: compile_windows.yml
- name: Download Deb Artifact
uses: dawidd6/action-download-artifact@v2
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: compile_linux.yml
- name: Download Flatpak Artifact
uses: dawidd6/action-download-artifact@v2
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build_flatpak.yml
- name: Download Tar Ball Artifact
uses: dawidd6/action-download-artifact@v2
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: upload_full_src.yml
- name: List downloaded binaries
run: "find ."
- name: Get Latest Release
id: last_release
uses: InsonusK/get-latest-release@v1.0.1
with:
myToken: ${{ github.token }}
view_top: 1
- name: Print Latest Release Info
run: |
echo "id: ${{ steps.last_release.outputs.id }}"
echo "tag_name: ${{ steps.last_release.outputs.tag_name }}"
echo "draft: ${{ steps.last_release.outputs.draft }}"
- name: Prepare Binaries
run: |
mkdir release
mv "./Deb package/soundux.deb" ./release/soundux-${{ steps.last_release.outputs.tag_name }}.deb
mv "./Source tarball/soundux.tar.gz" ./release/soundux-${{ steps.last_release.outputs.tag_name }}.tar.gz
mv "./soundux/soundux.flatpak" ./release/soundux-${{ steps.last_release.outputs.tag_name }}.flatpak
mv "./Installer/setup.exe" ./release/soundux-${{ steps.last_release.outputs.tag_name }}-windows-setup.exe
mv "./Release/soundux.exe" ./release/soundux-${{ steps.last_release.outputs.tag_name }}-windows-portable.exe
- name: List Release Binaries
run: "ls -lah release"
- name: Upload binaries
uses: skx/github-action-publish-binaries@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
releaseId: ${{ steps.last_release.outputs.id }}
args: "release/*"

View File

@ -1,49 +0,0 @@
on:
push:
branches: [master]
paths-ignore:
- "**/README.md"
- "**/compile_linux.yml"
- "**/compile_windows.yml"
- "**/build_flatpak.yml"
- "**/.all-contributorsrc"
- "**/windows_debug.yml"
- "**/upload_binaries_to_draft.yml"
pull_request:
branches: [master]
name: Upload source with submodules
jobs:
upload-full-src:
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
language: ["cpp"]
steps:
- name: Checkout
uses: actions/checkout@v2.3.4
with:
submodules: recursive
path: Soundux
- name: Install build dependencies
run: "sudo apt-get update && sudo apt-get install git build-essential cmake libx11-dev libpipewire-0.3-dev ninja-build libxi-dev libwnck-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev libpulse-dev"
- name: Fetch Required External Dependencies
run: 'cd Soundux && cmake -GNinja . && find build -not -name "_deps" -delete && rm CMakeCache.txt'
- name: Create tarball
uses: master-atul/tar-action@v1.0.2
with:
command: c
files: |
./Soundux
outPath: soundux.tar.gz
- name: Upload
uses: actions/upload-artifact@v2.2.4
with:
name: Source tarball
path: soundux.tar.gz

View File

@ -1,33 +0,0 @@
on: workflow_dispatch
name: Debug on Windows
jobs:
debug-windows:
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
language: ["cpp"]
steps:
- name: Setup NuGet.exe for use with actions
uses: NuGet/setup-nuget@v1.0.5
- name: Checkout
uses: actions/checkout@v2.3.4
with:
submodules: recursive
- name: Install OpenSSL
uses: crazy-max/ghaction-chocolatey@v1.6.0
with:
args: install openssl -y
- name: Add NuGet Remote
run: "nuget.exe sources Add -Name NuGetRemote -Source https://api.nuget.org/v3/index.json"
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
with:
limit-access-to-actor: true
continue-on-error: true

91
.gitignore vendored Normal file → Executable file
View File

@ -1,11 +1,80 @@
build
cmake-build-debug
.idea
.vscode
.history
.cache
analyze
node_modules
yarn.lock
package.json
compile_commands.json
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
*.qm
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
# qtcreator generated files
*.pro.user*
*.txt.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Other Stuff
/.idea
/.vscode
/vendor
/build*
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe

43
.gitmodules vendored
View File

@ -1,43 +0,0 @@
[submodule "lib/json"]
path = lib/json
url = https://github.com/nlohmann/json
[submodule "lib/miniaudio"]
path = lib/miniaudio
url = https://github.com/mackron/miniaudio
[submodule "lib/fancypp"]
path = lib/fancypp
url = https://github.com/Curve/fancypp
[submodule "lib/nativefiledialog-extended"]
path = lib/nativefiledialog-extended
url = https://github.com/btzy/nativefiledialog-extended
[submodule "src/ui/impl/webview/lib/soundux-ui"]
path = src/ui/impl/webview/lib/soundux-ui
url = https://github.com/Soundux/soundux-ui/
branch = build
[submodule "src/ui/impl/webview/lib/webviewpp"]
path = src/ui/impl/webview/lib/webviewpp
url = https://github.com/Soundux/webviewpp
[submodule "lib/tiny-process-library"]
path = lib/tiny-process-library
url = https://gitlab.com/eidheim/tiny-process-library.git
[submodule "lib/cpp-httplib"]
path = lib/cpp-httplib
url = https://github.com/yhirose/cpp-httplib
[submodule "lib/traypp"]
path = lib/traypp
url = https://github.com/Soundux/traypp
[submodule "deployment/flatpak/shared-modules"]
path = deployment/flatpak/shared-modules
url = https://github.com/flathub/shared-modules
[submodule "lib/semver"]
path = lib/semver
url = https://github.com/Neargye/semver
[submodule "lib/lockpp"]
path = lib/lockpp
url = https://github.com/Soundux/lockpp
[submodule "lib/backward-cpp"]
path = lib/backward-cpp
url = https://github.com/bombela/backward-cpp
[submodule "lib/guardpp"]
path = lib/guardpp
url = https://github.com/Soundux/guardpp

26
.travis.yml Normal file
View File

@ -0,0 +1,26 @@
language: cpp
compiler: gcc
sudo: required
dist: bionic
addons:
apt:
packages:
- git
- curl
- golang-go
- qt5-default
- libqt5x11extras5-dev
git:
depth: false
install:
- mkdir -p ~/bin
- curl -O https://www.qpm.io/download/v0.11.0/linux_386/qpm && install -m 755 ./qpm ~/bin/
script:
- ~/bin/qpm install
- mkdir build
- cd build
- qmake ..
- make

View File

@ -1,143 +0,0 @@
cmake_minimum_required(VERSION 3.1)
project(soundux VERSION 0.2.8 DESCRIPTION "A crossplatform soundboard")
set(FULL_VERSION_STRING "0.2.8")
option(EMBED_PATH "The path used for embedding" "OFF")
option(USE_FLATPAK "Allows the program to run under flatpak" OFF)
file(GLOB src
"src/*.cpp"
"src/*/*.cpp"
"src/*/*/*.cpp"
"src/*/*/*/*.cpp"
"src/*/*/*/*/*.cpp"
)
if (WIN32)
add_executable(soundux WIN32 ${src} "assets/icon.rc")
set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELWITHDEBINFO
)
foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
set(${CompilerFlag} "${${CompilerFlag}}" CACHE STRING "msvc compiler flags" FORCE)
message("MSVC flags: ${CompilerFlag}:${${CompilerFlag}}")
endforeach()
target_compile_definitions(soundux PRIVATE WIN32_LEAN_AND_MEAN=1)
target_compile_options(soundux PRIVATE /W4)
else()
add_executable(soundux ${src})
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "Enabling warning and error flags for debug build")
target_compile_options(soundux PRIVATE -Wall -Werror -Wextra -pedantic -Wno-unused-lambda-capture -Wno-gnu)
endif()
endif()
target_compile_definitions(soundux PRIVATE SOUNDUX_VERSION="${FULL_VERSION_STRING}" WNCK_I_KNOW_THIS_IS_UNSTABLE=1)
target_include_directories(soundux SYSTEM PRIVATE "src")
target_include_directories(soundux SYSTEM PRIVATE "lib/miniaudio")
target_include_directories(soundux SYSTEM PRIVATE "lib/semver/include")
target_include_directories(soundux SYSTEM PRIVATE "lib/fancypp/include")
target_include_directories(soundux SYSTEM PRIVATE "lib/json/single_include")
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(soundux PRIVATE Threads::Threads ${CMAKE_DL_LIBS})
if (UNIX)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
find_package(PipeWire REQUIRED)
find_package(PulseAudio)
find_package(X11 REQUIRED)
target_include_directories(soundux SYSTEM PRIVATE ${X11_INCLUDE_DIR} ${PULSEAUDIO_INCLUDE_DIR} ${PipeWire_INCLUDE_DIRS} ${Spa_INCLUDE_DIRS})
find_package(PkgConfig REQUIRED)
pkg_check_modules(WNCK libwnck-3.0)
target_link_libraries(soundux PRIVATE ${X11_LIBRARIES} ${X11_Xinput_LIB} ${X11_XTest_LIB})
endif()
if (WIN32)
target_compile_definitions(soundux PRIVATE _CRT_SECURE_NO_WARNINGS=1 _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS=1 _UNICODE=1)
endif()
add_subdirectory(src/ui/impl/webview/lib/webviewpp EXCLUDE_FROM_ALL)
add_subdirectory(lib/nativefiledialog-extended EXCLUDE_FROM_ALL)
add_subdirectory(lib/tiny-process-library EXCLUDE_FROM_ALL)
add_subdirectory(lib/backward-cpp EXCLUDE_FROM_ALL)
add_subdirectory(lib/traypp EXCLUDE_FROM_ALL)
add_subdirectory(lib/guardpp)
add_subdirectory(lib/lockpp)
add_backward(soundux)
if (WIN32)
set(OPENSSL_USE_STATIC_LIBS TRUE)
set(OPENSSL_MSVC_STATIC_RT TRUE)
set(BROTLI_USE_STATIC_LIBS TRUE)
endif()
set(HTTPLIB_REQUIRE_OPENSSL ON)
add_subdirectory(lib/cpp-httplib EXCLUDE_FROM_ALL)
target_include_directories(soundux SYSTEM PRIVATE "lib/cpp-httplib")
target_link_libraries(soundux PRIVATE webview nfd tiny-process-library tray guardpp httplib lockpp)
if (${EMBED_PATH} STREQUAL "OFF")
message("Web-content will not be embedded")
# [[ Copy required files ]]
# > Copies frontend files
if (MSVC)
file(COPY "${CMAKE_SOURCE_DIR}/src/ui/impl/webview/lib/soundux-ui/"
DESTINATION "${CMAKE_SOURCE_DIR}/build/Release/dist")
else()
file(COPY "${CMAKE_SOURCE_DIR}/src/ui/impl/webview/lib/soundux-ui/"
DESTINATION "${CMAKE_SOURCE_DIR}/build/dist")
endif()
else()
message("Using embed path " ${EMBED_PATH})
target_include_directories(webview PUBLIC ${EMBED_PATH})
target_compile_definitions(soundux PRIVATE IS_EMBEDDED=1)
endif()
target_compile_features(soundux PRIVATE cxx_std_17)
set_target_properties(soundux PROPERTIES
CXX_STANDARD 17
CXX_EXTENSIONS OFF
CXX_STANDARD_REQUIRED ON)
set_target_properties(soundux PROPERTIES VERSION ${PROJECT_VERSION})
set_target_properties(soundux PROPERTIES PROJECT_NAME ${PROJECT_NAME})
if(USE_FLATPAK)
target_compile_definitions(soundux PRIVATE USE_FLATPAK)
target_link_libraries(soundux PRIVATE ${PULSEAUDIO_LIBRARY})
install(TARGETS soundux DESTINATION bin)
if (${EMBED_PATH} STREQUAL "OFF")
install(DIRECTORY "${CMAKE_SOURCE_DIR}/build/dist" DESTINATION bin)
endif()
else()
set(CMAKE_INSTALL_PREFIX "/opt/soundux" CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
install(TARGETS soundux DESTINATION .)
if (${EMBED_PATH} STREQUAL "OFF")
install(DIRECTORY "${CMAKE_SOURCE_DIR}/build/dist" DESTINATION .)
endif()
install(FILES "${CMAKE_SOURCE_DIR}/deployment/soundux.desktop" DESTINATION /usr/share/applications)
install(FILES "${CMAKE_SOURCE_DIR}/deployment/appstream/io.github.Soundux.metainfo.xml" DESTINATION /usr/share/metainfo)
install(FILES "${CMAKE_SOURCE_DIR}/assets/soundux.png" DESTINATION /usr/share/pixmaps)
endif()

View File

@ -1,64 +0,0 @@
# ✍️ Contributing
Contributions are welcome! Here's how you can help:
- [Translations](#-translations)
- [Code](#-code)
- [Issues](#-issues)
- [Donations](#-donations)
## 📚 Translations
### Weblate (preferred)
1. Visit [our Weblate page](https://hosted.weblate.org/engage/soundux/)
2. Login / Register
3. Start translating!
- If you are adding a translation which language or territory specific version doesn't exist yet click on **Start new translation**
- If there already is a translation for your language, and you want to correct a string just click on the language and make your change
### Pull Request
1. [Fork the frontend](https://github.com/Soundux/soundux-ui/fork) [or website](https://github.com/Soundux/soundux.github.io/fork) and [clone](https://help.github.com/articles/cloning-a-repository/) your fork.
2. Start translating!
- Add a translation file in `/src/locales/`
- If you are adding a translation which language doesn't exist yet, name your translation `[COUNTRY_CODE].json`
- If there already is a translation for your language, and you want to add a territory specific one, name your translation `[COUNTRY_CODE]-[TERRITORY].json` so that it plays nicely with the [Implicit fallback](https://kazupon.github.io/vue-i18n/guide/fallback.html#implicit-fallback-using-locales)
- Replace `[COUNTRY_CODE]` with your corresponding code. [See the list here](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (Use column `639-1`)
- Replace `[TERRITORY]` with your corresponding territory code. [See the list here](https://en.wikipedia.org/wiki/ISO_3166-1#Officially_assigned_code_elements) (Use column `Alpha-2 code`)
- Add the corresponding translations for your language
3. Commit your changes to a new branch (not `master`, one change per branch) and push it:
- Use [Semantic Commit Messages](https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716)
4. Once you are happy with your translation, submit a pull request.
## 📑 Code
Before you start contributing please make sure to do the following things:
- Check if a branch exists, that already contains the changes you want to work on
- Please may also contact us <sup><sub>_(We'll reply as fast as we can!)_</sub></sup> before you start working on something because we may already work on the same thing but just haven't pushed any of those changes yet
1. [Fork](https://github.com/Soundux/Soundux/fork) the repository and [clone](https://help.github.com/articles/cloning-a-repository/) your fork.
2. Start coding!
- Implement your feature.
- Check your code works as expected.
- Run the code formatter: `clang-format -i $(git ls-files "*.cpp" "*.hpp")`
3. Commit your changes to a new branch (not `master`, one change per branch) and push it:
- Use [Semantic Commit Messages](https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716)
4. Once you are happy with your changes, submit a pull request.
- Open the pull request.
- Add a short description explaining briefly what you've done (or if it's a work-in-progress - what you need to do)
## 🆘 Issues
1. Do a quick search in the [existing issues](https://github.com/Soundux/Soundux/issues?q=is%3Aissue+) to check if the issue has already been reported.
2. [Open an issue](https://github.com/Soundux/Soundux/issues/new/choose) and fill in the template
After reporting, you should try to answer any questions or clarifications, as this will help determine the cause of the issue.
## 🎁 Donations
We are on [Ko-fi](https://ko-fi.com/soundux)

View File

@ -1,122 +0,0 @@
#.rst:
# FindPipeWire
# -------
#
# Try to find PipeWire on a Unix system.
#
# This will define the following variables:
#
# ``PipeWire_FOUND``
# True if (the requested version of) PipeWire is available
# ``PipeWire_VERSION``
# The version of PipeWire
# ``PipeWire_LIBRARIES``
# This can be passed to target_link_libraries() instead of the ``PipeWire::PipeWire``
# target
# ``PipeWire_INCLUDE_DIRS``
# This should be passed to target_include_directories() if the target is not
# used for linking
# ``PipeWire_DEFINITIONS``
# This should be passed to target_compile_options() if the target is not
# used for linking
#
# If ``PipeWire_FOUND`` is TRUE, it will also define the following imported target:
#
# ``PipeWire::PipeWire``
# The PipeWire library
#
# In general we recommend using the imported target, as it is easier to use.
# Bear in mind, however, that if the target is in the link interface of an
# exported library, it must be made available by the package config file.
#=============================================================================
# Copyright 2014 Alex Merry <alex.merry@kde.org>
# Copyright 2014 Martin Gräßlin <mgraesslin@kde.org>
# Copyright 2018-2020 Jan Grulich <jgrulich@redhat.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#=============================================================================
# Use pkg-config to get the directories and then use these values
# in the FIND_PATH() and FIND_LIBRARY() calls
find_package(PkgConfig QUIET)
pkg_search_module(PKG_PipeWire QUIET libpipewire-0.3 libpipewire-0.2)
pkg_search_module(PKG_Spa QUIET libspa-0.2 libspa-0.1)
set(PipeWire_DEFINITIONS "${PKG_PipeWire_CFLAGS}" "${PKG_Spa_CFLAGS}")
set(PipeWire_VERSION "${PKG_PipeWire_VERSION}")
find_path(PipeWire_INCLUDE_DIRS
NAMES
pipewire/pipewire.h
HINTS
${PKG_PipeWire_INCLUDE_DIRS}
${PKG_PipeWire_INCLUDE_DIRS}/pipewire-0.3
)
find_path(Spa_INCLUDE_DIRS
NAMES
spa/param/props.h
HINTS
${PKG_Spa_INCLUDE_DIRS}
${PKG_Spa_INCLUDE_DIRS}/spa-0.2
)
find_library(PipeWire_LIBRARIES
NAMES
pipewire-0.3
pipewire-0.2
HINTS
${PKG_PipeWire_LIBRARY_DIRS}
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PipeWire
FOUND_VAR
PipeWire_FOUND
REQUIRED_VARS
PipeWire_LIBRARIES
PipeWire_INCLUDE_DIRS
Spa_INCLUDE_DIRS
VERSION_VAR
PipeWire_VERSION
)
if(PipeWire_FOUND AND NOT TARGET PipeWire::PipeWire)
add_library(PipeWire::PipeWire UNKNOWN IMPORTED)
set_target_properties(PipeWire::PipeWire PROPERTIES
IMPORTED_LOCATION "${PipeWire_LIBRARIES}"
INTERFACE_COMPILE_OPTIONS "${PipeWire_DEFINITIONS}"
INTERFACE_INCLUDE_DIRECTORIES "${PipeWire_INCLUDE_DIRS};${Spa_INCLUDE_DIRS}"
)
endif()
mark_as_advanced(PipeWire_LIBRARIES PipeWire_INCLUDE_DIRS)
include(FeatureSummary)
set_package_properties(PipeWire PROPERTIES
URL "https://www.pipewire.org"
DESCRIPTION "PipeWire - multimedia processing"
)

View File

@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Soundux is a cross-platform soundboard
Copyright (C) 2021 Soundux developers
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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
@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
Soundux Copyright (C) 2021 Soundux developers
Soundux Copyright (C) 2020 D3SOX
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

338
README.md Normal file → Executable file
View File

@ -1,271 +1,145 @@
<div align="center">
⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
> [!NOTE]
> Soundux is undergoing a major rewrite right now, for more information see https://github.com/Soundux/Soundux/issues/591
⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
</div>
<hr/>
# This is the old Linux only Qt Widgets codebase. [See the new, current version](https://github.com/Soundux/Soundux)
<div align="center">
<p>
Read the documentation in:
<br>
<a href="https://github.com/Soundux/Soundux/blob/master/README.md">[English]</a>
<a href="https://github.com/Soundux/Soundux/blob/master/i18n/LISEZMOI.md">[French]</a>
<a href="https://github.com/Soundux/Soundux/blob/master/i18n/ПРОЧТИМЕНЯ.md">[Russian]</a>
<br><br><br>
<img src="assets/logo.gif" height="200"/>
<br>
<h6>A cross-platform soundboard 🔊</h6>
<br>
<a href="https://github.com/Soundux/Soundux/releases">
<img src="https://img.shields.io/github/release/Soundux/Soundux.svg?style=flat-square" alt="Latest Stable Release" />
<h1>
<a href="#readme">
<img src="icon.png" width="50" alt="Soundboard" />
</a>
<br />
Soundux
</h1>
<h4>A universal soundboard in Qt for linux using pulseaudio modules</h4>
</p>
<p>
<a href="https://github.com/D3SOX/Soundux/releases">
<img src="https://img.shields.io/github/last-commit/D3SOX/Soundux.svg?style=for-the-badge" alt="Last Commit" />
</a>
<br>
<a href="https://github.com/Soundux/Soundux/stargazers">
<img src="https://img.shields.io/github/stars/Soundux/soundux?style=flat-square" alt="GitHub Repo stars">
<a href="https://github.com/D3SOX/Soundux/blob/master/LICENSE">
<img src="https://img.shields.io/github/license/D3SOX/Soundux.svg?style=for-the-badge" alt="License" />
</a>
<a href="https://github.com/Soundux/Soundux/issues">
<img src="https://img.shields.io/github/issues/Soundux/soundux?style=flat-square" alt="GitHub issues">
</a>
<a href="https://github.com/Soundux/Soundux/pulls">
<img src="https://img.shields.io/github/issues-pr-raw/Soundux/soundux?label=pulls&style=flat-square" alt="GitHub pull requests">
</a>
<br>
<a href="https://github.com/Soundux/Soundux/blob/master/LICENSE">
<img src="https://img.shields.io/github/license/Soundux/Soundux.svg?style=flat-square" alt="License" />
</a>
<a href="https://discord.gg/4HwSGN4Ec2">
<img src="https://img.shields.io/discord/697348809591750706?label=discord&style=flat-square" alt="Discord" />
</a>
<a href="https://matrix.to/#/!XlIlRgKzoRavKnurkt:matrix.org">
<img src="https://img.shields.io/badge/chat-matrix%20space-blue?style=flat-square" alt="Matrix" />
</a>
<br>
<a href="https://github.com/Soundux/Soundux/actions?query=workflow%3A%22Build+on+Windows%22">
<img src="https://img.shields.io/github/workflow/status/Soundux/Soundux/Build%20on%20Windows?label=windows%20build&style=flat-square" alt="Windows Build" />
</a>
<a href="https://github.com/Soundux/Soundux/actions?query=workflow%3A%22Build+on+Linux%22">
<img src="https://img.shields.io/github/workflow/status/Soundux/Soundux/Build%20on%20Linux?label=linux%20build&style=flat-square" alt="Linux Build" />
</a>
<a href="https://github.com/Soundux/Soundux/actions?query=workflow%3A%22Build+Flatpak%22">
<img src="https://img.shields.io/github/workflow/status/Soundux/Soundux/Build%20Flatpak?label=flatpak%20build&style=flat-square" alt="Flatpak Build" />
</a>
<hr>
<a href="https://discord.com/invite/4HwSGN4Ec2">
<img src="https://invidget.switchblade.xyz/4HwSGN4Ec2" alt="Discord Invite"/>
</a>
<a href="https://hosted.weblate.org/engage/soundux/">
<img src="https://hosted.weblate.org/widgets/soundux/-/frontend/multi-green.svg" alt="Translation status" />
<a href="https://travis-ci.com/D3SOX/Soundux">
<img src="https://img.shields.io/travis/com/D3SOX/Soundux?style=for-the-badge" alt="Travis" />
</a>
</p>
</div>
# 👀 Preview
| ![Dark Interface](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/home-dark.png) | ![Light Interface](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/home-light.png) |
| -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| ![Settings Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/settings-dark.png) | ![Settings Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/settings-light.png) |
| ![Search Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/search-dark.png) | ![Search Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/search-light.png) |
| ![Application Passthrough](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/pass-through-dark.png) | ![Application Passthrough](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/pass-through-light.png) |
| ![Seek/Pause/Stop Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/multiple-playing-dark.png) | ![Seek/Pause/Stop Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/multiple-playing-light.png) |
| ![Grid View Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/grid-view-dark.png) | ![Grid View Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/grid-view-light.png) |
## Index
- [Introduction](#introduction)
- [Runtime Dependencies](#runtime-dependencies)
- [Compilation & Installation](#compilation--installation)
- [Arch Linux and derivatives](#arch-linux-and-derivatives)
- [Other distros](#other-distros)
- [Dependencies](#dependencies)
- [Install dependencies for Ubuntu and derivatives (Thanks to @Tibladar)](#install-dependencies-for-ubuntu-and-derivatives-thanks-to-tibladar)
- [Build](#build)
- [Install](#install)
- [Why _Soundux_?](#why-soundux)
- [License](#license)
- [TODO](#todo)
# 👋 Introduction
Soundux is a cross-platform soundboard that features a simple user interface.
With Soundux you can play audio to a specific application on Linux and to your VB-CABLE sink on Windows.
# Introduction
I didn't find any good soundboard application for linux so I created one. It uses pulseaudio modules to achieve a universal interface. You can select every recording stream for the audio output. The GUI is written with Qt.
# 🏃 Runtime Dependencies
These are required to run the program
It is currently in alpha because I don't know if this works for everyone.
## 🐧 Linux
# Runtime Dependencies
Please refer to your distro instructions on how to install
- [pulseaudio](https://gitlab.freedesktop.org/pulseaudio/pulseaudio) / [pipewire](https://pipewire.org/) >= 0.3.26
- Xorg
- Libwnck3 (optional, for icon support)
- Webkit2gtk
- libappindicator3
- [youtube-dl](https://youtube-dl.org/) & [ffmpeg](https://www.ffmpeg.org/) (optional, for downloader support)
## <img src="https://www.vectorlogo.zone/logos/microsoft/microsoft-icon.svg" height="20"/> Windows
- [VB-CABLE](https://vb-audio.com/Cable/) (Our installer automatically installs VB-CABLE)
- [Webview2 Runtime](https://developer.microsoft.com/microsoft-edge/webview2/) (Is also shipped with the installer)
- [youtube-dl](https://youtube-dl.org/) & [ffmpeg](https://www.ffmpeg.org/) (optional, for downloader support)
- [pulseaudio](https://gitlab.freedesktop.org/pulseaudio/pulseaudio)
- [mpg123](https://www.mpg123.de/) (optional: for playing mp3 files)
# 📥 Installation
# Compilation & Installation
## 🐧 Linux
### <img src="https://www.vectorlogo.zone/logos/archlinux/archlinux-icon.svg" height="20"/> Arch Linux and derivatives
You can install our package with your AUR helper of choice which will automatically compile and install the latest release version
## Arch Linux and derivatives
You can install my package with your AUR helper of choice which will automatically compile and install the master branch
```sh
yay -S soundux
```
We also provide a `soundux-git` package which compiles from the master branch
### <img src="https://www.vectorlogo.zone/logos/ubuntu/ubuntu-icon.svg" height="20"/> Ubuntu and derivatives
You can install Soundux via [pacstall](https://github.com/pacstall/pacstall)
```sh
pacstall -I soundux
yay -S soundux-git
```
### <img src="https://www.vectorlogo.zone/logos/getfedora/getfedora-icon.svg" height="20"> Fedora
Soundux can be installed via this [COPR repository](https://copr.fedorainfracloud.org/coprs/rivenirvana/soundux/)
## Other distros
### Dependencies
This list may be not accurate. Contact me if you find missing dependencies that I can update this list
- [qpm](https://github.com/Cutehacks/qpm)
- [qt5-base](https://github.com/qt/qtbase)
- [qt5-tools](https://github.com/qt/qt5)
### Install dependencies for Ubuntu and derivatives (Thanks to @Tibladar)
```sh
sudo dnf copr enable rivenirvana/soundux
sudo dnf install soundux pipewire-devel
sudo apt install git golang-go qt5-default libqt5x11extras5-dev mpg123
go get qpm.io/qpm
```
### <img src="https://www.vectorlogo.zone/logos/linuxfoundation/linuxfoundation-icon.svg" height="20" /> Distro-agnostic packages
You can grab the latest release from the Snap Store or Flathub
[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/soundux)
<a href='https://flathub.org/apps/details/io.github.Soundux'>
<img width='240' alt='Download on Flathub' src='https://flathub.org/assets/badges/flathub-badge-en.png'/>
</a>
## <img src="https://www.vectorlogo.zone/logos/microsoft/microsoft-icon.svg" height="20"/> Windows
Download our installer or portable from [the latest release](https://github.com/Soundux/Soundux/releases/latest)
# 🔨 Compilation
## 🔗 Build Dependencies
### 🐧 Linux
- Webkit2gtk
- PulseAudio development headers
- PipeWire development headers
- X11 client-side development headers
- libappindicator3 development headers
- OpenSSL development headers
- G++ >= 9
- Some distros still have G++ versions < 9 in their repos, using them will result in a build failure (for more information refer to [#71](https://github.com/Soundux/Soundux/issues/71)).
#### <img src="https://www.vectorlogo.zone/logos/debian/debian-icon.svg" height="20"/> Debian / <img src="https://www.vectorlogo.zone/logos/ubuntu/ubuntu-icon.svg" height="20"/> Ubuntu and derivatives
```sh
sudo apt install git build-essential cmake libx11-dev libxi-dev libwebkit2gtk-4.0-dev libappindicator3-dev libssl-dev libpulse-dev libpipewire-0.3-dev
```
> If you're on Ubuntu 20.04 or lower you might have to add the PipeWire PPA:
> `sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream`
#### <img src="https://www.vectorlogo.zone/logos/getfedora/getfedora-icon.svg" height="20"> Fedora and derivatives
```sh
sudo dnf install git webkit2gtk3 cmake llvm clang libXi-devel gtk3-devel webkit2gtk3-devel libappindicator-gtk3-devel pulseaudio-libs-devel pipewire-devel
```
### <img src="https://www.vectorlogo.zone/logos/microsoft/microsoft-icon.svg" height="20"/> Windows
- Nuget
- MSVC
- CMake
- OpenSSL
## 👷 Build
### Build
Clone the repository
```sh
git clone https://github.com/Soundux/Soundux.git
git clone https://github.com/D3SOX/Soundux.git
cd Soundux
git submodule update --init --recursive
```
Install dependencies
```sh
# If you installed qpm via go
~/go/bin/qpm install
# Otherwise
qpm install
```
Create a build folder and start compilation
```sh
mkdir build
cd build
cmake ..
cmake --build . --config Release
qmake ..
make
```
To start the program
```sh
./soundux # .\soundux.exe on Windows
./Soundux
```
## 🖥️ Install
### Install
Automated Installation is currently not available but will be available in the future. (You may look into my [arch package](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=soundux-git) and figure it out for your distro)
### 🐧 Linux
```sh
sudo make install
```
# Why _Soundux_?
# 📝 Why _Soundux_?
**Sound**board for Lin**ux**
The project started as a **Sound**board for Lin**ux**
# 🗒️ License
# License
The code is licensed under [GPLv3](LICENSE)
# ✍️ Contributing
The contribution guidelines can be found [here](CONTRIBUTING.md), please check them out if you're planning to contribute!
# ✨ Contributors
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://github.com/Curve"><img src="https://avatars.githubusercontent.com/u/37805707?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Noah</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3ACurve" title="Bug reports">🐛</a> <a href="#business-Curve" title="Business development">💼</a> <a href="https://github.com/Soundux/Soundux/commits?author=Curve" title="Code">💻</a> <a href="#design-Curve" title="Design">🎨</a> <a href="#ideas-Curve" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-Curve" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-Curve" title="Maintenance">🚧</a> <a href="#platform-Curve" title="Packaging/porting to new platform">📦</a> <a href="#projectManagement-Curve" title="Project Management">📆</a> <a href="#question-Curve" title="Answering Questions">💬</a> <a href="https://github.com/Soundux/Soundux/pulls?q=is%3Apr+reviewed-by%3ACurve" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/Soundux/Soundux/commits?author=Curve" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/D3SOX"><img src="https://avatars.githubusercontent.com/u/24937357?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Nico</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AD3SOX" title="Bug reports">🐛</a> <a href="#business-D3SOX" title="Business development">💼</a> <a href="https://github.com/Soundux/Soundux/commits?author=D3SOX" title="Code">💻</a> <a href="#design-D3SOX" title="Design">🎨</a> <a href="#ideas-D3SOX" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-D3SOX" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-D3SOX" title="Maintenance">🚧</a> <a href="#platform-D3SOX" title="Packaging/porting to new platform">📦</a> <a href="#projectManagement-D3SOX" title="Project Management">📆</a> <a href="#question-D3SOX" title="Answering Questions">💬</a> <a href="https://github.com/Soundux/Soundux/pulls?q=is%3Apr+reviewed-by%3AD3SOX" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/Soundux/Soundux/commits?author=D3SOX" title="Tests">⚠️</a> <a href="#translation-D3SOX" title="Translation">🌍</a> <a href="#a11y-D3SOX" title="Accessibility">️️️️♿️</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/MrKingMichael"><img src="https://avatars.githubusercontent.com/u/30067605?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Michael</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AMrKingMichael" title="Bug reports">🐛</a> <a href="#ideas-MrKingMichael" title="Ideas, Planning, & Feedback">🤔</a> <a href="#translation-MrKingMichael" title="Translation">🌍</a> <a href="https://github.com/Soundux/Soundux/commits?author=MrKingMichael" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/BrandonKMLee"><img src="https://avatars.githubusercontent.com/u/58927531?v=4?s=50" width="50px;" alt=""/><br /><sub><b>BrandonKMLee</b></sub></a><br /><a href="#ideas-BrandonKMLee" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Toadfield"><img src="https://avatars.githubusercontent.com/u/68649672?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Toadfield</b></sub></a><br /><a href="#ideas-Toadfield" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/Soundux/Soundux/issues?q=author%3AToadfield" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/fubka"><img src="https://avatars.githubusercontent.com/u/44064746?v=4?s=50" width="50px;" alt=""/><br /><sub><b>fubka</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Afubka" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/TheOriginalTripleD"><img src="https://avatars.githubusercontent.com/u/6907054?v=4?s=50" width="50px;" alt=""/><br /><sub><b>TheOriginalTripleD</b></sub></a><br /><a href="#research-TheOriginalTripleD" title="Research">🔬</a></td>
<td align="center"><a href="https://github.com/UltraBlackLinux"><img src="https://avatars.githubusercontent.com/u/62404294?v=4?s=50" width="50px;" alt=""/><br /><sub><b>UltraBlackLinux</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AUltraBlackLinux" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://bendem.be/"><img src="https://avatars.githubusercontent.com/u/2681677?v=4?s=50" width="50px;" alt=""/><br /><sub><b>bendem</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Abendem" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://edgar.bzh/"><img src="https://avatars.githubusercontent.com/u/46636609?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Edgar Onghena</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Aedgarogh" title="Bug reports">🐛</a> <a href="#research-edgarogh" title="Research">🔬</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/moggesmith10"><img src="https://avatars.githubusercontent.com/u/33375517?v=4?s=50" width="50px;" alt=""/><br /><sub><b>moggesmith10</b></sub></a><br /><a href="#ideas-moggesmith10" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://belmoussaoui.com/"><img src="https://avatars.githubusercontent.com/u/7660997?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Bilal Elmoussaoui</b></sub></a><br /><a href="#platform-bilelmoussaoui" title="Packaging/porting to new platform">📦</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/thomasfinstad"><img src="https://avatars.githubusercontent.com/u/5358752?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Thomas Finstad Larsen</b></sub></a><br /><a href="#ideas-thomasfinstad" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="http://arthurmelton.me"><img src="https://avatars.githubusercontent.com/u/29708070?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Arthur Melton</b></sub></a><br /><a href="#ideas-AMTitan" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/serkan-maker"><img src="https://avatars.githubusercontent.com/u/63740626?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Serkan ÖNDER</b></sub></a><br /><a href="#translation-serkan-maker" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/pizzadude"><img src="https://avatars.githubusercontent.com/u/1454420?v=4?s=50" width="50px;" alt=""/><br /><sub><b>PizzaDude</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Apizzadude" title="Bug reports">🐛</a> <a href="#research-pizzadude" title="Research">🔬</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Kylianalex"><img src="https://avatars.githubusercontent.com/u/66625058?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Kylianalex</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AKylianalex" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://gregerstoltnilsen.net/"><img src="https://avatars.githubusercontent.com/u/1364443?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Greger</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Agregersn" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/rivenirvana"><img src="https://avatars.githubusercontent.com/u/43519644?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Arvin Verain</b></sub></a><br /><a href="#platform-rivenirvana" title="Packaging/porting to new platform">📦</a></td>
<td align="center"><a href="http://einfacheinalex.eu/"><img src="https://avatars.githubusercontent.com/u/20642291?v=4?s=50" width="50px;" alt=""/><br /><sub><b>EinfachEinAlex</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/commits?author=EinfachEinAlex" title="Code">💻</a> <a href="#research-EinfachEinAlex" title="Research">🔬</a> <a href="https://github.com/Soundux/Soundux/commits?author=EinfachEinAlex" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center"><a href="https://discord.gg/ubmTQnuM3Z"><img src="https://avatars.githubusercontent.com/u/69876322?v=4?s=50" width="50px;" alt=""/><br /><sub><b>MeblIkea</b></sub></a><br /><a href="#translation-MeblIkea" title="Translation">🌍</a></td>
<td align="center"><a href="https://nathanbonnemains.squill.fr/"><img src="https://avatars.githubusercontent.com/u/45366162?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Nathan Bonnemains</b></sub></a><br /><a href="#translation-NathanBnm" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/lucasvbeek"><img src="https://avatars.githubusercontent.com/u/29404838?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Lucas van Beek</b></sub></a><br /><a href="#translation-lucasvbeek" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/underhood"><img src="https://avatars.githubusercontent.com/u/6674623?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Timotej S.</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Aunderhood" title="Bug reports">🐛</a> <a href="https://github.com/Soundux/Soundux/commits?author=underhood" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/3JlOy-PYCCKUi"><img src="https://avatars.githubusercontent.com/u/46464602?v=4?s=50" width="50px;" alt=""/><br /><sub><b>3JlOy_PYCCKUi</b></sub></a><br /><a href="#translation-3JlOy-PYCCKUi" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/FuRyQC"><img src="https://avatars.githubusercontent.com/u/91005051?v=4?s=50" width="50px;" alt=""/><br /><sub><b>FuRyQC</b></sub></a><br /><a href="#translation-FuRyQC" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://moral.net.au"><img src="https://avatars.githubusercontent.com/u/16875700?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Scott Percival</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Amoralrecordings" title="Bug reports">🐛</a> <a href="https://github.com/Soundux/Soundux/commits?author=moralrecordings" title="Tests">⚠️</a> <a href="https://github.com/Soundux/Soundux/commits?author=moralrecordings" title="Code">💻</a></td>
</tr>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
# TODO
- [ ] Don't assume that the QListWidgetItem is a SoundListWidgetItem. Can we make SoundListView host SoundListWidgetItems
- [ ] Playlist mode (play sounds one after another)
- [ ] Improve the logo
- [ ] Volume normalization
- [ ] Play sounds while another sound is playing
- [ ] Organize code
- [ ] Grid View
- [ ] Save window size
- [ ] Save volume states (+ Sync state)
- [ ] Option to only trigger hotkeys from current tab
- [ ] Only modify audio players started from this programm (stop, volume)
- [ ] Fix volume slider not working while playback
- [ ] Save positions when tabs moved
- [ ] Localization
- [ ] Package it as deb and flatpak and create a repology
- [ ] Change back recording streams when the program is closed (to fix a bug when the program is closed while playing a sound)
- [ ] Make it cross-platform (help on how to pass the sound to an application in Windows/macOS is greatly appreciated)
- [x] CTRL + F and focus search box
- [x] Hotkeys for folder tabs
- [x] Make UI responsive
- [x] Search sounds
- [x] Refresh button for folder tabs
- [x] Find a fancy name
- [x] CTRL+Q to quit
- [x] Automatically update files in folders (on startup?)
- [x] Separate volume sliders for me and for others (and a toggle to sync it)
- [x] Global Hotkeys
- [x] Check if dependencies are installed otherwise show a warning
- [x] Repeat button
- [x] Add support for other audio formats
- [x] Add folders and automatically create a tab for it
- [x] Create tabs to better organize your sounds
- [x] Double click items to play
- [x] Add multiple files at once
- [x] Save configuration in .config folder instead of in the same folder as the binary
- [x] Play sounds async
- [x] Implement stop feature

80
RunGuard.cpp Normal file
View File

@ -0,0 +1,80 @@
#include "RunGuard.h"
#include <QCryptographicHash>
// Thanks to https://stackoverflow.com/a/28172162
namespace
{
QString generateKeyHash( const QString& key, const QString& salt )
{
QByteArray data;
data.append( key.toUtf8() );
data.append( salt.toUtf8() );
data = QCryptographicHash::hash( data, QCryptographicHash::Sha1 ).toHex();
return data;
}
}
RunGuard::RunGuard( const QString& key )
: key( key )
, memLockKey( generateKeyHash( key, "_memLockKey" ) )
, sharedmemKey( generateKeyHash( key, "_sharedmemKey" ) )
, sharedMem( sharedmemKey )
, memLock( memLockKey, 1 )
{
memLock.acquire();
{
QSharedMemory fix( sharedmemKey ); // Fix for *nix: http://habrahabr.ru/post/173281/
fix.attach();
}
memLock.release();
}
RunGuard::~RunGuard()
{
release();
}
bool RunGuard::isAnotherRunning()
{
if ( sharedMem.isAttached() )
return false;
memLock.acquire();
const bool isRunning = sharedMem.attach();
if ( isRunning )
sharedMem.detach();
memLock.release();
return isRunning;
}
bool RunGuard::tryToRun()
{
if ( isAnotherRunning() ) // Extra check
return false;
memLock.acquire();
const bool result = sharedMem.create( sizeof( quint64 ) );
memLock.release();
if ( !result )
{
release();
return false;
}
return true;
}
void RunGuard::release()
{
memLock.acquire();
if ( sharedMem.isAttached() )
sharedMem.detach();
memLock.release();
}

32
RunGuard.h Normal file
View File

@ -0,0 +1,32 @@
#ifndef RUNGUARD_H
#define RUNGUARD_H
#include <QObject>
#include <QSharedMemory>
#include <QSystemSemaphore>
class RunGuard
{
public:
RunGuard( const QString& key );
~RunGuard();
bool isAnotherRunning();
bool tryToRun();
void release();
private:
const QString key;
const QString memLockKey;
const QString sharedmemKey;
QSharedMemory sharedMem;
QSystemSemaphore memLock;
Q_DISABLE_COPY( RunGuard )
};
#endif // RUNGUARD_H

59
Soundux.pro Normal file
View File

@ -0,0 +1,59 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
include(vendor/de/skycoder42/qhotkey/qhotkey.pri)
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
RunGuard.cpp \
qsoundslist.cpp \
searchview.cpp \
soundlistwidgetitem.cpp \
soundplayback.cpp \
customkeysequenceedit.cpp \
main.cpp \
mainwindow.cpp \
sethotkeydialog.cpp \
settings.cpp \
settingstab.cpp \
settingstabgeneral.cpp
HEADERS += \
RunGuard.h \
clickablesliderstyle.h \
qsoundslist.h \
searchview.h \
soundlistwidgetitem.h \
soundplayback.h \
customkeysequenceedit.h \
mainwindow.h \
json.hpp \
sethotkeydialog.h \
settings.h \
settingstab.h \
settingstabgeneral.h
FORMS += \
mainwindow.ui
RESOURCES += \
resources.qrc \
qdarkstyle/style.qrc
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

View File

@ -1 +0,0 @@
#define IDI_ICON1 101

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

View File

@ -1,2 +0,0 @@
#include "icon.h"
IDI_ICON1 ICON DISCARDABLE "icon.ico"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 584 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

22
clickablesliderstyle.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef CLICKABLESLIDERSTYLE_H
#define CLICKABLESLIDERSTYLE_H
#include <QObject>
#include <QProxyStyle>
// Thanks to https://stackoverflow.com/a/26281608
class ClickableSliderStyle : public QProxyStyle
{
public:
using QProxyStyle::QProxyStyle;
int styleHint(QStyle::StyleHint hint, const QStyleOption* option = nullptr, const QWidget* widget = nullptr, QStyleHintReturn* returnData = nullptr) const
{
if (hint == QStyle::SH_Slider_AbsoluteSetButtons)
return (Qt::LeftButton | Qt::MidButton | Qt::RightButton);
return QProxyStyle::styleHint(hint, option, widget, returnData);
}
};
#endif // CLICKABLESLIDERSTYLE_H

17
customkeysequenceedit.cpp Executable file
View File

@ -0,0 +1,17 @@
#include "customkeysequenceedit.h"
#include <QKeyEvent>
CustomKeySequenceEdit::CustomKeySequenceEdit(QWidget *parent) : QKeySequenceEdit(parent) { }
CustomKeySequenceEdit::~CustomKeySequenceEdit() { }
// Thanks to https://stackoverflow.com/a/38424451
void CustomKeySequenceEdit::keyPressEvent(QKeyEvent *pEvent)
{
QKeySequenceEdit::keyPressEvent(pEvent);
int value = keySequence()[0];
QKeySequence shortcut(value);
setKeySequence(shortcut);
}

20
customkeysequenceedit.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef CUSTOMKEYSEQUENCEEDIT_H
#define CUSTOMKEYSEQUENCEEDIT_H
#include <QKeySequenceEdit>
class QKeyEvent;
class CustomKeySequenceEdit : public QKeySequenceEdit
{
Q_OBJECT
public:
explicit CustomKeySequenceEdit(QWidget *parent = 0);
~CustomKeySequenceEdit();
protected:
void keyPressEvent(QKeyEvent *pEvent);
};
#endif // CUSTOMKEYSEQUENCEEDIT_H

View File

@ -1,10 +0,0 @@
[Desktop Entry]
Type=Application
Version=1.0
Name=Soundux
GenericName=Soundboard
Exec=soundux %U
Icon=io.github.Soundux
Terminal=false
Categories=Audio;Music;Player;AudioVideo;
Comment=A universal soundboard that uses PulseAudio modules or PipeWire linking

View File

@ -1,216 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2021 Soundux -->
<component type="desktop-application">
<id>io.github.Soundux</id>
<launchable type="desktop-id">io.github.Soundux.desktop</launchable>
<name>Soundux</name>
<developer_name>Soundux</developer_name>
<summary>A cross-platform soundboard</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0-only</project_license>
<url type="homepage">https://soundux.rocks/</url>
<url type="donation">https://ko-fi.com/soundux/</url>
<url type="bugtracker">https://github.com/Soundux/Soundux/issues</url>
<url type="help">https://github.com/Soundux/Soundux/issues</url>
<description>
<p>
A universal soundboard that uses PulseAudio modules or PipeWire linking
</p>
<p>Features</p>
<ul>
<li>Dark and light theme</li>
<li>Folder tabs</li>
<li>Supports a variety of audio formats</li>
<li>Sound search (can also be opened with CTRL + F)</li>
<li>Sound hotkeys</li>
<li>Stop button and hotkey</li>
<li>App Passthrough (can also be opened with CTRL + G)</li>
<li>Media Controls</li>
</ul>
</description>
<launchable type="desktop-id">
io.github.Soundux.desktop
</launchable>
<categories>
<category>AudioVideo</category>
<category>Audio</category>
</categories>
<screenshots>
<screenshot type="default">
<caption>Dark Interface</caption>
<image>https://raw.githubusercontent.com/Soundux/screenshots/screenshots/playing-dark.png</image>
</screenshot>
<screenshot>
<caption>Dark Settings</caption>
<image>https://raw.githubusercontent.com/Soundux/screenshots/screenshots/settings-dark.png</image>
</screenshot>
<screenshot>
<caption>Light Interface</caption>
<image>https://raw.githubusercontent.com/Soundux/screenshots/screenshots/playing-light.png</image>
</screenshot>
<screenshot>
<caption>Light Grid View</caption>
<image>https://raw.githubusercontent.com/Soundux/screenshots/screenshots/grid-view-light.png</image>
</screenshot>
</screenshots>
<releases>
<release version="0.2.8" date="2022-05-18">
<url>https://github.com/Soundux/Soundux/releases/tag/0.2.8</url>
<description>
<p>Last bugfix release for this iteration of the project</p>
<p>If you didn't know already: We're currently in the progress of a major rework. See issue #591 on GitHub</p>
<ul>
<li>Update translations</li>
<li>Hotkeys rework and MIDI support</li>
<li>Mute during playback on PipeWire</li>
<li>Language override setting</li>
<li>Automatically unload problematic PulseAudio modules</li>
<li>Disable downloader button when not on a tab</li>
<li>Don't prompt for VB-Cable setup when it was not detected</li>
<li>Fixed an issue with the PulseAudio backend (#587)</li>
<li>General bug fixes and stability improvements</li>
</ul>
</description>
</release>
<release version="0.2.7" date="2021-06-04">
<url>https://github.com/Soundux/Soundux/releases/tag/0.2.7</url>
<description>
<ul>
<li>Mono Support for PipeWire</li>
<li>Add Tab opens on last folder and initially opens in home folder</li>
<li>Fix audio playing at 100% in the beginning</li>
<li>New Translations (Greek, Dutch, French)</li>
<li>Fixed Space not working in search</li>
<li>Faster sorting, Per Tab sorting</li>
<li>Added minimum PipeWire version</li>
<li>Arrow Keys to navigate tabs</li>
<li>Set Volume individually</li>
<li>UI Improvements</li>
</ul>
</description>
</release>
<release version="0.2.6" date="2021-05-24">
<url>https://github.com/Soundux/Soundux/releases/tag/0.2.6</url>
<description>
<ul>
<li>Recursive Folder adding</li>
<li>Crashes with PulseAudio</li>
<li>Fix Icons</li>
<li>Bug fixes</li>
</ul>
</description>
</release>
<release version="0.2.5" date="2021-05-24">
<url>https://github.com/Soundux/Soundux/releases/tag/0.2.5</url>
<description>
<ul>
<li>Command line argument to start hidden</li>
<li>Support multiple output apps</li>
<li>Support multiple pass-through apps</li>
<li>Restore output on startup</li>
<li>UI improvements</li>
<li>Bug fixes</li>
</ul>
</description>
</release>
<release version="0.2.4" date="2021-05-18">
<url>https://github.com/Soundux/Soundux/releases/tag/0.2.4</url>
<description>
<ul>
<li>Enable Icon support for flatpak</li>
<li>Fix Blank Page bug on Ubuntu</li>
<li>Fix Crash on Startup</li>
</ul>
</description>
</release>
<release version="0.2.3" date="2021-05-17">
<url>https://github.com/Soundux/Soundux/releases/tag/0.2.3</url>
<description>
<ul>
<li>PipeWire support</li>
<li>Delete confirmation</li>
<li>Open Tab folder</li>
<li>Favorites</li>
<li>Playlist mode</li>
<li>Push to talk keys</li>
<li>Delete Sounds (move to trash)</li>
<li>Improved Launchpad mode</li>
<li>Bug fixes and other improvements</li>
</ul>
</description>
</release>
<release version="0.2.2b3" date="2021-04-01">
<url>https://github.com/Soundux/Soundux/releases/tag/0.2.2_b3</url>
<description>
<ul>
<li>Tray icon</li>
<li>Update notification</li>
<li>Downloader integration (youtube-dl)</li>
<li>UI improvements</li>
<li>Sorting options</li>
<li>Improved Hotkeys</li>
<li>New Search</li>
<li>Application Icons</li>
<li>Launchpad Mode</li>
<li>Mute during playback</li>
<li>System Information</li>
<li>Bug fixes and other improvements</li>
</ul>
</description>
</release>
<release version="0.2.1" date="2021-03-07">
<url>https://github.com/Soundux/Soundux/releases/tag/0.2.1</url>
<description>
<ul>
<li>Play sounds without output application</li>
<li>Bug fixes</li>
</ul>
</description>
</release>
<release version="0.2" date="2021-03-03">
<url>https://github.com/Soundux/Soundux/releases/tag/0.2</url>
<description>
<ul>
<li>New UI</li>
<li>Grid View</li>
<li>Media Controls</li>
<li>Internationalization</li>
<li>Application pass-through</li>
<li>General fixes</li>
</ul>
</description>
</release>
<release version="0.1.6" date="2021-02-06">
<url>https://github.com/Soundux/Soundux/releases/tag/0.1.6</url>
<description>
<ul>
<li>Support FLAC files</li>
<li>Changelogs on Flathub</li>
<li>General bugfixes and stability improvements</li>
<li>Only unload PulseAudio modules created by Soundux</li>
<li>Update stop button state</li>
<li>Prevent opening the program multiple times</li>
</ul>
</description>
</release>
<release version="0.1.5" date="2021-01-03">
<url>https://github.com/Soundux/Soundux/releases/tag/0.1.5</url>
<description>
<ul>
<li>Fix detection for non English systems on Linux</li>
</ul>
</description>
</release>
<release version="0.1.4" date="2020-12-23">
<url>https://github.com/Soundux/Soundux/releases/tag/0.1.4</url>
<description>
<ul>
<li>Use $XDG_CONFIG_HOME on Linux if it's set</li>
<li>UI now closes instantly</li>
</ul>
</description>
</release>
</releases>
<content_rating type="oars-1.1" />
</component>

View File

@ -1,5 +0,0 @@
soundux (0.2.2-1) focal; urgency=medium
* New beta release.
-- D3SOX <d3sox@protonmail.com> Thu, 1 Apr 2021 00:06:00 -0600

View File

@ -1 +0,0 @@
11

View File

@ -1,10 +0,0 @@
Package: soundux
Version: 0.2.8
Architecture: all
Maintainer: D3SOX <d3sox@protonmail.com>
Depends: libgtk-3-0, libwnck-3-0, libappindicator3-1, libwebkit2gtk-4.0-37, libx11-6, pulseaudio
Suggests: ffmpeg, youtube-dl
Section: sound
Priority: optional
Homepage: https://soundux.rocks
Description: A cross-platform soundboard

View File

@ -1,22 +0,0 @@
#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#export DH_VERBOSE = 1
# see FEATURE AREAS in dpkg-buildflags(1)
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
# see ENVIRONMENT in dpkg-buildflags(1)
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
# package maintainers to append LDFLAGS
export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
%:
dh $@
override_dh_auto_configure:
# The existence of an empty .git directory triggers syncqt.
mkdir .git || true
dh_auto_configure --

View File

@ -1,40 +0,0 @@
# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=7
inherit optfeature cmake
DESCRIPTION="A cross-platform soundboard"
HOMEPAGE="https://soundux.rocks"
SRC_URI="https://github.com/Soundux/Soundux/releases/download/${PV}/soundux-${PV}.tar.gz -> ${P}.tar.gz"
LICENSE="GPL-3"
SLOT="0"
KEYWORDS="~amd64"
DEPEND="
dev-libs/libappindicator:3
dev-libs/openssl
media-sound/pulseaudio
media-video/pipewire
net-libs/webkit-gtk:4
x11-base/xorg-server
x11-libs/gtk+:3
"
RDEPEND="${DEPEND}"
S="${WORKDIR}/Soundux"
src_configure() {
local mycmakeargs=(
-DCMAKE_INSTALL_PREFIX="${EPREFIX}"
-DEMBED_PATH="OFF"
)
cmake_src_configure
}
pkg_postinst() {
optfeature "Downloader support" media-video/ffmpeg net-misc/youtube-dl
optfeature "Icon support" x11-libs/libwnck:3
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,76 +0,0 @@
app-id: io.github.Soundux
runtime: org.gnome.Platform
runtime-version: "42"
sdk: org.gnome.Sdk
command: soundux
finish-args:
- --device=dri
- --socket=pulseaudio
- --socket=x11
- --share=network
- --share=ipc
- --filesystem=xdg-run/pipewire-0
- --filesystem=xdg-music:ro
- --filesystem=xdg-download:ro
- --filesystem=xdg-documents:ro
- --filesystem=/run/media:ro
- --filesystem=/media:ro
modules:
- "shared-modules/libappindicator/libappindicator-gtk3-introspection-12.10.json"
- name: libwnck
buildsystem: meson
config-opts:
- "-Dgtk_doc=false"
cleanup:
- "/include"
- "/lib/pkgconfig"
- "/bin"
sources:
- type: git
url: https://gitlab.gnome.org/GNOME/libwnck.git
tag: "40.0"
commit: "d161ed31914711b97a1c6ebef0558d80ce51113b"
- name: soundux
buildsystem: cmake-ninja
config-opts:
- -DUSE_FLATPAK=ON
- -DCMAKE_BUILD_TYPE=Release
- -DFETCHCONTENT_FULLY_DISCONNECTED=ON
post-install:
- "install -Dm 644 -t /app/share/metainfo deployment/appstream/io.github.Soundux.metainfo.xml"
- "install -Dm 644 -t /app/share/applications deployment/appstream/io.github.Soundux.desktop"
- "install -Dm 644 deployment/flatpak/icons/io.github.Soundux-256.png /app/share/icons/hicolor/256x256/apps/io.github.Soundux.png"
sources:
- type: archive
url: https://github.com/Soundux/Soundux/releases/download/0.2.8/soundux-0.2.8.tar.gz
sha256: d007841ae5bab71d8a25cc86d27ce137b01b29a7f2b42a5bd62b4ed50dd74043
- name: ffmpeg
config-opts:
- --enable-shared
- --disable-static
- --disable-doc
- --disable-ffplay
- --disable-devices
- --enable-gnutls
- --enable-libmp3lame
- --enable-libvorbis
sources:
- type: archive
url: https://www.ffmpeg.org/releases/ffmpeg-5.0.1.tar.xz
sha256: ef2efae259ce80a240de48ec85ecb062cecca26e4352ffb3fda562c21a93007b
post-install:
- install -Dm644 COPYING.LGPLv3 /app/share/licenses/ffmpeg/COPYING
cleanup:
- "/share/ffmpeg"
- name: youtube-dl
no-autogen: true
no-make-install: true
make-args:
- youtube-dl
- PYTHON=/usr/bin/python
sources:
- type: archive
url: https://github.com/ytdl-org/youtube-dl/releases/download/2021.12.17/youtube-dl-2021.12.17.tar.gz
sha256: 9f3b99c8b778455165b4525f21505e86c7ff565f3ac319e19733d810194135df
post-install:
- install -Dm0755 -t /app/bin youtube-dl

@ -1 +0,0 @@
Subproject commit 1b470b7982aa820ab2c972c8242f860e83ab6971

View File

@ -1,204 +0,0 @@
; Script generated by the Inno Script Studio Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Soundux"
#define MyAppVersion "0.2.8"
#define MyAppPublisher "Soundux"
#define MyAppURL "https://soundux.rocks"
#define MyAppExeName "soundux.exe"
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{CEF755B2-DDD3-4E35-8DF7-3BDBF86893DE}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
WizardStyle=modern
AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
LicenseFile=$PATH\LICENSE
OutputBaseFilename=setup
SetupIconFile=$PATH\assets\icon.ico
Compression=lzma
SolidCompression=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "armenian"; MessagesFile: "compiler:Languages\Armenian.isl"
Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl"
Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl"
Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl"
Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl"
Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl"
Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl"
Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl"
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl"
Name: "icelandic"; MessagesFile: "compiler:Languages\Icelandic.isl"
Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl"
Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl"
Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl"
Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl"
Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "slovak"; MessagesFile: "compiler:Languages\Slovak.isl"
Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl"
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"
Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl"
Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
Source: "$PATH\build\Release\soundux.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "$PATH\build\Release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{tmp}\VBCABLE_Driver_Pack43.zip"; DestDir: "{app}"; Flags: external deleteafterinstall; Components: VBCable
Source: "{tmp}\MicrosoftEdgeWebView2RuntimeInstallerX64.exe"; DestDir: "{tmp}"; Flags: external deleteafterinstall; Components: MicrosoftEdgeWebView2Runtime
Source: "{tmp}\youtube-dl.exe"; DestDir: "{app}"; Flags: external ignoreversion; Components: FfmpegYouTubeDL
Source: "{tmp}\ffmpeg.exe"; DestDir: "{app}"; Flags: external ignoreversion; Components: FfmpegYouTubeDL
Source: "{tmp}\vcredist_x86.exe"; DestDir: "{tmp}"; Flags: external deleteafterinstall; Components: FfmpegYouTubeDL
Source: "{tmp}\vcredist_x64.exe"; DestDir: "{tmp}"; Flags: external deleteafterinstall; Components: FfmpegYouTubeDL
[Dirs]
Name: "{app}"; Permissions: users-full
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
[Code]
#IFDEF UNICODE
#DEFINE AW "W"
#ELSE
#DEFINE AW "A"
#ENDIF
type
INSTALLSTATE = Longint;
const
INSTALLSTATE_INVALIDARG = -2; { An invalid parameter was passed to the function. }
INSTALLSTATE_UNKNOWN = -1; { The product is neither advertised or installed. }
INSTALLSTATE_ADVERTISED = 1; { The product is advertised but not installed. }
INSTALLSTATE_ABSENT = 2; { The product is installed for a different user. }
INSTALLSTATE_DEFAULT = 5; { The product is installed for the current user. }
VC_2010_REDIST_X86 = '{196BB40D-1578-3D01-B289-BEFC77A11A1E}';
VC_2010_REDIST_X64 = '{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}';
function IsWebView2NotInstalled: boolean;
begin
result := not RegKeyExists(HKEY_LOCAL_MACHINE,
'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft EdgeWebView');
end;
function MsiQueryProductState(szProduct: string): INSTALLSTATE;
external 'MsiQueryProductState{#AW}@msi.dll stdcall';
function VCVersionInstalled(const ProductID: string): Boolean;
begin
Result := MsiQueryProductState(ProductID) = INSTALLSTATE_DEFAULT;
end;
function VCRedistNeedsInstall: Boolean;
begin
Result := not (VCVersionInstalled(VC_2010_REDIST_X86) and VCVersionInstalled(VC_2010_REDIST_X64));
end;
const
SHCONTCH_NOPROGRESSBOX = 4;
SHCONTCH_RESPONDYESTOALL = 16;
procedure UnZip(ZipPath, TargetPath: string);
var
Shell: Variant;
ZipFile: Variant;
TargetFolder: Variant;
begin
Shell := CreateOleObject('Shell.Application');
ZipFile := Shell.NameSpace(ZipPath);
if VarIsClear(ZipFile) then
RaiseException(Format('ZIP file "%s" does not exist or cannot be opened', [ZipPath]));
TargetFolder := Shell.NameSpace(TargetPath);
if VarIsClear(TargetFolder) then
RaiseException(Format('Target path "%s" does not exist', [TargetPath]));
TargetFolder.CopyHere(ZipFile.Items, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);
end;
var
DownloadPage: TDownloadWizardPage;
function OnDownloadProgress(const Url, FileName: String; const Progress, ProgressMax: Int64): Boolean;
begin
if Progress = ProgressMax then
Log(Format('Successfully downloaded file to {tmp}: %s', [FileName]));
Result := True;
end;
procedure InitializeWizard;
begin
DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), @OnDownloadProgress);
end;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = wpReady then begin
DownloadPage.Clear;
if (WizardIsComponentSelected('MicrosoftEdgeWebView2Runtime')) then begin
DownloadPage.Add('https://go.microsoft.com/fwlink/?linkid=2124701', 'MicrosoftEdgeWebView2RuntimeInstallerX64.exe', '');
end;
if WizardIsComponentSelected('VBCable') then begin
DownloadPage.Add('https://download.vb-audio.com/Download_CABLE/VBCABLE_Driver_Pack43.zip', 'VBCABLE_Driver_Pack43.zip', '')
end;
if WizardIsComponentSelected('FfmpegYouTubeDL') then begin
DownloadPage.Add('https://github.com/eugeneware/ffmpeg-static/releases/download/b5.0/win32-x64', 'ffmpeg.exe', '')
DownloadPage.Add('https://github.com/ytdl-org/youtube-dl/releases/download/2021.12.17/youtube-dl.exe', 'youtube-dl.exe', '')
DownloadPage.Add('https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe', 'vcredist_x86.exe', '')
DownloadPage.Add('https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe', 'vcredist_x64.exe', '')
end;
DownloadPage.Show;
try
try
DownloadPage.Download;
Result := True;
except
Result := False;
end;
finally
if (Result and WizardIsComponentSelected('VBCable')) then begin
UnZip(ExpandConstant('{tmp}') + '\VBCABLE_Driver_Pack43.zip', ExpandConstant('{tmp}'))
end;
DownloadPage.Hide;
end;
end else
Result := True;
end;
[Run]
Filename: "{tmp}\MicrosoftEdgeWebView2RuntimeInstallerX64.exe"; Parameters: "/silent /install"; WorkingDir: "{tmp}"; Flags: 64bit; Description: "Install Microsoft Edge WebView2 Runtime"; Components: MicrosoftEdgeWebView2Runtime
Filename: "{tmp}\VBCABLE_Setup_x64.exe"; Parameters: "-h -i"; WorkingDir: "{tmp}"; Flags: 64bit; Description: "Install VB Cable"; Components: VBCable
Filename: "{tmp}\vcredist_x86.exe"; Parameters: "/q /norestart"; Check: VCRedistNeedsInstall; Components: FfmpegYouTubeDL
Filename: "{tmp}\vcredist_x64.exe"; Parameters: "/q /norestart"; Check: VCRedistNeedsInstall; Components: FfmpegYouTubeDL
Filename: "{app}\{#MyAppExeName}"; Flags: nowait postinstall skipifsilent; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"
[Components]
Name: "MicrosoftEdgeWebView2Runtime"; Description: "Install Microsoft Edge WebView2 Runtime (mandatory)"; Types: custom full compact; Flags: fixed disablenouninstallwarning; Check: IsWebView2NotInstalled
Name: "VBCable"; Description: "Install VBCable (recommended)"; Types: full; Flags: disablenouninstallwarning
Name: "FfmpegYouTubeDL"; Description: "Install ffmpeg and youtube-dl (for Downloader support)"; Types: full; Flags: disablenouninstallwarning

View File

@ -1,65 +0,0 @@
%global debug_package %{nil}
%global repo_url https://github.com/Soundux/Soundux
Name: soundux
Version: 0.2.8
Release: 1%{?dist}
Summary: A cross-platform soundboard
License: GPLv3+
URL: https://soundux.rocks
Source0: %{repo_url}/releases/download/%{version}/%{name}-%{version}.tar.gz
BuildRequires: cmake >= 3.1
BuildRequires: clang llvm ninja-build
BuildRequires: gtk3-devel
BuildRequires: libappindicator-gtk3-devel
BuildRequires: libwnck3-devel
BuildRequires: libXi-devel
BuildRequires: openssl-devel
BuildRequires: pipewire-devel
BuildRequires: pulseaudio-libs-devel
BuildRequires: webkit2gtk3-devel
BuildRequires: desktop-file-utils libappstream-glib
Requires: libappindicator-gtk3
Requires: libwnck3
Requires: (pulseaudio or pipewire-pulseaudio)
Requires: redhat-lsb-core
Requires: webkit2gtk3
Recommends: ffmpeg youtube-dl
%description
A universal soundboard that uses PulseAudio modules or PipeWire linking
%prep
%autosetup -n Soundux
%build
mkdir -p build
cd build
cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release
ninja
%install
cd build
DESTDIR=%{buildroot} ninja install
mkdir -p %{buildroot}%{_bindir}
ln -s /opt/soundux/soundux %{buildroot}%{_bindir}/%{name}
%check
desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop
appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/*.xml
%files
%license LICENSE
%doc README.md
/opt/%{name}
%{_bindir}/soundux
%{_datadir}/applications/*.desktop
%{_datadir}/pixmaps/*.png
%{_metainfodir}/*.xml
%changelog
* Wed May 26 2021 Arvin Verain <acverain@up.edu.ph> - 0.2.6-1
- Initial COPR package

View File

@ -1,10 +0,0 @@
[Desktop Entry]
Type=Application
Version=1.0
Name=Soundux
GenericName=Soundboard
Exec=/opt/soundux/soundux
Icon=soundux
Terminal=false
Categories=Audio;Music;Player;AudioVideo;
Comment=A universal soundboard that uses PulseAudio modules or PipeWire linking

17
docs/README.md Executable file
View File

@ -0,0 +1,17 @@
# Soundux
### Soundux is a universal soundboard in Qt for linux using pulseaudio modules
# Features
- Simple UI
- Tabs to organize your sounds
- Automatically add a folder as tab
- Global hotkeys
- Saves configuration automatically
- Uses PulseAudio modules so it should work on almost any distribution
- Output to any recording stream
- Supports most common audio formats (mp3, wav, ogg)
- more to come...
# Screenshots
to be added...

8
docs/_config.yml Executable file
View File

@ -0,0 +1,8 @@
theme: jekyll-theme-cayman
plugins:
- jekyll-relative-links
relative_links:
enabled: true
collections: true
include:
- README.md

View File

@ -1,258 +0,0 @@
<div align="center">
<p>
Lisez la documentation dans:
<br>
<a href="https://github.com/Soundux/Soundux/blob/master/README.md">[Anglais/English]</a>
<a href="https://github.com/Soundux/Soundux/blob/master/i18n/LISEZMOI.md">[Français/French]</a>
<a href="https://github.com/Soundux/Soundux/blob/master/i18n/ПРОЧТИМЕНЯ.md">[Russe/Russian]</a>
<br><br><br>
<img src="../assets/logo.gif" height="200"/>
<br>
<h6>Un soundboard Multi-Plateformes 🔊</h6>
<br>
<a href="https://github.com/Soundux/Soundux/releases">
<img src="https://img.shields.io/github/release/Soundux/Soundux.svg?style=flat-square" alt="Latest Stable Release" />
</a>
<br>
<a href="https://github.com/Soundux/Soundux/stargazers">
<img src="https://img.shields.io/github/stars/Soundux/soundux?style=flat-square" alt="GitHub Repo stars">
</a>
<a href="https://github.com/Soundux/Soundux/issues">
<img src="https://img.shields.io/github/issues/Soundux/soundux?style=flat-square" alt="GitHub issues">
</a>
<a href="https://github.com/Soundux/Soundux/pulls">
<img src="https://img.shields.io/github/issues-pr-raw/Soundux/soundux?label=pulls&style=flat-square" alt="GitHub pull requests">
</a>
<br>
<a href="https://github.com/Soundux/Soundux/blob/master/LICENSE">
<img src="https://img.shields.io/github/license/Soundux/Soundux.svg?style=flat-square" alt="License" />
</a>
<a href="https://discord.gg/4HwSGN4Ec2">
<img src="https://img.shields.io/discord/697348809591750706?label=discord&style=flat-square" alt="Discord" />
</a>
<a href="https://matrix.to/#/!XlIlRgKzoRavKnurkt:matrix.org">
<img src="https://img.shields.io/badge/chat-matrix%20space-blue?style=flat-square" alt="Matrix" />
</a>
<br>
<a href="https://github.com/Soundux/Soundux/actions?query=workflow%3A%22Build+on+Windows%22">
<img src="https://img.shields.io/github/workflow/status/Soundux/Soundux/Build%20on%20Windows?label=windows%20build&style=flat-square" alt="Windows Build" />
</a>
<a href="https://github.com/Soundux/Soundux/actions?query=workflow%3A%22Build+on+Linux%22">
<img src="https://img.shields.io/github/workflow/status/Soundux/Soundux/Build%20on%20Linux?label=linux%20build&style=flat-square" alt="Linux Build" />
</a>
<a href="https://github.com/Soundux/Soundux/actions?query=workflow%3A%22Build+Flatpak%22">
<img src="https://img.shields.io/github/workflow/status/Soundux/Soundux/Build%20Flatpak?label=flatpak%20build&style=flat-square" alt="Flatpak Build" />
</a>
<hr>
<a href="https://discord.com/invite/4HwSGN4Ec2">
<img src="https://invidget.switchblade.xyz/4HwSGN4Ec2" alt="Discord Invite"/>
</a>
<a href="https://hosted.weblate.org/engage/soundux/">
<img src="https://hosted.weblate.org/widgets/soundux/-/frontend/multi-green.svg" alt="Translation status" />
</a>
</p>
</div>
# 👀 Aperçu
| ![Dark Interface](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/home-dark.png) | ![Light Interface](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/home-light.png) |
| -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| ![Settings Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/settings-dark.png) | ![Settings Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/settings-light.png) |
| ![Search Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/search-dark.png) | ![Search Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/search-light.png) |
| ![Application Passthrough](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/pass-through-dark.png) | ![Application Passthrough](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/pass-through-light.png) |
| ![Seek/Pause/Stop Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/multiple-playing-dark.png) | ![Seek/Pause/Stop Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/multiple-playing-light.png) |
| ![Grid View Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/grid-view-dark.png) | ![Grid View Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/grid-view-light.png) |
# 👋 Introduction
Soundux est un Soundboard multi-plateformes qui possède une interface utilisateur simple .
Avec Soundux vous pouvez jouer de l'audio à une application en particulier sous linux et pour votre VB-Cable sink pour Windows.
# Dépendances d'exécution
Ces fichiers sont nécéssaire pour le fonctionnement du programe.
## 🐧 Linux
S'il vous plait, vous référez aux instructions pour votre distribution Linux.
- [pulseaudio](https://gitlab.freedesktop.org/pulseaudio/pulseaudio) / [pipewire](https://pipewire.org/) >= 0.3.26
- Xorg
- Libwnck3 (optionnel,pour le support d'icones)
- Webkit2gtk
- libappindicator3
- [youtube-dl](https://youtube-dl.org/) & [ffmpeg](https://www.ffmpeg.org/) (optionnel, Pour utiliser la fonction de téléchargement)
## <img src="https://www.vectorlogo.zone/logos/microsoft/microsoft-icon.svg" height="20"/> Windows
- [VB-CABLE](https://vb-audio.com/Cable/) (Notre installateur installe automatiquement VB-Cable)
- [Webview2 Runtime](https://developer.microsoft.com/microsoft-edge/webview2/) (ceci est d'office dans l'installateur)
- [youtube-dl](https://youtube-dl.org/) & [ffmpeg](https://www.ffmpeg.org/) (optionnel, Pour utiliser la fonction de téléchargement)
# 📥 Installation
## 🐧 Linux
### <img src="https://www.vectorlogo.zone/logos/archlinux/archlinux-icon.svg" height="20"/> Arch Linux et dérivés.
Vous pouvez installer notre paquet avec votre AUR helper de choix ce qui vas automatiquement compiler et installer la dernière version
publiée.
```sh
yay -S soundux
```
Nous avons aussi un paquet `soundux-git` qui se compile directement de la branche maitre (master)
### <img src="https://www.vectorlogo.zone/logos/ubuntu/ubuntu-icon.svg" height="20"/> Ubuntu et dérivés
Vous pouvez installer Soundux via [pacstall](https://github.com/pacstall/pacstall)
```sh
pacstall -I soundux
```
### <img src="https://www.vectorlogo.zone/logos/getfedora/getfedora-icon.svg" height="20"> Fedora
Soundux peut être installé via [COPR repository](https://copr.fedorainfracloud.org/coprs/rivenirvana/soundux/)
```sh
sudo dnf copr enable rivenirvana/soundux
sudo dnf install soundux pipewire-devel
```
### <img src="https://www.vectorlogo.zone/logos/linuxfoundation/linuxfoundation-icon.svg" height="20" /> Paquets Distro-agnostic
Vous pouvez prendre directement la dernière version depuis le snapstore ou flathub
[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/soundux)
<a href='https://flathub.org/apps/details/io.github.Soundux'>
<img width='240' alt='Download on Flathub' src='https://flathub.org/assets/badges/flathub-badge-en.png'/>
</a>
## <img src="https://www.vectorlogo.zone/logos/microsoft/microsoft-icon.svg" height="20"/> Windows
Télécharger notre installateur ou version portable [de la dernière version publiée](https://github.com/Soundux/Soundux/releases/latest)
# 🔨 Compilation
## 🔗 build les dépendances
### 🐧 Linux
- Webkit2gtk
- PulseAudio development headers
- PipeWire development headers
- X11 client-side development headers
- libappindicator3 development headers
- OpenSSL development headers
- G++ >= 9
- Certaines distributions ont toujours la G++ versions < 9 dans leur repos. Les utilisé résulterons a une erreur de construction (pour plus d'informations se réfferer à (anglais) [#71](https://github.com/Soundux/Soundux/issues/71)).
#### <img src="https://www.vectorlogo.zone/logos/debian/debian-icon.svg" height="20"/> Debian / <img src="https://www.vectorlogo.zone/logos/ubuntu/ubuntu-icon.svg" height="20"/> Ubuntu et dérivés
```sh
sudo apt install git build-essential cmake libx11-dev libxi-dev libwebkit2gtk-4.0-dev libappindicator3-dev libssl-dev libpulse-dev libpipewire-0.3-dev
```
> Si vous êtes sous Ubuntu 20.04 ou plus vieux, vous devrez peut être ajouter le PipeWire PPA:
> `sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream`
#### <img src="https://www.vectorlogo.zone/logos/getfedora/getfedora-icon.svg" height="20"> Fedora et dérivés
```sh
sudo dnf install git webkit2gtk3 cmake llvm clang libXi-devel gtk3-devel webkit2gtk3-devel libappindicator-gtk3-devel pulseaudio-libs-devel pipewire-devel
```
### <img src="https://www.vectorlogo.zone/logos/microsoft/microsoft-icon.svg" height="20"/> Windows
- Nuget
- MSVC
- CMake
- OpenSSL
## 👷 Build
Clonez le repo
```sh
git clone https://github.com/Soundux/Soundux.git
cd Soundux
git submodule update --init --recursive
```
Créer un dossier de build et commencer la compilation
```sh
mkdir build
cd build
cmake ..
cmake --build . --config Release
```
Pour lancer le programme
```sh
./soundux # .\soundux.exe on Windows
```
## 🖥️ Installation
### 🐧 Linux
```sh
sudo make install
```
# 📝 Pourquoi _Soundux_?
Le projet a démarré comme **Sound**board pour Lin**ux**
# 🗒️ License
Le code est licensé sous [GPLv3](../LICENSE)
# ✍️ Contribution
Les règles de conduite pour la contribution peuvent être trouvé [ici](../CONTRIBUTING.md), S'il vous plait, consultez les si vous prévoyez de contribuer.
# ✨ Aidants
Milles merci à tout ce beaux monde! ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://github.com/Curve"><img src="https://avatars.githubusercontent.com/u/37805707?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Noah</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3ACurve" title="Bug reports">🐛</a> <a href="#business-Curve" title="Business development">💼</a> <a href="https://github.com/Soundux/Soundux/commits?author=Curve" title="Code">💻</a> <a href="#design-Curve" title="Design">🎨</a> <a href="#ideas-Curve" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-Curve" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-Curve" title="Maintenance">🚧</a> <a href="#platform-Curve" title="Packaging/porting to new platform">📦</a> <a href="#projectManagement-Curve" title="Project Management">📆</a> <a href="#question-Curve" title="Answering Questions">💬</a> <a href="https://github.com/Soundux/Soundux/pulls?q=is%3Apr+reviewed-by%3ACurve" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/Soundux/Soundux/commits?author=Curve" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/D3SOX"><img src="https://avatars.githubusercontent.com/u/24937357?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Nico</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AD3SOX" title="Bug reports">🐛</a> <a href="#business-D3SOX" title="Business development">💼</a> <a href="https://github.com/Soundux/Soundux/commits?author=D3SOX" title="Code">💻</a> <a href="#design-D3SOX" title="Design">🎨</a> <a href="#ideas-D3SOX" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-D3SOX" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-D3SOX" title="Maintenance">🚧</a> <a href="#platform-D3SOX" title="Packaging/porting to new platform">📦</a> <a href="#projectManagement-D3SOX" title="Project Management">📆</a> <a href="#question-D3SOX" title="Answering Questions">💬</a> <a href="https://github.com/Soundux/Soundux/pulls?q=is%3Apr+reviewed-by%3AD3SOX" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/Soundux/Soundux/commits?author=D3SOX" title="Tests">⚠️</a> <a href="#translation-D3SOX" title="Translation">🌍</a> <a href="#a11y-D3SOX" title="Accessibility">️️️️♿️</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/MrKingMichael"><img src="https://avatars.githubusercontent.com/u/30067605?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Michael</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AMrKingMichael" title="Bug reports">🐛</a> <a href="#ideas-MrKingMichael" title="Ideas, Planning, & Feedback">🤔</a> <a href="#translation-MrKingMichael" title="Translation">🌍</a> <a href="https://github.com/Soundux/Soundux/commits?author=MrKingMichael" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/BrandonKMLee"><img src="https://avatars.githubusercontent.com/u/58927531?v=4?s=50" width="50px;" alt=""/><br /><sub><b>BrandonKMLee</b></sub></a><br /><a href="#ideas-BrandonKMLee" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Toadfield"><img src="https://avatars.githubusercontent.com/u/68649672?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Toadfield</b></sub></a><br /><a href="#ideas-Toadfield" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/Soundux/Soundux/issues?q=author%3AToadfield" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/fubka"><img src="https://avatars.githubusercontent.com/u/44064746?v=4?s=50" width="50px;" alt=""/><br /><sub><b>fubka</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Afubka" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/TheOriginalTripleD"><img src="https://avatars.githubusercontent.com/u/6907054?v=4?s=50" width="50px;" alt=""/><br /><sub><b>TheOriginalTripleD</b></sub></a><br /><a href="#research-TheOriginalTripleD" title="Research">🔬</a></td>
<td align="center"><a href="https://github.com/UltraBlackLinux"><img src="https://avatars.githubusercontent.com/u/62404294?v=4?s=50" width="50px;" alt=""/><br /><sub><b>UltraBlackLinux</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AUltraBlackLinux" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://bendem.be/"><img src="https://avatars.githubusercontent.com/u/2681677?v=4?s=50" width="50px;" alt=""/><br /><sub><b>bendem</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Abendem" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://edgar.bzh/"><img src="https://avatars.githubusercontent.com/u/46636609?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Edgar Onghena</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Aedgarogh" title="Bug reports">🐛</a> <a href="#research-edgarogh" title="Research">🔬</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/moggesmith10"><img src="https://avatars.githubusercontent.com/u/33375517?v=4?s=50" width="50px;" alt=""/><br /><sub><b>moggesmith10</b></sub></a><br /><a href="#ideas-moggesmith10" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://belmoussaoui.com/"><img src="https://avatars.githubusercontent.com/u/7660997?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Bilal Elmoussaoui</b></sub></a><br /><a href="#platform-bilelmoussaoui" title="Packaging/porting to new platform">📦</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/thomasfinstad"><img src="https://avatars.githubusercontent.com/u/5358752?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Thomas Finstad Larsen</b></sub></a><br /><a href="#ideas-thomasfinstad" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="http://arthurmelton.me"><img src="https://avatars.githubusercontent.com/u/29708070?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Arthur Melton</b></sub></a><br /><a href="#ideas-AMTitan" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/serkan-maker"><img src="https://avatars.githubusercontent.com/u/63740626?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Serkan ÖNDER</b></sub></a><br /><a href="#translation-serkan-maker" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/pizzadude"><img src="https://avatars.githubusercontent.com/u/1454420?v=4?s=50" width="50px;" alt=""/><br /><sub><b>PizzaDude</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Apizzadude" title="Bug reports">🐛</a> <a href="#research-pizzadude" title="Research">🔬</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Kylianalex"><img src="https://avatars.githubusercontent.com/u/66625058?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Kylianalex</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AKylianalex" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://gregerstoltnilsen.net/"><img src="https://avatars.githubusercontent.com/u/1364443?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Greger</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Agregersn" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/rivenirvana"><img src="https://avatars.githubusercontent.com/u/43519644?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Arvin Verain</b></sub></a><br /><a href="#platform-rivenirvana" title="Packaging/porting to new platform">📦</a></td>
<td align="center"><a href="http://einfacheinalex.eu/"><img src="https://avatars.githubusercontent.com/u/20642291?v=4?s=50" width="50px;" alt=""/><br /><sub><b>EinfachEinAlex</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/commits?author=EinfachEinAlex" title="Code">💻</a> <a href="#research-EinfachEinAlex" title="Research">🔬</a> <a href="https://github.com/Soundux/Soundux/commits?author=EinfachEinAlex" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center"><a href="https://discord.gg/ubmTQnuM3Z"><img src="https://avatars.githubusercontent.com/u/69876322?v=4?s=50" width="50px;" alt=""/><br /><sub><b>MeblIkea</b></sub></a><br /><a href="#translation-MeblIkea" title="Translation">🌍</a></td>
<td align="center"><a href="https://nathanbonnemains.squill.fr/"><img src="https://avatars.githubusercontent.com/u/45366162?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Nathan Bonnemains</b></sub></a><br /><a href="#translation-NathanBnm" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/lucasvbeek"><img src="https://avatars.githubusercontent.com/u/29404838?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Lucas van Beek</b></sub></a><br /><a href="#translation-lucasvbeek" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/underhood"><img src="https://avatars.githubusercontent.com/u/6674623?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Timotej S.</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Aunderhood" title="Bug reports">🐛</a> <a href="https://github.com/Soundux/Soundux/commits?author=underhood" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/3JlOy-PYCCKUi"><img src="https://avatars.githubusercontent.com/u/46464602?v=4?s=50" width="50px;" alt=""/><br /><sub><b>3JlOy_PYCCKUi</b></sub></a><br /><a href="#translation-3JlOy-PYCCKUi" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/FuRyQC"><img src="https://avatars.githubusercontent.com/u/91005051?v=4?s=50" width="50px;" alt=""/><br /><sub><b>FuRyQC</b></sub></a><br /><a href="#translation-FuRyQC" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://moral.net.au"><img src="https://avatars.githubusercontent.com/u/16875700?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Scott Percival</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Amoralrecordings" title="Bug reports">🐛</a> <a href="https://github.com/Soundux/Soundux/commits?author=moralrecordings" title="Tests">⚠️</a> <a href="https://github.com/Soundux/Soundux/commits?author=moralrecordings" title="Code">💻</a></td>
</tr>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
Ce projet suis les spécifications de [all-contributors](https://github.com/all-contributors/all-contributors) Les contributions de toute sortes sont bienvenue!

View File

@ -1,258 +0,0 @@
<div align="center">
<p>
Читайте документацию на:
<br>
<a href="https://github.com/Soundux/Soundux/blob/master/README.md">[Английском/English]</a>
<a href="https://github.com/Soundux/Soundux/blob/master/i18n/LISEZMOI.md">[Французском/French]</a>
<a href="https://github.com/Soundux/Soundux/blob/master/i18n/ПРОЧТИМЕНЯ.md">[Русском/Russian]</a>
<br><br><br>
<img src="../assets/logo.gif" height="200"/>
<br>
<h6>Кроссплатформенный soundboard 🔊</h6>
<br>
<a href="https://github.com/Soundux/Soundux/releases">
<img src="https://img.shields.io/github/release/Soundux/Soundux.svg?style=flat-square" alt="Latest Stable Release" />
</a>
<br>
<a href="https://github.com/Soundux/Soundux/stargazers">
<img src="https://img.shields.io/github/stars/Soundux/soundux?style=flat-square" alt="GitHub Repo stars">
</a>
<a href="https://github.com/Soundux/Soundux/issues">
<img src="https://img.shields.io/github/issues/Soundux/soundux?style=flat-square" alt="GitHub issues">
</a>
<a href="https://github.com/Soundux/Soundux/pulls">
<img src="https://img.shields.io/github/issues-pr-raw/Soundux/soundux?label=pulls&style=flat-square" alt="GitHub pull requests">
</a>
<br>
<a href="https://github.com/Soundux/Soundux/blob/master/LICENSE">
<img src="https://img.shields.io/github/license/Soundux/Soundux.svg?style=flat-square" alt="License" />
</a>
<a href="https://discord.gg/4HwSGN4Ec2">
<img src="https://img.shields.io/discord/697348809591750706?label=discord&style=flat-square" alt="Discord" />
</a>
<a href="https://matrix.to/#/!XlIlRgKzoRavKnurkt:matrix.org">
<img src="https://img.shields.io/badge/chat-matrix%20space-blue?style=flat-square" alt="Matrix" />
</a>
<br>
<a href="https://github.com/Soundux/Soundux/actions?query=workflow%3A%22Build+on+Windows%22">
<img src="https://img.shields.io/github/workflow/status/Soundux/Soundux/Build%20on%20Windows?label=windows%20build&style=flat-square" alt="Windows Build" />
</a>
<a href="https://github.com/Soundux/Soundux/actions?query=workflow%3A%22Build+on+Linux%22">
<img src="https://img.shields.io/github/workflow/status/Soundux/Soundux/Build%20on%20Linux?label=linux%20build&style=flat-square" alt="Linux Build" />
</a>
<a href="https://github.com/Soundux/Soundux/actions?query=workflow%3A%22Build+Flatpak%22">
<img src="https://img.shields.io/github/workflow/status/Soundux/Soundux/Build%20Flatpak?label=flatpak%20build&style=flat-square" alt="Flatpak Build" />
</a>
<hr>
<a href="https://discord.com/invite/4HwSGN4Ec2">
<img src="https://invidget.switchblade.xyz/4HwSGN4Ec2" alt="Discord Invite"/>
</a>
<a href="https://hosted.weblate.org/engage/soundux/">
<img src="https://hosted.weblate.org/widgets/soundux/-/frontend/multi-green.svg" alt="Translation status" />
</a>
</p>
</div>
# 👀 Предпросмотр
| ![Dark Interface](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/home-dark.png) | ![Light Interface](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/home-light.png) |
| -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| ![Settings Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/settings-dark.png) | ![Settings Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/settings-light.png) |
| ![Search Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/search-dark.png) | ![Search Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/search-light.png) |
| ![Application Passthrough](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/pass-through-dark.png) | ![Application Passthrough](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/pass-through-light.png) |
| ![Seek/Pause/Stop Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/multiple-playing-dark.png) | ![Seek/Pause/Stop Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/multiple-playing-light.png) |
| ![Grid View Dark](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/grid-view-dark.png) | ![Grid View Light](https://raw.githubusercontent.com/Soundux/screenshots/screenshots/grid-view-light.png) |
# 👋 Введение
Soundux это кроссплатформенный soundboard с простым интерфейсом.
С помощью Soundux вы можете проигрывать аудиофайлы в определенное приложение на Linux и в VB-CABLE на Windows.
# 🏃 Зависимости запуска
Эти зависимости необходимы чтобы запустить программу
## 🐧 Linux
Пожалуйста воспользуйтесь инструкцией вашего дистрибутива по установке
- [pulseaudio](https://gitlab.freedesktop.org/pulseaudio/pulseaudio) / [pipewire](https://pipewire.org/) >= 0.3.26
- Xorg
- Libwnck3 (опционально, для поддержки иконок)
- Webkit2gtk
- libappindicator3
- [youtube-dl](https://youtube-dl.org/) & [ffmpeg](https://www.ffmpeg.org/) (опционально, для поддержки загрузки)
## <img src="https://www.vectorlogo.zone/logos/microsoft/microsoft-icon.svg" height="20"/> Windows
- [VB-CABLE](https://vb-audio.com/Cable/) (Наш установщик автоматически устанавливает VB-CABLE)
- [Webview2 Runtime](https://developer.microsoft.com/microsoft-edge/webview2/) (Тоже поставляется вместе с установщиком)
- [youtube-dl](https://youtube-dl.org/) & [ffmpeg](https://www.ffmpeg.org/) (опционально, для поддержки загрузки)
# 📥 Установка
## 🐧 Linux
### <img src="https://www.vectorlogo.zone/logos/archlinux/archlinux-icon.svg" height="20"/> Arch Linux и производные
Вы можете установить наш пакет с помощью вашего AUR помошника, который автоматически соберет и установит последний релиз
```sh
yay -S soundux
```
Мы так же предоставляем пакет `soundux-git` который соберет программу из ветки master
### <img src="https://www.vectorlogo.zone/logos/ubuntu/ubuntu-icon.svg" height="20"/> Ubuntu и производные
Вы можете установить Soundux с помощью [pacstall](https://github.com/pacstall/pacstall)
```sh
pacstall -I soundux
```
### <img src="https://www.vectorlogo.zone/logos/getfedora/getfedora-icon.svg" height="20"> Fedora
Soundux может быть установлен с помощью этого [COPR репозитория](https://copr.fedorainfracloud.org/coprs/rivenirvana/soundux/)
```sh
sudo dnf copr enable rivenirvana/soundux
sudo dnf install soundux pipewire-devel
```
### <img src="https://www.vectorlogo.zone/logos/linuxfoundation/linuxfoundation-icon.svg" height="20" /> Дистрибутивонезависимые пакеты
Вы можете получить последний релиз из Snap Store или Flathub
[![Установить из Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/soundux)
<a href='https://flathub.org/apps/details/io.github.Soundux'>
<img width='240' alt='Установить из Flathub' src='https://flathub.org/assets/badges/flathub-badge-en.png'/>
</a>
## <img src="https://www.vectorlogo.zone/logos/microsoft/microsoft-icon.svg" height="20"/> Windows
Скачайте наш установщик или портативную версию [последнего релиза](https://github.com/Soundux/Soundux/releases/latest)
# 🔨 Сборка
## 🔗 Зависимости сборки
### 🐧 Linux
- Webkit2gtk
- PulseAudio development headers
- PipeWire development headers
- X11 client-side development headers
- libappindicator3 development headers
- OpenSSL development headers
- G++ >= 9
- Некоторые дистрибутивы все еще имеют G++ версии < 9 в своих репозиториях, используя их вы получите ошибку сборки (подробнее [#71](https://github.com/Soundux/Soundux/issues/71)).
#### <img src="https://www.vectorlogo.zone/logos/debian/debian-icon.svg" height="20"/> Debian / <img src="https://www.vectorlogo.zone/logos/ubuntu/ubuntu-icon.svg" height="20"/> Ubuntu и производные
```sh
sudo apt install git build-essential cmake libx11-dev libxi-dev libwebkit2gtk-4.0-dev libappindicator3-dev libssl-dev libpulse-dev libpipewire-0.3-dev
```
> Если вы на Ubuntu 20.04 или ниже вам возможно придется добавить PipeWire PPA:
> `sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream`
#### <img src="https://www.vectorlogo.zone/logos/getfedora/getfedora-icon.svg" height="20"> Fedora и производные
```sh
sudo dnf install git webkit2gtk3 cmake llvm clang libXi-devel gtk3-devel webkit2gtk3-devel libappindicator-gtk3-devel pulseaudio-libs-devel pipewire-devel
```
### <img src="https://www.vectorlogo.zone/logos/microsoft/microsoft-icon.svg" height="20"/> Windows
- Nuget
- MSVC
- CMake
- OpenSSL
## 👷 Сборка
Склонируйте репозиторий
```sh
git clone https://github.com/Soundux/Soundux.git
cd Soundux
git submodule update --init --recursive
```
Создайте дирректорию сборки и начите сборку
```sh
mkdir build
cd build
cmake ..
cmake --build . --config Release
```
Чтобы запустить программу
```sh
./soundux # .\soundux.exe на Windows
```
## 🖥️ Установка
### 🐧 Linux
```sh
sudo make install
```
# 📝 Почему _Soundux_?
Проект начался как **Sound**board для Lin**ux**
# 🗒️ Лицензия
Исходный код лицензирован под [GPLv3](LICENSE)
# ✍️ Внести вклад
Руководство вы можете найти [здесь](CONTRIBUTING.md), пожалуйста, изучите его если вы собираетесь вносить вклад!
# ✨ Contributors
Спасибо этим замечательным людям ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://github.com/Curve"><img src="https://avatars.githubusercontent.com/u/37805707?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Noah</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3ACurve" title="Bug reports">🐛</a> <a href="#business-Curve" title="Business development">💼</a> <a href="https://github.com/Soundux/Soundux/commits?author=Curve" title="Code">💻</a> <a href="#design-Curve" title="Design">🎨</a> <a href="#ideas-Curve" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-Curve" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-Curve" title="Maintenance">🚧</a> <a href="#platform-Curve" title="Packaging/porting to new platform">📦</a> <a href="#projectManagement-Curve" title="Project Management">📆</a> <a href="#question-Curve" title="Answering Questions">💬</a> <a href="https://github.com/Soundux/Soundux/pulls?q=is%3Apr+reviewed-by%3ACurve" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/Soundux/Soundux/commits?author=Curve" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/D3SOX"><img src="https://avatars.githubusercontent.com/u/24937357?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Nico</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AD3SOX" title="Bug reports">🐛</a> <a href="#business-D3SOX" title="Business development">💼</a> <a href="https://github.com/Soundux/Soundux/commits?author=D3SOX" title="Code">💻</a> <a href="#design-D3SOX" title="Design">🎨</a> <a href="#ideas-D3SOX" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-D3SOX" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-D3SOX" title="Maintenance">🚧</a> <a href="#platform-D3SOX" title="Packaging/porting to new platform">📦</a> <a href="#projectManagement-D3SOX" title="Project Management">📆</a> <a href="#question-D3SOX" title="Answering Questions">💬</a> <a href="https://github.com/Soundux/Soundux/pulls?q=is%3Apr+reviewed-by%3AD3SOX" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/Soundux/Soundux/commits?author=D3SOX" title="Tests">⚠️</a> <a href="#translation-D3SOX" title="Translation">🌍</a> <a href="#a11y-D3SOX" title="Accessibility">️️️️♿️</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/MrKingMichael"><img src="https://avatars.githubusercontent.com/u/30067605?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Michael</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AMrKingMichael" title="Bug reports">🐛</a> <a href="#ideas-MrKingMichael" title="Ideas, Planning, & Feedback">🤔</a> <a href="#translation-MrKingMichael" title="Translation">🌍</a> <a href="https://github.com/Soundux/Soundux/commits?author=MrKingMichael" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/BrandonKMLee"><img src="https://avatars.githubusercontent.com/u/58927531?v=4?s=50" width="50px;" alt=""/><br /><sub><b>BrandonKMLee</b></sub></a><br /><a href="#ideas-BrandonKMLee" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Toadfield"><img src="https://avatars.githubusercontent.com/u/68649672?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Toadfield</b></sub></a><br /><a href="#ideas-Toadfield" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/Soundux/Soundux/issues?q=author%3AToadfield" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/fubka"><img src="https://avatars.githubusercontent.com/u/44064746?v=4?s=50" width="50px;" alt=""/><br /><sub><b>fubka</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Afubka" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/TheOriginalTripleD"><img src="https://avatars.githubusercontent.com/u/6907054?v=4?s=50" width="50px;" alt=""/><br /><sub><b>TheOriginalTripleD</b></sub></a><br /><a href="#research-TheOriginalTripleD" title="Research">🔬</a></td>
<td align="center"><a href="https://github.com/UltraBlackLinux"><img src="https://avatars.githubusercontent.com/u/62404294?v=4?s=50" width="50px;" alt=""/><br /><sub><b>UltraBlackLinux</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AUltraBlackLinux" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://bendem.be/"><img src="https://avatars.githubusercontent.com/u/2681677?v=4?s=50" width="50px;" alt=""/><br /><sub><b>bendem</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Abendem" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://edgar.bzh/"><img src="https://avatars.githubusercontent.com/u/46636609?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Edgar Onghena</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Aedgarogh" title="Bug reports">🐛</a> <a href="#research-edgarogh" title="Research">🔬</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/moggesmith10"><img src="https://avatars.githubusercontent.com/u/33375517?v=4?s=50" width="50px;" alt=""/><br /><sub><b>moggesmith10</b></sub></a><br /><a href="#ideas-moggesmith10" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://belmoussaoui.com/"><img src="https://avatars.githubusercontent.com/u/7660997?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Bilal Elmoussaoui</b></sub></a><br /><a href="#platform-bilelmoussaoui" title="Packaging/porting to new platform">📦</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/thomasfinstad"><img src="https://avatars.githubusercontent.com/u/5358752?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Thomas Finstad Larsen</b></sub></a><br /><a href="#ideas-thomasfinstad" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="http://arthurmelton.me"><img src="https://avatars.githubusercontent.com/u/29708070?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Arthur Melton</b></sub></a><br /><a href="#ideas-AMTitan" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/serkan-maker"><img src="https://avatars.githubusercontent.com/u/63740626?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Serkan ÖNDER</b></sub></a><br /><a href="#translation-serkan-maker" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/pizzadude"><img src="https://avatars.githubusercontent.com/u/1454420?v=4?s=50" width="50px;" alt=""/><br /><sub><b>PizzaDude</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Apizzadude" title="Bug reports">🐛</a> <a href="#research-pizzadude" title="Research">🔬</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Kylianalex"><img src="https://avatars.githubusercontent.com/u/66625058?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Kylianalex</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3AKylianalex" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://gregerstoltnilsen.net/"><img src="https://avatars.githubusercontent.com/u/1364443?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Greger</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Agregersn" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/rivenirvana"><img src="https://avatars.githubusercontent.com/u/43519644?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Arvin Verain</b></sub></a><br /><a href="#platform-rivenirvana" title="Packaging/porting to new platform">📦</a></td>
<td align="center"><a href="http://einfacheinalex.eu/"><img src="https://avatars.githubusercontent.com/u/20642291?v=4?s=50" width="50px;" alt=""/><br /><sub><b>EinfachEinAlex</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/commits?author=EinfachEinAlex" title="Code">💻</a> <a href="#research-EinfachEinAlex" title="Research">🔬</a> <a href="https://github.com/Soundux/Soundux/commits?author=EinfachEinAlex" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center"><a href="https://discord.gg/ubmTQnuM3Z"><img src="https://avatars.githubusercontent.com/u/69876322?v=4?s=50" width="50px;" alt=""/><br /><sub><b>MeblIkea</b></sub></a><br /><a href="#translation-MeblIkea" title="Translation">🌍</a></td>
<td align="center"><a href="https://nathanbonnemains.squill.fr/"><img src="https://avatars.githubusercontent.com/u/45366162?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Nathan Bonnemains</b></sub></a><br /><a href="#translation-NathanBnm" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/lucasvbeek"><img src="https://avatars.githubusercontent.com/u/29404838?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Lucas van Beek</b></sub></a><br /><a href="#translation-lucasvbeek" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/underhood"><img src="https://avatars.githubusercontent.com/u/6674623?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Timotej S.</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Aunderhood" title="Bug reports">🐛</a> <a href="https://github.com/Soundux/Soundux/commits?author=underhood" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/3JlOy-PYCCKUi"><img src="https://avatars.githubusercontent.com/u/46464602?v=4?s=50" width="50px;" alt=""/><br /><sub><b>3JlOy_PYCCKUi</b></sub></a><br /><a href="#translation-3JlOy-PYCCKUi" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/FuRyQC"><img src="https://avatars.githubusercontent.com/u/91005051?v=4?s=50" width="50px;" alt=""/><br /><sub><b>FuRyQC</b></sub></a><br /><a href="#translation-FuRyQC" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://moral.net.au"><img src="https://avatars.githubusercontent.com/u/16875700?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Scott Percival</b></sub></a><br /><a href="https://github.com/Soundux/Soundux/issues?q=author%3Amoralrecordings" title="Bug reports">🐛</a> <a href="https://github.com/Soundux/Soundux/commits?author=moralrecordings" title="Tests">⚠️</a> <a href="https://github.com/Soundux/Soundux/commits?author=moralrecordings" title="Code">💻</a></td>
</tr>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
Этот проект следует спецификации [all-contributors](https://github.com/all-contributors/all-contributors). Любой вклад приветствуется!

BIN
icon.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

22828
json.hpp Executable file

File diff suppressed because it is too large Load Diff

@ -1 +0,0 @@
Subproject commit 3bb9240cb15459768adb3e7d963a20e1523a6294

@ -1 +0,0 @@
Subproject commit 429750092850b18abeccb7bd390e9fb88baf2b1b

@ -1 +0,0 @@
Subproject commit ede7f712a08f7c66ff4a5590ad94a477c48850a5

@ -1 +0,0 @@
Subproject commit 59a29ea3437e06d38a3d64ea2230d022b0294f0d

@ -1 +0,0 @@
Subproject commit fc2f7116fe6a8849f7ff775d73500becb07df36e

@ -1 +0,0 @@
Subproject commit 9b901bad31f9809f4bfaefc8795589db3ce46250

@ -1 +0,0 @@
Subproject commit 4d813cfe23c28db165cce6785419fee9d2399766

@ -1 +0,0 @@
Subproject commit 4d3d271676c1f4557a6317b137137e6a0c1c018b

@ -1 +0,0 @@
Subproject commit b06119fed9dd00f37c4d62625d82357862cf2dd6

@ -1 +0,0 @@
Subproject commit 15e4f77f8254e4b093f6be128db50fe4b6bee120

@ -1 +0,0 @@
Subproject commit 698db7d58dd450cc9e30dc12d3bd0c5ca4d6a5b1

25
main.cpp Executable file
View File

@ -0,0 +1,25 @@
#include "mainwindow.h"
#include <QApplication>
#include <RunGuard.h>
#include <QDialog>
int main(int argc, char *argv[])
{
RunGuard guard("x_soundboard");
QCoreApplication::setOrganizationName("D3SOX");
QCoreApplication::setApplicationName("Soundux");
QApplication a(argc, argv);
if (!guard.tryToRun())
{
QMessageBox::warning(nullptr, "Failed to start", "The program is already running", QMessageBox::Ok);
return 0;
}
MainWindow w;
w.show();
return a.exec();
}

648
mainwindow.cpp Executable file
View File

@ -0,0 +1,648 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
static vector<QHotkey *> hotkeys;
static string configFolder;
static string soundFilesConfig;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->tabWidget->setTabsClosable(true);
ui->tabWidget->setMovable(true);
ui->stopButton->setDisabled(true);
ui->remoteVolumeSlider->setStyle(new ClickableSliderStyle(ui->remoteVolumeSlider->style()));
ui->localVolumeSlider->setStyle(new ClickableSliderStyle(ui->localVolumeSlider->style()));
// Set the config variables
configFolder = QStandardPaths::standardLocations(QStandardPaths::ConfigLocation)[0].toStdString() + "/" + windowTitle().toStdString();
// Create config folder
QString configFolderQ = QString::fromStdString(configFolder);
QDir dir;
QFile configFolderFile(configFolderQ);
if (!configFolderFile.exists()) {
dir.mkdir(configFolderQ);
}
soundFilesConfig = configFolder + "/sounds.json";
soundPlayback = new SoundPlayback(this, ui);
settingsDialog = new SettingsDialog(this, configFolder, soundPlayback);
// We unload the modules first to remove any possible leftovers
//TODO: Only remove modules created by Soundboard
system("pacmd unload-module module-null-sink");
system("pacmd unload-module module-loopback");
// Create null sink
system("pacmd load-module module-null-sink sink_name=soundboard_sink sink_properties=device.description=Soundboard-Sink");
// get default input device
string defaultInput = "";
char cmd[] = "pacmd dump";
string result = soundPlayback->getCommandOutput(cmd);
regex reg(R"rgx(set-default-source (.+))rgx");
smatch sm;
regex_search(result, sm, reg);
defaultInput = sm[1].str();
// Create loopback for input
if (defaultInput != "")
{
cout << "Found default input device " << defaultInput << endl;
auto createLoopBack = "pacmd load-module module-loopback source=\"" + defaultInput + "\" sink=\"soundboard_sink\"";
system(createLoopBack.c_str());
}
loadSoundFiles();
soundPlayback->loadSources();
// we need to update the buttons if the program starts because the first tab may be a directory tab
this->on_tabWidget_currentChanged(0);
// add CTRL + Q shortcut: quit
auto shortcut = new QShortcut(this);
shortcut->setKey(Qt::CTRL + Qt::Key_Q);
connect(shortcut, SIGNAL(activated()), this, SLOT(slotShortcutCtrlQ()));
// add CTRL + F shortcut: search
auto searchShortcut = new QShortcut(this);
searchShortcut->setKey(Qt::CTRL + Qt::Key_F);
connect(searchShortcut, SIGNAL(activated()), SLOT(slotShortcutCtrlF()));
searchView = new SearchView(this, ui->tabWidget, soundPlayback);
searchView->hide();
searchView->setAllowedAreas(Qt::RightDockWidgetArea);
this->addDockWidget(Qt::RightDockWidgetArea, searchView);
connect(ui->searchButton, &QPushButton::clicked, [&]() {
if (searchView->isHidden()) {
searchView->show();
} else {
searchView->hide();
}
});
}
void MainWindow::slotShortcutCtrlQ()
{
close();
}
void MainWindow::slotShortcutCtrlF()
{
if (searchView->isHidden()) {
searchView->show();
} else {
searchView->hide();
}
}
void MainWindow::closeEvent(QCloseEvent *event)
{
//TODO: Only remove modules created by Soundboard
system("pacmd unload-module module-null-sink");
system("pacmd unload-module module-loopback");
//TODO: Switch all recording streams back to default device
event->accept();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::syncVolume(bool remote)
{
// Get volume from slider
int localValue = ui->localVolumeSlider->value();
int remoteValue = ui->remoteVolumeSlider->value();
if (ui->syncCheckBox->isChecked()) {
if (remote) {
ui->localVolumeSlider->setValue(remoteValue);
} else {
ui->remoteVolumeSlider->setValue(localValue);
}
}
// TODO: this is disabled until I find a good solution
/*
char cmd[] = "pacmd list-sink-inputs";
string result = getCommandOutput(cmd);
string delimiter = "\n";
size_t pos = 0;
string currentLine;
// Tell me if there is a better way to parse the pulseaudio output
regex reg(R"rgx(((index: (\d+)))|(driver: )(.*)|(state: )(.*)|(flags: )(.*)|(source: .*)(<(.*)>)|(muted: )(.{0,3})|([a-zA-Z-.0-9_]*)\ =\ (\"(.*)\"))rgx");
smatch sm;
PulseAudioPlaybackStream *current = nullptr;
while ((pos = result.find(delimiter)) != string::npos)
{
currentLine = result.substr(0, pos);
if (regex_search(currentLine, sm, reg))
{
auto index = sm[3];
if (index.length() > 0)
{
if (current)
{
soundPlayback->checkAndChangeVolume(current, localValue);
}
current = new PulseAudioPlaybackStream();
current->index = stoi(index);
}
else
{
auto propertyName = sm[15];
auto propertyValue = sm[17];
if (propertyName.length() > 0)
{
if (propertyName == "application.name")
{
current->applicationName = propertyValue.str();
}
}
}
}
result.erase(0, pos + delimiter.length());
}
soundPlayback->checkAndChangeVolume(current, localValue);
*/
}
// Sync volume when the slider value has changed
void MainWindow::on_localVolumeSlider_valueChanged(int value)
{
syncVolume(false);
}
void MainWindow::on_remoteVolumeSlider_valueChanged(int value)
{
syncVolume(true);
}
void MainWindow::on_refreshAppsButton_clicked()
{
soundPlayback->loadSources();
}
void MainWindow::on_stopButton_clicked()
{
soundPlayback->stopSound();
}
void MainWindow::on_addFolderButton_clicked()
{
auto selectedFolder = QFileDialog::getExistingDirectory(this, ("Select folder"), QDir::homePath());
if (selectedFolder != "")
{
QDir directory(selectedFolder);
QFileInfo fileInfo(selectedFolder);
auto created = createTab(fileInfo.fileName());
created->directory = directory.absolutePath().toStdString();
QStringList files = directory.entryList({"*.mp3", "*.wav", "*.ogg"}, QDir::Files);
for (auto fileName : files)
{
QFile file(directory.absoluteFilePath(fileName));
addSoundToView(file, created);
}
saveSoundFiles();
}
}
void MainWindow::on_refreshFolderButton_clicked()
{
auto view = getActiveView();
if (view) {
this->refreshFolder(view);
}
}
void MainWindow::refreshFolder(QSoundsList *view) {
QStringList items;
for (auto viewItem : view->findItems("*", Qt::MatchWildcard))
{
items.push_back(viewItem->toolTip());
}
const QDir directory(QString::fromStdString(view->directory));
const QStringList files = directory.entryList({"*.mp3", "*.wav", "*.ogg"}, QDir::Files);
QStringList filesAbsolute;
for (auto fileName : files)
{
const auto absolutePath = directory.absoluteFilePath(fileName);
filesAbsolute.push_back(absolutePath);
// add new ones
if (!LContains(items, absolutePath)) {
cout << "adding " << absolutePath.toStdString() << endl;
QFile file(absolutePath);
addSoundToView(file, view);
}
}
auto list = view->findItems("*", Qt::MatchWildcard);
// remove old ones
for (const auto item : list) {
if (!LContains(filesAbsolute, item->toolTip())) {
cout << "removing " << item->toolTip().toStdString() << endl;
this->removeSound((SoundListWidgetItem*) item);
}
}
saveSoundFiles();
}
void MainWindow::addSoundToView(QFile &file, QListWidget *widget)
{
QFileInfo fileInfo(file);
auto path = fileInfo.absoluteFilePath().toStdString();
for (QListWidgetItem *item : widget->findItems("*", Qt::MatchWildcard))
{
// Check if Sound is already added
if (path == item->toolTip().toStdString())
{
auto already = "The sound " + item->text().toStdString() + " is already in the list";
QMessageBox::warning(this, "", tr(already.c_str()), QMessageBox::Ok);
return;
}
}
auto item = new SoundListWidgetItem();
item->setText(fileInfo.completeBaseName());
item->setToolTip(fileInfo.absoluteFilePath());
widget->addItem(item);
}
void MainWindow::on_addSoundButton_clicked()
{
if (!getActiveView())
{
createTab("Main");
}
QStringList selectedFiles = QFileDialog::getOpenFileNames(this, tr("Select file"), QDir::homePath(), tr("Sound files (*.mp3 *.wav *.ogg)"));
for (auto selectedFile : selectedFiles)
{
if (selectedFile != "")
{
QFile file(selectedFile);
addSoundToView(file, getActiveView());
}
}
saveSoundFiles();
}
void MainWindow::on_settingsButton_clicked()
{
settingsDialog->exec();
}
void MainWindow::on_soundsListWidget_itemDoubleClicked(QListWidgetItem *listWidgetItem)
{
if (listWidgetItem)
{
soundPlayback->playSound(listWidgetItem->toolTip().toStdString());
}
}
void MainWindow::on_removeSoundButton_clicked()
{
if (getActiveView())
{
SoundListWidgetItem *it = getSelectedItem();
this->removeSound(it);
}
}
void MainWindow::removeSound(SoundListWidgetItem *it) {
if (it)
{
unregisterHotkey(it);
delete it;
saveSoundFiles();
}
}
void MainWindow::on_clearSoundsButton_clicked()
{
if (getActiveView())
{
QMessageBox::StandardButton resBtn = QMessageBox::question(this, "Clear sounds", tr("Are you sure?\n"), QMessageBox::No | QMessageBox::Yes, QMessageBox::Yes);
if (resBtn == QMessageBox::Yes)
{
clearSoundFiles();
saveSoundFiles();
}
}
}
SoundListWidgetItem *MainWindow::getSelectedItem()
{
if (getActiveView())
{
return (SoundListWidgetItem*) getActiveView()->item(getActiveView()->currentRow());
}
return nullptr;
}
void MainWindow::on_playSoundButton_clicked()
{
SoundListWidgetItem *it = getSelectedItem();
if (it)
{
soundPlayback->playSound(it->toolTip().toStdString());
}
}
void MainWindow::on_addTabButton_clicked()
{
bool ok;
QString text = QInputDialog::getText(this, "Add a tab", "Tab Text:", QLineEdit::Normal, "", &ok);
if (ok && !text.isEmpty())
{
createTab(text);
saveSoundFiles();
}
}
void MainWindow::on_setHotkeyButton_clicked()
{
SoundListWidgetItem *it = getSelectedItem();
if (it)
{
SetHotkeyDialog shd(this, it);
auto clicked = shd.exec();
if (clicked == 1)
{
auto given = shd.getSequence();
if (!given.isNull()) {
registerHotkey(it, given.toString());
} else {
unregisterHotkey(it);
}
saveSoundFiles();
}
}
}
void MainWindow::registerHotkey(SoundListWidgetItem* it, QString keys)
{
// Unregister previous hotkey
unregisterHotkey(it);
it->setHotkey(keys);
cout << "register " << keys.toStdString() << endl;
auto neger = QKeySequence(keys);
auto hotkey = new QHotkey(QKeySequence(keys), true, this);
if (hotkey->isRegistered())
{
hotkeys.push_back(hotkey);
auto toPlay = it->toolTip().toStdString();
connect(hotkey, &QHotkey::activated, this, [=]() {
soundPlayback->playSound(toPlay);
});
}
else
{
unregisterHotkey(it);
QMessageBox::warning(this, "Could not register " + keys, "Either the key combination is not valid or it's not possible to use this combination (Maybe another program is using it)", QMessageBox::Ok);
}
}
bool compareChar(char &c1, char &c2)
{
if (c1 == c2)
return true;
else if (toupper(c1) == toupper(c2))
return true;
return false;
}
bool caseInSensStringCompare(string &str1, string &str2)
{
return ((str1.size() == str2.size()) &&
equal(str1.begin(), str1.end(), str2.begin(), &compareChar));
}
void MainWindow::unregisterHotkey(SoundListWidgetItem *it)
{
auto previousHotkey = it->hotkey;
if (!previousHotkey.isNull())
{
auto previousHotkeyStr = previousHotkey.toString().toStdString();
cout << "unregister " << previousHotkeyStr << endl;
for (QHotkey *hotkey : hotkeys)
{
auto hotkeyStr = hotkey->shortcut().toString().toStdString();
if (caseInSensStringCompare(hotkeyStr, previousHotkeyStr))
{
delete hotkey;
}
}
// Reset Data
it->setHotkey(QVariant());
}
}
void MainWindow::on_tabWidget_tabBarDoubleClicked(int index)
{
bool ok;
QString text = QInputDialog::getText(this, "Rename tab", "Tab Text:", QLineEdit::Normal, ui->tabWidget->tabText(index), &ok);
if (ok && !text.isEmpty())
{
ui->tabWidget->setTabText(index, text);
saveSoundFiles();
}
}
void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
QMessageBox::StandardButton resBtn = QMessageBox::question(this, "Delete tab", tr("Are you sure?\n"), QMessageBox::No | QMessageBox::Yes, QMessageBox::Yes);
if (resBtn == QMessageBox::Yes)
{
ui->tabWidget->removeTab(index);
saveSoundFiles();
}
}
QSoundsList *MainWindow::createTab(QString title)
{
auto soundsListWidget = new QSoundsList();
// why do we set the object name?
soundsListWidget->setObjectName(title);
connect(soundsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(on_soundsListWidget_itemDoubleClicked(QListWidgetItem *)));
ui->tabWidget->addTab(soundsListWidget, title);
return soundsListWidget;
}
void MainWindow::clearSoundFiles()
{
if (getActiveView())
{
while (getActiveView()->count() > 0)
{
getActiveView()->takeItem(0);
}
}
}
QSoundsList *MainWindow::getActiveView()
{
return (QSoundsList *)ui->tabWidget->widget(ui->tabWidget->currentIndex());
}
void MainWindow::saveSoundFiles()
{
json jsonTabs = json::array();
for (auto i = 0; i < ui->tabWidget->count(); i++)
{
auto title = ui->tabWidget->tabText(i).toStdString();
QSoundsList *listWidget = (QSoundsList *)ui->tabWidget->widget(i);
json tabJson;
json tabJsonSounds = json::array();
// if it is a directory we just save the path and update the sounds from there later
if (listWidget->directory.length() > 0) {
tabJson["directory"] = listWidget->directory;
}
for (auto *_item : listWidget->findItems("*", Qt::MatchWildcard))
{
auto item = (SoundListWidgetItem*) _item;
json j;
j["name"] = item->text().toStdString();
// TODO: make the path relative when it's a folder tab
j["path"] = item->toolTip().toStdString();
auto hotkey = item->hotkey;
if (!hotkey.isNull())
{
auto hotkeyStr = hotkey.toString().toStdString();
j["hotkey"] = hotkeyStr;
}
tabJsonSounds.push_back(j);
}
tabJson["title"] = title;
tabJson["sounds"] = tabJsonSounds;
jsonTabs.push_back(tabJson);
}
ofstream myfile;
myfile.open(soundFilesConfig);
myfile << jsonTabs.dump();
myfile.close();
}
void MainWindow::loadSoundFiles()
{
ifstream fileIn(soundFilesConfig);
if (fileIn.is_open())
{
clearSoundFiles();
json j = json::parse(fileIn);
for (auto& tabItem : j.items())
{
const auto item = tabItem.value();
const auto titleItem = item.find("title");
const auto directoryItem = item.find("directory");
const auto soundsItem = item.find("sounds");
if (titleItem == item.end() || soundsItem == item.end()) {
cout << item.dump() << " is not a valid tab" << endl;
continue;
}
const auto title = titleItem->get<string>();
const auto sounds = soundsItem->get<vector<json>>();
const auto soundsListWidget = createTab(title.c_str());
for (auto _child : sounds)
{
auto soundName = _child["name"];
auto soundPath = _child["path"];
remove(soundPath.begin(), soundPath.end(), '"');
auto item = new SoundListWidgetItem();
item->setText(QString::fromStdString(soundName));
item->setToolTip(QString::fromStdString(soundPath));
auto soundHotkey = _child["hotkey"];
if (!soundHotkey.is_null())
{
// Set hotkey back
registerHotkey(item, QString::fromStdString(soundHotkey));
}
soundsListWidget->addItem(item);
}
if (directoryItem != item.end()) {
const auto directory = directoryItem->get<string>();
// it is a directory category so we set the property
soundsListWidget->directory = directory;
this->refreshFolder(soundsListWidget);
}
}
fileIn.close();
}
}
// we need this to update the buttons if the tab switched
void MainWindow::on_tabWidget_currentChanged(int index)
{
QSoundsList* switchedTo = (QSoundsList *)ui->tabWidget->widget(index);
if (switchedTo) {
bool isFolderTab = switchedTo->directory.length() > 0;
this->ui->addSoundButton->setVisible(!isFolderTab);
this->ui->removeSoundButton->setVisible(!isFolderTab);
this->ui->clearSoundsButton->setVisible(!isFolderTab);
this->ui->refreshFolderButton->setVisible(isFolderTab);
this->ui->setHotkeyButton->setVisible(true);
} else {
this->ui->addSoundButton->setVisible(true);
this->ui->removeSoundButton->setVisible(false);
this->ui->clearSoundsButton->setVisible(false);
this->ui->refreshFolderButton->setVisible(false);
this->ui->setHotkeyButton->setVisible(false);
}
}

114
mainwindow.h Executable file
View File

@ -0,0 +1,114 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#include <array>
#include <stdlib.h>
#include <regex>
#include <thread>
#include <fstream>
#include <pthread.h>
#include <signal.h>
#include <algorithm>
#include <QMainWindow>
#include <QFile>
#include <QDir>
#include <QFileDialog>
#include <QTreeView>
#include <QListWidgetItem>
#include <QCloseEvent>
#include <QMessageBox>
#include <QStandardPaths>
#include <QInputDialog>
#include <QLineEdit>
#include <QTimer>
#include <QShortcut>
#include <QAction>
#include <qhotkey.h>
#include <json.hpp>
#include <soundplayback.h>
#include <settings.h>
#include <sethotkeydialog.h>
#include <clickablesliderstyle.h>
#include <soundlistwidgetitem.h>
#include <qsoundslist.h>
#include <searchview.h>
class SoundPlayback;
class SettingsDialog;
using namespace std;
using json = nlohmann::json;
QT_BEGIN_NAMESPACE
namespace Ui
{
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
SoundPlayback *soundPlayback;
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void closeEvent(QCloseEvent *event);
private:
Ui::MainWindow *ui;
SettingsDialog *settingsDialog;
SearchView *searchView;
void clearSoundFiles();
void saveSoundFiles();
void loadSoundFiles();
QSoundsList *getActiveView();
SoundListWidgetItem *getSelectedItem();
QSoundsList *createTab(QString title);
void addSoundsToView(QSoundsList *soundsListWidget);
void addSoundToView(QFile &file, QListWidget *widget);
void syncVolume(bool remote);
void refreshFolder(QSoundsList *view);
void removeSound(SoundListWidgetItem* it);
void registerHotkey(SoundListWidgetItem* it, QString keys);
void unregisterHotkey(SoundListWidgetItem* it);
bool LContains(QStringList l, QString what) {
auto pIt = std::find_if(l.begin(), l.end(), [&](QString other)
{
return other == what;
});
return pIt != l.end();
}
private slots:
void slotShortcutCtrlQ();
void slotShortcutCtrlF();
void on_addTabButton_clicked();
void on_soundsListWidget_itemDoubleClicked(QListWidgetItem *listWidgetItem);
void on_refreshAppsButton_clicked();
void on_stopButton_clicked();
void on_addSoundButton_clicked();
void on_removeSoundButton_clicked();
void on_clearSoundsButton_clicked();
void on_playSoundButton_clicked();
void on_setHotkeyButton_clicked();
void on_tabWidget_tabCloseRequested(int index);
void on_tabWidget_tabBarDoubleClicked(int index);
void on_addFolderButton_clicked();
void on_refreshFolderButton_clicked();
void on_localVolumeSlider_valueChanged(int value);
void on_remoteVolumeSlider_valueChanged(int value);
void on_settingsButton_clicked();
void on_tabWidget_currentChanged(int index);
};
#endif // MAINWINDOW_H

354
mainwindow.ui Executable file
View File

@ -0,0 +1,354 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>993</width>
<height>550</height>
</rect>
</property>
<property name="windowTitle">
<string>Soundux</string>
</property>
<property name="windowIcon">
<iconset resource="resources.qrc">
<normaloff>:/icon.jpg</normaloff>:/icon.jpg</iconset>
</property>
<property name="dockOptions">
<set>QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks</set>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="6">
<widget class="QLabel" name="outputApplicationLabel">
<property name="text">
<string>Output Application</string>
</property>
</widget>
</item>
<item row="1" column="8" colspan="2">
<widget class="QWidget" name="widget" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QComboBox" name="outputApplication">
<property name="maximumSize">
<size>
<width>235</width>
<height>16777215</height>
</size>
</property>
<property name="currentText">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="refreshAppsButton">
<property name="maximumSize">
<size>
<width>235</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Refresh</string>
</property>
<property name="icon">
<iconset theme="view-refresh-symbolic"/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="8" column="2">
<widget class="QLabel" name="localVolumeLabel">
<property name="text">
<string>Local Volume</string>
</property>
</widget>
</item>
<item row="8" column="4">
<widget class="QSlider" name="localVolumeSlider">
<property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
</property>
<property name="maximum">
<number>65536</number>
</property>
<property name="value">
<number>65536</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="icon">
<property name="maximumSize">
<size>
<width>64</width>
<height>64</height>
</size>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="resources.qrc">:/icon.jpg</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item row="10" column="8" colspan="2">
<widget class="QGroupBox" name="buttonBox">
<property name="flat">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPushButton" name="searchButton">
<property name="text">
<string>Search sounds</string>
</property>
<property name="icon">
<iconset theme="edit-find">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addTabButton">
<property name="text">
<string>Add tab</string>
</property>
<property name="icon">
<iconset theme="tab-new">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addFolderButton">
<property name="text">
<string>Add folder tab</string>
</property>
<property name="icon">
<iconset theme="folder-new"/>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="refreshFolderButton">
<property name="text">
<string>Refresh folder</string>
</property>
<property name="icon">
<iconset theme="view-refresh">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addSoundButton">
<property name="text">
<string>Add</string>
</property>
<property name="icon">
<iconset theme="list-add">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="removeSoundButton">
<property name="text">
<string>Remove</string>
</property>
<property name="icon">
<iconset theme="list-remove">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="clearSoundsButton">
<property name="text">
<string>Clear</string>
</property>
<property name="icon">
<iconset theme="remove">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="setHotkeyButton">
<property name="text">
<string>Set Hotkey</string>
</property>
<property name="icon">
<iconset theme="input-keyboard-symbolic">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="playSoundButton">
<property name="text">
<string>Play</string>
</property>
<property name="icon">
<iconset theme="player_play">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="settingsButton">
<property name="text">
<string>Settings</string>
</property>
<property name="icon">
<iconset theme="preferences-system-symbolic">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="repeatCheckBox">
<property name="text">
<string>Repeat</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="9" column="4">
<widget class="QSlider" name="remoteVolumeSlider">
<property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
</property>
<property name="maximum">
<number>65536</number>
</property>
<property name="value">
<number>65536</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="9" column="2">
<widget class="QLabel" name="remoteVolumeLabel">
<property name="text">
<string>Remote Volume</string>
</property>
</widget>
</item>
<item row="10" column="0" colspan="8">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>-1</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="appNameLabel">
<property name="font">
<font>
<pointsize>22</pointsize>
</font>
</property>
<property name="text">
<string>Soundux</string>
</property>
</widget>
</item>
<item row="8" column="0" rowspan="2" colspan="2">
<widget class="QPushButton" name="stopButton">
<property name="minimumSize">
<size>
<width>140</width>
<height>50</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>140</width>
<height>50</height>
</size>
</property>
<property name="text">
<string>Stop</string>
</property>
<property name="icon">
<iconset theme="media-playback-stop">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="8" column="5" rowspan="2">
<widget class="QCheckBox" name="syncCheckBox">
<property name="text">
<string>Sync</string>
</property>
<property name="icon">
<iconset theme="insert-link-symbolic">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<action name="actionExit">
<property name="text">
<string>Exit</string>
</property>
</action>
</widget>
<resources>
<include location="resources.qrc"/>
</resources>
<connections/>
</ui>

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 977 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 530 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1007 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 565 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
qdarkstyle/rc/arrow_up.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 969 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Some files were not shown because too many files have changed in this diff Show More