Compare commits
No commits in common. "master" and "legacy" have entirely different histories.
@ -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
|
||||
}
|
119
.clang-format
@ -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
|
||||
...
|
||||
|
55
.clang-tidy
@ -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
@ -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
@ -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.
|
73
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -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
|
5
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -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
@ -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]
|
27
.github/pull_request_template.md
vendored
@ -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.
|
30
.github/workflows/build_flatpak.yml
vendored
@ -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"
|
46
.github/workflows/compile_linux.yml
vendored
@ -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
|
70
.github/workflows/compile_windows.yml
vendored
@ -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
|
25
.github/workflows/linux_debug.yml
vendored
@ -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
|
69
.github/workflows/upload_binaries_to_draft.yml
vendored
@ -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/*"
|
49
.github/workflows/upload_full_src.yml
vendored
@ -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
|
33
.github/workflows/windows_debug.yml
vendored
@ -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
@ -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
@ -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
@ -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
|
143
CMakeLists.txt
@ -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()
|
@ -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)
|
@ -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"
|
||||
)
|
6
LICENSE
@ -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
@ -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
|
||||
|  |  |
|
||||
| -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
## 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
|
||||
|
||||
[](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
@ -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
@ -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
@ -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
|
@ -1 +0,0 @@
|
||||
#define IDI_ICON1 101
|
BIN
assets/icon.ico
Before Width: | Height: | Size: 114 KiB |
@ -1,2 +0,0 @@
|
||||
#include "icon.h"
|
||||
IDI_ICON1 ICON DISCARDABLE "icon.ico"
|
Before Width: | Height: | Size: 14 KiB |
BIN
assets/logo.gif
Before Width: | Height: | Size: 1.9 MiB |
Before Width: | Height: | Size: 584 KiB |
Before Width: | Height: | Size: 25 KiB |
22
clickablesliderstyle.h
Normal 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
@ -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
@ -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
|
@ -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
|
@ -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>
|
@ -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
|
@ -1 +0,0 @@
|
||||
11
|
@ -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
|
@ -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 --
|
@ -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
|
||||
}
|
Before Width: | Height: | Size: 21 KiB |
@ -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
|
@ -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
|
@ -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
|
@ -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
@ -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
@ -0,0 +1,8 @@
|
||||
theme: jekyll-theme-cayman
|
||||
plugins:
|
||||
- jekyll-relative-links
|
||||
relative_links:
|
||||
enabled: true
|
||||
collections: true
|
||||
include:
|
||||
- README.md
|
258
i18n/LISEZMOI.md
@ -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
|
||||
|  |  |
|
||||
| -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|
||||
# 👋 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
|
||||
|
||||
[](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!
|
@ -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>
|
||||
|
||||
# 👀 Предпросмотр
|
||||
|  |  |
|
||||
| -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|
||||
# 👋 Введение
|
||||
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
|
||||
|
||||
[](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). Любой вклад приветствуется!
|
@ -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
lib/json
@ -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
@ -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
@ -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
@ -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
@ -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>
|
BIN
qdarkstyle/rc/arrow_down.png
Normal file
After Width: | Height: | Size: 525 B |
BIN
qdarkstyle/rc/arrow_down@2x.png
Normal file
After Width: | Height: | Size: 977 B |
BIN
qdarkstyle/rc/arrow_down_disabled.png
Normal file
After Width: | Height: | Size: 547 B |
BIN
qdarkstyle/rc/arrow_down_disabled@2x.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
qdarkstyle/rc/arrow_down_focus.png
Normal file
After Width: | Height: | Size: 530 B |
BIN
qdarkstyle/rc/arrow_down_focus@2x.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
qdarkstyle/rc/arrow_down_pressed.png
Normal file
After Width: | Height: | Size: 518 B |
BIN
qdarkstyle/rc/arrow_down_pressed@2x.png
Normal file
After Width: | Height: | Size: 1007 B |
BIN
qdarkstyle/rc/arrow_left.png
Normal file
After Width: | Height: | Size: 546 B |
BIN
qdarkstyle/rc/arrow_left@2x.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
qdarkstyle/rc/arrow_left_disabled.png
Normal file
After Width: | Height: | Size: 569 B |
BIN
qdarkstyle/rc/arrow_left_disabled@2x.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
qdarkstyle/rc/arrow_left_focus.png
Normal file
After Width: | Height: | Size: 565 B |
BIN
qdarkstyle/rc/arrow_left_focus@2x.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
qdarkstyle/rc/arrow_left_pressed.png
Normal file
After Width: | Height: | Size: 541 B |
BIN
qdarkstyle/rc/arrow_left_pressed@2x.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
qdarkstyle/rc/arrow_right.png
Normal file
After Width: | Height: | Size: 518 B |
BIN
qdarkstyle/rc/arrow_right@2x.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
qdarkstyle/rc/arrow_right_disabled.png
Normal file
After Width: | Height: | Size: 553 B |
BIN
qdarkstyle/rc/arrow_right_disabled@2x.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
qdarkstyle/rc/arrow_right_focus.png
Normal file
After Width: | Height: | Size: 543 B |
BIN
qdarkstyle/rc/arrow_right_focus@2x.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
qdarkstyle/rc/arrow_right_pressed.png
Normal file
After Width: | Height: | Size: 544 B |
BIN
qdarkstyle/rc/arrow_right_pressed@2x.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
qdarkstyle/rc/arrow_up.png
Normal file
After Width: | Height: | Size: 512 B |
BIN
qdarkstyle/rc/arrow_up@2x.png
Normal file
After Width: | Height: | Size: 969 B |
BIN
qdarkstyle/rc/arrow_up_disabled.png
Normal file
After Width: | Height: | Size: 538 B |
BIN
qdarkstyle/rc/arrow_up_disabled@2x.png
Normal file
After Width: | Height: | Size: 1.0 KiB |