Merge remote-tracking branch 'origin/master' into

This commit is contained in:
LordGrey 2023-11-17 19:49:26 +01:00
commit 3613186a55
163 changed files with 1887 additions and 2896 deletions
.ci
.devcontainer.json
.github
CMakeLists.txt
bin
cmake
debian
dependencies
include
libsrc

@ -1,71 +0,0 @@
#!/bin/bash
# detect CI
if [ "$HOME" != "" ]; then
# GitHub Actions
echo "Github Actions detected"
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
CI_BUILD_DIR="$GITHUB_WORKSPACE"
else
# for executing in non ci environment
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
fi
# set environment variables if not exists
[ -z "${BUILD_TYPE}" ] && BUILD_TYPE="Debug"
# Determine cmake build type; tag builds are Release, else Debug (-dev appends to platform)
if [[ $BUILD_SOURCEBRANCH == *"refs/tags"* || $GITHUB_REF == *"refs/tags"* ]]; then
BUILD_TYPE=Release
else
PLATFORM=${PLATFORM}-dev
fi
echo "Platform: ${PLATFORM}, build type: ${BUILD_TYPE}, CI_NAME: $CI_NAME, docker image: ${DOCKER_IMAGE}, docker type: ${DOCKER_TAG}"
# Build the package on osx or linux
if [[ "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then
echo "Compile Hyperion on OSX or Darwin"
# compile prepare
mkdir build || exit 1
cd build
cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ../ || exit 2
make -j $(sysctl -n hw.ncpu) package || exit 3
cd ${CI_BUILD_DIR} && source /${CI_BUILD_DIR}/test/testrunner.sh || exit 4
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ $CI_NAME == *"mingw64_nt"* || "$CI_NAME" == 'windows_nt' ]]; then
echo "Compile Hyperion on Windows"
# compile prepare
echo "Number of Cores $NUMBER_OF_PROCESSORS"
mkdir build || exit 1
cd build
cmake -G "Visual Studio 17 2022" -A x64 -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE="Release" ../ || exit 2
cmake --build . --target package --config "Release" -- -nologo -v:m -maxcpucount || exit 3
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ "$CI_NAME" == 'linux' ]]; then
echo "Compile Hyperion with DOCKER_IMAGE = ${DOCKER_IMAGE}, DOCKER_TAG = ${DOCKER_TAG} and friendly name DOCKER_NAME = ${DOCKER_NAME}"
# set GitHub Container Registry url
REGISTRY_URL="ghcr.io/hyperion-project/${DOCKER_IMAGE}"
# take ownership of deploy dir
mkdir ${CI_BUILD_DIR}/deploy
# run docker
docker run --rm \
-v "${CI_BUILD_DIR}/deploy:/deploy" \
-v "${CI_BUILD_DIR}:/source:ro" \
$REGISTRY_URL:$DOCKER_TAG \
/bin/bash -c "mkdir hyperion && cp -r source/. /hyperion &&
cd /hyperion && mkdir build && cd build &&
cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ../ || exit 2 &&
make -j $(nproc) package || exit 3 &&
cp /hyperion/build/bin/h* /deploy/ 2>/dev/null || : &&
cp /hyperion/build/Hyperion-* /deploy/ 2>/dev/null || : &&
cd /hyperion && source /hyperion/test/testrunner.sh || exit 4 &&
exit 0;
exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
# overwrite file owner to current user
sudo chown -fR $(stat -c "%U:%G" ${CI_BUILD_DIR}/deploy) ${CI_BUILD_DIR}/deploy
fi

@ -1,40 +0,0 @@
#!/bin/bash
# detect CI
if [ "$HOME" != "" ]; then
# GitHub Actions
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
CI_BUILD_DIR="$GITHUB_WORKSPACE"
else
# for executing in non ci environment
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
fi
function installAndUpgrade()
{
arr=("$@")
for i in "${arr[@]}";
do
list_output=`brew list --formula | grep $i`
outdated_output=`brew outdated | grep $i`
if [[ ! -z "$list_output" ]]; then
if [[ ! -z "$outdated_output" ]]; then
echo "Outdated package: ${outdated_output}"
brew unlink ${outdated_output}
brew upgrade $i
brew link --overwrite $i
fi
else
brew install $i
fi
done
}
# install osx deps for hyperion compile
if [[ $CI_NAME == 'osx' || $CI_NAME == 'darwin' ]]; then
echo "Install dependencies"
brew update
dependencies=("qt5" "python" "libusb" "cmake" "doxygen")
installAndUpgrade "${dependencies[@]}"
fi

@ -1,20 +1,25 @@
{ {
"name": "Hyperion.ng Linux", "name": "Hyperion.ng Linux",
"extensions": [ "customizations": {
"twxs.cmake", // Configure properties specific to VS Code.
"ms-vscode.cpptools", "vscode": {
"ms-vscode.cmake-tools", "extensions": [
"spmeesseman.vscode-taskexplorer", "twxs.cmake",
"yzhang.markdown-all-in-one", "ms-vscode.cpptools",
"CoenraadS.bracket-pair-colorizer", "ms-vscode.cmake-tools",
"vscode-icons-team.vscode-icons", "spmeesseman.vscode-taskexplorer",
"editorconfig.editorconfig" "yzhang.markdown-all-in-one",
], "CoenraadS.bracket-pair-colorizer",
"settings": { "vscode-icons-team.vscode-icons",
"editor.formatOnSave": false, "editorconfig.editorconfig",
"cmake.environment": { "RVSmartPorting.rpm-spec-ext"
}, ],
}, "settings": {
"editor.formatOnSave": false,
"cmake.environment": { }
}
}
},
"forwardPorts": [8090, 8092], "forwardPorts": [8090, 8092],
"postCreateCommand": "git submodule update --recursive --init && sudo apt-get update && sudo apt-get install -y git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libjpeg-dev libturbojpeg0-dev libssl-dev" "postCreateCommand": "git submodule update --recursive --init && sudo apt-get update && sudo apt-get install -y git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libjpeg-dev libturbojpeg0-dev libssl-dev libasound2-dev"
} }

59
.github/scripts/build.sh vendored Executable file

@ -0,0 +1,59 @@
#!/bin/bash
# set environment variables if not exists
[ -z "${BUILD_TYPE}" ] && BUILD_TYPE="Debug"
[ -z "${TARGET_ARCH}" ] && TARGET_ARCH="linux/amd64"
[ -z "${PLATFORM}" ] && PLATFORM="x11"
# Determine cmake build type; tag builds are Release, else Debug (-dev appends to platform)
if [[ $GITHUB_REF == *"refs/tags"* ]]; then
BUILD_TYPE=Release
else
PLATFORM=${PLATFORM}-dev
fi
echo "Compile Hyperion on '${RUNNER_OS}' with build type '${BUILD_TYPE}' and platform '${PLATFORM}'"
# Build the package on MacOS, Windows or Linux
if [[ "$RUNNER_OS" == 'macOS' ]]; then
mkdir build || exit 1
cd build
cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ../ || exit 2
make -j $(sysctl -n hw.ncpu) package || exit 3
cd ${GITHUB_WORKSPACE} && source /${GITHUB_WORKSPACE}/test/testrunner.sh || exit 4
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ $RUNNER_OS == "Windows" ]]; then
echo "Number of Cores $NUMBER_OF_PROCESSORS"
mkdir build || exit 1
cd build
cmake -G "Visual Studio 17 2022" -A x64 -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE="Release" ../ || exit 2
cmake --build . --target package --config "Release" -- -nologo -v:m -maxcpucount || exit 3
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ "$RUNNER_OS" == 'Linux' ]]; then
echo "Docker arguments used: DOCKER_IMAGE=${DOCKER_IMAGE}, DOCKER_TAG=${DOCKER_TAG}, TARGET_ARCH=${TARGET_ARCH}"
# verification bypass of external dependencies
git config --global --add safe.directory "${GITHUB_WORKSPACE}/dependencies/external/*"
# set GitHub Container Registry url
REGISTRY_URL="ghcr.io/hyperion-project/${DOCKER_IMAGE}"
# take ownership of deploy dir
mkdir ${GITHUB_WORKSPACE}/deploy
# run docker
docker run --rm --platform=${TARGET_ARCH} \
-v "${GITHUB_WORKSPACE}/deploy:/deploy" \
-v "${GITHUB_WORKSPACE}:/source:rw" \
$REGISTRY_URL:$DOCKER_TAG \
/bin/bash -c "mkdir -p /source/build && cd /source/build &&
cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ../ || exit 2 &&
cmake --build /source/build --target package -- -j $(nproc) || exit 3 &&
cp /source/build/bin/h* /deploy/ 2>/dev/null || : &&
cp /source/build/Hyperion-* /deploy/ 2>/dev/null || : &&
cd /source && source /source/test/testrunner.sh || exit 5 &&
exit 0;
exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
# overwrite file owner to current user
sudo chown -fR $(stat -c "%U:%G" ${GITHUB_WORKSPACE}/deploy) ${GITHUB_WORKSPACE}/deploy
fi

@ -1,154 +0,0 @@
name: Hyperion APT Build
on:
workflow_call:
inputs:
head_sha:
type: string
description: The branch, tag or SHA to checkout
required: true
secrets:
APT_GPG:
required: true
APT_USER:
required: true
APT_PASSWORD:
required: true
APT_DRAFT:
required: true
workflow_dispatch:
inputs:
head_sha:
type: string
description: The branch, tag or SHA to checkout
required: true
secrets:
APT_GPG:
required: true
APT_USER:
required: true
APT_PASSWORD:
required: true
APT_DRAFT:
required: true
jobs:
setup:
name: Setup APT build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set APT matrix
id: apt-ppa
run: |
APT=$(jq -n '.include |= [ inputs[] | select(.["exclude"] != true)]' .github/workflows/apt/*.json --compact-output)
echo "apt=$APT" >> $GITHUB_OUTPUT
outputs:
apt-matrix: ${{ steps.apt-ppa.outputs.apt }}
build:
name: ${{ matrix.description }}
needs: [setup]
runs-on: ubuntu-latest
strategy:
matrix: ${{ fromJson(needs.setup.outputs.apt-matrix) }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.head_sha || github.event.client_payload.head_sha }}
submodules: true
- name: Generate environment variables
run: |
tr -d '\n' < .version > temp && mv temp .version
VERSION=$(cat .version)
echo VERSION=${VERSION} >> $GITHUB_ENV
if [[ $VERSION == *"-"* ]]; then
echo STANDARDS_VERSION=$(echo ${VERSION%-*}) >> $GITHUB_ENV
echo TARBALL_VERSION=$(echo ${VERSION%-*}) >> $GITHUB_ENV
echo DEBIAN_FORMAT='3.0 (quilt)' >> $GITHUB_ENV
else
echo STANDARDS_VERSION=$(echo ${VERSION%+*}) >> $GITHUB_ENV
echo TARBALL_VERSION=${VERSION}~$(echo ${{ matrix.distribution }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV
echo DEBIAN_FORMAT='3.0 (native)' >> $GITHUB_ENV
fi
echo DISTRIBUTION=$(echo ${{ matrix.distribution }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV
- name: Build package
shell: bash
run: |
mkdir -p "${GITHUB_WORKSPACE}/deploy"
docker run --rm \
-v "${GITHUB_WORKSPACE}/deploy:/deploy" \
-v "${GITHUB_WORKSPACE}:/source:rw" \
ghcr.io/hyperion-project/${{ matrix.architecture }}:${{ env.DISTRIBUTION }} \
/bin/bash -c "cd /source && \
mkdir -p debian/source && echo '${{ env.DEBIAN_FORMAT }}' > debian/source/format && \
dch --create --distribution ${{ env.DISTRIBUTION }} --package 'hyperion' -v '${{ env.VERSION }}~${{ env.DISTRIBUTION }}' '${{ github.event.commits[0].message }}' && \
cp -fr LICENSE debian/copyright && \
sed 's/@BUILD_DEPENDS@/${{ matrix.build-depends }}/g; s/@DEPENDS@/${{ matrix.package-depends }}/g; s/@ARCHITECTURE@/${{ matrix.architecture }}/g; s/@STANDARDS_VERSION@/${{ env.STANDARDS_VERSION }}/g' debian/control.in > debian/control && \
sed 's/@CMAKE_ENVIRONMENT@/${{ matrix.cmake-environment }}/g' debian/rules.in > debian/rules && \
tar -cJf ../hyperion_${{ env.TARBALL_VERSION }}.orig.tar.xz . && \
debuild --no-lintian -uc -us && \
cp ../hyperion_*.deb /deploy"
- name: Upload package artifact
if: ${{ startsWith(github.event.ref, 'refs/tags') || github.event_name == 'workflow_dispatch' }}
uses: actions/upload-artifact@v3
with:
path: deploy
retention-days: 1
publish:
name: Publish APT packages
if: ${{ startsWith(github.event.ref, 'refs/tags') || github.event_name == 'workflow_dispatch' }}
needs: [setup, build]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.head_sha || github.event.client_payload.head_sha }}
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v6.0.0
with:
gpg_private_key: ${{ secrets.APT_GPG }}
- name: Install reprepro
run: sudo apt -y install reprepro
- name: Make build folders, export public GPG key and copy distributions file
run: |
mkdir -p apt/{conf,dists,db}
gpg --armor --output apt/hyperion.pub.key --export 'admin@hyperion-project.org'
cp debian/distributions apt/conf/distributions
- name: Create initial structure/packages files and symbolic links
run: |
reprepro -Vb apt createsymlinks
reprepro -Vb apt export
- name: Download artifacts
uses: actions/download-artifact@v3.0.2
- name: Include artifacts into the package source
run: |
for file in artifact/hyperion_*.deb; do
if [ -f "$file" ]; then
dist=${file#*~}
dist=${dist%_*}
reprepro -Vb apt/ includedeb "$dist" "$file"
fi
done
- name: Upload packages to APT server (DRAFT)
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
with:
server: apt.hyperion-project.org
username: ${{ secrets.APT_USER }}
password: ${{ secrets.APT_PASSWORD }}
local-dir: "./apt/"
server-dir: ${{ secrets.APT_DRAFT }}
dangerous-clean-slate: true

@ -1,58 +0,0 @@
[
{
"distribution": "Focal",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.8, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 20.04 (Focal Fossa) (amd64)"
},
{
"distribution": "Jammy",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.04 (Jammy Jellyfish) (amd64)"
},
{
"distribution": "Kinetic",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.10 (Kinetic Kudu) (amd64)"
},
{
"distribution": "Lunar",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.11, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 23.04 (Lunar Lobster) (amd64)"
},
{
"distribution": "Buster",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.7, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg0, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 10.x (Buster) (amd64)"
},
{
"distribution": "Bullseye",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.9, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 11.x (Bullseye) (amd64)"
},
{
"distribution": "Bookworm",
"architecture": "amd64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.11, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 12.x (Bookworm) (amd64)"
}
]

@ -1,51 +0,0 @@
[
{
"distribution": "Focal",
"architecture": "arm64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.8, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg, libcec4",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 20.04 (Focal Fossa) (arm64)"
},
{
"distribution": "Jammy",
"architecture": "arm64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg, libcec6",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.04 (Jammy Jellyfish) (arm64)"
},
{
"distribution": "Kinetic",
"architecture": "arm64",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg, libcec6",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.10 (Kinetic Kudu) (arm64)"
},
{
"distribution": "Buster",
"architecture": "arm64",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl-dev, libraspberrypi-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.7, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg0, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 10.x (Buster) (arm64)"
},
{
"distribution": "Bullseye",
"architecture": "arm64",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl-dev, libraspberrypi-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.9, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 11.x (Bullseye) (arm64)"
},
{
"distribution": "Bookworm",
"architecture": "arm64",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl-dev, libraspberrypi-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.11, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 12.x (Bookworm) (arm64)",
"exclude" : true
}
]

@ -1,51 +0,0 @@
[
{
"distribution": "Focal",
"architecture": "armhf",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.8, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg, libcec4",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 20.04 (Focal Fossa) (armhf)"
},
{
"distribution": "Jammy",
"architecture": "armhf",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg, libcec6",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.04 (Jammy Jellyfish) (armhf)"
},
{
"distribution": "Kinetic",
"architecture": "armhf",
"build-depends": "git, cmake, build-essential, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, libqt5x11extras5-dev, libusb-1.0-0-dev, python3-dev, libcec-dev, libxcb-image0-dev, libxcb-util0-dev, libxcb-shm0-dev, libxcb-render0-dev, libxcb-randr0-dev, libxrandr-dev, libxrender-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libssl-dev, libmbedtls-dev",
"package-depends": "libpython3.10, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg, libcec6",
"cmake-environment": "-DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DENABLE_XCB=ON -DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Ubuntu 22.10 (Kinetic Kudu) (armhf)"
},
{
"distribution": "Buster",
"architecture": "armhf",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl1.0-dev, libraspberrypi-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.7, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg0, libcec4",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 10.x (Buster) (armhf)"
},
{
"distribution": "Bullseye",
"architecture": "armhf",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl-dev, libraspberrypi-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.9, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls12, libasound2, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 11.x (Bullseye) (armhf)"
},
{
"distribution": "Bookworm",
"architecture": "armhf",
"build-depends": "git, cmake, python3-dev, qtbase5-dev, libqt5serialport5-dev, libqt5sql5-sqlite, libqt5svg5-dev, build-essential, libusb-1.0-0-dev, libcec-dev, libssl-dev, libraspberrypi-dev, libasound2-dev, libturbojpeg0-dev, libjpeg-dev, libmbedtls-dev",
"package-depends": "libpython3.11, libusb-1.0-0, libqt5widgets5, libqt5x11extras5, libqt5sql5, libqt5sql5-sqlite, libqt5serialport5, libmbedtls14, libasound2, libturbojpeg0, libcec6",
"cmake-environment": "-DUSE_SYSTEM_MBEDTLS_LIBS=ON -DENABLE_DEPLOY_DEPENDENCIES=OFF -DCMAKE_BUILD_TYPE=Release",
"description": "Debian 12.x (Bookworm) (armhf)",
"exclude" : true
}
]

@ -1,4 +1,4 @@
name: Clean artifacts name: 🧹 Cleanup old artifacts
# Run cleanup workflow at the end of every day # Run cleanup workflow at the end of every day
on: on:
@ -9,7 +9,7 @@ jobs:
clean: clean:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: cleanup - name: 🧹 Cleanup old workflow artifacts
uses: kolpav/purge-artifacts-action@v1 uses: kolpav/purge-artifacts-action@v1
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}

@ -1,4 +1,8 @@
name: "CodeQL" name: 📊 CodeQL
run-name: |
${{ github.event_name == 'schedule' && '⏰ Scheduled CodeQL run' || '' }}
${{ github.event_name == 'push' && format('📊 Pushed CodeQL run - {0}', github.event.head_commit.message) || '' }}
${{ github.event_name == 'pull_request' && format('📊 CodeQL run for PR {0} - {1}', github.event.pull_request.number, github.event.pull_request.title) || github.event.head_commit.message }}
on: on:
push: push:
@ -10,7 +14,7 @@ on:
jobs: jobs:
analyze: analyze:
name: Analyze name: 📊 Analyze
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
actions: read actions: read
@ -23,35 +27,35 @@ jobs:
language: [ python, javascript, cpp ] language: [ python, javascript, cpp ]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
submodules: recursive submodules: recursive
- name: Install Packages (cpp) - name: 📥 Install Packages (cpp)
if: ${{ matrix.language == 'cpp' }} if: ${{ matrix.language == 'cpp' }}
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install --yes git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libasound2-dev libturbojpeg0-dev libjpeg-dev libssl-dev sudo apt-get install --yes git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libasound2-dev libturbojpeg0-dev libjpeg-dev libssl-dev
- name: Initialize CodeQL - name: 🔁 Initialize CodeQL
uses: github/codeql-action/init@v2 uses: github/codeql-action/init@v2
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
queries: +security-and-quality queries: +security-and-quality
config-file: ./.github/config/codeql.yml config-file: ./.github/config/codeql.yml
- name: Autobuild - name: 👷 Autobuild
uses: github/codeql-action/autobuild@v2 uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis - name: 🏃 Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2 uses: github/codeql-action/analyze@v2
with: with:
category: "/language:${{ matrix.language }}" category: "/language:${{ matrix.language }}"
upload: False upload: False
output: sarif-results output: sarif-results
- name: Filter SARIF - name: 🆔 Filter SARIF
uses: advanced-security/filter-sarif@v1 uses: advanced-security/filter-sarif@v1
with: with:
patterns: | patterns: |
@ -63,11 +67,12 @@ jobs:
input: sarif-results/${{ matrix.language }}.sarif input: sarif-results/${{ matrix.language }}.sarif
output: sarif-results/${{ matrix.language }}.sarif output: sarif-results/${{ matrix.language }}.sarif
- name: Upload SARIF - name: 📦 Upload SARIF
uses: github/codeql-action/upload-sarif@v2 uses: github/codeql-action/upload-sarif@v2
with: with:
sarif_file: sarif-results/${{ matrix.language }}.sarif sarif_file: sarif-results/${{ matrix.language }}.sarif
- name: Upload loc as a Build Artifact
- name: 📦 Upload loc as a Build Artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
name: sarif-results name: sarif-results

@ -1,187 +0,0 @@
name: Nightly build
# Create nightly builds at the end of every day
on:
schedule:
- cron: '0 0 * * *'
repository_dispatch:
types: [hyperion_nightly_push]
jobs:
update:
name: Update Submodule rpi_ws281x
if: github.repository_owner == 'hyperion-project'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0
submodules: recursive
- name: Update Submodule rpi_ws281x
id: update
run: git submodule update --remote --recursive dependencies/external/rpi_ws281x
- name: Check git status
id: status
run: echo "status=$(git status -s)" >> $GITHUB_OUTPUT
- name: Add and commit changes
if: ${{ steps.status.outputs.status }}
run: |
git config --local user.email "20935312+Hyperion-Bot@users.noreply.github.com"
git config --local user.name "Hyperion-Bot"
git config --local diff.ignoreSubmodules dirty
git commit -am "Update submodule rpi_ws281x"
- name: Push changes
if: ${{ steps.status.outputs.status }}
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.HYPERION_BOT_TOKEN }}
branch: ${{ github.ref }}
check:
name: Compare local <-> nightly
needs: [update]
if: github.repository_owner == 'hyperion-project'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check if commit has changed
id: build-necessary
run: |
if wget --spider "https://nightly.apt.hyperion-project.org/$(git rev-parse --short HEAD)" 2>/dev/null; then
echo "commit-has-changed=false" >> $GITHUB_OUTPUT
else
echo "commit-has-changed=true" >> $GITHUB_OUTPUT
fi
outputs:
build-nightly: ${{ steps.build-necessary.outputs.commit-has-changed }}
setup:
name: Setup nightly build
needs: [check]
if: ${{ needs.check.outputs.build-nightly == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set nightly matrix
id: nightly-ppa
run: |
NIGHTLY=$(jq -n '.include |= [ inputs[] | select(.["exclude"] != true)]' .github/workflows/apt/*.json --compact-output)
echo "nightly=$NIGHTLY" >> $GITHUB_OUTPUT
outputs:
nightly-matrix: ${{ steps.nightly-ppa.outputs.nightly }}
build:
name: ${{ matrix.description }}
needs: [setup]
runs-on: ubuntu-latest
strategy:
matrix: ${{ fromJson(needs.setup.outputs.nightly-matrix) }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Generate environment variables
run: |
echo "$(tr -d '\n' < .version)+nightly$(date '+%Y%m%d')$(git rev-parse --short HEAD)" > .version
VERSION=$(cat .version)
echo VERSION=${VERSION} >> $GITHUB_ENV
if [[ $VERSION == *"-"* ]]; then
echo STANDARDS_VERSION=$(echo ${VERSION%-*}) >> $GITHUB_ENV
echo TARBALL_VERSION=$(echo ${VERSION%-*}) >> $GITHUB_ENV
echo DEBIAN_FORMAT='3.0 (quilt)' >> $GITHUB_ENV
else
echo STANDARDS_VERSION=$(echo ${VERSION%+*}) >> $GITHUB_ENV
echo TARBALL_VERSION=${VERSION}~$(echo ${{ matrix.distribution }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV
echo DEBIAN_FORMAT='3.0 (native)' >> $GITHUB_ENV
fi
echo DISTRIBUTION=$(echo ${{ matrix.distribution }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV
- name: Build package
shell: bash
run: |
mkdir -p "${GITHUB_WORKSPACE}/deploy"
docker run --rm \
-v "${GITHUB_WORKSPACE}/deploy:/deploy" \
-v "${GITHUB_WORKSPACE}:/source:rw" \
ghcr.io/hyperion-project/${{ matrix.architecture }}:${{ env.DISTRIBUTION }} \
/bin/bash -c "cd /source && \
mkdir -p debian/source && echo '${{ env.DEBIAN_FORMAT }}' > debian/source/format && \
dch --create --distribution ${{ env.DISTRIBUTION }} --package 'hyperion' -v '${{ env.VERSION }}~${{ env.DISTRIBUTION }}' '${{ github.event.commits[0].message }}' && \
cp -fr LICENSE debian/copyright && \
sed 's/@BUILD_DEPENDS@/${{ matrix.build-depends }}/g; s/@DEPENDS@/${{ matrix.package-depends }}/g; s/@ARCHITECTURE@/${{ matrix.architecture }}/g; s/@STANDARDS_VERSION@/${{ env.STANDARDS_VERSION }}/g' debian/control.in > debian/control && \
sed 's/@CMAKE_ENVIRONMENT@/${{ matrix.cmake-environment }}/g' debian/rules.in > debian/rules && \
tar -cJf ../hyperion_${{ env.TARBALL_VERSION }}.orig.tar.xz . && \
debuild --no-lintian -uc -us && \
cp ../hyperion_*.deb /deploy"
- name: Upload package artifact
uses: actions/upload-artifact@v3
with:
path: deploy
retention-days: 1
publish:
name: Publish nightly packages
needs: [setup, build]
if: github.repository_owner == 'hyperion-project'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v6.0.0
with:
gpg_private_key: ${{ secrets.APT_GPG }}
- name: Install reprepro
run: sudo apt -y install reprepro
- name: Make build folders, export public GPG key, copy distributions file and create short sha file for nightly build check
run: |
mkdir -p nightly/{conf,dists,db}
gpg --armor --output nightly/hyperion.pub.key --export 'admin@hyperion-project.org'
cp debian/distributions nightly/conf/distributions
touch "nightly/$(git rev-parse --short HEAD)"
- name: Create initial structure/packages files and symbolic links
run: |
reprepro -Vb nightly createsymlinks
reprepro -Vb nightly export
- name: Download artifacts
uses: actions/download-artifact@v3.0.2
- name: Include artifacts into the package source
run: |
for file in artifact/*.deb; do
if [ -f "$file" ]; then
dist=${file#*~}
dist=${dist%_*}
reprepro -Vb nightly/ includedeb "$dist" "$file"
fi
done
- name: Upload packages to nightly server
uses: SamKirkland/FTP-Deploy-Action@v4.3.4
with:
server: nightly.apt.hyperion-project.org
username: ${{ secrets.NIGHTLY_USER }}
password: ${{ secrets.NIGHTLY_PASSWORD }}
local-dir: "./nightly/"
server-dir: "./"
dangerous-clean-slate: true
- name: Remove intermediate artifacts
uses: geekyeggo/delete-artifact@v2
with:
name: artifact
failOnError: false

@ -1,193 +0,0 @@
name: Hyperion PR Build
on:
pull_request:
branches:
- master
jobs:
######################
###### Linux #########
######################
Linux:
name: ${{ matrix.dockerName }}
runs-on: ubuntu-latest
strategy:
matrix:
dockerImage: [ x86_64, armv6l, armv7l, aarch64 ]
include:
- dockerImage: x86_64
dockerName: Debian Buster (x86_64)
platform: x11
- dockerImage: armv6l
dockerName: Debian Buster (Raspberry Pi v1 & ZERO)
platform: rpi
- dockerImage: armv7l
dockerName: Debian Buster (Raspberry Pi 2 & 3)
platform: rpi
- dockerImage: aarch64
dockerName: Debian Buster (Generic AARCH64)
platform: amlogic
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
# Append PR number to .version
- name: Append PR number to version
shell: bash
run: |
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ github.event.pull_request.number }}" >> .version
# Build packages
- name: Build packages
env:
DOCKER_IMAGE: ${{ matrix.dockerImage }}
DOCKER_TAG: buster
DOCKER_NAME: ${{ matrix.dockerName }}
PLATFORM: ${{ matrix.platform }}
shell: bash
run: ./.ci/ci_build.sh
# Collecting deployable artifacts
- name: Collecting deployable artifacts
shell: bash
run: |
mkdir -p ${{ matrix.dockerImage }}
mv deploy/*.tar.gz ${{ matrix.dockerImage }}
# Upload artifacts
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: ${{ matrix.dockerImage }}
path: ${{ matrix.dockerImage }}
######################
###### macOS #########
######################
macOS:
name: macOS
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
# Append PR number to .version
- name: Append PR number to version
shell: bash
run: |
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ github.event.pull_request.number }}" >> .version
# Install dependencies
- name: Install dependencies
shell: bash
run: ./.ci/ci_install.sh
# Build packages
- name: Build packages
env:
PLATFORM: osx
shell: bash
run: ./.ci/ci_build.sh
# Collecting deployable artifacts
- name: Collecting deployable artifacts
shell: bash
run: |
mkdir -p macOS
mv build/*.dmg macOS
# Upload artifacts
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: macOS
path: macOS
######################
###### Windows #######
######################
windows:
name: Windows
runs-on: windows-2022
env:
VCINSTALLDIR: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC'
QT_VERSION: 5.15.2
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
# Append PR number to .version
- name: Append PR number to version
shell: bash
run: |
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ github.event.pull_request.number }}" >> .version
- name: Install Qt
uses: jurplel/install-qt-action@v3
with:
version: ${{env.QT_VERSION}}
target: 'desktop'
arch: 'win64_msvc2019_64'
cache: 'true'
cache-key-prefix: 'cache-qt-windows'
- name: Cache Chocolatey downloads
uses: actions/cache@v3
with:
path: C:\Users\runneradmin\AppData\Local\Temp\chocolatey
key: ${{ runner.os }}-chocolatey
# - name: Install Python
# shell: powershell
# run: |
# choco install --no-progress python -y
- name: Install OpenSSL, DirectX SDK
shell: powershell
run: |
choco install --no-progress openssl --version=1.1.1.2100 -y
choco install --no-progress directx-sdk -y
- name: Install libjpeg-turbo
run: |
Invoke-WebRequest https://netcologne.dl.sourceforge.net/project/libjpeg-turbo/2.0.6/libjpeg-turbo-2.0.6-vc64.exe -OutFile libjpeg-turbo.exe -UserAgent NativeHost
.\libjpeg-turbo /S
- name: Set up x64 build architecture environment
shell: cmd
run: call "${{env.VCINSTALLDIR}}\Auxiliary\Build\vcvars64.bat"
# Build packages
- name: Build packages
env:
PLATFORM: windows
shell: bash
run: ./.ci/ci_build.sh
# Collecting deployable artifacts
- name: Collecting deployable artifacts
shell: bash
run: |
mkdir -p windows
mv build/*.exe windows
# Upload artifacts
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: windows
path: windows

@ -1,201 +0,0 @@
name: Hyperion CI Build
on:
push:
branches:
- '**'
tags:
- '*'
jobs:
###################
###### Linux ######
###################
Linux:
name: ${{ matrix.dockerName }}
runs-on: ubuntu-latest
strategy:
matrix:
dockerImage: [ x86_64, armv6l, armv7l, aarch64 ]
include:
- dockerImage: x86_64
dockerName: Debian Buster (x86_64)
platform: x11
- dockerImage: armv6l
dockerName: Debian Buster (Raspberry Pi v1 & ZERO)
platform: rpi
- dockerImage: armv7l
dockerName: Debian Buster (Raspberry Pi 2 & 3)
platform: rpi
- dockerImage: aarch64
dockerName: Debian Buster (Generic AARCH64)
platform: amlogic
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
# Build process
- name: Build packages
env:
DOCKER_IMAGE: ${{ matrix.dockerImage }}
DOCKER_TAG: buster
DOCKER_NAME: ${{ matrix.dockerName }}
PLATFORM: ${{ matrix.platform }}
shell: bash
run: ./.ci/ci_build.sh
# Upload artifacts (only on tagged commit)
- name: Upload artifacts
if: startsWith(github.event.ref, 'refs/tags')
uses: actions/upload-artifact@v3
with:
path: deploy/Hyperion-*
###################
###### macOS ######
###################
macOS:
name: macOS
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
# Install dependencies
- name: Install dependencies
shell: bash
run: ./.ci/ci_install.sh
# Build process
- name: Build packages
env:
PLATFORM: osx
shell: bash
run: ./.ci/ci_build.sh
# Upload artifacts (only on tagged commit)
- name: Upload artifacts
if: startsWith(github.event.ref, 'refs/tags')
uses: actions/upload-artifact@v3
with:
path: build/Hyperion-*
#####################
###### Windows ######
#####################
windows:
name: Windows
runs-on: windows-2022
env:
VCINSTALLDIR: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC'
QT_VERSION: 5.15.2
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Qt
uses: jurplel/install-qt-action@v3
with:
version: ${{env.QT_VERSION}}
target: 'desktop'
arch: 'win64_msvc2019_64'
cache: 'true'
cache-key-prefix: 'cache-qt-windows'
- name: Cache Chocolatey downloads
uses: actions/cache@v3
with:
path: C:\Users\runneradmin\AppData\Local\Temp\chocolatey
key: ${{ runner.os }}-chocolatey
# - name: Install Python
# shell: powershell
# run: |
# choco install --no-progress python -y
- name: Install OpenSSL, DirectX SDK
shell: powershell
run: |
choco install --no-progress openssl --version=1.1.1.2100 -y
choco install --no-progress directx-sdk -y
- name: Install libjpeg-turbo
run: |
Invoke-WebRequest https://netcologne.dl.sourceforge.net/project/libjpeg-turbo/2.0.6/libjpeg-turbo-2.0.6-vc64.exe -OutFile libjpeg-turbo.exe -UserAgent NativeHost
.\libjpeg-turbo /S
- name: Set up x64 build architecture environment
shell: cmd
run: call "${{env.VCINSTALLDIR}}\Auxiliary\Build\vcvars64.bat"
# Build packages
- name: Build packages
env:
PLATFORM: windows
shell: bash
run: ./.ci/ci_build.sh
# Upload artifacts (only on tagged commit)
- name: Upload artifacts
if: startsWith(github.event.ref, 'refs/tags')
uses: actions/upload-artifact@v3
with:
path: build/Hyperion-*
retention-days: 1
#####################################
###### Publish GitHub Releases ######
#####################################
github_publish:
name: Publish GitHub Releases
if: startsWith(github.event.ref, 'refs/tags')
needs: [Linux, macOS, windows]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
# Generate environment variables
- name: Generate environment variables from .version and tag
run: |
echo "TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
echo "VERSION=$(tr -d '\n' < .version)" >> $GITHUB_ENV
# Download artifacts from previous build process
- name: Download artifacts
uses: actions/download-artifact@v3.0.2
with:
path: artifacts
# Create draft release and upload artifacts
- name: Create draft release
uses: softprops/action-gh-release@v1
with:
name: Hyperion ${{ env.VERSION }}
tag_name: ${{ env.TAG }}
files: "artifacts/**"
draft: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
##########################
###### APT workflow ######
##########################
apt_build:
name: APT Build GitHub Releases
if: startsWith(github.event.ref, 'refs/tags')
needs: [Linux, macOS, windows]
uses: ./.github/workflows/apt.yml
secrets: inherit
with:
head_sha: master

49
.github/workflows/push_pull.yml vendored Normal file

@ -0,0 +1,49 @@
name: Hyperion CI/PR Builds
run-name: |
${{ github.event_name == 'push' && '🌱 Push build -' || '' }}
${{ github.event_name == 'pull_request' && format('📦 Artifacts build for PR {0} - {1}', github.event.pull_request.number, github.event.pull_request.title) || github.event.head_commit.message }}
on:
push:
branches:
- '**'
tags:
- '*'
pull_request:
branches:
- 'master'
jobs:
# GitHub Push/Pull Request (Release only on tagged commits)
github_build:
name: Qt ${{ matrix.qt_version }} Build ${{ matrix.qt_version == '6' && '(Testing))' || '' }}
strategy:
fail-fast: false
matrix:
qt_version: ['5', '6']
uses: ./.github/workflows/qt5_6.yml
secrets: inherit
with:
qt_version: ${{ matrix.qt_version }}
event_name: ${{ github.event_name }}
pull_request_number: ${{ github.event.pull_request.number }}
publish: ${{ startsWith(github.event.ref, 'refs/tags') }}
# Build DEB/RPM Packages for APT/DNF Repository (runs only on tagged commits)
repo_build:
name: 🚀 Let Hyperion build its own repository (APT/DNF)
if: startsWith(github.event.ref, 'refs/tags')
needs: [ github_build ]
runs-on: ubuntu-latest
steps:
- name: 📲 Dispatch APT/DNF build
if: ${{ env.SECRET_HYPERION_BOT_TOKEN != null }}
uses: peter-evans/repository-dispatch@v2.1.2
with:
repository: hyperion-project/hyperion.releases-ci
token: ${{ secrets.HYPERION_BOT_TOKEN }}
event-type: releases_repo_build
client-payload: '{ "head_sha": "${{ github.sha }}" }'
env:
SECRET_HYPERION_BOT_TOKEN: ${{ secrets.HYPERION_BOT_TOKEN }}

250
.github/workflows/qt5_6.yml vendored Normal file

@ -0,0 +1,250 @@
name: GitHub Qt5/6 Builds
on:
# Reusable from push_pull.yml
workflow_call:
inputs:
qt_version:
type: string
description: Build with this Qt version
default: '5'
required: false
event_name:
type: string
description: The event name
default: ''
required: false
pull_request_number:
type: string
description: The corresponding PR number
default: ''
required: false
publish:
type: boolean
description: Package publishing
default: false
required: false
env:
ghcr: hyperion-project
jobs:
######################
###### Linux #########
######################
Linux:
name: 🐧 ${{ matrix.os.description }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
os: [
{ distribution: debian, codename: buster, description: Debian Buster (x86_64), architecture: [ amd64, linux/amd64 ] },
{ distribution: debian, codename: bullseye, description: Debian Bullseye (x86_64), architecture: [ amd64, linux/amd64 ] },
{ distribution: debian, codename: buster, description: Debian Buster (Raspberry Pi 1/ZERO), architecture: [ armv6, linux/arm/v5 ] },
{ distribution: debian, codename: buster, description: Debian Buster (Raspberry Pi 2/3/4), architecture: [ armv7, linux/arm/v7 ] },
{ distribution: debian, codename: bullseye, description: Debian Bullseye (Raspberry Pi 2/3/4), architecture: [ armv7, linux/arm/v7 ] },
{ distribution: debian, codename: buster, description: Debian Buster (Generic AARCH64), architecture: [ aarch64, linux/arm64 ] },
{ distribution: debian, codename: bullseye, description: Debian Bullseye (Generic AARCH64), architecture: [ aarch64, linux/arm64 ] }
]
isQt5:
- ${{ inputs.qt_version == '5' }}
include:
- os.architecture[0]: amd64
platform: x11
- os.architecture[0]: armv6
platform: rpi
- os.architecture[0]: armv7
platform: rpi
- os.architecture[0]: aarch64
platform: amlogic
exclude:
- isQt5: true
os: { distribution: debian, codename: bullseye }
- isQt5: false
os: { distribution: debian, codename: buster }
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: 🔧 Prepare
shell: bash
run: |
echo '::group::Append PR number to version (PR only)'
if [[ "${{ inputs.event_name }}" = "pull_request" ]]; then
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ inputs.pull_request_number }}" >> .version
fi
echo '::endgroup::'
- name: 👷 Build
shell: bash
run: ./.github/scripts/build.sh
env:
DOCKER_IMAGE: ${{ matrix.os.distribution }}
DOCKER_TAG: ${{ matrix.os.codename }}${{ inputs.qt_version == '6' && '-qt6' || '' }}
PLATFORM: ${{ matrix.platform }}
TARGET_ARCH: ${{ matrix.os.architecture[1] }}
- name: 📦 Upload
if: ${{ inputs.publish || inputs.event_name == 'pull_request' }}
uses: actions/upload-artifact@v3
with:
name: ${{ inputs.event_name == 'pull_request' && env.NAME || 'artifact' }}
path: ${{ inputs.event_name == 'pull_request' && 'deploy/*.tar.gz' || 'deploy/Hyperion-*' }}
env:
NAME: ${{ format('{0}_{1}_{2}{3}', matrix.os.distribution, matrix.os.codename, matrix.os.architecture[0], inputs.qt_version == '6' && '_qt6' || '') }}
######################
###### macOS #########
######################
macOS:
name: 🍏 macOS x64
runs-on: macos-latest
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: 🔧 Prepare
shell: bash
run: |
echo '::group::Append PR number to version (PR only)'
if [[ "${{ inputs.event_name }}" = "pull_request" ]]; then
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ inputs.pull_request_number }}" >> .version
fi
echo '::endgroup::'
echo '::group::Update/Install dependencies'
brew update || true
brew install --overwrite qt${{ inputs.qt_version }} libusb
brew link --overwrite --force qt${{ inputs.qt_version }}
echo '::endgroup::'
- name: 👷 Build
shell: bash
run: ./.github/scripts/build.sh
env:
PLATFORM: osx
- name: 📦 Upload
if: ${{ inputs.publish || inputs.event_name == 'pull_request' }}
uses: actions/upload-artifact@v3
with:
name: ${{ inputs.event_name == 'pull_request' && env.NAME || 'artifact' }}
path: 'build/Hyperion-*'
env:
NAME: ${{ inputs.qt_version == '6' && 'macOS_x64_qt6' || 'macOS_x64' }}
######################
###### Windows #######
######################
windows:
name: 🪟 Windows x64
runs-on: windows-2022
env:
VCINSTALLDIR: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC'
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: 🔧 Prepare PR
if: ${{ inputs.event_name == 'pull_request' }}
shell: bash
run: |
echo '::group::Append PR number to version'
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ inputs.pull_request_number }}" >> .version
echo '::endgroup::'
- name: 💾 Cache/Restore
uses: actions/cache@v3
with:
path: C:\Users\runneradmin\AppData\Local\Temp\chocolatey
key: ${{ runner.os }}${{ inputs.qt_version == '6' && '-chocolatey-qt6' || '-chocolatey' }}
- name: 📥 Install DirectX SDK, OpenSSL, libjpeg-turbo ${{ inputs.qt_version == '6' && 'and Vulkan-SDK' || '' }}
shell: powershell
run: |
choco install --no-progress directx-sdk ${{env.VULKAN_SDK}} -y
choco install --no-progress ${{env.OPENSSL}} -y
Invoke-WebRequest https://netcologne.dl.sourceforge.net/project/libjpeg-turbo/3.0.1/libjpeg-turbo-3.0.1-vc64.exe -OutFile libjpeg-turbo.exe -UserAgent NativeHost
.\libjpeg-turbo /S
env:
VULKAN_SDK: ${{ inputs.qt_version == '6' && 'vulkan-sdk' || '' }}
OPENSSL: ${{ inputs.qt_version == '6' && 'openssl' || 'openssl --version=1.1.1.2100' }}
- name: 📥 Install Qt
uses: jurplel/install-qt-action@v3
with:
version: ${{ inputs.qt_version == '6' && '6.5.2' || '5.15.2' }}
target: 'desktop'
modules: ${{ inputs.qt_version == '6' && 'qtserialport' || '' }}
arch: 'win64_msvc2019_64'
cache: 'true'
cache-key-prefix: 'cache-qt-windows'
- name: 🛠️ Setup MSVC
shell: cmd
run: call "${{env.VCINSTALLDIR}}\Auxiliary\Build\vcvars64.bat"
- name: 👷 Build
shell: bash
run: ./.github/scripts/build.sh
env:
PLATFORM: windows
- name: 📦 Upload
if: ${{ inputs.publish || inputs.event_name == 'pull_request' }}
uses: actions/upload-artifact@v3
with:
name: ${{ inputs.event_name == 'pull_request' && env.NAME || 'artifact' }}
path: ${{ inputs.event_name == 'pull_request' && 'build/*.exe' || 'build/Hyperion-*' }}
env:
NAME: ${{ inputs.qt_version == '6' && 'windows_x64_qt6' || 'windows_x64' }}
#####################################
###### Publish GitHub Releases ######
#####################################
github_publish:
name: 🚀 Publish GitHub Releases
if: ${{ inputs.qt_version == '5' && inputs.publish }}
needs: [Linux, macOS, windows]
runs-on: ubuntu-latest
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
- name: 🔧 Prepare
run: |
echo '::group::Generate environment variables from .version and tag'
echo "TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
echo "VERSION=$(tr -d '\n' < .version)" >> $GITHUB_ENV
echo '::endgroup::'
- name: 💾 Artifact download
uses: actions/download-artifact@v3.0.2
with:
path: artifacts
- name: 📦 Upload
uses: softprops/action-gh-release@v1
with:
name: Hyperion ${{ env.VERSION }}
tag_name: ${{ env.TAG }}
files: "artifacts/**"
draft: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

@ -1,15 +1,18 @@
name: Release Actions name: 🚀 Release Actions
run-name: 🚀 Let HyperBian create
on: on:
release: release:
types: [published] types: [published]
jobs: jobs:
hyperbian: hyperbian:
name: Let HyperBian create name: 🚀 Let HyperBian create
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
# Dispatch event to build new HyperBian image # Dispatch event to build new HyperBian image
- name: Dispatch HyperBian build - name: 📲 Dispatch HyperBian build
uses: peter-evans/repository-dispatch@v2.1.2 uses: peter-evans/repository-dispatch@v2.1.2
if: ${{ github.repository_owner == 'hyperion-project'}} if: ${{ github.repository_owner == 'hyperion-project'}}
with: with:

@ -1,17 +1,17 @@
cmake_minimum_required(VERSION 3.5.0) cmake_minimum_required(VERSION 3.5.0)
message( STATUS "CMake Version: ${CMAKE_VERSION}" ) message(STATUS "CMake Version: ${CMAKE_VERSION}")
macro(addIndent text) macro(addIndent text)
if(${CMAKE_VERSION} VERSION_GREATER "3.16.0") if(${CMAKE_VERSION} VERSION_GREATER "3.16.0")
list(APPEND CMAKE_MESSAGE_INDENT ${text}) list(APPEND CMAKE_MESSAGE_INDENT ${text})
endif() endif()
endmacro() endmacro()
macro(removeIndent) macro(removeIndent)
if(${CMAKE_VERSION} VERSION_GREATER "3.16.0") if(${CMAKE_VERSION} VERSION_GREATER "3.16.0")
list(POP_BACK CMAKE_MESSAGE_INDENT) list(POP_BACK CMAKE_MESSAGE_INDENT)
endif() endif()
endmacro() endmacro()
PROJECT(hyperion) PROJECT(hyperion)
@ -31,9 +31,16 @@ set(CMAKE_AUTOMOC ON)
# auto prepare .qrc files # auto prepare .qrc files
set(CMAKE_AUTORCC ON) set(CMAKE_AUTORCC ON)
# Configure CCache if available # multicore compiling
include(ProcessorCount)
ProcessorCount(NCORES)
if(NOT NCORES EQUAL 0)
set(CMAKE_BUILD_PARALLEL_LEVEL NCORES)
endif()
# Configure CCache ifavailable
find_program(CCACHE_FOUND ccache) find_program(CCACHE_FOUND ccache)
if ( CCACHE_FOUND ) if(CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND) endif(CCACHE_FOUND)
@ -58,160 +65,163 @@ set(CMAKE_CXX_EXTENSIONS OFF)
# Set build variables # Set build variables
# Grabber # Grabber
SET ( DEFAULT_AMLOGIC OFF ) set(DEFAULT_AMLOGIC OFF)
SET ( DEFAULT_DISPMANX OFF ) set(DEFAULT_DISPMANX OFF)
SET ( DEFAULT_DX OFF ) set(DEFAULT_DX OFF)
SET ( DEFAULT_MF OFF ) set(DEFAULT_MF OFF)
SET ( DEFAULT_OSX OFF ) set(DEFAULT_OSX OFF)
SET ( DEFAULT_QT ON ) set(DEFAULT_QT ON )
SET ( DEFAULT_V4L2 OFF ) set(DEFAULT_V4L2 OFF)
SET ( DEFAULT_AUDIO ON ) set(DEFAULT_AUDIO ON )
SET ( DEFAULT_X11 OFF ) set(DEFAULT_X11 OFF)
SET ( DEFAULT_XCB OFF ) set(DEFAULT_XCB OFF)
# Input # Input
SET ( DEFAULT_BOBLIGHT_SERVER ON ) set(DEFAULT_BOBLIGHT_SERVER ON )
SET ( DEFAULT_CEC OFF ) set(DEFAULT_CEC OFF)
SET ( DEFAULT_FLATBUF_SERVER ON ) set(DEFAULT_FLATBUF_SERVER ON )
SET ( DEFAULT_PROTOBUF_SERVER ON ) set(DEFAULT_PROTOBUF_SERVER ON )
# Output # Output
SET ( DEFAULT_FORWARDER ON ) set(DEFAULT_FORWARDER ON )
SET ( DEFAULT_FLATBUF_CONNECT ON ) set(DEFAULT_FLATBUF_CONNECT ON )
# LED-Devices # LED-Devices
SET ( DEFAULT_DEV_NETWORK ON ) set(DEFAULT_DEV_NETWORK ON )
SET ( DEFAULT_DEV_SERIAL ON ) set(DEFAULT_DEV_SERIAL ON )
SET ( DEFAULT_DEV_SPI OFF ) set(DEFAULT_DEV_SPI OFF)
SET ( DEFAULT_DEV_TINKERFORGE OFF ) set(DEFAULT_DEV_TINKERFORGE OFF)
SET ( DEFAULT_DEV_USB_HID OFF ) set(DEFAULT_DEV_USB_HID OFF)
SET ( DEFAULT_DEV_WS281XPWM OFF ) set(DEFAULT_DEV_WS281XPWM OFF)
# Services # Services
SET ( DEFAULT_EFFECTENGINE ON ) set(DEFAULT_EFFECTENGINE ON )
SET ( DEFAULT_EXPERIMENTAL OFF ) set(DEFAULT_EXPERIMENTAL OFF)
SET ( DEFAULT_MDNS ON ) set(DEFAULT_MDNS ON )
SET ( DEFAULT_REMOTE_CTL ON ) set(DEFAULT_REMOTE_CTL ON )
# Build # Build
SET ( DEFAULT_JSONCHECKS ON ) set(DEFAULT_JSONCHECKS ON )
SET ( DEFAULT_DEPLOY_DEPENDENCIES ON ) set(DEFAULT_DEPLOY_DEPENDENCIES ON )
SET ( DEFAULT_USE_SYSTEM_FLATBUFFERS_LIBS OFF ) set(DEFAULT_USE_SYSTEM_FLATBUFFERS_LIBS OFF)
SET ( DEFAULT_USE_SYSTEM_PROTO_LIBS OFF ) set(DEFAULT_USE_SYSTEM_PROTO_LIBS OFF)
SET ( DEFAULT_USE_SYSTEM_MBEDTLS_LIBS OFF ) set(DEFAULT_USE_SYSTEM_MBEDTLS_LIBS OFF)
SET ( DEFAULT_USE_SYSTEM_QMDNS_LIBS OFF ) set(DEFAULT_USE_SYSTEM_QMDNS_LIBS OFF)
SET ( DEFAULT_TESTS OFF ) set(DEFAULT_TESTS OFF)
# Build Hyperion with a reduced set of functionality, overwrites other default values # Build Hyperion with a reduced set of functionality, overwrites other default values
SET ( DEFAULT_HYPERION_LIGHT OFF ) set(DEFAULT_HYPERION_LIGHT OFF)
IF ( ${CMAKE_SYSTEM} MATCHES "Linux" ) if(${CMAKE_SYSTEM} MATCHES "Linux")
SET ( DEFAULT_FB ON ) set(DEFAULT_FB ON)
SET ( DEFAULT_V4L2 ON ) set(DEFAULT_V4L2 ON)
SET ( DEFAULT_DEV_SPI ON ) set(DEFAULT_DEV_SPI ON)
SET ( DEFAULT_DEV_TINKERFORGE ON ) set(DEFAULT_DEV_TINKERFORGE ON)
SET ( DEFAULT_DEV_USB_HID ON ) set(DEFAULT_DEV_USB_HID ON)
SET ( DEFAULT_CEC ON ) set(DEFAULT_CEC ON)
ELSEIF ( WIN32 ) elseif (WIN32)
SET ( DEFAULT_DX ON ) set(DEFAULT_DX ON)
SET ( DEFAULT_MF ON ) set(DEFAULT_MF ON)
ELSE() else()
SET ( DEFAULT_FB OFF ) set(DEFAULT_FB OFF)
SET ( DEFAULT_V4L2 OFF ) set(DEFAULT_V4L2 OFF)
SET ( DEFAULT_DEV_SPI OFF ) set(DEFAULT_DEV_SPI OFF)
SET ( DEFAULT_DEV_TINKERFORGE OFF ) set(DEFAULT_DEV_TINKERFORGE OFF)
SET ( DEFAULT_DEV_USB_HID OFF ) set(DEFAULT_DEV_USB_HID OFF)
SET ( DEFAULT_CEC OFF ) set(DEFAULT_CEC OFF)
ENDIF() endif()
if ( NOT DEFINED PLATFORM ) if(NOT DEFINED PLATFORM)
if ( APPLE ) if(APPLE)
SET( PLATFORM "osx") set(PLATFORM "osx")
elseif ( WIN32 ) elseif (WIN32)
SET( PLATFORM "windows") set(PLATFORM "windows")
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86" ) elseif ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86")
SET( PLATFORM "x11") set(PLATFORM "x11")
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64") elseif ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64")
SET( PLATFORM "rpi") set(PLATFORM "rpi")
FILE( READ /proc/cpuinfo SYSTEM_CPUINFO ) file(READ /proc/cpuinfo SYSTEM_CPUINFO)
STRING ( TOLOWER "${SYSTEM_CPUINFO}" SYSTEM_CPUINFO ) STRING (TOLOWER "${SYSTEM_CPUINFO}" SYSTEM_CPUINFO)
if ( "${SYSTEM_CPUINFO}" MATCHES "amlogic" AND ${CMAKE_SIZEOF_VOID_P} EQUAL 4 ) if("${SYSTEM_CPUINFO}" MATCHES "amlogic" AND ${CMAKE_SIZEOF_VOID_P} EQUAL 4)
SET( PLATFORM "amlogic" ) set(PLATFORM "amlogic")
elseif ( ("${SYSTEM_CPUINFO}" MATCHES "amlogic" OR "${SYSTEM_CPUINFO}" MATCHES "odroid-c2" OR "${SYSTEM_CPUINFO}" MATCHES "vero4k") AND ${CMAKE_SIZEOF_VOID_P} EQUAL 8 ) elseif (("${SYSTEM_CPUINFO}" MATCHES "amlogic" OR "${SYSTEM_CPUINFO}" MATCHES "odroid-c2" OR "${SYSTEM_CPUINFO}" MATCHES "vero4k") AND ${CMAKE_SIZEOF_VOID_P} EQUAL 8)
SET( PLATFORM "amlogic64" ) set(PLATFORM "amlogic64")
endif() endif()
endif() endif()
if ( PLATFORM ) if(PLATFORM)
message( STATUS "PLATFORM is not defined, evaluated platform: ${PLATFORM}") message(STATUS "PLATFORM is not defined, evaluated platform: ${PLATFORM}")
else() else()
message( FATAL_ERROR "PLATFORM is not defined and could not be evaluated. Set -DPLATFORM=<rpi|amlogic|amlogic64|x11|x11-dev|osx|osx-dev>") message(FATAL_ERROR "PLATFORM is not defined and could not be evaluated. Set -DPLATFORM=<rpi|amlogic|amlogic64|x11|x11-dev|osx|osx-dev>")
endif() endif()
endif() endif()
message( STATUS "PLATFORM: ${PLATFORM}") message(STATUS "PLATFORM: ${PLATFORM}")
# Macro to get path of first sub dir of a dir, used for MAC OSX lib/header searching # Macro to get path of first sub dir of a dir, used for MAC OSX lib/header searching
MACRO(FIRSTSUBDIR result curdir) macro(FIRSTSUBDIR result curdir)
FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) file(GLOB children RELATIVE ${curdir} ${curdir}/*)
SET(dirlist "") set(dirlist "")
FOREACH(child ${children}) foreach(child ${children})
IF(IS_DIRECTORY ${curdir}/${child}) if(IS_DIRECTORY ${curdir}/${child})
LIST(APPEND dirlist "${curdir}/${child}") list(APPEND dirlist "${curdir}/${child}")
BREAK() break()
ENDIF() endif()
ENDFOREACH() endforeach()
SET(${result} ${dirlist}) set(${result} ${dirlist})
ENDMACRO() endmacro()
if("${PLATFORM}" MATCHES "osx")
# specify the min version of the target platform (only GitHub Actions)
if(DEFINED ENV{GITHUB_WORKSPACE})
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15")
endif()
if ( "${PLATFORM}" MATCHES "osx" )
# specify the min version of the target platform
SET ( CMAKE_OSX_DEPLOYMENT_TARGET "10.15" )
# add specific prefix paths # add specific prefix paths
FIRSTSUBDIR(SUBDIRPY "/usr/local/opt/python3/Frameworks/Python.framework/Versions") FIRSTSUBDIR(SUBDIRPY "/usr/local/opt/python3/Frameworks/Python.framework/Versions")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${SUBDIRPY}) set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${SUBDIRPY})
include_directories("/opt/X11/include/") include_directories("/opt/X11/include/")
SET ( DEFAULT_OSX ON ) set(DEFAULT_OSX ON )
SET ( DEFAULT_AUDIO OFF ) set(DEFAULT_AUDIO OFF)
SET ( DEFAULT_DEV_USB_HID ON ) set(DEFAULT_DEV_USB_HID ON )
elseif ( "${PLATFORM}" MATCHES "rpi" ) elseif ("${PLATFORM}" MATCHES "rpi")
SET ( DEFAULT_DISPMANX ON ) set(DEFAULT_DISPMANX ON)
SET ( DEFAULT_DEV_WS281XPWM ON ) set(DEFAULT_DEV_WS281XPWM ON)
elseif ( "${PLATFORM}" MATCHES "^amlogic" ) elseif ("${PLATFORM}" MATCHES "^amlogic")
SET ( DEFAULT_AMLOGIC ON ) set(DEFAULT_AMLOGIC ON)
if ( "${PLATFORM}" MATCHES "-dev$" ) if("${PLATFORM}" MATCHES "-dev$")
SET ( DEFAULT_AMLOGIC ON ) set(DEFAULT_AMLOGIC ON)
SET ( DEFAULT_DISPMANX OFF ) set(DEFAULT_DISPMANX OFF)
SET ( DEFAULT_QT OFF ) set(DEFAULT_QT OFF)
SET ( DEFAULT_CEC OFF ) set(DEFAULT_CEC OFF)
endif() endif()
elseif ( "${PLATFORM}" MATCHES "^x11" ) elseif ("${PLATFORM}" MATCHES "^x11")
SET ( DEFAULT_X11 ON ) set(DEFAULT_X11 ON)
SET ( DEFAULT_XCB ON ) set(DEFAULT_XCB ON)
if ( "${PLATFORM}" MATCHES "-dev$" ) if("${PLATFORM}" MATCHES "-dev$")
SET ( DEFAULT_AMLOGIC ON) set(DEFAULT_AMLOGIC ON)
SET ( DEFAULT_DEV_WS281XPWM ON ) set(DEFAULT_DEV_WS281XPWM ON)
endif() endif()
elseif ( "${PLATFORM}" STREQUAL "imx6" ) elseif ("${PLATFORM}" STREQUAL "imx6")
SET ( DEFAULT_FB ON ) set(DEFAULT_FB ON)
endif() endif()
# enable tests for -dev builds # enable tests for -dev builds
if ( "${PLATFORM}" MATCHES "-dev$" ) if("${PLATFORM}" MATCHES "-dev$")
SET ( DEFAULT_TESTS ON ) set(DEFAULT_TESTS ON)
endif() endif()
STRING( TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE) string(TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE)
STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" ) string(REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}")
ADD_DEFINITIONS( ${PLATFORM_DEFINE} ) ADD_DEFINITIONS(${PLATFORM_DEFINE})
# set the build options # set the build options
option(HYPERION_LIGHT "Build Hyperion with a reduced set of functionality" ${DEFAULT_HYPERION_LIGHT} ) option(HYPERION_LIGHT "Build Hyperion with a reduced set of functionality" ${DEFAULT_HYPERION_LIGHT})
message(STATUS "HYPERION_LIGHT = ${HYPERION_LIGHT}") message(STATUS "HYPERION_LIGHT = ${HYPERION_LIGHT}")
if (HYPERION_LIGHT) if(HYPERION_LIGHT)
message(STATUS "HYPERION_LIGHT: Hyperion is build with a reduced set of functionality.") message(STATUS "HYPERION_LIGHT: Hyperion is build with a reduced set of functionality.")
# Disable Grabbers # Disable Grabbers
SET ( DEFAULT_AMLOGIC OFF ) SET ( DEFAULT_AMLOGIC OFF )
@ -228,43 +238,43 @@ if (HYPERION_LIGHT)
SET ( DEFAULT_AUDIO OFF ) SET ( DEFAULT_AUDIO OFF )
# Disable Input Servers # Disable Input Servers
SET ( DEFAULT_BOBLIGHT_SERVER OFF ) set(DEFAULT_BOBLIGHT_SERVER OFF)
SET ( DEFAULT_CEC OFF ) set(DEFAULT_CEC OFF)
SET ( DEFAULT_FLATBUF_SERVER OFF ) set(DEFAULT_FLATBUF_SERVER OFF)
SET ( DEFAULT_PROTOBUF_SERVER OFF ) set(DEFAULT_PROTOBUF_SERVER OFF)
# Disable Output Connectors # Disable Output Connectors
SET ( DEFAULT_FORWARDER OFF ) set(DEFAULT_FORWARDER OFF)
SET ( DEFAULT_FLATBUF_CONNECT OFF ) set(DEFAULT_FLATBUF_CONNECT OFF)
# Disable Services # Disable Services
SET ( DEFAULT_EFFECTENGINE OFF ) set(DEFAULT_EFFECTENGINE OFF)
endif() endif()
message(STATUS "Grabber options:") message(STATUS "Grabber options:")
addIndent(" - ") addIndent(" - ")
option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC} ) option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC})
message(STATUS "ENABLE_AMLOGIC = ${ENABLE_AMLOGIC}") message(STATUS "ENABLE_AMLOGIC = ${ENABLE_AMLOGIC}")
option(ENABLE_DISPMANX "Enable the RPi dispmanx grabber" ${DEFAULT_DISPMANX} ) option(ENABLE_DISPMANX "Enable the RPi dispmanx grabber" ${DEFAULT_DISPMANX})
message(STATUS "ENABLE_DISPMANX = ${ENABLE_DISPMANX}") message(STATUS "ENABLE_DISPMANX = ${ENABLE_DISPMANX}")
option(ENABLE_DX "Enable the DirectX grabber" ${DEFAULT_DX}) option(ENABLE_DX "Enable the DirectX grabber" ${DEFAULT_DX})
message(STATUS "ENABLE_DX = ${ENABLE_DX}") message(STATUS "ENABLE_DX = ${ENABLE_DX}")
if (ENABLE_AMLOGIC) if(ENABLE_AMLOGIC)
SET(ENABLE_FB ON) set(ENABLE_FB ON)
else() else()
option(ENABLE_FB " Enable the framebuffer grabber" ${DEFAULT_FB} ) option(ENABLE_FB " Enable the framebuffer grabber" ${DEFAULT_FB})
endif() endif()
message(STATUS "ENABLE_FB = ${ENABLE_FB}") message(STATUS "ENABLE_FB = ${ENABLE_FB}")
option(ENABLE_MF "Enable the Media Foundation grabber" ${DEFAULT_MF}) option(ENABLE_MF "Enable the Media Foundation grabber" ${DEFAULT_MF})
message(STATUS "ENABLE_MF = ${ENABLE_MF}") message(STATUS "ENABLE_MF = ${ENABLE_MF}")
option(ENABLE_OSX "Enable the OSX grabber" ${DEFAULT_OSX} ) option(ENABLE_OSX "Enable the OSX grabber" ${DEFAULT_OSX})
message(STATUS "ENABLE_OSX = ${ENABLE_OSX}") message(STATUS "ENABLE_OSX = ${ENABLE_OSX}")
option(ENABLE_QT "Enable the Qt grabber" ${DEFAULT_QT}) option(ENABLE_QT "Enable the Qt grabber" ${DEFAULT_QT})
@ -287,16 +297,16 @@ removeIndent()
message(STATUS "Input options:") message(STATUS "Input options:")
addIndent(" - ") addIndent(" - ")
option(ENABLE_BOBLIGHT_SERVER "Enable BOBLIGHT server" ${DEFAULT_BOBLIGHT_SERVER} ) option(ENABLE_BOBLIGHT_SERVER "Enable BOBLIGHT server" ${DEFAULT_BOBLIGHT_SERVER})
message(STATUS "ENABLE_BOBLIGHT_SERVER = ${ENABLE_BOBLIGHT_SERVER}") message(STATUS "ENABLE_BOBLIGHT_SERVER = ${ENABLE_BOBLIGHT_SERVER}")
option(ENABLE_CEC "Enable the libcec and CEC control" ${DEFAULT_CEC} ) option(ENABLE_CEC "Enable the libcec and CEC control" ${DEFAULT_CEC})
message(STATUS "ENABLE_CEC = ${ENABLE_CEC}") message(STATUS "ENABLE_CEC = ${ENABLE_CEC}")
option(ENABLE_FLATBUF_SERVER "Enable Flatbuffers server" ${DEFAULT_FLATBUF_SERVER} ) option(ENABLE_FLATBUF_SERVER "Enable Flatbuffers server" ${DEFAULT_FLATBUF_SERVER})
message(STATUS "ENABLE_FLATBUF_SERVER = ${ENABLE_FLATBUF_SERVER}") message(STATUS "ENABLE_FLATBUF_SERVER = ${ENABLE_FLATBUF_SERVER}")
option(ENABLE_PROTOBUF_SERVER "Enable Protocol Buffers server" ${DEFAULT_PROTOBUF_SERVER} ) option(ENABLE_PROTOBUF_SERVER "Enable Protocol Buffers server" ${DEFAULT_PROTOBUF_SERVER})
message(STATUS "ENABLE_PROTOBUF_SERVER = ${ENABLE_PROTOBUF_SERVER}") message(STATUS "ENABLE_PROTOBUF_SERVER = ${ENABLE_PROTOBUF_SERVER}")
removeIndent() removeIndent()
@ -304,13 +314,13 @@ removeIndent()
message(STATUS "Output options:") message(STATUS "Output options:")
addIndent(" - ") addIndent(" - ")
option(ENABLE_FORWARDER "Enable Hyperion forwarding" ${DEFAULT_FORWARDER} ) option(ENABLE_FORWARDER "Enable Hyperion forwarding" ${DEFAULT_FORWARDER})
message(STATUS "ENABLE_FORWARDER = ${ENABLE_FORWARDER}") message(STATUS "ENABLE_FORWARDER = ${ENABLE_FORWARDER}")
if (ENABLE_FORWARDER) if(ENABLE_FORWARDER)
SET(ENABLE_FLATBUF_CONNECT ON) set(ENABLE_FLATBUF_CONNECT ON)
else() else()
option(ENABLE_FLATBUF_CONNECT "Enable Flatbuffers connecting remotely" ${DEFAULT_FLATBUF_CONNECT} ) option(ENABLE_FLATBUF_CONNECT "Enable Flatbuffers connecting remotely" ${DEFAULT_FLATBUF_CONNECT})
endif() endif()
message(STATUS "ENABLE_FLATBUF_CONNECT = ${ENABLE_FLATBUF_CONNECT}") message(STATUS "ENABLE_FLATBUF_CONNECT = ${ENABLE_FLATBUF_CONNECT}")
@ -319,22 +329,22 @@ removeIndent()
message(STATUS "LED-Device options:") message(STATUS "LED-Device options:")
addIndent(" - ") addIndent(" - ")
option(ENABLE_DEV_NETWORK "Enable the Network devices" ${DEFAULT_DEV_NETWORK} ) option(ENABLE_DEV_NETWORK "Enable the Network devices" ${DEFAULT_DEV_NETWORK})
message(STATUS "ENABLE_DEV_NETWORK = ${ENABLE_DEV_NETWORK}") message(STATUS "ENABLE_DEV_NETWORK = ${ENABLE_DEV_NETWORK}")
option(ENABLE_DEV_SERIAL "Enable the Serial devices" ${DEFAULT_DEV_SERIAL} ) option(ENABLE_DEV_SERIAL "Enable the Serial devices" ${DEFAULT_DEV_SERIAL})
message(STATUS "ENABLE_DEV_SERIAL = ${ENABLE_DEV_SERIAL}") message(STATUS "ENABLE_DEV_SERIAL = ${ENABLE_DEV_SERIAL}")
option(ENABLE_DEV_SPI "Enable the SPI device" ${DEFAULT_DEV_SPI} ) option(ENABLE_DEV_SPI "Enable the SPI device" ${DEFAULT_DEV_SPI})
message(STATUS "ENABLE_DEV_SPI = ${ENABLE_DEV_SPI}") message(STATUS "ENABLE_DEV_SPI = ${ENABLE_DEV_SPI}")
option(ENABLE_DEV_TINKERFORGE "Enable the TINKERFORGE device" ${DEFAULT_DEV_TINKERFORGE}) option(ENABLE_DEV_TINKERFORGE "Enable the TINKERFORGE device" ${DEFAULT_DEV_TINKERFORGE})
message(STATUS "ENABLE_DEV_TINKERFORGE = ${ENABLE_DEV_TINKERFORGE}") message(STATUS "ENABLE_DEV_TINKERFORGE = ${ENABLE_DEV_TINKERFORGE}")
option(ENABLE_DEV_USB_HID "Enable the libusb and hid devices" ${DEFAULT_DEV_USB_HID} ) option(ENABLE_DEV_USB_HID "Enable the libusb and hid devices" ${DEFAULT_DEV_USB_HID})
message(STATUS "ENABLE_DEV_USB_HID = ${ENABLE_DEV_USB_HID}") message(STATUS "ENABLE_DEV_USB_HID = ${ENABLE_DEV_USB_HID}")
option(ENABLE_DEV_WS281XPWM "Enable the WS281x-PWM device" ${DEFAULT_DEV_WS281XPWM} ) option(ENABLE_DEV_WS281XPWM "Enable the WS281x-PWM device" ${DEFAULT_DEV_WS281XPWM})
message(STATUS "ENABLE_DEV_WS281XPWM = ${ENABLE_DEV_WS281XPWM}") message(STATUS "ENABLE_DEV_WS281XPWM = ${ENABLE_DEV_WS281XPWM}")
removeIndent() removeIndent()
@ -375,7 +385,7 @@ endif()
message(STATUS "DEFAULT_USE_SYSTEM_MBEDTLS_LIBS = ${DEFAULT_USE_SYSTEM_MBEDTLS_LIBS}") message(STATUS "DEFAULT_USE_SYSTEM_MBEDTLS_LIBS = ${DEFAULT_USE_SYSTEM_MBEDTLS_LIBS}")
if (ENABLE_MDNS) if(ENABLE_MDNS)
message(STATUS "DEFAULT_USE_SYSTEM_QMDNS_LIBS = ${DEFAULT_USE_SYSTEM_QMDNS_LIBS}") message(STATUS "DEFAULT_USE_SYSTEM_QMDNS_LIBS = ${DEFAULT_USE_SYSTEM_QMDNS_LIBS}")
endif() endif()
@ -388,14 +398,14 @@ message(STATUS "ENABLE_TESTS = ${ENABLE_TESTS}")
removeIndent() removeIndent()
SET ( FLATBUFFERS_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/flatbuf ) set(FLATBUFFERS_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/flatbuf)
SET ( FLATBUFFERS_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/flatbuf ) set(FLATBUFFERS_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/flatbuf)
SET ( PROTOBUF_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/proto ) set(PROTOBUF_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/proto)
SET ( PROTOBUF_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/proto ) set(PROTOBUF_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/proto)
if(ENABLE_JSONCHECKS OR ENABLE_EFFECTENGINE) if(ENABLE_JSONCHECKS OR ENABLE_EFFECTENGINE)
if ("${CMAKE_VERSION}" VERSION_LESS "3.12.0") if("${CMAKE_VERSION}" VERSION_LESS "3.12.0")
set(Python_ADDITIONAL_VERSIONS 3.5) set(Python_ADDITIONAL_VERSIONS 3.5)
find_package(PythonInterp 3.5 REQUIRED) find_package(PythonInterp 3.5 REQUIRED)
else() else()
@ -408,38 +418,38 @@ endif()
if(ENABLE_JSONCHECKS) if(ENABLE_JSONCHECKS)
# check all json files # check all json files
FILE ( GLOB_RECURSE HYPERION_SCHEMAS RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/libsrc/*schema*.json ) file (GLOB_RECURSE HYPERION_SCHEMAS RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/libsrc/*schema*.json)
SET( JSON_FILES ${CMAKE_BINARY_DIR}/config/hyperion.config.json.default ${HYPERION_SCHEMAS}) set(JSON_FILES ${CMAKE_BINARY_DIR}/config/hyperion.config.json.default ${HYPERION_SCHEMAS})
EXECUTE_PROCESS ( execute_process (
COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkjson.py ${JSON_FILES} COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkjson.py ${JSON_FILES}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_JSON_FAILED RESULT_VARIABLE CHECK_JSON_FAILED
) )
IF ( ${CHECK_JSON_FAILED} ) if(${CHECK_JSON_FAILED})
MESSAGE (FATAL_ERROR "check of json files failed" ) message (FATAL_ERROR "check of json files failed")
ENDIF () endif()
if(ENABLE_EFFECTENGINE) if(ENABLE_EFFECTENGINE)
EXECUTE_PROCESS ( execute_process (
COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkeffects.py effects effects/schema COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkeffects.py effects effects/schema
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_EFFECTS_FAILED RESULT_VARIABLE CHECK_EFFECTS_FAILED
) )
IF ( ${CHECK_EFFECTS_FAILED} ) if(${CHECK_EFFECTS_FAILED})
MESSAGE (FATAL_ERROR "check of json effect files failed" ) message (FATAL_ERROR "check of json effect files failed")
ENDIF () endif()
endif() endif()
EXECUTE_PROCESS ( execute_process (
COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkschema.py ${CMAKE_BINARY_DIR}/config/hyperion.config.json.default libsrc/hyperion/hyperion.schema.json COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkschema.py ${CMAKE_BINARY_DIR}/config/hyperion.config.json.default libsrc/hyperion/hyperion.schema.json
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_CONFIG_FAILED RESULT_VARIABLE CHECK_CONFIG_FAILED
) )
IF ( ${CHECK_CONFIG_FAILED} ) if(${CHECK_CONFIG_FAILED})
MESSAGE (FATAL_ERROR "check of json default config failed" ) message (FATAL_ERROR "check of json default config failed")
ENDIF () endif()
endif(ENABLE_JSONCHECKS) endif(ENABLE_JSONCHECKS)
# Add project specific cmake modules (find, etc) # Add project specific cmake modules (find, etc)
@ -453,8 +463,8 @@ configure_file("${PROJECT_SOURCE_DIR}/HyperionConfig.h.in" "${PROJECT_BINARY_DIR
include_directories("${PROJECT_BINARY_DIR}") include_directories("${PROJECT_BINARY_DIR}")
# Define the global output path of binaries # Define the global output path of binaries
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
file(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH}) file(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH})
file(MAKE_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) file(MAKE_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
@ -467,32 +477,21 @@ include_directories(${CMAKE_SOURCE_DIR}/include)
#set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so") #set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so")
# MSVC options # MSVC options
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
# Search for Windows SDK # Search for Windows SDK
find_package(WindowsSDK REQUIRED) find_package(WindowsSDK REQUIRED)
message(STATUS "WINDOWS SDK: ${WINDOWSSDK_LATEST_DIR} ${WINDOWSSDK_LATEST_NAME}") message(STATUS "WINDOWS SDK: ${WINDOWSSDK_LATEST_DIR} ${WINDOWSSDK_LATEST_NAME}")
message(STATUS "MSVC VERSION: ${MSVC_VERSION}") message(STATUS "MSVC VERSION: ${MSVC_VERSION}")
# Search for DirectX9
if (ENABLE_DX)
find_package(DirectX9 REQUIRED)
endif(ENABLE_DX)
endif()
# Use GNU gold linker if available
if (NOT WIN32 AND NOT APPLE)
include (${CMAKE_CURRENT_SOURCE_DIR}/cmake/LDGold.cmake)
endif() endif()
# Don't create new dynamic tags (RUNPATH) and setup -rpath to search for shared libs in BINARY/../lib folder (only for Unix) # Don't create new dynamic tags (RUNPATH) and setup -rpath to search for shared libs in BINARY/../lib folder (only for Unix)
if (ENABLE_DEPLOY_DEPENDENCIES AND UNIX AND NOT APPLE) if(ENABLE_DEPLOY_DEPENDENCIES AND UNIX AND NOT APPLE)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags")
SET(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_RPATH}:$ORIGIN/../lib") set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif () endif()
if(APPLE) if(APPLE)
set(CMAKE_EXE_LINKER_FLAGS "-framework CoreGraphics") set(CMAKE_EXE_LINKER_FLAGS "-framework CoreGraphics")
@ -503,18 +502,18 @@ find_package(Threads REQUIRED)
# Allow to overwrite QT base directory # Allow to overwrite QT base directory
# Either supply QTDIR as -DQTDIR=<path> to cmake or set and environment variable QTDIR pointing to the Qt installation # Either supply QTDIR as -DQTDIR=<path> to cmake or set and environment variable QTDIR pointing to the Qt installation
# For Windows and OSX, the default Qt installation path are tried to resolved automatically # For Windows and OSX, the default Qt installation path are tried to resolved automatically
if (NOT DEFINED QTDIR) if(NOT DEFINED QTDIR)
if (DEFINED ENV{QTDIR}) if(DEFINED ENV{QTDIR})
set(QTDIR $ENV{QTDIR}) set(QTDIR $ENV{QTDIR})
else() else()
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
FIRSTSUBDIR(SUBDIRQT "C:/Qt") FIRSTSUBDIR(SUBDIRQT "C:/Qt")
if (NOT ${SUBDIRQT} STREQUAL "") if(NOT ${SUBDIRQT} STREQUAL "")
set(QTDIR "${SUBDIRQT}/msvc2019_64") set(QTDIR "${SUBDIRQT}/msvc2019_64")
endif() endif()
elseif ( "${PLATFORM}" MATCHES "osx" ) elseif ("${PLATFORM}" MATCHES "osx")
# QT6 x86_64 location # QT6 x86_64 location
if (EXISTS /usr/local/opt/qt6) if(EXISTS /usr/local/opt/qt6)
set(QTDIR "/usr/local/opt/qt6") set(QTDIR "/usr/local/opt/qt6")
# QT6 arm64 location # QT6 arm64 location
elseif (EXISTS /opt/homebrew/opt/qt@6) elseif (EXISTS /opt/homebrew/opt/qt@6)
@ -530,34 +529,34 @@ if (NOT DEFINED QTDIR)
endif() endif()
endif() endif()
if (DEFINED QTDIR) if(DEFINED QTDIR)
message(STATUS "Add QTDIR: ${QTDIR} to CMAKE_PREFIX_PATH") message(STATUS "Add QTDIR: ${QTDIR} to CMAKE_PREFIX_PATH")
list(PREPEND CMAKE_PREFIX_PATH ${QTDIR} "${QTDIR}/lib") list(PREPEND CMAKE_PREFIX_PATH ${QTDIR} "${QTDIR}/lib")
endif() endif()
if (CMAKE_PREFIX_PATH) if(CMAKE_PREFIX_PATH)
message( STATUS "CMAKE_PREFIX_PATH used: ${CMAKE_PREFIX_PATH}" ) message(STATUS "CMAKE_PREFIX_PATH used: ${CMAKE_PREFIX_PATH}")
endif() endif()
# find QT libs # find QT libs
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network Sql Widgets REQUIRED) find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network Sql Widgets REQUIRED)
message( STATUS "Found Qt Version: ${QT_VERSION}" ) message(STATUS "Found Qt Version: ${QT_VERSION}")
if (${QT_VERSION_MAJOR} GREATER_EQUAL 6 ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
SET(QT_MIN_VERSION "6.2.2") set(QT_MIN_VERSION "6.2.2")
else() else()
SET(QT_MIN_VERSION "5.5.0") set(QT_MIN_VERSION "5.5.0")
endif() endif()
if ( "${QT_VERSION}" VERSION_LESS "${QT_MIN_VERSION}" ) if("${QT_VERSION}" VERSION_LESS "${QT_MIN_VERSION}")
message( FATAL_ERROR "Your Qt version is to old! Minimum required ${QT_MIN_VERSION}" ) message(FATAL_ERROR "Your Qt version is to old! Minimum required ${QT_MIN_VERSION}")
endif() endif()
find_package(Qt${QT_VERSION_MAJOR} ${QT_VERSION} COMPONENTS Core Gui Network Sql Widgets REQUIRED) find_package(Qt${QT_VERSION_MAJOR} ${QT_VERSION} COMPONENTS Core Gui Network Sql Widgets REQUIRED)
message( STATUS "Qt version used: ${QT_VERSION}" ) message(STATUS "Qt version used: ${QT_VERSION}")
if (APPLE AND (${QT_VERSION_MAJOR} GREATER_EQUAL 6) ) if(APPLE AND (${QT_VERSION_MAJOR} GREATER_EQUAL 6))
set(OPENSSL_ROOT_DIR /usr/local/opt/openssl) set(OPENSSL_ROOT_DIR /usr/local/opt/openssl)
endif() endif()
@ -569,29 +568,29 @@ add_definitions(${QT_DEFINITIONS})
add_subdirectory(dependencies) add_subdirectory(dependencies)
add_subdirectory(libsrc) add_subdirectory(libsrc)
add_subdirectory(src) add_subdirectory(src)
if (ENABLE_TESTS) if(ENABLE_TESTS)
add_subdirectory(test) add_subdirectory(test)
endif () endif()
# Add resources directory # Add resources directory
add_subdirectory(resources) add_subdirectory(resources)
# remove generated files on make cleaan too # remove generated files on make cleaan too
LIST( APPEND GENERATED_QRC list(APPEND GENERATED_QRC
${CMAKE_BINARY_DIR}/WebConfig.qrc ${CMAKE_BINARY_DIR}/WebConfig.qrc
${CMAKE_BINARY_DIR}/HyperionConfig.h ${CMAKE_BINARY_DIR}/HyperionConfig.h
) )
if(ENABLE_EFFECTENGINE) if(ENABLE_EFFECTENGINE)
LIST( APPEND GENERATED_QRC list(APPEND GENERATED_QRC
${CMAKE_BINARY_DIR}/EffectEngine.qrc ${CMAKE_BINARY_DIR}/EffectEngine.qrc
) )
endif () endif()
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${GENERATED_QRC}" ) set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${GENERATED_QRC}")
# uninstall target # uninstall target
configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
# enable make package - no code after this line ! # enable make package - no code after this line !

@ -1,4 +1,4 @@
#!/bin/bash -e #!/bin/bash
DOCKER="docker" DOCKER="docker"
# Git repo url of Hyperion # Git repo url of Hyperion
@ -7,20 +7,21 @@ GIT_REPO_URL="https://github.com/hyperion-project/hyperion.ng.git"
REGISTRY_URL="ghcr.io/hyperion-project" REGISTRY_URL="ghcr.io/hyperion-project"
# cmake build type # cmake build type
BUILD_TYPE="Release" BUILD_TYPE="Release"
# the docker image at GitHub Container Registry DISTRIBUTION="debian"
BUILD_IMAGE="x86_64" CODENAME="bullseye"
# the docker tag at GitHub Container Registry ARCHITECTURE="amd64"
BUILD_TAG="bullseye"
# build packages (.deb .zip ...) # build packages (.deb .zip ...)
BUILD_PACKAGES=true BUILD_PACKAGES=true
# packages string inserted to cmake cmd # packages string inserted to cmake cmd
PACKAGES="" PACKAGES=""
# platform string inserted to cmake cmd # platform string inserted to cmake cmd
BUILD_PLATFORM="" BUILD_PLATFORM=""
#Run build with Qt6 or Qt5
BUILD_WITH_QT5=false
#Run build using GitHub code files #Run build using GitHub code files
BUILD_LOCAL=0 BUILD_LOCAL=false
#Build from scratch #Build from scratch
BUILD_INCREMENTAL=0 BUILD_INCREMENTAL=false
#Verbose output #Verbose output
_VERBOSE=0 _VERBOSE=0
#Additional args #Additional args
@ -37,11 +38,7 @@ cd `dirname ${BASE_PATH}` > /dev/null
BASE_PATH=`pwd`; BASE_PATH=`pwd`;
popd > /dev/null popd > /dev/null
BASE_PATH=`pwd`;function log () { BASE_PATH=`pwd`;
if [[ $_V -eq 1 ]]; then
echo "$@"
fi
}
set +e set +e
${DOCKER} ps >/dev/null 2>&1 ${DOCKER} ps >/dev/null 2>&1
@ -62,7 +59,7 @@ function printHelp {
echo "######################################################## echo "########################################################
## A script to compile Hyperion inside a docker container ## A script to compile Hyperion inside a docker container
## Requires installed Docker: https://www.docker.com/ ## Requires installed Docker: https://www.docker.com/
## Without arguments it will compile Hyperion for Debian Bullseye (x86_64) and uses Hyperion code from GitHub repository. ## Without arguments it will compile Hyperion for ${DISTRIBUTION}:${CODENAME}, ${ARCHITECTURE} architecture and uses Hyperion code from GitHub repository.
## For all images and tags currently available, see https://github.com/orgs/hyperion-project/packages ## For all images and tags currently available, see https://github.com/orgs/hyperion-project/packages
## ##
## Homepage: https://www.hyperion-project.org ## Homepage: https://www.hyperion-project.org
@ -71,16 +68,17 @@ echo "########################################################
# These are possible arguments to modify the script behaviour with their default values # These are possible arguments to modify the script behaviour with their default values
# #
# docker-compile.sh -h, --help # Show this help message # docker-compile.sh -h, --help # Show this help message
# docker-compile.sh -i, --image # The docker image, e.g., x86_64, armv6l, armv7l, aarch64 # docker-compile.sh -n, --name # The distribution's codename, e.g., buster, bullseye, bookworm, jammy, trixie, lunar, mantic; Note: for Fedora it is the version number
# docker-compile.sh -t, --tag # The docker tag, e.g., buster, bullseye, bookworm # docker-compile.sh -a, --architecture # The output architecture, e.g., amd64, arm64, arm/v7
# docker-compile.sh -b, --type # Release or Debug build # docker-compile.sh -b, --type # Release or Debug build
# docker-compile.sh -p, --packages # If true, build packages with CPack # docker-compile.sh -p, --packages # If true, build packages with CPack
# docker-compile.sh --qt5 # Build with Qt5, otherwise build with Qt6
# docker-compile.sh -f, --platform # cmake PLATFORM parameter, e.g. x11, amlogic-dev
# docker-compile.sh -l, --local # Run build using local code files # docker-compile.sh -l, --local # Run build using local code files
# docker-compile.sh -c, --incremental # Run incremental build, i.e. do not delete files created during previous build # docker-compile.sh -c, --incremental # Run incremental build, i.e. do not delete files created during previous build
# docker-compile.sh -f, --platform # cmake PLATFORM parameter, e.g. x11, amlogic-dev
# docker-compile.sh -v, --verbose # Run the script in verbose mode # docker-compile.sh -v, --verbose # Run the script in verbose mode
# docker-compile.sh -- args # Additonal cmake arguments, e.g., -DHYPERION_LIGHT=ON # docker-compile.sh -- args # Additonal cmake arguments, e.g., -DHYPERION_LIGHT=ON
# More informations to docker tags at: https://github.com/Hyperion-Project/hyperion.docker-ci" # More informations to docker containers available at: https://github.com/Hyperion-Project/hyperion.docker-ci"
} }
function log () { function log () {
@ -89,48 +87,63 @@ function log () {
fi fi
} }
function check_distribution () {
url=${REGISTRY_URL}/$1:${CODENAME}
log "Check for distribution at: $url"
if $($DOCKER buildx imagetools inspect "$url" 2>&1 | grep -q $2) ; then
rc=0
else
rc=1
fi
return $rc
}
echo "Compile Hyperion using a Docker container" echo "Compile Hyperion using a Docker container"
options=$(getopt -l "image:,tag:,type:,packages:,platform:,local,incremental,verbose,help" -o "i:t:b:p:f:lcvh" -a -- "$@") options=$(getopt -l "architecture:,name:,type:,packages:,platform:,qt5,local,incremental,verbose,help" -o "a:n:b:p:f:lcvh" -a -- "$@")
eval set -- "$options" eval set -- "$options"
while true while true
do do
case $1 in case $1 in
-i|--image) -a|--architecture)
shift shift
BUILD_IMAGE=$1 ARCHITECTURE=`echo $1 | tr '[:upper:]' '[:lower:]'`
;; ;;
-t|--tag) -n|--name)
shift shift
BUILD_TAG=$1 CODENAME=`echo $1 | tr '[:upper:]' '[:lower:]'`
;; ;;
-b|--type) -b|--type)
shift shift
BUILD_TYPE=$1 BUILD_TYPE=$1
;; ;;
-p|--packages) -p|--packages)
shift shift
BUILD_PACKAGES=$1 BUILD_PACKAGES=$1
;; ;;
-f|--platform) -f|--platform)
shift shift
BUILD_PLATFORM=$1 BUILD_PLATFORM=$1
;; ;;
-l|--local) --qt5)
BUILD_LOCAL=1 BUILD_WITH_QT5=true
;; ;;
-c|--incremental) -l|--local)
BUILD_INCREMENTAL=1 BUILD_LOCAL=true
;; ;;
-v|--verbose) -i|--incremental)
BUILD_INCREMENTAL=true
;;
-v|--verbose)
_VERBOSE=1 _VERBOSE=1
;; ;;
-h|--help) -h|--help)
printHelp printHelp
exit 0 exit 0
;; ;;
--) --)
shift shift
break;; break;;
esac esac
shift shift
@ -148,7 +161,66 @@ if [[ ! -z ${BUILD_PLATFORM} ]]; then
PLATFORM="-DPLATFORM=${BUILD_PLATFORM}" PLATFORM="-DPLATFORM=${BUILD_PLATFORM}"
fi fi
echo "---> Initialize with IMAGE:TAG=${BUILD_IMAGE}:${BUILD_TAG}, BUILD_TYPE=${BUILD_TYPE}, BUILD_PACKAGES=${BUILD_PACKAGES}, PLATFORM=${BUILD_PLATFORM}, BUILD_LOCAL=${BUILD_LOCAL}, BUILD_INCREMENTAL=${BUILD_INCREMENTAL}" PLATFORM_ARCHITECTURE="linux/"${ARCHITECTURE}
QTVERSION="5"
if [ ${BUILD_WITH_QT5} == false ]; then
QTVERSION="6"
CODENAME="${CODENAME}-qt6"
fi
echo "---> Evaluate distribution for codename:${CODENAME} on platform architecture ${PLATFORM_ARCHITECTURE}"
DISTRIBUTION="debian"
if ! check_distribution ${DISTRIBUTION} ${PLATFORM_ARCHITECTURE} ; then
DISTRIBUTION="ubuntu"
if ! check_distribution ${DISTRIBUTION} ${PLATFORM_ARCHITECTURE} ; then
DISTRIBUTION="fedora"
if ! check_distribution ${DISTRIBUTION} ${PLATFORM_ARCHITECTURE} ; then
echo "No docker image found for a distribution with codename: ${CODENAME} to be build on platform architecture ${PLATFORM_ARCHITECTURE}"
exit 1
fi
fi
fi
echo "---> Build with -> Distribution: ${DISTRIBUTION}, Codename: ${CODENAME}, Architecture: ${ARCHITECTURE}, Type: ${BUILD_TYPE}, Platform: ${BUILD_PLATFORM}, QT Version: ${QTVERSION}, Build Packages: ${BUILD_PACKAGES}, Build local: ${BUILD_LOCAL}, Build incremental: ${BUILD_INCREMENTAL}"
# Determine the current architecture
CURRENT_ARCHITECTURE=`uname -m`
#Test if multiarchitecture setup, i.e. user-space is 32bit
if [ ${CURRENT_ARCHITECTURE} == "aarch64" ]; then
CURRENT_ARCHITECTURE="arm64"
USER_ARCHITECTURE=$CURRENT_ARCHITECTURE
IS_V7L=`cat /proc/$$/maps |grep -m1 -c v7l`
if [ $IS_V7L -ne 0 ]; then
USER_ARCHITECTURE="arm/v7"
else
IS_V6L=`cat /proc/$$/maps |grep -m1 -c v6l`
if [ $IS_V6L -ne 0 ]; then
USER_ARCHITECTURE="arm/v6"
fi
fi
if [ $ARCHITECTURE != $USER_ARCHITECTURE ]; then
log "Identified user space current architecture: $USER_ARCHITECTURE"
CURRENT_ARCHITECTURE=$USER_ARCHITECTURE
fi
else
CURRENT_ARCHITECTURE=${CURRENT_ARCHITECTURE//x86_/amd}
fi
log "Identified kernel current architecture: $CURRENT_ARCHITECTURE"
if [ $ARCHITECTURE != $CURRENT_ARCHITECTURE ]; then
echo "---> Build is not for the same architecturem, enable emulation for ${PLATFORM_ARCHITECTURE}"
ENTRYPOINT_OPTION=
if [ $CURRENT_ARCHITECTURE != "amd64" ]; then
echo "---> Emulation builds can only be executed on linux/amd64, linux/x86_64 platforms, current architecture is ${CURRENT_ARCHITECTURE}"
exit 1
fi
else
log "Build natively for platform architecture: ${PLATFORM_ARCHITECTURE}"
ENTRYPOINT_OPTION="--entrypoint="""
fi
log "---> BASE_PATH = ${BASE_PATH}" log "---> BASE_PATH = ${BASE_PATH}"
CODE_PATH=${BASE_PATH}; CODE_PATH=${BASE_PATH};
@ -163,9 +235,11 @@ git clone --recursive --depth 1 -q ${GIT_REPO_URL} ${CODE_PATH} || { echo "--->
fi fi
log "---> CODE_PATH = ${CODE_PATH}" log "---> CODE_PATH = ${CODE_PATH}"
BUILD_DIR="build-${BUILD_IMAGE}-${BUILD_TAG}" ARCHITECTURE_PATH=${ARCHITECTURE//\//_}
BUILD_DIR="build-${CODENAME}-${ARCHITECTURE_PATH}"
BUILD_PATH="${CODE_PATH}/${BUILD_DIR}" BUILD_PATH="${CODE_PATH}/${BUILD_DIR}"
DEPLOY_DIR="deploy/${BUILD_IMAGE}/${BUILD_TAG}" DEPLOY_DIR="deploy/${CODENAME}/${ARCHITECTURE}"
DEPLOY_PATH="${CODE_PATH}/${DEPLOY_DIR}" DEPLOY_PATH="${CODE_PATH}/${DEPLOY_DIR}"
log "---> BUILD_DIR = ${BUILD_DIR}" log "---> BUILD_DIR = ${BUILD_DIR}"
@ -178,7 +252,7 @@ sudo rm -fr "${DEPLOY_PATH}" >/dev/null 2>&1
mkdir -p "${DEPLOY_PATH}" >/dev/null 2>&1 mkdir -p "${DEPLOY_PATH}" >/dev/null 2>&1
#Remove previous build area, if no incremental build #Remove previous build area, if no incremental build
if [ ${BUILD_INCREMENTAL} != 1 ]; then if [ ${BUILD_INCREMENTAL} != true ]; then
sudo rm -fr "${BUILD_PATH}" >/dev/null 2>&1 sudo rm -fr "${BUILD_PATH}" >/dev/null 2>&1
fi fi
mkdir -p "${BUILD_PATH}" >/dev/null 2>&1 mkdir -p "${BUILD_PATH}" >/dev/null 2>&1
@ -194,10 +268,11 @@ echo "---> Compiling Hyperion from source code at ${CODE_PATH}"
# execute inside container all commands on bash # execute inside container all commands on bash
echo "---> Startup docker..." echo "---> Startup docker..."
$DOCKER run --rm \ $DOCKER run --rm --platform=${PLATFORM_ARCHITECTURE} \
${ENTRYPOINT_OPTION} \
-v "${DEPLOY_PATH}:/deploy" \ -v "${DEPLOY_PATH}:/deploy" \
-v "${CODE_PATH}/:/source:rw" \ -v "${CODE_PATH}/:/source:rw" \
${REGISTRY_URL}/${BUILD_IMAGE}:${BUILD_TAG} \ ${REGISTRY_URL}/${DISTRIBUTION}:${CODENAME} \
/bin/bash -c "mkdir -p /source/${BUILD_DIR} && cd /source/${BUILD_DIR} && /bin/bash -c "mkdir -p /source/${BUILD_DIR} && cd /source/${BUILD_DIR} &&
cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${PLATFORM} ${BUILD_ARGS} .. || exit 2 && cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${PLATFORM} ${BUILD_ARGS} .. || exit 2 &&
make -j $(nproc) ${PACKAGES} || exit 3 || : && make -j $(nproc) ${PACKAGES} || exit 3 || : &&
@ -210,7 +285,7 @@ DOCKERRC=${?}
sudo chown -fR $(stat -c "%U:%G" ${BASE_PATH}) ${BUILD_PATH} sudo chown -fR $(stat -c "%U:%G" ${BASE_PATH}) ${BUILD_PATH}
if [ ${DOCKERRC} == 0 ]; then if [ ${DOCKERRC} == 0 ]; then
if [ ${BUILD_LOCAL} == 1 ]; then if [ ${BUILD_LOCAL} == true ]; then
echo "---> Find compiled binaries in: ${BUILD_PATH}/bin" echo "---> Find compiled binaries in: ${BUILD_PATH}/bin"
fi fi

@ -73,13 +73,13 @@ if [ ${ARCHITECTURE} == "aarch64" ]; then
IS_V7L=`cat /proc/$$/maps |grep -m1 -c v7l` IS_V7L=`cat /proc/$$/maps |grep -m1 -c v7l`
if [ $IS_V7L -ne 0 ]; then if [ $IS_V7L -ne 0 ]; then
USER_ARCHITECTURE="armv7l" USER_ARCHITECTURE="armv7l"
else else
IS_V6L=`cat /proc/$$/maps |grep -m1 -c v6l` IS_V6L=`cat /proc/$$/maps |grep -m1 -c v6l`
if [ $IS_V6L -ne 0 ]; then if [ $IS_V6L -ne 0 ]; then
USER_ARCHITECTURE="armv6l" USER_ARCHITECTURE="armv6l"
fi fi
fi fi
if [ $ARCHITECTURE != $USER_ARCHITECTURE ]; then if [ $ARCHITECTURE != $USER_ARCHITECTURE ]; then
echo "---> Identified kernel target architecture: $ARCHITECTURE" echo "---> Identified kernel target architecture: $ARCHITECTURE"
echo "---> Identified user space target architecture: $USER_ARCHITECTURE" echo "---> Identified user space target architecture: $USER_ARCHITECTURE"
ARCHITECTURE=$USER_ARCHITECTURE ARCHITECTURE=$USER_ARCHITECTURE
@ -134,11 +134,11 @@ if [ -z "$run_id" ]; then
# Determine run_id from head_sha # Determine run_id from head_sha
runs=$(request_call "$api_url/actions/runs?head_sha=$head_sha") runs=$(request_call "$api_url/actions/runs?head_sha=$head_sha")
run_id=$(echo "$runs" | tr '\r\n' ' ' | ${pythonCmd} -c """ run_id=$(echo "$runs" | tr '\r\n' ' ' | ${pythonCmd} -c """
import json,sys import json,sys,os
data = json.load(sys.stdin) data = json.load(sys.stdin)
for i in data['workflow_runs']: for i in data['workflow_runs']:
if i['name'] == 'Hyperion PR Build': if os.path.basename(i['path']) == 'push_pull.yml':
print(i['id']) print(i['id'])
break break
""" 2>/dev/null) """ 2>/dev/null)
@ -198,11 +198,11 @@ if [[ ! -z ${CURRENT_SERVICE} ]]; then
echo "---> Stop current service: ${CURRENT_SERVICE}" echo "---> Stop current service: ${CURRENT_SERVICE}"
STOPCMD="systemctl stop --quiet ${CURRENT_SERVICE} --now" STOPCMD="systemctl stop --quiet ${CURRENT_SERVICE} --now"
USERNAME=${SUDO_USER:-$(whoami)} USERNAME=${SUDO_USER:-$(whoami)}
if [ ${USERNAME} != "root" ]; then if [ ${USERNAME} != "root" ]; then
STOPCMD="sudo ${STOPCMD}" STOPCMD="sudo ${STOPCMD}"
fi fi
${STOPCMD} >/dev/null 2>&1 ${STOPCMD} >/dev/null 2>&1
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "---> Critical Error: Failed to stop service: ${CURRENT_SERVICE}, Hyperion may not be started. Stop Hyperion manually." echo "---> Critical Error: Failed to stop service: ${CURRENT_SERVICE}, Hyperion may not be started. Stop Hyperion manually."

@ -1,5 +1,5 @@
[Unit] [Unit]
Description=Hyperion ambient light systemd service for user %i Description=Hyperion ambient light systemd service for user %i
Documentation=https://docs.hyperion-project.org Documentation=https://docs.hyperion-project.org
Requisite=network.target Requisite=network.target
Wants=network-online.target Wants=network-online.target

22
bin/service/hyperion.xml Normal file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Hyperion</short>
<description>Hyperion.NG firewall rules</description>
<!-- HTTP -->
<port protocol="tcp" port="8090"/>
<!-- HTTPS -->
<port protocol="tcp" port="8892"/>
<!-- JSON Server -->
<port protocol="tcp" port="19444"/>
<!-- Flatbuffers Server -->
<port protocol="tcp" port="19400"/>
<!-- Protocol Buffers Server -->
<port protocol="tcp" port="19445"/>
<!-- Boblight Server -->
<port protocol="tcp" port="19333"/>
<include service="ssdp"/>
<include service="mdns"/>
</service>

@ -19,4 +19,10 @@ find_package_handle_standard_args(qmdnsengine
REQUIRED_VARS QMDNS_INCLUDE_DIR QMDNS_LIBRARIES REQUIRED_VARS QMDNS_INCLUDE_DIR QMDNS_LIBRARIES
) )
mark_as_advanced(QMDNS_INCLUDE_DIR QMDNS_LIBRARIES) if(QMDNSENGINE_FOUND)
add_library(qmdnsengine STATIC IMPORTED GLOBAL)
set_target_properties(qmdnsengine PROPERTIES
IMPORTED_LOCATION ${QMDNS_LIBRARIES}
INTERFACE_INCLUDE_DIRECTORIES ${QMDNS_INCLUDE_DIR}
)
endif()

@ -1,17 +0,0 @@
option(ENABLE_LDGOLD "Use GNU gold linker" ON)
set(LDGOLD_FOUND FALSE)
if(ENABLE_LDGOLD)
execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE LD_VERSION)
if(LD_VERSION MATCHES "GNU gold")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
set(LDGOLD_FOUND TRUE)
message(STATUS "Linker: GNU gold")
else()
message(STATUS "GNU gold linker is not available, falling back to default system linker")
endif()
else()
message(STATUS "Linker: Default system linker")
endif()

@ -1,8 +1,8 @@
[Desktop Entry] [Desktop Entry]
Name=Hyperion Name=Hyperion
GenericName=Hyperion Ambient Lighting GenericName=Hyperion Ambient Lighting
Comment=Hyperion mimics the well known Ambilight from Philips Comment=Hyperion is an opensource Bias or Ambient Lighting implementation
Icon=/usr/share/pixmaps/hyperion/hyperiond_128.png Icon=hyperion
Terminal=false Terminal=false
TryExec=hyperiond TryExec=hyperiond
Exec=hyperiond Exec=hyperiond

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (c) 2014-2023 Hyperion Project -->
<component type="desktop-application">
<id>com.hyperion-project.hyperion</id>
<metadata_license>MIT</metadata_license>
<project_license>MIT</project_license>
<name>Hyperion</name>
<summary>The successor to Hyperion aka Hyperion Next Generation.</summary>
<description>
<p>
Hyperion is an opensource Bias or Ambient Lighting implementation which you might know from TV manufacturers.
It supports many LED devices and video grabbers.
</p>
</description>
<url type="homepage">https://hyperion-project.org</url>
<url type="bugtracker">https://github.com/hyperion-project/hyperion.ng/issues</url>
<url type="help">https://hyperion-project.org</url>
<url type="faq">https://docs.hyperion-project.org/</url>
<url type="donation">https://www.paypal.me/HyperionAmbi</url>
<url type="translate">https://poeditor.com/join/project/Y4F6vHRFjA</url>
<releases>
<release version="2.0.15" date="2022-02-19" />
<release version="2.0.14" date="2022-11-27" />
<release version="2.0.13" date="2022-05-22" />
<release version="2.0.12" date="2021-11-21" />
</releases>
<screenshots>
<screenshot type="default">
<caption>The multi language web interface</caption>
<image>https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/doc/screenshot.png</image>
</screenshot>
</screenshots>
<categories>
<category>Application</category>
</categories>
<launchable type="desktop-id">com.hyperion-project.hyperion.desktop</launchable>
<developer_name>Hyperion Project</developer_name>
<update_contact>admin@hyperion-project.org</update_contact>
<content_rating type="oars-1.0" />
</component>

Binary file not shown.

Before

(image error) Size: 17 KiB

@ -105,9 +105,9 @@ ln -fs $BINSP/scripts/updateHyperionUser.sh $BINTP/updateHyperionUser 2>/dev/nul
if [ "$IS_UPGRADE" = false ]; then if [ "$IS_UPGRADE" = false ]; then
if hash desktop-file-install 2>/dev/null; then if hash desktop-file-install 2>/dev/null; then
echo "---> Install Hyperion desktop icons" echo "---> Install Hyperion desktop icons"
mkdir /usr/share/pixmaps/hyperion 2>/dev/null cp -R /usr/share/hyperion/icons /usr/share/icons/hicolor 2>/dev/null
cp /usr/share/hyperion/desktop/*.png /usr/share/pixmaps/hyperion 2>/dev/null cp /usr/share/hyperion/desktop/hyperion.metainfo.xml /usr/share/metainfo/hyperion.metainfo.xml 2>/dev/null
desktop-file-install /usr/share/hyperion/desktop/hyperiond.desktop 2>/dev/null desktop-file-install /usr/share/hyperion/desktop/hyperion.desktop 2>/dev/null
fi fi
fi fi
@ -149,7 +149,7 @@ $REBOOTMESSAGE
echo "-----------------------------------------------------------------------------" echo "-----------------------------------------------------------------------------"
echo "Webpage: www.hyperion-project.org" echo "Webpage: www.hyperion-project.org"
echo "Forum: www.hyperion-project.org" echo "Forum: www.hyperion-project.org"
echo "Documenation: docs.hyperion-project.org" echo "Documentation: docs.hyperion-project.org"
echo "-----------------------------------------------------------------------------" echo "-----------------------------------------------------------------------------"

@ -59,11 +59,29 @@ fi
# In case we don't use a service kill all instances # In case we don't use a service kill all instances
killall hyperiond 2> /dev/null killall hyperiond 2> /dev/null
# delete desktop icons; desktop-file-edit is a workaround to hide the entry and delete it afterwards manual. # remove desktop/appstream file
# TODO Better way for deletion and keep the desktop in sync without logout/login or desktop dependend cmds?
echo "---> Delete Hyperion desktop icons"
desktop-file-edit --set-key=NoDisplay --set-value=true /usr/share/applications/hyperiond.desktop 2> /dev/null
rm -v /usr/share/applications/hyperion* 2> /dev/null rm -v /usr/share/applications/hyperion* 2> /dev/null
rm -rv /usr/share/pixmaps/hyperion 2> /dev/null rm -v /usr/share/metainfo/hyperion* 2> /dev/null
# update desktop-database (if exists)
if [ -x /usr/bin/update-desktop-database ]; then
update-desktop-database -q /usr/share/applications
fi
# remove Hyperion icons
for i in 16x16 22x22 24x24 32x32 36x36 48x48 64x64 72x72 96x96 128x128 192x192 256x256 512x512
rm -v usr/share/icons/hicolor/$i/apps/hyperion.png 2> /dev/null
done
# update icon-cache
if [ -e /usr/share/icons/hicolor/icon-theme.cache ] ; then
# touch it, just in case we cannot find the binary...
touch --no-create /usr/share/icons/hicolor
if hash gtk-update-icon-cache 2>/dev/null; then
gtk-update-icon-cache /usr/share/icons/hicolor
fi
# ignore errors
true
fi
exit 0 exit 0

@ -52,7 +52,7 @@ SET ( CPACK_PACKAGE_CONTACT "packages@hyperion-project.org")
SET ( CPACK_PACKAGE_VENDOR "hyperion-project") SET ( CPACK_PACKAGE_VENDOR "hyperion-project")
SET ( CPACK_PACKAGE_EXECUTABLES "hyperiond;Hyperion" ) SET ( CPACK_PACKAGE_EXECUTABLES "hyperiond;Hyperion" )
SET ( CPACK_PACKAGE_INSTALL_DIRECTORY "Hyperion" ) SET ( CPACK_PACKAGE_INSTALL_DIRECTORY "Hyperion" )
SET ( CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icons/hyperion-icon-32px.png" ) SET ( CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icons/hyperion-32px.png" )
SET ( CPACK_PACKAGE_VERSION_MAJOR "${HYPERION_VERSION_MAJOR}") SET ( CPACK_PACKAGE_VERSION_MAJOR "${HYPERION_VERSION_MAJOR}")
SET ( CPACK_PACKAGE_VERSION_MINOR "${HYPERION_VERSION_MINOR}") SET ( CPACK_PACKAGE_VERSION_MINOR "${HYPERION_VERSION_MINOR}")

@ -1,15 +0,0 @@
# process a .rc file for windows
# Provides (BINARY_NAME)_WIN_RC_PATH with path to generated file
function(generate_win_rc_file BINARY_NAME)
# target path to store generated files
set(TARGET_PATH ${CMAKE_BINARY_DIR}/win_rc_file/${BINARY_NAME})
# assets
string(REPLACE "/" "\\\\" WIN_RC_ICON_PATH ${CMAKE_SOURCE_DIR}/cmake/nsis/installer.ico)
# configure the rc file
configure_file(
${CMAKE_SOURCE_DIR}/cmake/win/win.rc.in
${TARGET_PATH}/win.rc
)
# provide var for parent scope
set(${BINARY_NAME}_WIN_RC_PATH ${TARGET_PATH}/win.rc PARENT_SCOPE)
endfunction()

12
debian/control.in vendored

@ -1,12 +0,0 @@
Source: hyperion
Section: devel
Priority: optional
Build-Depends: @BUILD_DEPENDS@
Standards-Version: @STANDARDS_VERSION@
Maintainer: Hyperion Project <admin@hyperion-project.org>
Homepage: https://hyperion-project.org/
Package: hyperion
Architecture: @ARCHITECTURE@
Depends: @DEPENDS@
Description: Hyperion is an opensource Bias or Ambient Lighting implementation which you might know from TV manufactures. It supports many LED devices and video grabbers.

58
debian/distributions vendored

@ -1,58 +0,0 @@
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Codename: focal
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Codename: jammy
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Codename: kinetic
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Codename: lunar
Architectures: amd64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Suite: oldstable
Codename: buster
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Suite: stable
Codename: bullseye
Architectures: amd64 armhf arm64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes
Origin: Hyperion-Project
Label: apt.hyperion-project.org
Suite: unstable
Codename: bookworm
Architectures: amd64
Components: main
Description: Official APT Repository by Hyperion Project
SignWith: yes

32
debian/rules.in vendored

@ -1,32 +0,0 @@
#!/usr/bin/make -f
export DH_VERBOSE = 1
BUILDDIR = build
build:
mkdir $(BUILDDIR);
cd $(BUILDDIR); cmake @CMAKE_ENVIRONMENT@ -DCMAKE_INSTALL_PREFIX=../debian/tmp/usr ..
make -j4 -C $(BUILDDIR)
binary: binary-indep binary-arch
binary-indep:
binary-arch:
cd $(BUILDDIR); cmake -P cmake_install.cmake
rm -rf debian/tmp/usr/include debian/tmp/usr/lib debian/tmp/usr/bin/flatc
mkdir debian/tmp/DEBIAN
cp cmake/package-scripts/postinst debian/tmp/DEBIAN
chmod 0775 debian/tmp/DEBIAN/postinst
cp cmake/package-scripts/preinst debian/tmp/DEBIAN
chmod 0775 debian/tmp/DEBIAN/preinst
cp cmake/package-scripts/prerm debian/tmp/DEBIAN
chmod 0775 debian/tmp/DEBIAN/prerm
dpkg-gencontrol -phyperion
dpkg --build debian/tmp ..
rm -rf debian/tmp $(BUILDDIR)
clean:
rm -rf $(BUILDDIR)
.PHONY: build binary binary-arch binary-indep clean

@ -1,26 +0,0 @@
cmake_minimum_required(VERSION 3.5)
project(qmdnsengine)
set(WORK_DIR "@QMDNS_WORK_DIR@")
set(SOURCE_DIR "@QMDNS_SOURCE_DIR@")
set(INSTALL_DIR "@QMDNS_INSTALL_DIR@")
set(CMAKE_ARGS "@QMDNS_CMAKE_ARGS@")
set(QMDNS_LOGGING "@QMDNS_LOGGING@")
include(ExternalProject)
ExternalProject_Add(qmdnsengine
PREFIX ${WORK_DIR}
BUILD_ALWAYS OFF
DOWNLOAD_COMMAND ""
SOURCE_DIR ${SOURCE_DIR}
INSTALL_DIR ${INSTALL_DIR}
CMAKE_ARGS ${CMAKE_ARGS}
LOG_DOWNLOAD ${QMDNS_LOGGING}
LOG_UPDATE ${QMDNS_LOGGING}
LOG_CONFIGURE ${QMDNS_LOGGING}
LOG_BUILD ${QMDNS_LOGGING}
LOG_INSTALL ${QMDNS_LOGGING}
LOG_TEST ${QMDNS_LOGGING}
)

@ -24,46 +24,46 @@ if (ENABLE_MDNS)
if (USE_SYSTEM_QMDNS_LIBS) if (USE_SYSTEM_QMDNS_LIBS)
find_package(qmdnsengine REQUIRED) find_package(qmdnsengine REQUIRED)
else () else ()
if (NOT DEFINED BUILD_QMDNS_ONCE)
set(BUILD_QMDNS_ONCE CACHE INTERNAL "Done")
set(QMDNS_WORK_DIR "${CMAKE_BINARY_DIR}/dependencies/external/qmdnsengine")
set(QMDNS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/qmdnsengine")
set(QMDNS_INSTALL_DIR ${CMAKE_BINARY_DIR})
set(QMDNS_CMAKE_ARGS
-DBUILD_SHARED_LIBS:BOOL=OFF
-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}
-DBIN_INSTALL_DIR:STRING=lib
-DLIB_INSTALL_DIR:STRING=lib
-DINCLUDE_INSTALL_DIR:STRING=include
-DCMAKE_PREFIX_PATH:PATH=${CMAKE_PREFIX_PATH}
-Wno-dev
)
if(${CMAKE_BUILD_TYPE} AND ${CMAKE_BUILD_TYPE} EQUAL "Debug")
set(QMDNS_LOGGING 1)
else ()
set(QMDNS_LOGGING 0)
endif ()
configure_file(${CMAKE_SOURCE_DIR}/dependencies/CMakeLists-qmdnsengine.txt.in ${QMDNS_WORK_DIR}/CMakeLists.txt @ONLY)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . WORKING_DIRECTORY ${QMDNS_WORK_DIR})
execute_process(COMMAND ${CMAKE_COMMAND} --build . --config "${CMAKE_BUILD_TYPE}" WORKING_DIRECTORY ${QMDNS_WORK_DIR})
endif()
set(QMDNS_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include")
if(WIN32) if(WIN32)
set(QMDNS_LIBRARIES ${CMAKE_BINARY_DIR}/lib/qmdnsengine${CMAKE_STATIC_LIBRARY_SUFFIX}) set(QMDNS_LIBRARIES ${CMAKE_BINARY_DIR}/lib/qmdnsengine${CMAKE_STATIC_LIBRARY_SUFFIX})
else() else()
set(QMDNS_LIBRARIES ${CMAKE_BINARY_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}qmdnsengine${CMAKE_STATIC_LIBRARY_SUFFIX}) set(QMDNS_LIBRARIES ${CMAKE_BINARY_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}qmdnsengine${CMAKE_STATIC_LIBRARY_SUFFIX})
endif() endif()
mark_as_advanced (QMDNS_INCLUDE_DIR QMDNS_LIBRARIES) get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
endif () set(QMDNS_CMAKE_ARGS
-DBUILD_SHARED_LIBS:BOOL=OFF
-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}
-DBIN_INSTALL_DIR:STRING=lib
-DLIB_INSTALL_DIR:STRING=lib
-DINCLUDE_INSTALL_DIR:STRING=include
-DCMAKE_PREFIX_PATH:PATH=${CMAKE_PREFIX_PATH}
$<$<NOT:$<BOOL:${isMultiConfig}>>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}>
-Wno-dev
)
set(QMDNS_INCLUDE_DIR ${QMDNS_INCLUDE_DIR} PARENT_SCOPE) include(ExternalProject)
set(QMDNS_LIBRARIES ${QMDNS_LIBRARIES} PARENT_SCOPE) ExternalProject_Add(qmdns
include_directories(${QMDNS_INCLUDE_DIR}) PREFIX ${CMAKE_BINARY_DIR}/dependencies/external/qmdnsengine
BUILD_ALWAYS OFF
DOWNLOAD_COMMAND ""
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/qmdnsengine
BINARY_DIR ${CMAKE_BINARY_DIR}/dependencies/external/qmdnsengine/build
CMAKE_ARGS ${QMDNS_CMAKE_ARGS}
CONFIGURE_COMMAND ${CMAKE_COMMAND} -S <SOURCE_DIR> -B <BINARY_DIR> ${QMDNS_CMAKE_ARGS} -G ${CMAKE_GENERATOR}
BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG>
INSTALL_DIR ${CMAKE_BINARY_DIR}
BUILD_BYPRODUCTS ${QMDNS_LIBRARIES}
)
add_library(qmdnsengine STATIC IMPORTED GLOBAL)
set_target_properties(qmdnsengine PROPERTIES
IMPORTED_LOCATION ${QMDNS_LIBRARIES}
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include
)
add_dependencies(qmdnsengine qmdns)
endif ()
endif() endif()
#============================================================================= #=============================================================================
@ -75,8 +75,18 @@ if(ENABLE_FLATBUF_SERVER OR ENABLE_FLATBUF_CONNECT)
if (USE_SYSTEM_FLATBUFFERS_LIBS) if (USE_SYSTEM_FLATBUFFERS_LIBS)
find_program(FLATBUFFERS_FLATC_EXECUTABLE NAMES flatc REQUIRED) find_program(FLATBUFFERS_FLATC_EXECUTABLE NAMES flatc REQUIRED)
find_package(Flatbuffers REQUIRED) find_package(Flatbuffers QUIET)
else () if (NOT Flatbuffers_FOUND)
find_package(FlatBuffers QUIET)
if (NOT FlatBuffers_FOUND)
message(STATUS "Could not find Flatbuffers system library, build static Flatbuffers library")
set(DEFAULT_USE_SYSTEM_FLATBUFFERS_LIBS OFF PARENT_SCOPE)
set(USE_SYSTEM_FLATBUFFERS_LIBS OFF)
endif()
endif()
endif()
if (NOT USE_SYSTEM_FLATBUFFERS_LIBS)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared flatbuffers library") set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared flatbuffers library")
set(FLATBUFFERS_BUILD_TESTS OFF CACHE BOOL "Build Flatbuffers with tests") set(FLATBUFFERS_BUILD_TESTS OFF CACHE BOOL "Build Flatbuffers with tests")
add_subdirectory(external/flatbuffers) add_subdirectory(external/flatbuffers)
@ -133,9 +143,9 @@ endif()
if(ENABLE_PROTOBUF_SERVER) if(ENABLE_PROTOBUF_SERVER)
set(USE_SYSTEM_PROTO_LIBS ${DEFAULT_USE_SYSTEM_PROTO_LIBS} CACHE BOOL "use protobuf library from system") set(USE_SYSTEM_PROTO_LIBS ${DEFAULT_USE_SYSTEM_PROTO_LIBS} CACHE BOOL "use protobuf library from system")
# defines for 3rd party sub-modules # defines for 3rd party sub-modules
set(ABSL_PROPAGATE_CXX_STD ON CACHE BOOL "Build abseil-cpp with C++ version requirements propagated") set(ABSL_PROPAGATE_CXX_STD ON CACHE BOOL "Build abseil-cpp with C++ version requirements propagated")
if (USE_SYSTEM_PROTO_LIBS) if (USE_SYSTEM_PROTO_LIBS)
find_package(Protobuf REQUIRED) find_package(Protobuf REQUIRED)
@ -163,7 +173,7 @@ if(ENABLE_PROTOBUF_SERVER)
# define the protobuf library # define the protobuf library
set(PROTOBUF_LIBRARIES protobuf::libprotobuf) set(PROTOBUF_LIBRARIES protobuf::libprotobuf)
endif() endif()
# redefine at parent scope # redefine at parent scope

@ -1,93 +0,0 @@
#pragma once
#ifndef __APPLE__
/*
* this is a mock up for compiling and testing osx wrapper on no osx platform.
* this will show a test image and rotate the colors.
*
* see https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX10.8.sdk/System/Library/Frameworks/CoreGraphics.framework/Versions/A/Headers
*
*/
#include <utils/Image.h>
#include <utils/ColorRgb.h>
enum _CGError {
kCGErrorSuccess = 0,
kCGErrorFailure = 1000,
kCGErrorIllegalArgument = 1001,
kCGErrorInvalidConnection = 1002,
kCGErrorInvalidContext = 1003,
kCGErrorCannotComplete = 1004,
kCGErrorNotImplemented = 1006,
kCGErrorRangeCheck = 1007,
kCGErrorTypeCheck = 1008,
kCGErrorInvalidOperation = 1010,
kCGErrorNoneAvailable = 1011,
/* Obsolete errors. */
kCGErrorNameTooLong = 1005,
kCGErrorNoCurrentPoint = 1009,
kCGErrorApplicationRequiresNewerSystem = 1015,
kCGErrorApplicationNotPermittedToExecute = 1016,
kCGErrorApplicationIncorrectExecutableFormatFound = 1023,
kCGErrorApplicationIsLaunching = 1024,
kCGErrorApplicationAlreadyRunning = 1025,
kCGErrorApplicationCanOnlyBeRunInOneSessionAtATime = 1026,
kCGErrorClassicApplicationsMustBeLaunchedByClassic = 1027,
kCGErrorForkFailed = 1028,
kCGErrorRetryRegistration = 1029,
kCGErrorFirst = 1000,
kCGErrorLast = 1029
};
typedef int32_t CGError;
typedef double CGFloat;
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
struct CGPoint {
float x;
float y;
};
typedef struct CGPoint CGPoint;
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
typedef CGError CGDisplayErr;
typedef uint32_t CGDirectDisplayID;
typedef uint32_t CGDisplayCount;;
typedef struct CGDisplayMode *CGDisplayModeRef;
typedef Image<ColorRgb> CGImage;
typedef CGImage* CGImageRef;
typedef unsigned char CFData;
typedef CFData* CFDataRef;
const int kCGDirectMainDisplay = 0;
CGError CGGetActiveDisplayList(uint32_t maxDisplays, CGDirectDisplayID *activeDisplays, uint32_t *displayCount);
CGDisplayModeRef CGDisplayCopyDisplayMode(CGDirectDisplayID display);
CGRect CGDisplayBounds(CGDirectDisplayID display);
void CGDisplayModeRelease(CGDisplayModeRef mode);
CGImageRef CGDisplayCreateImage(CGDirectDisplayID display);
void CGImageRelease(CGImageRef image);
CGImageRef CGImageGetDataProvider(CGImageRef image);
CFDataRef CGDataProviderCopyData(CGImageRef image);
unsigned char* CFDataGetBytePtr(CFDataRef imgData);
unsigned CGImageGetWidth(CGImageRef image);
unsigned CGImageGetHeight(CGImageRef image);
unsigned CGImageGetBitsPerPixel(CGImageRef image);
unsigned CGImageGetBytesPerRow(CGImageRef image);
void CFRelease(CFDataRef imgData);
#endif

@ -4,7 +4,7 @@
#include <utils/ColorBgr.h> #include <utils/ColorBgr.h>
#include <utils/ColorRgba.h> #include <utils/ColorRgba.h>
#include <hyperion/Grabber.h> #include <hyperion/Grabber.h>
#include <grabber/FramebufferFrameGrabber.h> #include <grabber/framebuffer/FramebufferFrameGrabber.h>
/// ///
/// ///

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#include <grabber/AmlogicGrabber.h> #include <grabber/amlogic/AmlogicGrabber.h>
/// ///
/// The Amlogic uses an instance of the AmlogicGrabber to obtain ImageRgb's from the /// The Amlogic uses an instance of the AmlogicGrabber to obtain ImageRgb's from the

@ -6,7 +6,7 @@
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
// Hyperion-utils includes // Hyperion-utils includes
#include <grabber/AudioGrabber.h> #include <grabber/audio/AudioGrabber.h>
/// ///
/// @brief The Linux Audio capture implementation /// @brief The Linux Audio capture implementation
@ -18,74 +18,69 @@ class AudioGrabberLinux : public AudioGrabber
AudioGrabberLinux(); AudioGrabberLinux();
~AudioGrabberLinux() override; ~AudioGrabberLinux() override;
/// ///
/// Process audio buffer /// Process audio buffer
/// ///
void processAudioBuffer(snd_pcm_sframes_t frames); void processAudioBuffer(snd_pcm_sframes_t frames);
/// ///
/// Is Running Flag /// Is Running Flag
/// ///
std::atomic<bool> _isRunning; std::atomic<bool> _isRunning;
/// ///
/// Current capture device /// Current capture device
/// ///
snd_pcm_t * _captureDevice; snd_pcm_t * _captureDevice;
public slots: public slots:
/// ///
/// Start audio capturing session /// Start audio capturing session
/// ///
/// @returns true if successful /// @returns true if successful
bool start() override; bool start() override;
/// ///
/// Stop audio capturing session /// Stop audio capturing session
/// ///
void stop() override; void stop() override;
/// ///
/// Discovery audio devices /// Discovery audio devices
/// ///
QJsonArray discover(const QJsonObject& params) override; QJsonArray discover(const QJsonObject& params) override;
private: private:
/// ///
/// Refresh audio devices /// Refresh audio devices
/// ///
void refreshDevices(); void refreshDevices();
/// ///
/// Configure current audio capture interface /// Configure current audio capture interface
/// ///
bool configureCaptureInterface(); bool configureCaptureInterface();
/// ///
/// Get device name from path /// Get device name from path
/// ///
QString getDeviceName(const QString& devicePath) const; QString getDeviceName(const QString& devicePath) const;
/// ///
/// Current sample rate /// Current sample rate
/// ///
unsigned int _sampleRate; unsigned int _sampleRate;
/// ///
/// Audio capture thread /// Audio capture thread
/// ///
pthread_t _audioThread; pthread_t _audioThread;
/// ///
/// ALSA device configuration parameters /// ALSA device configuration parameters
/// ///
snd_pcm_hw_params_t * _captureDeviceConfig; snd_pcm_hw_params_t * _captureDeviceConfig;
}; };
///
/// Audio processing thread function
///
static void* AudioThreadRunner(void* params);
#endif // AUDIOGRABBERLINUX_H #endif // AUDIOGRABBERLINUX_H

@ -2,7 +2,7 @@
#define AUDIOGRABBERWINDOWS_H #define AUDIOGRABBERWINDOWS_H
// Hyperion-utils includes // Hyperion-utils includes
#include <grabber/AudioGrabber.h> #include <grabber/audio/AudioGrabber.h>
#include <DSound.h> #include <DSound.h>
/// ///
@ -14,7 +14,7 @@ class AudioGrabberWindows : public AudioGrabber
AudioGrabberWindows(); AudioGrabberWindows();
~AudioGrabberWindows() override; ~AudioGrabberWindows() override;
public slots: public slots:
bool start() override; bool start() override;
void stop() override; void stop() override;

@ -3,14 +3,14 @@
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#ifdef WIN32 #ifdef WIN32
#include <grabber/AudioGrabberWindows.h> #include <grabber/audio/AudioGrabberWindows.h>
#endif #endif
#ifdef __linux__ #ifdef __linux__
#include <grabber/AudioGrabberLinux.h> #include <grabber/audio/AudioGrabberLinux.h>
#endif #endif
/// ///
/// Audio Grabber wrapper /// Audio Grabber wrapper
/// ///
class AudioWrapper : public GrabberWrapper class AudioWrapper : public GrabberWrapper
@ -32,7 +32,7 @@ class AudioWrapper : public GrabberWrapper
/// ///
~AudioWrapper() override; ~AudioWrapper() override;
/// ///
/// Settings update handler /// Settings update handler
/// ///
void handleSettingsUpdate(settings::type type, const QJsonDocument& config) override; void handleSettingsUpdate(settings::type type, const QJsonDocument& config) override;
@ -43,13 +43,13 @@ class AudioWrapper : public GrabberWrapper
/// ///
void action() override; void action() override;
/// ///
/// Start audio capturing session /// Start audio capturing session
/// ///
/// @returns true if successful /// @returns true if successful
bool start() override; bool start() override;
/// ///
/// Stop audio capturing session /// Stop audio capturing session
/// ///
void stop() override; void stop() override;

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#include <grabber/DirectXGrabber.h> #include <grabber/directx/DirectXGrabber.h>
class DirectXWrapper: public GrabberWrapper class DirectXWrapper: public GrabberWrapper
{ {

@ -3,7 +3,7 @@
// Utils includes // Utils includes
#include <utils/ColorRgba.h> #include <utils/ColorRgba.h>
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#include <grabber/DispmanxFrameGrabber.h> #include <grabber/dispmanx/DispmanxFrameGrabber.h>
/// ///
/// The DispmanxWrapper uses an instance of the DispmanxFrameGrabber to obtain ImageRgb's from the /// The DispmanxWrapper uses an instance of the DispmanxFrameGrabber to obtain ImageRgb's from the

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#include <grabber/FramebufferFrameGrabber.h> #include <grabber/framebuffer/FramebufferFrameGrabber.h>
/// ///
/// The FramebufferWrapper uses an instance of the FramebufferFrameGrabber to obtain ImageRgb's from the /// The FramebufferWrapper uses an instance of the FramebufferFrameGrabber to obtain ImageRgb's from the

@ -1,11 +1,7 @@
#pragma once #pragma once
// OSX includes // OSX includes
#ifdef __APPLE__
#include <CoreGraphics/CoreGraphics.h> #include <CoreGraphics/CoreGraphics.h>
#else
#include <grabber/OsxFrameGrabberMock.h>
#endif
// Utils includes // Utils includes
#include <utils/ColorRgb.h> #include <utils/ColorRgb.h>

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#include <grabber/OsxFrameGrabber.h> #include <grabber/osx/OsxFrameGrabber.h>
/// ///
/// The OsxWrapper uses an instance of the OsxFrameGrabber to obtain ImageRgb's from the displayed content. /// The OsxWrapper uses an instance of the OsxFrameGrabber to obtain ImageRgb's from the displayed content.

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#include <grabber/QtGrabber.h> #include <grabber/qt/QtGrabber.h>
/// ///
/// The QtWrapper uses QtFramework API's to get a picture from system /// The QtWrapper uses QtFramework API's to get a picture from system

@ -136,11 +136,11 @@ class EncoderThreadManager : public QObject
public: public:
explicit EncoderThreadManager(QObject *parent = nullptr) explicit EncoderThreadManager(QObject *parent = nullptr)
: QObject(parent) : QObject(parent)
, _threadCount(static_cast<unsigned long>(qMax(QThread::idealThreadCount(), DEFAULT_THREAD_COUNT))) , _threadCount(qMax(QThread::idealThreadCount(), DEFAULT_THREAD_COUNT))
, _threads(nullptr) , _threads(nullptr)
{ {
_threads = new Thread<EncoderThread>*[_threadCount]; _threads = new Thread<EncoderThread>*[_threadCount];
for (unsigned long i = 0; i < _threadCount; i++) for (int i = 0; i < _threadCount; i++)
{ {
_threads[i] = new Thread<EncoderThread>(new EncoderThread, this); _threads[i] = new Thread<EncoderThread>(new EncoderThread, this);
_threads[i]->setObjectName("Encoder " + QString::number(i)); _threads[i]->setObjectName("Encoder " + QString::number(i));
@ -151,7 +151,7 @@ public:
{ {
if (_threads != nullptr) if (_threads != nullptr)
{ {
for(unsigned long i = 0; i < _threadCount; i++) for(int i = 0; i < _threadCount; i++)
{ {
_threads[i]->deleteLater(); _threads[i]->deleteLater();
_threads[i] = nullptr; _threads[i] = nullptr;
@ -165,18 +165,18 @@ public:
void start() void start()
{ {
if (_threads != nullptr) if (_threads != nullptr)
for (unsigned long i = 0; i < _threadCount; i++) for (int i = 0; i < _threadCount; i++)
connect(_threads[i]->thread(), &EncoderThread::newFrame, this, &EncoderThreadManager::newFrame); connect(_threads[i]->thread(), &EncoderThread::newFrame, this, &EncoderThreadManager::newFrame);
} }
void stop() void stop()
{ {
if (_threads != nullptr) if (_threads != nullptr)
for(unsigned long i = 0; i < _threadCount; i++) for(int i = 0; i < _threadCount; i++)
disconnect(_threads[i]->thread(), nullptr, nullptr, nullptr); disconnect(_threads[i]->thread(), nullptr, nullptr, nullptr);
} }
unsigned long _threadCount; int _threadCount;
Thread<EncoderThread>** _threads; Thread<EncoderThread>** _threads;
signals: signals:

@ -4,9 +4,9 @@
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#if defined(ENABLE_MF) #if defined(ENABLE_MF)
#include <grabber/MFGrabber.h> #include <grabber/video/mediafoundation/MFGrabber.h>
#elif defined(ENABLE_V4L2) #elif defined(ENABLE_V4L2)
#include <grabber/V4L2Grabber.h> #include <grabber/video/v4l2/V4L2Grabber.h>
#endif #endif
class VideoWrapper : public GrabberWrapper class VideoWrapper : public GrabberWrapper

@ -21,7 +21,7 @@
#include <hyperion/Grabber.h> #include <hyperion/Grabber.h>
// decoder thread includes // decoder thread includes
#include <grabber/EncoderThread.h> #include <grabber/video/EncoderThread.h>
/// Forward class declaration /// Forward class declaration
class SourceReaderCB; class SourceReaderCB;

@ -19,7 +19,7 @@
#include <utils/Components.h> #include <utils/Components.h>
// decoder thread includes // decoder thread includes
#include <grabber/EncoderThread.h> #include <grabber/video/EncoderThread.h>
// Determine the cmake options // Determine the cmake options
#include <HyperionConfig.h> #include <HyperionConfig.h>

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#include <grabber/X11Grabber.h> #include <grabber/x11/X11Grabber.h>
// some include of xorg defines "None" this is also used by QT and has to be undefined to avoid collisions // some include of xorg defines "None" this is also used by QT and has to be undefined to avoid collisions
#ifdef None #ifdef None
#undef None #undef None

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#include <grabber/XcbGrabber.h> #include <grabber/xcb/XcbGrabber.h>
// some include of xorg defines "None" this is also used by QT and has to be undefined to avoid collisions // some include of xorg defines "None" this is also used by QT and has to be undefined to avoid collisions
#ifdef None #ifdef None

@ -555,7 +555,7 @@ namespace hyperion
if (pixelNum > 0) if (pixelNum > 0)
{ {
// initial cluster with different colors // initial cluster with different colors
auto clusters = std::unique_ptr< ColorCluster<ColorRgbScalar> >(new ColorCluster<ColorRgbScalar>[_clusterCount]); std::unique_ptr<ColorCluster<ColorRgbScalar>[]> clusters(new ColorCluster<ColorRgbScalar>[_clusterCount]);
for(int k = 0; k < _clusterCount; ++k) for(int k = 0; k < _clusterCount; ++k)
{ {
clusters.get()[k].newColor = DEFAULT_CLUSTER_COLORS[k]; clusters.get()[k].newColor = DEFAULT_CLUSTER_COLORS[k];

@ -3,9 +3,8 @@
#include <QString> #include <QString>
#include <QByteArray> #include <QByteArray>
namespace Process { namespace Process
{
void restartHyperion(int exitCode = 0); void restartHyperion(int exitCode = 0);
QByteArray command_exec(const QString& cmd, const QByteArray& data = {}); QByteArray command_exec(const QString& cmd, const QByteArray& data = {});
} }

@ -1,7 +1,7 @@
# Define the current source locations # Define the current source locations
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include) set(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include)
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc) set(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc)
add_subdirectory(hyperion) add_subdirectory(hyperion)
add_subdirectory(commandline) add_subdirectory(commandline)
@ -40,7 +40,7 @@ add_subdirectory(events)
if(ENABLE_MDNS) if(ENABLE_MDNS)
add_subdirectory(mdns) add_subdirectory(mdns)
endif() endif()
if(ENABLE_EFFECTENGINE) if(ENABLE_EFFECTENGINE)
add_subdirectory(effectengine) add_subdirectory(effectengine)

@ -1,26 +1,20 @@
# Define the current source locations
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/api)
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/api)
FILE ( GLOB_RECURSE Api_SOURCES "${CURRENT_HEADER_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" )
set(Api_RESOURCES ${CURRENT_SOURCE_DIR}/JSONRPC_schemas.qrc )
add_library(hyperion-api add_library(hyperion-api
${Api_SOURCES} ${CMAKE_SOURCE_DIR}/include/api/apiStructs.h
${Api_RESOURCES} ${CMAKE_SOURCE_DIR}/include/api/API.h
${CMAKE_SOURCE_DIR}/include/api/JsonAPI.h
${CMAKE_SOURCE_DIR}/include/api/JsonCB.h
${CMAKE_SOURCE_DIR}/libsrc/api/JsonAPI.cpp
${CMAKE_SOURCE_DIR}/libsrc/api/API.cpp
${CMAKE_SOURCE_DIR}/libsrc/api/JsonCB.cpp
${CMAKE_SOURCE_DIR}/libsrc/api/JSONRPC_schemas.qrc
) )
if(ENABLE_DX)
include_directories(${DIRECTX9_INCLUDE_DIRS})
target_link_libraries(hyperion-api ${DIRECTX9_LIBRARIES})
endif(ENABLE_DX)
target_link_libraries(hyperion-api target_link_libraries(hyperion-api
hyperion hyperion
hyperion-utils hyperion-utils
Qt${QT_VERSION_MAJOR}::Core ${DIRECTX9_LIBRARIES}
Qt${QT_VERSION_MAJOR}::Gui )
Qt${QT_VERSION_MAJOR}::Network
target_include_directories(hyperion-api PRIVATE
${DIRECTX9_INCLUDE_DIRS}
) )

@ -19,55 +19,55 @@
#include <HyperionConfig.h> // Required to determine the cmake options #include <HyperionConfig.h> // Required to determine the cmake options
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#include <grabber/QtGrabber.h> #include <grabber/qt/QtGrabber.h>
#include <utils/WeakConnect.h> #include <utils/WeakConnect.h>
#include <events/EventEnum.h> #include <events/EventEnum.h>
#if defined(ENABLE_MF) #if defined(ENABLE_MF)
#include <grabber/MFGrabber.h> #include <grabber/video/mediafoundation/MFGrabber.h>
#elif defined(ENABLE_V4L2) #elif defined(ENABLE_V4L2)
#include <grabber/V4L2Grabber.h> #include <grabber/video/v4l2/V4L2Grabber.h>
#endif #endif
#if defined(ENABLE_AUDIO) #if defined(ENABLE_AUDIO)
#include <grabber/AudioGrabber.h> #include <grabber/audio/AudioGrabber.h>
#ifdef WIN32 #ifdef WIN32
#include <grabber/AudioGrabberWindows.h> #include <grabber/audio/AudioGrabberWindows.h>
#endif #endif
#ifdef __linux__ #ifdef __linux__
#include <grabber/AudioGrabberLinux.h> #include <grabber/audio/AudioGrabberLinux.h>
#endif #endif
#endif #endif
#if defined(ENABLE_X11) #if defined(ENABLE_X11)
#include <grabber/X11Grabber.h> #include <grabber/x11/X11Grabber.h>
#endif #endif
#if defined(ENABLE_XCB) #if defined(ENABLE_XCB)
#include <grabber/XcbGrabber.h> #include <grabber/xcb/XcbGrabber.h>
#endif #endif
#if defined(ENABLE_DX) #if defined(ENABLE_DX)
#include <grabber/DirectXGrabber.h> #include <grabber/directx/DirectXGrabber.h>
#endif #endif
#if defined(ENABLE_FB) #if defined(ENABLE_FB)
#include <grabber/FramebufferFrameGrabber.h> #include <grabber/framebuffer/FramebufferFrameGrabber.h>
#endif #endif
#if defined(ENABLE_DISPMANX) #if defined(ENABLE_DISPMANX)
#include <grabber/DispmanxFrameGrabber.h> #include <grabber/dispmanx/DispmanxFrameGrabber.h>
#endif #endif
#if defined(ENABLE_AMLOGIC) #if defined(ENABLE_AMLOGIC)
#include <grabber/AmlogicGrabber.h> #include <grabber/amlogic/AmlogicGrabber.h>
#endif #endif
#if defined(ENABLE_OSX) #if defined(ENABLE_OSX)
#include <grabber/OsxFrameGrabber.h> #include <grabber/osx/OsxFrameGrabber.h>
#endif #endif
#include <utils/jsonschema/QJsonFactory.h> #include <utils/jsonschema/QJsonFactory.h>

@ -1,11 +1,9 @@
add_library(blackborder
# Define the current source locations ${CMAKE_SOURCE_DIR}/include/blackborder/BlackBorderDetector.h
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/blackborder) ${CMAKE_SOURCE_DIR}/include/blackborder/BlackBorderProcessor.h
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/blackborder) ${CMAKE_SOURCE_DIR}/libsrc/blackborder/BlackBorderDetector.cpp
${CMAKE_SOURCE_DIR}/libsrc/blackborder/BlackBorderProcessor.cpp
FILE ( GLOB Blackborder_SOURCES "${CURRENT_HEADER_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" ) )
add_library(blackborder ${Blackborder_SOURCES} )
target_link_libraries(blackborder target_link_libraries(blackborder
hyperion-utils hyperion-utils

@ -1,14 +1,11 @@
add_library(boblightserver
# Define the current source locations ${CMAKE_SOURCE_DIR}/include/boblightserver/BoblightServer.h
set(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/boblightserver) ${CMAKE_SOURCE_DIR}/libsrc/boblightserver/BoblightServer.cpp
set(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/boblightserver) ${CMAKE_SOURCE_DIR}/libsrc/boblightserver/BoblightClientConnection.h
${CMAKE_SOURCE_DIR}/libsrc/boblightserver/BoblightClientConnection.cpp
FILE ( GLOB BoblightServer_SOURCES "${CURRENT_HEADER_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" ) )
add_library(boblightserver ${BoblightServer_SOURCES} )
target_link_libraries(boblightserver target_link_libraries(boblightserver
hyperion hyperion
hyperion-utils hyperion-utils
${QT_LIBRARIES}
) )

@ -1,20 +1,17 @@
# Define the current source locations
find_package(CEC REQUIRED) find_package(CEC REQUIRED)
if(CEC_FOUND)
list(GET CEC_LIBRARIES 0 CEC_LIBRARIES)
add_definitions(-DCEC_LIBRARY="${CEC_LIBRARIES}")
else()
message(FATAL_ERROR "libCEC not found")
endif()
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/cec) add_library(cechandler
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/cec) ${CMAKE_SOURCE_DIR}/include/cec/CECHandler.h
${CMAKE_SOURCE_DIR}/libsrc/cec/CECHandler.cpp
FILE (GLOB CEC_SOURCES "${CURRENT_HEADER_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp") )
add_library(cechandler ${CEC_SOURCES})
list(GET CEC_LIBRARIES 0 CEC_LIBRARIES)
add_definitions(-DCEC_LIBRARY="${CEC_LIBRARIES}")
include_directories(${CEC_INCLUDE_DIRS})
target_link_libraries(cechandler target_link_libraries(cechandler
Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Core
${CMAKE_DL_LIBS} ${CMAKE_DL_LIBS}
) )

@ -1,10 +1,27 @@
# Define the current source locations add_library(commandline
set(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/commandline) ${CMAKE_SOURCE_DIR}/include/commandline/BooleanOption.h
set(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/commandline) ${CMAKE_SOURCE_DIR}/include/commandline/ColorOption.h
${CMAKE_SOURCE_DIR}/include/commandline/ColorsOption.h
FILE ( GLOB Parser_SOURCES "${CURRENT_HEADER_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" ) ${CMAKE_SOURCE_DIR}/include/commandline/DoubleOption.h
${CMAKE_SOURCE_DIR}/include/commandline/ImageOption.h
add_library(commandline ${Parser_SOURCES} ) ${CMAKE_SOURCE_DIR}/include/commandline/IntOption.h
${CMAKE_SOURCE_DIR}/include/commandline/Option.h
${CMAKE_SOURCE_DIR}/include/commandline/Parser.h
${CMAKE_SOURCE_DIR}/include/commandline/RegularExpressionOption.h
${CMAKE_SOURCE_DIR}/include/commandline/SwitchOption.h
${CMAKE_SOURCE_DIR}/include/commandline/ValidatorOption.h
${CMAKE_SOURCE_DIR}/libsrc/commandline/BooleanOption.cpp
${CMAKE_SOURCE_DIR}/libsrc/commandline/ColorOption.cpp
${CMAKE_SOURCE_DIR}/libsrc/commandline/ColorsOption.cpp
${CMAKE_SOURCE_DIR}/libsrc/commandline/DoubleOption.cpp
${CMAKE_SOURCE_DIR}/libsrc/commandline/ImageOption.cpp
${CMAKE_SOURCE_DIR}/libsrc/commandline/IntOption.cpp
${CMAKE_SOURCE_DIR}/libsrc/commandline/Option.cpp
${CMAKE_SOURCE_DIR}/libsrc/commandline/Parser.cpp
${CMAKE_SOURCE_DIR}/libsrc/commandline/RegularExpressionOption.cpp
${CMAKE_SOURCE_DIR}/libsrc/commandline/SwitchOption.cpp
${CMAKE_SOURCE_DIR}/libsrc/commandline/ValidatorOption.cpp
)
target_link_libraries(commandline target_link_libraries(commandline
hyperion hyperion

@ -1,16 +1,14 @@
# Define the current source locations
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/db)
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/db)
FILE ( GLOB DB_SOURCES "${CURRENT_HEADER_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" )
add_library(database add_library(database
${DB_SOURCES} ${CMAKE_SOURCE_DIR}/include/db/AuthTable.h
${CMAKE_SOURCE_DIR}/include/db/DBManager.h
${CMAKE_SOURCE_DIR}/include/db/InstanceTable.h
${CMAKE_SOURCE_DIR}/include/db/MetaTable.h
${CMAKE_SOURCE_DIR}/include/db/SettingsTable.h
${CMAKE_SOURCE_DIR}/libsrc/db/DBManager.cpp
) )
target_link_libraries(database target_link_libraries(database
hyperion hyperion
hyperion-utils hyperion-utils
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Sql Qt${QT_VERSION_MAJOR}::Sql
) )

@ -1,47 +1,30 @@
if (NOT CMAKE_VERSION VERSION_LESS "3.12") file(GLOB effectFiles RELATIVE ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/effects/*)
find_package(Python3 COMPONENTS Interpreter Development REQUIRED) set(HYPERION_EFFECTS_RES "")
else() foreach(f ${effectFiles})
find_package (PythonLibs ${PYTHON_VERSION_STRING} EXACT) # Maps PythonLibs to the PythonInterp version of the main cmake get_filename_component(fname ${f} NAME)
endif() set(HYPERION_EFFECTS_RES "${HYPERION_EFFECTS_RES}\n\t\t<file alias=\"/effects/${fname}\">${f}</file>")
endforeach()
# Include the python directory. Also include the parent (which is for example /usr/include) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/EffectEngine.qrc.in ${CMAKE_BINARY_DIR}/EffectEngine.qrc)
# which may be required when it is not includes by the (cross-) compiler by default.
if (NOT CMAKE_VERSION VERSION_LESS "3.12")
include_directories(${Python3_INCLUDE_DIRS} ${Python3_INCLUDE_DIRS}/..)
else()
include_directories(${PYTHON_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS}/..)
endif()
# Define the current source locations
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/effectengine)
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/effectengine)
FILE ( GLOB EffectEngineSOURCES "${CURRENT_HEADER_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" )
FILE ( GLOB effectFiles RELATIVE ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/effects/* )
SET ( HYPERION_EFFECTS_RES "")
FOREACH( f ${effectFiles} )
GET_FILENAME_COMPONENT(fname ${f} NAME)
SET(HYPERION_EFFECTS_RES "${HYPERION_EFFECTS_RES}\n\t\t<file alias=\"/effects/${fname}\">${f}</file>")
ENDFOREACH()
CONFIGURE_FILE(${CURRENT_SOURCE_DIR}/EffectEngine.qrc.in ${CMAKE_BINARY_DIR}/EffectEngine.qrc )
SET(EffectEngine_RESOURCES ${CMAKE_BINARY_DIR}/EffectEngine.qrc)
add_library(effectengine add_library(effectengine
${EffectEngine_RESOURCES} ${CMAKE_BINARY_DIR}/EffectEngine.qrc
${EffectEngineSOURCES} ${CMAKE_SOURCE_DIR}/include/effectengine/ActiveEffectDefinition.h
${CMAKE_SOURCE_DIR}/include/effectengine/Effect.h
${CMAKE_SOURCE_DIR}/include/effectengine/EffectDefinition.h
${CMAKE_SOURCE_DIR}/include/effectengine/EffectEngine.h
${CMAKE_SOURCE_DIR}/include/effectengine/EffectFileHandler.h
${CMAKE_SOURCE_DIR}/include/effectengine/EffectModule.h
${CMAKE_SOURCE_DIR}/include/effectengine/EffectSchema.h
${CMAKE_SOURCE_DIR}/libsrc/effectengine/Effect.cpp
${CMAKE_SOURCE_DIR}/libsrc/effectengine/EffectEngine.cpp
${CMAKE_SOURCE_DIR}/libsrc/effectengine/EffectFileHandler.cpp
${CMAKE_SOURCE_DIR}/libsrc/effectengine/EffectModule.cpp
) )
target_link_libraries(effectengine target_link_libraries(effectengine
hyperion
python python
hyperion
Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Gui
) )
if (NOT CMAKE_VERSION VERSION_LESS "3.12")
target_link_libraries( effectengine ${Python3_LIBRARIES} )
else()
target_link_libraries( effectengine ${PYTHON_LIBRARIES} )
endif()

@ -1,6 +1,6 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/">
<file alias="effect-schema">${CURRENT_SOURCE_DIR}/EffectDefinition.schema.json</file> <file alias="effect-schema">${CMAKE_CURRENT_SOURCE_DIR}/EffectDefinition.schema.json</file>
${HYPERION_EFFECTS_RES} ${HYPERION_EFFECTS_RES}
</qresource> </qresource>
</RCC> </RCC>

@ -1,69 +1,54 @@
# set (compiled) Flatbuffer schema names
set(FBS_Request "hyperion_request")
set(FBS_Reply "hyperion_reply")
# Define the current source locations # define and compile flatbuffer schemas
set(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/flatbufserver) list(APPEND Compiled_FBS ${FBS_Request}_generated.h)
set(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/flatbufserver) list(APPEND Compiled_FBS ${FBS_Reply}_generated.h)
compile_flattbuffer_schema(${CMAKE_CURRENT_SOURCE_DIR}/${FBS_Request}.fbs ${CMAKE_CURRENT_SOURCE_DIR})
include_directories( compile_flattbuffer_schema(${CMAKE_CURRENT_SOURCE_DIR}/${FBS_Reply}.fbs ${CMAKE_CURRENT_SOURCE_DIR})
${CMAKE_CURRENT_BINARY_DIR}
${FLATBUFFERS_INCLUDE_DIRS}
)
set(Flatbuffer_GENERATED_FBS
hyperion_reply_generated.h
hyperion_request_generated.h
)
set(Flatbuffer_FBS
${CURRENT_SOURCE_DIR}/hyperion_reply.fbs
${CURRENT_SOURCE_DIR}/hyperion_request.fbs
)
FOREACH(FBS_FILE ${Flatbuffer_FBS})
compile_flattbuffer_schema(${FBS_FILE} ${CMAKE_CURRENT_SOURCE_DIR})
ENDFOREACH(FBS_FILE)
# let cmake know about new generated source files # let cmake know about new generated source files
set_source_files_properties( set_source_files_properties(${Compiled_FBS} PROPERTIES GENERATED TRUE)
${Flatbuffer_GENERATED_FBS} PROPERTIES GENERATED TRUE
)
### Split flatbufconnect from flatbufserver as flatbufserver relates to HyperionDaemon
# split flatbufconnect from flatbufserver as flatbufserver relates to HyperionDaemon
if(ENABLE_FLATBUF_CONNECT) if(ENABLE_FLATBUF_CONNECT)
add_library(flatbufconnect add_library(flatbufconnect
${CURRENT_HEADER_DIR}/FlatBufferConnection.h ${CMAKE_SOURCE_DIR}/include/flatbufserver/FlatBufferConnection.h
${CURRENT_SOURCE_DIR}/FlatBufferConnection.cpp ${CMAKE_SOURCE_DIR}/libsrc/flatbufserver/FlatBufferConnection.cpp
${FLATBUFSERVER_SOURCES} ${Compiled_FBS}
${Flatbuffer_GENERATED_FBS} )
) target_link_libraries(flatbufconnect
target_link_libraries(flatbufconnect hyperion-utils
hyperion-utils flatbuffers
flatbuffers )
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Core target_include_directories(flatbufconnect PUBLIC
) ${FLATBUFFERS_INCLUDE_DIRS}
)
endif() endif()
if(ENABLE_FLATBUF_SERVER) if(ENABLE_FLATBUF_SERVER)
add_library(flatbufserver add_library(flatbufserver
${CURRENT_HEADER_DIR}/FlatBufferServer.h ${CMAKE_SOURCE_DIR}/include/flatbufserver/FlatBufferServer.h
${CURRENT_SOURCE_DIR}/FlatBufferServer.cpp ${CMAKE_SOURCE_DIR}/libsrc/flatbufserver/FlatBufferServer.cpp
${CURRENT_SOURCE_DIR}/FlatBufferClient.h ${CMAKE_SOURCE_DIR}/libsrc/flatbufserver/FlatBufferClient.h
${CURRENT_SOURCE_DIR}/FlatBufferClient.cpp ${CMAKE_SOURCE_DIR}/libsrc/flatbufserver/FlatBufferClient.cpp
${FLATBUFSERVER_SOURCES} ${Compiled_FBS}
${Flatbuffer_GENERATED_FBS} )
)
target_link_libraries(flatbufserver target_link_libraries(flatbufserver
hyperion-utils hyperion-utils
flatbuffers flatbuffers
Qt${QT_VERSION_MAJOR}::Network )
Qt${QT_VERSION_MAJOR}::Core
)
if(ENABLE_MDNS)
target_link_libraries(flatbufserver mdns)
endif()
target_include_directories(flatbufserver PUBLIC
${FLATBUFFERS_INCLUDE_DIRS}
)
if(ENABLE_MDNS)
target_link_libraries(flatbufserver mdns)
endif()
endif() endif()

@ -1,22 +1,11 @@
add_library(forwarder
# Define the current source locations ${CMAKE_SOURCE_DIR}/include/forwarder/MessageForwarder.h
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/forwarder) ${CMAKE_SOURCE_DIR}/libsrc/forwarder/MessageForwarder.cpp
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/forwarder)
if(ENABLE_FLATBUF_CONNECT)
include_directories(
${CMAKE_CURRENT_BINARY_DIR}/../../libsrc/flatbufserver
) )
endif()
FILE ( GLOB Forwarder_SOURCES "${CURRENT_HEADER_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" )
add_library(forwarder ${Forwarder_SOURCES} )
target_link_libraries(forwarder target_link_libraries(forwarder
hyperion hyperion
hyperion-utils hyperion-utils
${QT_LIBRARIES}
) )
if(ENABLE_FLATBUF_CONNECT) if(ENABLE_FLATBUF_CONNECT)

@ -1,39 +1,39 @@
if (ENABLE_AMLOGIC) if(ENABLE_AMLOGIC)
add_subdirectory(amlogic) add_subdirectory(amlogic)
endif (ENABLE_AMLOGIC) endif (ENABLE_AMLOGIC)
if (ENABLE_DISPMANX) if(ENABLE_DISPMANX)
add_subdirectory(dispmanx) add_subdirectory(dispmanx)
endif (ENABLE_DISPMANX) endif (ENABLE_DISPMANX)
if (ENABLE_FB) if(ENABLE_FB)
add_subdirectory(framebuffer) add_subdirectory(framebuffer)
endif (ENABLE_FB) endif (ENABLE_FB)
if (ENABLE_OSX) if(ENABLE_OSX)
add_subdirectory(osx) add_subdirectory(osx)
endif(ENABLE_OSX) endif(ENABLE_OSX)
if (ENABLE_V4L2 OR ENABLE_MF) if(ENABLE_V4L2 OR ENABLE_MF)
add_subdirectory(video) add_subdirectory(video)
endif () endif()
if (ENABLE_X11) if(ENABLE_X11)
add_subdirectory(x11) add_subdirectory(x11)
endif(ENABLE_X11) endif(ENABLE_X11)
if (ENABLE_XCB) if(ENABLE_XCB)
add_subdirectory(xcb) add_subdirectory(xcb)
endif(ENABLE_XCB) endif(ENABLE_XCB)
if (ENABLE_QT) if(ENABLE_QT)
add_subdirectory(qt) add_subdirectory(qt)
endif(ENABLE_QT) endif(ENABLE_QT)
if (ENABLE_DX) if(ENABLE_DX)
add_subdirectory(directx) add_subdirectory(directx)
endif(ENABLE_DX) endif(ENABLE_DX)
if (ENABLE_AUDIO) if(ENABLE_AUDIO)
add_subdirectory(audio) add_subdirectory(audio)
endif() endif()

@ -20,7 +20,7 @@
// Local includes // Local includes
#include <utils/Logger.h> #include <utils/Logger.h>
#include <grabber/AmlogicGrabber.h> #include <grabber/amlogic/AmlogicGrabber.h>
#include "Amvideocap.h" #include "Amvideocap.h"
// Constants // Constants

@ -1,4 +1,4 @@
#include <grabber/AmlogicWrapper.h> #include <grabber/amlogic/AmlogicWrapper.h>
AmlogicWrapper::AmlogicWrapper(int pixelDecimation, int updateRate_Hz) AmlogicWrapper::AmlogicWrapper(int pixelDecimation, int updateRate_Hz)
: GrabberWrapper("Amlogic", &_grabber, updateRate_Hz) : GrabberWrapper("Amlogic", &_grabber, updateRate_Hz)

@ -1,13 +1,15 @@
INCLUDE (CheckIncludeFiles) add_library(amlogic-grabber
${CMAKE_SOURCE_DIR}/include/grabber/amlogic/AmlogicGrabber.h
# Define the current source locations ${CMAKE_SOURCE_DIR}/include/grabber/amlogic/AmlogicWrapper.h
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber) ${CMAKE_SOURCE_DIR}/libsrc/grabber/amlogic/AmlogicGrabber.cpp
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/amlogic) ${CMAKE_SOURCE_DIR}/libsrc/grabber/amlogic/AmlogicWrapper.cpp
${CMAKE_SOURCE_DIR}/libsrc/grabber/amlogic/Amvideocap.h
FILE ( GLOB AmlogicSOURCES "${CURRENT_HEADER_DIR}/Amlogic*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" ) ${CMAKE_SOURCE_DIR}/libsrc/grabber/amlogic/ion.h
${CMAKE_SOURCE_DIR}/libsrc/grabber/amlogic/meson_ion.h
add_library(amlogic-grabber ${AmlogicSOURCES} ) ${CMAKE_SOURCE_DIR}/libsrc/grabber/amlogic/IonBuffer.h
${CMAKE_SOURCE_DIR}/libsrc/grabber/amlogic/IonBuffer.cpp
)
target_link_libraries(amlogic-grabber target_link_libraries(amlogic-grabber
hyperion hyperion
${QT_LIBRARIES}) )

@ -1,4 +1,4 @@
#include <grabber/AudioGrabber.h> #include <grabber/audio/AudioGrabber.h>
#include <math.h> #include <math.h>
#include <QImage> #include <QImage>
#include <QObject> #include <QObject>

@ -1,11 +1,31 @@
#include <grabber/AudioGrabberLinux.h> #include <grabber/audio/AudioGrabberLinux.h>
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
#include <QJsonObject> #include <QJsonObject>
#include <QJsonArray> #include <QJsonArray>
typedef void* (*THREADFUNCPTR)(void*); static void * AudioThreadRunner(void* params)
{
AudioGrabberLinux* This = static_cast<AudioGrabberLinux*>(params);
Debug(This->getLog(), "Audio Thread Started");
snd_pcm_sframes_t framesAvailable = 0;
while (This->_isRunning.load(std::memory_order_acquire))
{
snd_pcm_wait(This->_captureDevice, 1000);
if ((framesAvailable = snd_pcm_avail(This->_captureDevice)) > 0)
This->processAudioBuffer(framesAvailable);
sched_yield();
}
Debug(This->getLog(), "Audio Thread Shutting Down");
return nullptr;
}
AudioGrabberLinux::AudioGrabberLinux() AudioGrabberLinux::AudioGrabberLinux()
: AudioGrabber() : AudioGrabber()
@ -121,7 +141,7 @@ bool AudioGrabberLinux::configureCaptureInterface()
snd_pcm_close(_captureDevice); snd_pcm_close(_captureDevice);
return false; return false;
} }
if ((error = snd_pcm_hw_params_set_access(_captureDevice, _captureDeviceConfig, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) if ((error = snd_pcm_hw_params_set_access(_captureDevice, _captureDeviceConfig, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
{ {
Error(_log, "Failed to configure interleaved mode: %s", snd_strerror(error)); Error(_log, "Failed to configure interleaved mode: %s", snd_strerror(error));
@ -129,7 +149,7 @@ bool AudioGrabberLinux::configureCaptureInterface()
snd_pcm_close(_captureDevice); snd_pcm_close(_captureDevice);
return false; return false;
} }
if ((error = snd_pcm_hw_params_set_format(_captureDevice, _captureDeviceConfig, SND_PCM_FORMAT_S16_LE)) < 0) if ((error = snd_pcm_hw_params_set_format(_captureDevice, _captureDeviceConfig, SND_PCM_FORMAT_S16_LE)) < 0)
{ {
Error(_log, "Failed to configure capture format: %s", snd_strerror(error)); Error(_log, "Failed to configure capture format: %s", snd_strerror(error));
@ -169,7 +189,7 @@ bool AudioGrabberLinux::configureCaptureInterface()
snd_pcm_close(_captureDevice); snd_pcm_close(_captureDevice);
return false; return false;
} }
return true; return true;
} }
@ -189,11 +209,6 @@ bool AudioGrabberLinux::start()
_isRunning.store(true, std::memory_order_release); _isRunning.store(true, std::memory_order_release);
pthread_attr_t threadAttributes; pthread_attr_t threadAttributes;
int threadPriority = 1;
sched_param schedulerParameter;
schedulerParameter.sched_priority = threadPriority;
if (pthread_attr_init(&threadAttributes) != 0) if (pthread_attr_init(&threadAttributes) != 0)
{ {
Debug(_log, "Failed to create thread attributes"); Debug(_log, "Failed to create thread attributes");
@ -201,7 +216,7 @@ bool AudioGrabberLinux::start()
return false; return false;
} }
if (pthread_create(&_audioThread, &threadAttributes, static_cast<THREADFUNCPTR>(&AudioThreadRunner), static_cast<void*>(this)) != 0) if (pthread_create(&_audioThread, &threadAttributes, &AudioThreadRunner, static_cast<void*>(this)) != 0)
{ {
Debug(_log, "Failed to create audio capture thread"); Debug(_log, "Failed to create audio capture thread");
stop(); stop();
@ -239,7 +254,7 @@ void AudioGrabberLinux::processAudioBuffer(snd_pcm_sframes_t frames)
ssize_t bytes = snd_pcm_frames_to_bytes(_captureDevice, frames); ssize_t bytes = snd_pcm_frames_to_bytes(_captureDevice, frames);
int16_t * buffer = static_cast<int16_t*>(calloc(static_cast<size_t>(bytes / 2), sizeof(int16_t))); int16_t * buffer = static_cast<int16_t*>(calloc(static_cast<size_t>(bytes / 2), sizeof(int16_t)));
if (frames == 0) if (frames == 0)
{ {
buffer[0] = 0; buffer[0] = 0;
@ -293,25 +308,3 @@ QString AudioGrabberLinux::getDeviceName(const QString& devicePath) const
return _deviceProperties.value(devicePath).name; return _deviceProperties.value(devicePath).name;
} }
static void * AudioThreadRunner(void* params)
{
AudioGrabberLinux* This = static_cast<AudioGrabberLinux*>(params);
Debug(This->getLog(), "Audio Thread Started");
snd_pcm_sframes_t framesAvailable = 0;
while (This->_isRunning.load(std::memory_order_acquire))
{
snd_pcm_wait(This->_captureDevice, 1000);
if ((framesAvailable = snd_pcm_avail(This->_captureDevice)) > 0)
This->processAudioBuffer(framesAvailable);
sched_yield();
}
Debug(This->getLog(), "Audio Thread Shutting Down");
return nullptr;
}

@ -1,4 +1,4 @@
#include <grabber/AudioGrabberWindows.h> #include <grabber/audio/AudioGrabberWindows.h>
#include <climits> #include <climits>
@ -71,7 +71,7 @@ bool AudioGrabberWindows::configureCaptureInterface()
notificationSize -= notificationSize % audioFormat.nBlockAlign; notificationSize -= notificationSize % audioFormat.nBlockAlign;
bufferCaptureSize = notificationSize * AUDIO_NOTIFICATION_COUNT; bufferCaptureSize = notificationSize * AUDIO_NOTIFICATION_COUNT;
DSCBUFFERDESC bufferDesc; DSCBUFFERDESC bufferDesc;
bufferDesc.dwSize = sizeof(DSCBUFFERDESC); bufferDesc.dwSize = sizeof(DSCBUFFERDESC);
bufferDesc.dwFlags = 0; bufferDesc.dwFlags = 0;
@ -80,7 +80,7 @@ bool AudioGrabberWindows::configureCaptureInterface()
bufferDesc.lpwfxFormat = &audioFormat; bufferDesc.lpwfxFormat = &audioFormat;
bufferDesc.dwFXCount = 0; bufferDesc.dwFXCount = 0;
bufferDesc.lpDSCFXDesc = NULL; bufferDesc.lpDSCFXDesc = NULL;
// Create Capture Device's Buffer // Create Capture Device's Buffer
LPDIRECTSOUNDCAPTUREBUFFER preBuffer; LPDIRECTSOUNDCAPTUREBUFFER preBuffer;
if (FAILED(recordingDevice->CreateCaptureBuffer(&bufferDesc, &preBuffer, NULL))) if (FAILED(recordingDevice->CreateCaptureBuffer(&bufferDesc, &preBuffer, NULL)))
@ -101,7 +101,7 @@ bool AudioGrabberWindows::configureCaptureInterface()
} }
preBuffer->Release(); preBuffer->Release();
// Create Notifications // Create Notifications
LPDIRECTSOUNDNOTIFY8 notify; LPDIRECTSOUNDNOTIFY8 notify;
@ -112,7 +112,7 @@ bool AudioGrabberWindows::configureCaptureInterface()
recordingBuffer->Release(); recordingBuffer->Release();
return false; return false;
} }
// Create Events // Create Events
notificationEvent = CreateEvent(NULL, TRUE, FALSE, NULL); notificationEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
@ -133,11 +133,11 @@ bool AudioGrabberWindows::configureCaptureInterface()
positionNotify[i].dwOffset = (notificationSize * i) + notificationSize - 1; positionNotify[i].dwOffset = (notificationSize * i) + notificationSize - 1;
positionNotify[i].hEventNotify = notificationEvent; positionNotify[i].hEventNotify = notificationEvent;
} }
// Set Notifications // Set Notifications
notify->SetNotificationPositions(AUDIO_NOTIFICATION_COUNT, positionNotify); notify->SetNotificationPositions(AUDIO_NOTIFICATION_COUNT, positionNotify);
notify->Release(); notify->Release();
return true; return true;
} }
@ -162,12 +162,12 @@ bool AudioGrabberWindows::start()
} }
Info(_log, "Capture audio from %s", QSTRING_CSTR(getDeviceName(_device))); Info(_log, "Capture audio from %s", QSTRING_CSTR(getDeviceName(_device)));
if (!this->configureCaptureInterface()) if (!this->configureCaptureInterface())
{ {
return false; return false;
} }
if (FAILED(recordingBuffer->Start(DSCBSTART_LOOPING))) if (FAILED(recordingBuffer->Start(DSCBSTART_LOOPING)))
{ {
Error(_log, "Failed starting audio capture from '%s'", QSTRING_CSTR(getDeviceName(_device))); Error(_log, "Failed starting audio capture from '%s'", QSTRING_CSTR(getDeviceName(_device)));
@ -214,7 +214,7 @@ void AudioGrabberWindows::stop()
{ {
Error(_log, "Audio capture failed to stop: '%s'", QSTRING_CSTR(getDeviceName(_device))); Error(_log, "Audio capture failed to stop: '%s'", QSTRING_CSTR(getDeviceName(_device)));
} }
if (FAILED(recordingBuffer->Release())) if (FAILED(recordingBuffer->Release()))
{ {
Error(_log, "Failed to release recording buffer: '%s'", QSTRING_CSTR(getDeviceName(_device))); Error(_log, "Failed to release recording buffer: '%s'", QSTRING_CSTR(getDeviceName(_device)));
@ -306,7 +306,7 @@ void AudioGrabberWindows::processAudioBuffer()
// Buffer wrapped around, read second position // Buffer wrapped around, read second position
if (capturedAudio2 != NULL) if (capturedAudio2 != NULL)
{ {
bufferCapturePosition += capturedAudio2Length; bufferCapturePosition += capturedAudio2Length;
bufferCapturePosition %= bufferCaptureSize; // Circular Buffer bufferCapturePosition %= bufferCaptureSize; // Circular Buffer
} }
@ -318,13 +318,13 @@ void AudioGrabberWindows::processAudioBuffer()
{ {
CopyMemory(readBuffer + capturedAudioLength, capturedAudio2, capturedAudio2Length); CopyMemory(readBuffer + capturedAudioLength, capturedAudio2, capturedAudio2Length);
} }
// Release Buffer Lock // Release Buffer Lock
recordingBuffer->Unlock(capturedAudio, capturedAudioLength, capturedAudio2, capturedAudio2Length); recordingBuffer->Unlock(capturedAudio, capturedAudioLength, capturedAudio2, capturedAudio2Length);
// Process Audio Frame // Process Audio Frame
this->processAudioFrame(readBuffer, frameSize); this->processAudioFrame(readBuffer, frameSize);
delete[] readBuffer; delete[] readBuffer;
} }

@ -1,4 +1,4 @@
#include <grabber/AudioWrapper.h> #include <grabber/audio/AudioWrapper.h>
#include <hyperion/GrabberWrapper.h> #include <hyperion/GrabberWrapper.h>
#include <QObject> #include <QObject>
#include <QMetaType> #include <QMetaType>

@ -1,35 +1,38 @@
# Define the current source locations if(WIN32)
SET( CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber ) add_definitions(-DUNICODE -D_UNICODE)
SET( CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/audio ) set(AUDIO_GRABBER_SOURCES
${CMAKE_SOURCE_DIR}/include/grabber/audio/AudioGrabberWindows.h
if (WIN32) ${CMAKE_SOURCE_DIR}/libsrc/grabber/audio/AudioGrabberWindows.cpp
add_definitions(-DUNICODE -D_UNICODE) )
FILE ( GLOB AUDIO_GRABBER_SOURCES "${CURRENT_HEADER_DIR}/Audio*Windows.h" "${CURRENT_HEADER_DIR}/AudioGrabber.h" "${CURRENT_HEADER_DIR}/AudioWrapper.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*Windows.cpp" "${CURRENT_SOURCE_DIR}/AudioGrabber.cpp" "${CURRENT_SOURCE_DIR}/AudioWrapper.cpp") elseif(CMAKE_HOST_UNIX AND NOT APPLE)
elseif(${CMAKE_SYSTEM} MATCHES "Linux") set(AUDIO_GRABBER_SOURCES
FILE ( GLOB AUDIO_GRABBER_SOURCES "${CURRENT_HEADER_DIR}/Audio*Linux.h" "${CURRENT_HEADER_DIR}/AudioGrabber.h" "${CURRENT_HEADER_DIR}/AudioWrapper.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*Linux.cpp" "${CURRENT_SOURCE_DIR}/AudioGrabber.cpp" "${CURRENT_SOURCE_DIR}/AudioWrapper.cpp") ${CMAKE_SOURCE_DIR}/include/grabber/audio/AudioGrabberLinux.h
elseif (APPLE) ${CMAKE_SOURCE_DIR}/libsrc/grabber/audio/AudioGrabberLinux.cpp
#TODO )
#FILE ( GLOB AUDIO_GRABBER_SOURCES "${CURRENT_HEADER_DIR}/Audio*Apple.h" "${CURRENT_HEADER_DIR}/AudioGrabber.h" "${CURRENT_HEADER_DIR}/AudioWrapper.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*Apple.cpp" "${CURRENT_SOURCE_DIR}/AudioGrabber.cpp" "${CURRENT_SOURCE_DIR}/AudioWrapper.cpp")
endif() endif()
add_library( audio-grabber ${AUDIO_GRABBER_SOURCES} ) add_library(audio-grabber
${CMAKE_SOURCE_DIR}/include/grabber/audio/AudioGrabber.h
${CMAKE_SOURCE_DIR}/include/grabber/audio/AudioWrapper.h
${CMAKE_SOURCE_DIR}/libsrc/grabber/audio/AudioGrabber.cpp
${CMAKE_SOURCE_DIR}/libsrc/grabber/audio/AudioWrapper.cpp
${AUDIO_GRABBER_SOURCES}
)
set(AUDIO_LIBS hyperion) if(WIN32)
set(AUDIO_LIBS DSound)
elseif(CMAKE_HOST_UNIX AND NOT APPLE)
if (WIN32) set(THREADS_PREFER_PTHREAD_FLAG ON)
set(AUDIO_LIBS ${AUDIO_LIBS} DSound) find_package(ALSA REQUIRED)
elseif(${CMAKE_SYSTEM} MATCHES "Linux") find_package(Threads REQUIRED)
find_package(ALSA REQUIRED) set(AUDIO_LIBS ${ALSA_LIBRARIES} Threads::Threads)
if (ALSA_FOUND)
include_directories(${ALSA_INCLUDE_DIRS})
set(AUDIO_LIBS ${AUDIO_LIBS} ${ALSA_LIBRARIES})
endif(ALSA_FOUND)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
set(AUDIO_LIBS ${AUDIO_LIBS} Threads::Threads) # PRIVATE
endif() endif()
target_link_libraries(audio-grabber
hyperion
${AUDIO_LIBS}
)
target_link_libraries(audio-grabber ${AUDIO_LIBS} ${QT_LIBRARIES}) if(CMAKE_HOST_UNIX AND NOT APPLE)
target_include_directories(audio-grabber PUBLIC ${ALSA_INCLUDE_DIRS})
endif()

@ -1,14 +1,17 @@
# Define the current source locations find_package(DirectX9 REQUIRED)
SET( CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber )
SET( CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/directx )
include_directories(${DIRECTX9_INCLUDE_DIRS}) add_library(directx-grabber
${CMAKE_SOURCE_DIR}/include/grabber/directx/DirectXGrabber.h
FILE ( GLOB DIRECTX_GRAB_SOURCES "${CURRENT_HEADER_DIR}/DirectX*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" ) ${CMAKE_SOURCE_DIR}/include/grabber/directx/DirectXWrapper.h
${CMAKE_SOURCE_DIR}/libsrc/grabber/directx/DirectXGrabber.cpp
add_library( directx-grabber ${DIRECTX_GRAB_SOURCES} ) ${CMAKE_SOURCE_DIR}/libsrc/grabber/directx/DirectXWrapper.cpp
)
target_link_libraries(directx-grabber target_link_libraries(directx-grabber
hyperion hyperion
${DIRECTX9_LIBRARIES} ${DIRECTX9_LIBRARIES}
)
target_include_directories(directx-grabber PUBLIC
${DIRECTX9_INCLUDE_DIRS}
) )

@ -1,5 +1,5 @@
#include <windows.h> #include <windows.h>
#include <grabber/DirectXGrabber.h> #include <grabber/directx/DirectXGrabber.h>
#pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3d9.lib")
#pragma comment(lib,"d3dx9.lib") #pragma comment(lib,"d3dx9.lib")

@ -1,4 +1,4 @@
#include <grabber/DirectXWrapper.h> #include <grabber/directx/DirectXWrapper.h>
DirectXWrapper::DirectXWrapper( int updateRate_Hz, DirectXWrapper::DirectXWrapper( int updateRate_Hz,
int display, int display,

@ -1,5 +1,5 @@
# Find the BCM-package (VC control) # Find the BCM-package (VC control)
if( "${PLATFORM}" MATCHES rpi) if("${PLATFORM}" MATCHES rpi)
find_package(BCM) find_package(BCM)
if(BCM_FOUND) if(BCM_FOUND)
add_definitions(-DBCM_FOUND) add_definitions(-DBCM_FOUND)
@ -9,21 +9,20 @@ else()
set(BCM_LIBRARY "") set(BCM_LIBRARY "")
endif() endif()
# Define the current source locations add_library(dispmanx-grabber
set(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber) ${CMAKE_SOURCE_DIR}/include/grabber/dispmanx/DispmanxFrameGrabber.h
set(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/dispmanx) ${CMAKE_SOURCE_DIR}/include/grabber/dispmanx/DispmanxWrapper.h
${CMAKE_SOURCE_DIR}/libsrc/grabber/dispmanx/DispmanxFrameGrabber.cpp
${CMAKE_SOURCE_DIR}/libsrc/grabber/dispmanx/DispmanxWrapper.cpp
)
FILE ( GLOB DispmanxGrabberSOURCES "${CURRENT_HEADER_DIR}/Dispmanx*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" )
add_library(dispmanx-grabber ${DispmanxGrabberSOURCES})
add_definitions(-DBCM_LIBRARY="${BCM_LIBRARY}") add_definitions(-DBCM_LIBRARY="${BCM_LIBRARY}")
target_link_libraries(dispmanx-grabber
hyperion
${CMAKE_DL_LIBS}
)
target_include_directories(dispmanx-grabber PUBLIC target_include_directories(dispmanx-grabber PUBLIC
${BCM_INCLUDE_DIR} ${BCM_INCLUDE_DIR}
) )
target_link_libraries(dispmanx-grabber
hyperion
${QT_LIBRARIES}
${CMAKE_DL_LIBS}
)

@ -16,7 +16,7 @@ namespace {
} //End of constants } //End of constants
// Local includes // Local includes
#include "grabber/DispmanxFrameGrabber.h" #include "grabber/dispmanx/DispmanxFrameGrabber.h"
DispmanxFrameGrabber::DispmanxFrameGrabber() DispmanxFrameGrabber::DispmanxFrameGrabber()
: Grabber("DISPMANXGRABBER") : Grabber("DISPMANXGRABBER")

@ -1,4 +1,4 @@
#include <grabber/DispmanxWrapper.h> #include <grabber/dispmanx/DispmanxWrapper.h>
DispmanxWrapper::DispmanxWrapper( int updateRate_Hz, DispmanxWrapper::DispmanxWrapper( int updateRate_Hz,
int pixelDecimation int pixelDecimation

@ -1,11 +1,10 @@
# Define the current source locations add_library(framebuffer-grabber
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber) ${CMAKE_SOURCE_DIR}/include/grabber/framebuffer/FramebufferFrameGrabber.h
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/framebuffer) ${CMAKE_SOURCE_DIR}/include/grabber/framebuffer/FramebufferWrapper.h
${CMAKE_SOURCE_DIR}/libsrc/grabber/framebuffer/FramebufferFrameGrabber.cpp
FILE ( GLOB FramebufferGrabberSOURCES "${CURRENT_HEADER_DIR}/Framebuffer*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" ) ${CMAKE_SOURCE_DIR}/libsrc/grabber/framebuffer/FramebufferWrapper.cpp
)
add_library(framebuffer-grabber ${FramebufferGrabberSOURCES} )
target_link_libraries(framebuffer-grabber target_link_libraries(framebuffer-grabber
hyperion hyperion
${QT_LIBRARIES}) )

@ -28,7 +28,7 @@ const char DISCOVERY_FILEPATTERN[] = "fb?";
} //End of constants } //End of constants
// Local includes // Local includes
#include <grabber/FramebufferFrameGrabber.h> #include <grabber/framebuffer/FramebufferFrameGrabber.h>
FramebufferFrameGrabber::FramebufferFrameGrabber(const QString & device) FramebufferFrameGrabber::FramebufferFrameGrabber(const QString & device)
: Grabber("FRAMEBUFFERGRABBER") : Grabber("FRAMEBUFFERGRABBER")

@ -1,4 +1,4 @@
#include <grabber/FramebufferWrapper.h> #include <grabber/framebuffer/FramebufferWrapper.h>
FramebufferWrapper::FramebufferWrapper( int updateRate_Hz, FramebufferWrapper::FramebufferWrapper( int updateRate_Hz,
const QString & device, const QString & device,

@ -1,11 +1,10 @@
# Define the current source locations add_library(osx-grabber
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber) ${CMAKE_SOURCE_DIR}/include/grabber/osx/OsxFrameGrabber.h
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/osx) ${CMAKE_SOURCE_DIR}/include/grabber/osx/OsxWrapper.h
${CMAKE_SOURCE_DIR}/libsrc/grabber/osx/OsxFrameGrabber.cpp
FILE ( GLOB OsxGrabberSOURCES "${CURRENT_HEADER_DIR}/Osx*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" ) ${CMAKE_SOURCE_DIR}/libsrc/grabber/osx/OsxWrapper.cpp
)
add_library(osx-grabber ${OsxGrabberSOURCES} )
target_link_libraries(osx-grabber target_link_libraries(osx-grabber
hyperion hyperion
${QT_LIBRARIES}) )

@ -3,7 +3,7 @@
#include <iostream> #include <iostream>
// Local includes // Local includes
#include <grabber/OsxFrameGrabber.h> #include <grabber/osx/OsxFrameGrabber.h>
//Qt //Qt
#include <QJsonObject> #include <QJsonObject>

@ -1,159 +0,0 @@
#ifndef __APPLE__
#include <grabber/OsxFrameGrabberMock.h>
unsigned __osx_frame_counter = 0;
const int __screenWidth = 800;
const int __screenHeight = 600;
CGError CGGetActiveDisplayList(uint32_t maxDisplays, CGDirectDisplayID *activeDisplays, uint32_t *displayCount)
{
if (maxDisplays == 0 || activeDisplays == nullptr)
{
*displayCount = 2;
}
else
{
displayCount = &maxDisplays;
if (activeDisplays != nullptr)
{
for (CGDirectDisplayID i = 0; i < maxDisplays; ++i)
{
activeDisplays[i] = i;
}
}
else
{
return kCGErrorFailure;
}
}
return kCGErrorSuccess;
}
CGImageRef CGDisplayCreateImage(CGDirectDisplayID display)
{
CGImageRef image = new CGImage(__screenWidth / (display+1), __screenHeight / (display+1));
return image;
}
void CGImageRelease(CGImageRef image)
{
delete image;
}
CGImageRef CGImageGetDataProvider(CGImageRef image)
{
__osx_frame_counter++;
if (__osx_frame_counter > 100)
{
__osx_frame_counter = 0;
}
ColorRgb color[4] = {ColorRgb::RED, ColorRgb::BLUE, ColorRgb::GREEN, ColorRgb::WHITE};
if (__osx_frame_counter < 25)
{
color[0] = ColorRgb::WHITE;
color[1] = ColorRgb::RED;
color[2] = ColorRgb::BLUE;
color[3] = ColorRgb::GREEN;
}
else if(__osx_frame_counter < 50)
{
color[1] = ColorRgb::WHITE;
color[2] = ColorRgb::RED;
color[3] = ColorRgb::BLUE;
color[0] = ColorRgb::GREEN;
}
else if(__osx_frame_counter < 75)
{
color[2] = ColorRgb::WHITE;
color[3] = ColorRgb::RED;
color[0] = ColorRgb::BLUE;
color[1] = ColorRgb::GREEN;
}
unsigned w = image->width();
unsigned h = image->height();
for (unsigned y=0; y<h; y++)
{
for (unsigned x=0; x<w; x++)
{
unsigned id = 0;
if (x < w/2 && y < h/2) id = 1;
if (x < w/2 && y >= h/2) id = 2;
if (x >= w/2 && y < h/2) id = 3;
image->memptr()[y*w + x] = color[id];
}
}
return image;
}
CFDataRef CGDataProviderCopyData(CGImageRef image)
{
const unsigned indexMax = image->width() * image->height() * CGImageGetBitsPerPixel(image);
CFDataRef data = new CFData[indexMax];
int lineLength = CGImageGetBytesPerRow(image);
for (unsigned y=0; y<image->height(); y++)
{
for (unsigned x=0; x<image->width(); x++)
{
int index = lineLength * y + x * CGImageGetBitsPerPixel(image);
data[index ] = (*image)(x,y).blue;
data[index+1] = (*image)(x,y).green;
data[index+2] = (*image)(x,y).red;
data[index+3] = 0;
}
}
return data;
}
unsigned char* CFDataGetBytePtr(CFDataRef imgData)
{
return imgData;
}
unsigned CGImageGetWidth(CGImageRef image)
{
return image->width();
}
unsigned CGImageGetHeight(CGImageRef image)
{
return image->height();
}
unsigned CGImageGetBytesPerRow(CGImageRef image)
{
return image->width()*CGImageGetBitsPerPixel(image);
}
unsigned CGImageGetBitsPerPixel(CGImageRef)
{
return 4;
}
void CFRelease(CFDataRef imgData)
{
delete imgData;
}
CGDisplayModeRef CGDisplayCopyDisplayMode(CGDirectDisplayID display)
{
return nullptr;
}
CGRect CGDisplayBounds(CGDirectDisplayID display)
{
CGRect rect;
rect.size.width = __screenWidth / (display+1);
rect.size.height = __screenHeight / (display+1);
return rect;
}
void CGDisplayModeRelease(CGDisplayModeRef mode)
{
}
#endif

@ -1,4 +1,4 @@
#include <grabber/OsxWrapper.h> #include <grabber/osx/OsxWrapper.h>
OsxWrapper::OsxWrapper( int updateRate_Hz, OsxWrapper::OsxWrapper( int updateRate_Hz,
int display, int display,

@ -1,13 +1,10 @@
# Define the current source locations add_library(qt-grabber
SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber) ${CMAKE_SOURCE_DIR}/include/grabber/qt/QtGrabber.h
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/qt) ${CMAKE_SOURCE_DIR}/include/grabber/qt/QtWrapper.h
${CMAKE_SOURCE_DIR}/libsrc/grabber/qt/QtGrabber.cpp
${CMAKE_SOURCE_DIR}/libsrc/grabber/qt/QtWrapper.cpp
FILE ( GLOB QT_GRAB_SOURCES "${CURRENT_HEADER_DIR}/Qt*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp" ) )
add_library(qt-grabber ${QT_GRAB_SOURCES} )
target_link_libraries(qt-grabber target_link_libraries(qt-grabber
hyperion hyperion
${QT_LIBRARIES}
) )

@ -1,5 +1,5 @@
// proj // proj
#include <grabber/QtGrabber.h> #include <grabber/qt/QtGrabber.h>
// qt // qt
#include <QPixmap> #include <QPixmap>
@ -226,7 +226,7 @@ int QtGrabber::grabFrame(Image<ColorRgb>& image)
QPixmap originalPixmap = grabWindow(0, _src_x, _src_y, _src_x_max, _src_y_max); QPixmap originalPixmap = grabWindow(0, _src_x, _src_y, _src_x_max, _src_y_max);
#else #else
QPixmap originalPixmap = _screen->grabWindow(0, _src_x, _src_y, _src_x_max, _src_y_max); QPixmap originalPixmap = _screen->grabWindow(0, _src_x, _src_y, _src_x_max, _src_y_max);
#endif #endif
if (originalPixmap.isNull()) if (originalPixmap.isNull())
{ {
rc = -1; rc = -1;

@ -1,4 +1,4 @@
#include <grabber/QtWrapper.h> #include <grabber/qt/QtWrapper.h>
QtWrapper::QtWrapper( int updateRate_Hz, QtWrapper::QtWrapper( int updateRate_Hz,
int display, int display,

@ -1,38 +1,38 @@
# Common cmake definition for external video grabber # Common cmake definition for external video grabber
# Add Turbo JPEG library set(MF-grabber mediafoundation)
if (ENABLE_V4L2 OR ENABLE_MF) set(V4L2-grabber v4l2)
find_package(TurboJPEG)
if (TURBOJPEG_FOUND)
add_definitions(-DHAVE_TURBO_JPEG)
message( STATUS "Using Turbo JPEG library: ${TurboJPEG_LIBRARY}")
include_directories(${TurboJPEG_INCLUDE_DIRS})
else ()
message( STATUS "Turbo JPEG library not found, MJPEG camera format won't work.")
endif ()
endif()
# Define the wrapper/header/source locations and collect them if(ENABLE_MF)
SET(WRAPPER_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/video)
SET(HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber)
if (ENABLE_MF)
project(mf-grabber) project(mf-grabber)
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/video/mediafoundation) set(grabber_project MF)
FILE (GLOB SOURCES "${WRAPPER_DIR}/*.cpp" "${HEADER_DIR}/Video*.h" "${HEADER_DIR}/MF*.h" "${HEADER_DIR}/Encoder*.h" "${CURRENT_SOURCE_DIR}/*.h" "${CURRENT_SOURCE_DIR}/*.cpp") set(MediaFoundationSourceReaderCallBack ${CMAKE_SOURCE_DIR}/libsrc/grabber/video/mediafoundation/MFSourceReaderCB.h)
elseif(ENABLE_V4L2) elseif(ENABLE_V4L2)
project(v4l2-grabber) project(v4l2-grabber)
SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/video/v4l2) set(grabber_project V4L2)
FILE (GLOB SOURCES "${WRAPPER_DIR}/*.cpp" "${HEADER_DIR}/Video*.h" "${HEADER_DIR}/V4L2*.h" "${HEADER_DIR}/Encoder*.h" "${CURRENT_SOURCE_DIR}/*.cpp")
endif() endif()
add_library(${PROJECT_NAME} ${SOURCES}) add_library(${PROJECT_NAME}
target_link_libraries(${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/include/grabber/video/EncoderThread.h
hyperion ${CMAKE_SOURCE_DIR}/include/grabber/video/VideoWrapper.h
events ${CMAKE_SOURCE_DIR}/libsrc/grabber/video/EncoderThread.cpp
hyperion-utils ${CMAKE_SOURCE_DIR}/libsrc/grabber/video/VideoWrapper.cpp
${QT_LIBRARIES} ${CMAKE_SOURCE_DIR}/include/grabber/video/${${grabber_project}-grabber}/${grabber_project}Grabber.h
${CMAKE_SOURCE_DIR}/libsrc/grabber/video/${${grabber_project}-grabber}/${grabber_project}Grabber.cpp
${MediaFoundationSourceReaderCallBack}
) )
if(TURBOJPEG_FOUND) target_link_libraries(${PROJECT_NAME} hyperion)
target_link_libraries(${PROJECT_NAME} ${TurboJPEG_LIBRARY})
# Add Turbo JPEG library
if(ENABLE_V4L2 OR ENABLE_MF)
find_package(TurboJPEG)
if(TURBOJPEG_FOUND)
add_definitions(-DHAVE_TURBO_JPEG)
message(STATUS "Using Turbo JPEG library: ${TurboJPEG_LIBRARY}")
target_link_libraries(${PROJECT_NAME} ${TurboJPEG_LIBRARY})
target_include_directories(${PROJECT_NAME} PUBLIC ${TurboJPEG_INCLUDE_DIRS})
else ()
message(STATUS "Turbo JPEG library not found, MJPEG camera format won't work.")
endif()
endif() endif()

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