From 897e6f2e84e80f2109c5cb553b5fe15e7ce4ad50 Mon Sep 17 00:00:00 2001 From: cbdev Date: Sat, 25 Jul 2020 12:35:18 +0200 Subject: Output version information during normal startup --- midimonster.c | 1 + 1 file changed, 1 insertion(+) (limited to 'midimonster.c') diff --git a/midimonster.c b/midimonster.c index b418711..3cc9719 100644 --- a/midimonster.c +++ b/midimonster.c @@ -472,6 +472,7 @@ int main(int argc, char** argv){ return EXIT_FAILURE; } + version(); if(platform_initialize()){ fprintf(stderr, "Failed to perform platform-specific initialization\n"); return EXIT_FAILURE; -- cgit v1.2.3 From 70f1ca5bbb3156d9d2b90a115ba88495e5151b55 Mon Sep 17 00:00:00 2001 From: cbdev Date: Sat, 10 Oct 2020 17:30:15 +0200 Subject: Update some comments --- backends/sacn.c | 2 +- backends/visca.c | 1 + midimonster.c | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) (limited to 'midimonster.c') diff --git a/backends/sacn.c b/backends/sacn.c index 0ea7b58..e395ae2 100644 --- a/backends/sacn.c +++ b/backends/sacn.c @@ -385,7 +385,7 @@ static int sacn_set(instance* inst, size_t num, channel** c, channel_value* v){ //send packet if required if(mark){ - //find output instance data + //find output control data for the instance for(u = 0; u < global_cfg.fd[data->fd_index].universes; u++){ if(global_cfg.fd[data->fd_index].universe[u].universe == data->uni){ break; diff --git a/backends/visca.c b/backends/visca.c index 2e82515..9f398a2 100644 --- a/backends/visca.c +++ b/backends/visca.c @@ -241,6 +241,7 @@ static size_t ptz_set_relmove(instance* inst, channel* c, channel_value* v, uint } //set stored axis speed + //TODO find a way to do relative axis speed via speed_factor, without overwriting a set absolute speed msg[4] = data->panspeed; msg[5] = data->tiltspeed; diff --git a/midimonster.c b/midimonster.c index 3cc9719..3849953 100644 --- a/midimonster.c +++ b/midimonster.c @@ -4,10 +4,10 @@ #include #include #ifndef _WIN32 -#include -#define MM_API __attribute__((visibility("default"))) + #include + #define MM_API __attribute__((visibility("default"))) #else -#define MM_API __attribute__((dllexport)) + #define MM_API __attribute__((dllexport)) #endif #define BACKEND_NAME "core" #define MM_SWAP_LIMIT 20 -- cgit v1.2.3 From a743153aafffb38a6d8765d1f1c634dde51d5558 Mon Sep 17 00:00:00 2001 From: cbdev Date: Mon, 21 Jun 2021 22:15:15 +0200 Subject: Repository cleanup, part 2 --- .ci.sh | 134 ----------------------------------------- .travis.yml | 157 ------------------------------------------------- MIDIMonster.svg | 1 - Makefile | 18 +++--- TODO | 15 ----- assets/MIDIMonster.svg | 1 + assets/TODO | 15 +++++ assets/ci-config.yml | 157 +++++++++++++++++++++++++++++++++++++++++++++++++ assets/ci.sh | 134 +++++++++++++++++++++++++++++++++++++++++ assets/midimonster.1 | 42 +++++++++++++ assets/midimonster.ico | Bin 0 -> 321510 bytes assets/midimonster.rc | 22 +++++++ midimonster.1 | 42 ------------- midimonster.c | 6 +- midimonster.ico | Bin 321510 -> 0 bytes midimonster.rc | 22 ------- 16 files changed, 385 insertions(+), 381 deletions(-) delete mode 100755 .ci.sh delete mode 100644 .travis.yml delete mode 100644 MIDIMonster.svg delete mode 100644 TODO create mode 100644 assets/MIDIMonster.svg create mode 100644 assets/TODO create mode 100644 assets/ci-config.yml create mode 100755 assets/ci.sh create mode 100644 assets/midimonster.1 create mode 100644 assets/midimonster.ico create mode 100644 assets/midimonster.rc delete mode 100644 midimonster.1 delete mode 100644 midimonster.ico delete mode 100644 midimonster.rc (limited to 'midimonster.c') diff --git a/.ci.sh b/.ci.sh deleted file mode 100755 index 4a646a9..0000000 --- a/.ci.sh +++ /dev/null @@ -1,134 +0,0 @@ -#!/bin/bash - -# Check for Travis and use the provided fold method if detected -if declare -f travis_fold > /dev/null; then - ci_fold(){ - travis_fold "$1" "$2" - } -else - ci_fold(){ - printf -- "-- %s stage %s --\n" "$1" "$2" - } -fi - -if [ -z "$OS" ]; then - OS="linux" -fi - -if [ "$TASK" = "spellcheck" ]; then - result=0 - # Create list of files to be spellchecked - spellcheck_files=$(find . -type f | grep -v ".git/") - - # Run spellintian to find spelling errors - sl_results=$(xargs spellintian 2>&1 <<< "$spellcheck_files") - - sl_errors=$(wc -l <<< "$sl_results") - sl_errors_dups=$((grep "\(duplicate word\)" | wc -l) <<< "$sl_results") - sl_errors_nodups=$((grep -v "\(duplicate word\)" | wc -l) <<< "$sl_results") - - if [ "$sl_errors" -ne 0 ]; then - printf "Spellintian found %s errors (%s spelling, %s duplicate words):\n\n" "$sl_errors" "$sl_errors_nodups" "$sl_errors_dups" - printf "%s\n\n" "$sl_results" - result=1 - else - printf "Spellintian reports no errors\n" - fi - - # Run codespell to find some more - cs_results=$(xargs codespell --quiet 2 <<< "$spellcheck_files" 2>&1) - cs_errors=$(wc -l <<< "$cs_results") - if [ "$cs_errors" -ne 0 ]; then - printf "Codespell found %s errors:\n\n" "$cs_errors" - printf "%s\n\n" "$cs_results" - result=1 - else - printf "Codespell reports no errors\n" - fi - exit "$result" -elif [ "$TASK" = "codesmell" ]; then - result=0 - - if [ -z "$(which lizard)" ]; then - printf "Installing lizard...\n" - pip3 install lizard - fi - - # Run shellcheck for all shell scripts - printf "Running shellcheck...\n" - shell_files="$(find . -type f -iname \*.sh)" - xargs shellcheck -Cnever -s bash <<< "$shell_files" - if [ "$?" -ne "0" ]; then - result=1 - fi - - # Run cloc for some stats - printf "Code statistics:\n\n" - cloc ./ - - # Run lizard for the project - printf "Running lizard for code complexity analysis\n" - lizard ./ - if [ "$?" -ne "0" ]; then - result=1 - fi - - exit "$result" -elif [ "$TASK" = "sanitize" ]; then - # Run sanitized compile - ci_fold start "make_sanitize" - if ! make sanitize; then - printf "Failed to build\n" - exit 1 - fi - ci_fold end "make_sanitize" -elif [ "$TASK" = "windows" ]; then - ci_fold start "make_windows" - if ! make windows; then - printf "Failed to build\n" - exit 1 - fi - make -C backends lua.dll - ci_fold end "make_windows" - if [ "$(git describe)" == "$(git describe --abbrev=0)" ] || [ -n "$DEPLOY" ]; then - ci_fold start "deploy_windows" - mkdir ./deployment - mkdir ./deployment/backends - mkdir ./deployment/docs - # Strip the Windows binaries as they become huge quickly - strip midimonster.exe backends/*.dll - cp ./midimonster.exe ./deployment/ - cp ./backends/*.dll ./deployment/backends/ - cp ./backends/*.dll.disabled ./deployment/backends/ - cp ./monster.cfg ./deployment/monster.cfg - cp ./backends/*.md ./deployment/docs/ - cp -r ./configs ./deployment/ - cd ./deployment - zip -r "./midimonster-$(git describe)-windows.zip" "./" - find . ! -iname '*.zip' -delete - ci_fold end "deploy_windows" - fi -else - # Otherwise compile as normal - ci_fold start "make" - if ! make full; then - printf "Failed to build\n" - exit 1 - fi - ci_fold end "make" - if [ "$(git describe)" == "$(git describe --abbrev=0)" ] || [ -n "$DEPLOY" ]; then - ci_fold start "deploy_unix" - mkdir ./deployment - mkdir ./deployment/backends - mkdir ./deployment/docs - cp ./midimonster ./deployment/ - cp ./backends/*.so ./deployment/backends/ - cp ./monster.cfg ./deployment/monster.cfg - cp ./backends/*.md ./deployment/docs/ - cp -r ./configs ./deployment/ - cd ./deployment - tar czf "midimonster-$(git describe)-$OS.tgz" "./" - find . ! -iname '*.tgz' -delete - ci_fold end "deploy_unix" - fi -fi diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9fbe236..0000000 --- a/.travis.yml +++ /dev/null @@ -1,157 +0,0 @@ -language: c -group: edge -os: linux -dist: bionic - -before_script: - - export -f travis_fold - - export OS="$TRAVIS_OS_NAME" - -script: - - "bash .ci.sh" - -addons: - apt: - packages: &core_build - # This is all the bits we need to enable all options - - libasound2-dev - - libevdev-dev - - libola-dev - - libjack-jackd2-dev - - liblua5.3-dev - - python3-dev - - libssl-dev - - lintian - packages: &core_build_gpp_latest - - *core_build - - gcc-8 - - g++-8 - packages: &core_build_clang_latest - - *core_build - - clang-6.0 - packages: &core_build_windows - - *core_build - - mingw-w64 - packages: &linters - - python3 - - python3-pip - - lintian - - codespell - - shellcheck - - cloc - -jobs: - fast_finish: true - include: - - os: linux - dist: bionic - compiler: clang - env: TASK='compile' - addons: - apt: - packages: - - *core_build_clang_latest - - os: linux - dist: bionic - compiler: gcc - env: TASK='compile' - addons: - apt: - packages: - - *core_build_gpp_latest - - os: linux - dist: bionic - compiler: mingw32-gcc - env: - - TASK='windows' - - CC='x86_64-w64-mingw32-gcc' - addons: - apt: - packages: - - *core_build_windows - - os: linux - dist: bionic - compiler: clang - env: TASK='sanitize' - addons: - apt: - packages: - - *core_build_clang_latest - - os: osx - osx_image: xcode10.2 - compiler: clang - env: - - TASK='compile' - - os: osx - osx_image: xcode10.2 - compiler: clang - env: - - TASK='sanitize' - - os: linux - dist: bionic - env: TASK='codesmell' - addons: - apt: - packages: - - *linters - - os: linux - dist: bionic - env: TASK='spellcheck' - addons: - apt: - packages: - - *linters - allow_failures: - - os: linux - dist: bionic - env: TASK='codesmell' - - os: linux - dist: bionic - env: TASK='spellcheck' - -env: - global: - # No colours in terminal (to reduce log file size) - - TERM=dumb - # Parallel make build - - MAKEFLAGS="-j 4" - -cache: - apt: true - -before_install: -# Travis clones with --branch, which omits tags. Since we use them for the version string at build time, fetch them - - git pull --tags - - printf "This is %s on %s\n" "$(git describe)" "$TRAVIS_OS_NAME" - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi -# 'brew install' sometimes returns non-zero for some arcane reason. Executing 'true' resets the exit code and allows Travis to continue building... -# Travis seems to have Python 2.7 installed by default, which for some reason prevents pkg-config from reading python3.pc - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install ola lua openssl jack python3; brew link --overwrite python; true; fi -# OpenSSL is not a proper install due to some Apple bull, so provide additional locations via the environment... -# Additionally, newer versions of this "recipe" seem to use the name 'openssl@1.1' instead of plain 'openssl' and there seems to be -# no way to programmatically get the link and include paths. Genius! Hardcoding the new version for the time being... - - export CFLAGS="$CFLAGS -I/usr/local/opt/openssl@1.1/include" - - export LDFLAGS="$LDFLAGS -L/usr/local/opt/openssl@1.1/lib" -#Use the latest clang if we're compiling with clang - - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CC" = "clang" ]; then export CC="clang-6.0"; export CXX="clang-6.0"; fi -# Download libraries to link with for Windows - - if [ "$TASK" == "windows" ]; then wget "https://downloads.sourceforge.net/project/luabinaries/5.3.5/Windows%20Libraries/Dynamic/lua-5.3.5_Win64_dllw6_lib.zip" -O lua53.zip; unzip lua53.zip lua53.dll; fi - -notifications: - irc: - channels: - - "irc.hackint.org#midimonster" - on_success: change # default: always - on_failure: always # default: always - nick: mm_ci - use_notice: true - -deploy: - provider: releases - file_glob: true - token: $GITHUB_TOKEN - file: ./deployment/* - skip_cleanup: true - draft: true - on: - tags: true diff --git a/MIDIMonster.svg b/MIDIMonster.svg deleted file mode 100644 index 7e411dc..0000000 --- a/MIDIMonster.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 3 \ No newline at end of file diff --git a/Makefile b/Makefile index 9b95f1b..50fc73e 100644 --- a/Makefile +++ b/Makefile @@ -11,14 +11,18 @@ GITVERSION = $(shell git describe) CFLAGS ?= -g -Wall -Wpedantic #CFLAGS += -DDEBUG # Hide all non-API symbols for export -CFLAGS += -fvisibility=hidden -I./ +CFLAGS += -fvisibility=hidden + +# Subdirectory objects need the include path +RCCFLAGS += -I./ +CFLAGS += -I./ midimonster: LDLIBS = -ldl # Replace version string with current git-describe if possible ifneq "$(GITVERSION)" "" midimonster: CFLAGS += -DMIDIMONSTER_VERSION=\"$(GITVERSION)\" midimonster.exe: CFLAGS += -DMIDIMONSTER_VERSION=\"$(GITVERSION)\" -resource.o: RCCFLAGS += -DMIDIMONSTER_VERSION=\\\"$(GITVERSION)\\\" +assets/resource.o: RCCFLAGS += -DMIDIMONSTER_VERSION=\\\"$(GITVERSION)\\\" endif # Work around strange linker passing convention differences in Linux and OSX @@ -55,10 +59,10 @@ backends-full: midimonster: midimonster.c portability.h $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) $< $(OBJS) $(LDLIBS) -o $@ -resource.o: midimonster.rc midimonster.ico +assets/resource.o: assets/midimonster.rc assets/midimonster.ico $(RCC) $(RCCFLAGS) $< -o $@ --output-format=coff -midimonster.ico: MIDIMonster.svg +assets/midimonster.ico: assets/MIDIMonster.svg convert -density 384 $< -define icon:auto-resize $@ midimonster.exe: export CC = x86_64-w64-mingw32-gcc @@ -66,14 +70,14 @@ midimonster.exe: RCC ?= x86_64-w64-mingw32-windres midimonster.exe: CFLAGS += -Wno-format midimonster.exe: LDLIBS = -lws2_32 midimonster.exe: LDFLAGS += -Wl,--out-implib,libmmapi.a -midimonster.exe: midimonster.c portability.h $(OBJS) resource.o - $(CC) $(CFLAGS) $(LDFLAGS) $< $(OBJS) resource.o $(LDLIBS) -o $@ +midimonster.exe: midimonster.c portability.h $(OBJS) assets/resource.o + $(CC) $(CFLAGS) $(LDFLAGS) $< $(OBJS) assets/resource.o $(LDLIBS) -o $@ clean: $(RM) midimonster $(RM) midimonster.exe $(RM) libmmapi.a - $(RM) resource.o + $(RM) assets/resource.o $(RM) $(OBJS) $(MAKE) -C backends clean diff --git a/TODO b/TODO deleted file mode 100644 index 9158e24..0000000 --- a/TODO +++ /dev/null @@ -1,15 +0,0 @@ -keepalive channels per backend? -Note source in channel value struct -udp backends may ignore MTU -make event collectors threadsafe to stop marshalling data... -collect & check backend API version -move all connection establishment to _start to be able to hot-stop/start all backends -event deduplication in core? -move all typenames to _t - -per-channel filters - * invert - * edge detection - -channel discovery / enumeration -note exit condition/reconnection details for backends diff --git a/assets/MIDIMonster.svg b/assets/MIDIMonster.svg new file mode 100644 index 0000000..7e411dc --- /dev/null +++ b/assets/MIDIMonster.svg @@ -0,0 +1 @@ +Asset 3 \ No newline at end of file diff --git a/assets/TODO b/assets/TODO new file mode 100644 index 0000000..9158e24 --- /dev/null +++ b/assets/TODO @@ -0,0 +1,15 @@ +keepalive channels per backend? +Note source in channel value struct +udp backends may ignore MTU +make event collectors threadsafe to stop marshalling data... +collect & check backend API version +move all connection establishment to _start to be able to hot-stop/start all backends +event deduplication in core? +move all typenames to _t + +per-channel filters + * invert + * edge detection + +channel discovery / enumeration +note exit condition/reconnection details for backends diff --git a/assets/ci-config.yml b/assets/ci-config.yml new file mode 100644 index 0000000..9fbe236 --- /dev/null +++ b/assets/ci-config.yml @@ -0,0 +1,157 @@ +language: c +group: edge +os: linux +dist: bionic + +before_script: + - export -f travis_fold + - export OS="$TRAVIS_OS_NAME" + +script: + - "bash .ci.sh" + +addons: + apt: + packages: &core_build + # This is all the bits we need to enable all options + - libasound2-dev + - libevdev-dev + - libola-dev + - libjack-jackd2-dev + - liblua5.3-dev + - python3-dev + - libssl-dev + - lintian + packages: &core_build_gpp_latest + - *core_build + - gcc-8 + - g++-8 + packages: &core_build_clang_latest + - *core_build + - clang-6.0 + packages: &core_build_windows + - *core_build + - mingw-w64 + packages: &linters + - python3 + - python3-pip + - lintian + - codespell + - shellcheck + - cloc + +jobs: + fast_finish: true + include: + - os: linux + dist: bionic + compiler: clang + env: TASK='compile' + addons: + apt: + packages: + - *core_build_clang_latest + - os: linux + dist: bionic + compiler: gcc + env: TASK='compile' + addons: + apt: + packages: + - *core_build_gpp_latest + - os: linux + dist: bionic + compiler: mingw32-gcc + env: + - TASK='windows' + - CC='x86_64-w64-mingw32-gcc' + addons: + apt: + packages: + - *core_build_windows + - os: linux + dist: bionic + compiler: clang + env: TASK='sanitize' + addons: + apt: + packages: + - *core_build_clang_latest + - os: osx + osx_image: xcode10.2 + compiler: clang + env: + - TASK='compile' + - os: osx + osx_image: xcode10.2 + compiler: clang + env: + - TASK='sanitize' + - os: linux + dist: bionic + env: TASK='codesmell' + addons: + apt: + packages: + - *linters + - os: linux + dist: bionic + env: TASK='spellcheck' + addons: + apt: + packages: + - *linters + allow_failures: + - os: linux + dist: bionic + env: TASK='codesmell' + - os: linux + dist: bionic + env: TASK='spellcheck' + +env: + global: + # No colours in terminal (to reduce log file size) + - TERM=dumb + # Parallel make build + - MAKEFLAGS="-j 4" + +cache: + apt: true + +before_install: +# Travis clones with --branch, which omits tags. Since we use them for the version string at build time, fetch them + - git pull --tags + - printf "This is %s on %s\n" "$(git describe)" "$TRAVIS_OS_NAME" + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi +# 'brew install' sometimes returns non-zero for some arcane reason. Executing 'true' resets the exit code and allows Travis to continue building... +# Travis seems to have Python 2.7 installed by default, which for some reason prevents pkg-config from reading python3.pc + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install ola lua openssl jack python3; brew link --overwrite python; true; fi +# OpenSSL is not a proper install due to some Apple bull, so provide additional locations via the environment... +# Additionally, newer versions of this "recipe" seem to use the name 'openssl@1.1' instead of plain 'openssl' and there seems to be +# no way to programmatically get the link and include paths. Genius! Hardcoding the new version for the time being... + - export CFLAGS="$CFLAGS -I/usr/local/opt/openssl@1.1/include" + - export LDFLAGS="$LDFLAGS -L/usr/local/opt/openssl@1.1/lib" +#Use the latest clang if we're compiling with clang + - if [ "$TRAVIS_OS_NAME" == "linux" -a "$CC" = "clang" ]; then export CC="clang-6.0"; export CXX="clang-6.0"; fi +# Download libraries to link with for Windows + - if [ "$TASK" == "windows" ]; then wget "https://downloads.sourceforge.net/project/luabinaries/5.3.5/Windows%20Libraries/Dynamic/lua-5.3.5_Win64_dllw6_lib.zip" -O lua53.zip; unzip lua53.zip lua53.dll; fi + +notifications: + irc: + channels: + - "irc.hackint.org#midimonster" + on_success: change # default: always + on_failure: always # default: always + nick: mm_ci + use_notice: true + +deploy: + provider: releases + file_glob: true + token: $GITHUB_TOKEN + file: ./deployment/* + skip_cleanup: true + draft: true + on: + tags: true diff --git a/assets/ci.sh b/assets/ci.sh new file mode 100755 index 0000000..4a646a9 --- /dev/null +++ b/assets/ci.sh @@ -0,0 +1,134 @@ +#!/bin/bash + +# Check for Travis and use the provided fold method if detected +if declare -f travis_fold > /dev/null; then + ci_fold(){ + travis_fold "$1" "$2" + } +else + ci_fold(){ + printf -- "-- %s stage %s --\n" "$1" "$2" + } +fi + +if [ -z "$OS" ]; then + OS="linux" +fi + +if [ "$TASK" = "spellcheck" ]; then + result=0 + # Create list of files to be spellchecked + spellcheck_files=$(find . -type f | grep -v ".git/") + + # Run spellintian to find spelling errors + sl_results=$(xargs spellintian 2>&1 <<< "$spellcheck_files") + + sl_errors=$(wc -l <<< "$sl_results") + sl_errors_dups=$((grep "\(duplicate word\)" | wc -l) <<< "$sl_results") + sl_errors_nodups=$((grep -v "\(duplicate word\)" | wc -l) <<< "$sl_results") + + if [ "$sl_errors" -ne 0 ]; then + printf "Spellintian found %s errors (%s spelling, %s duplicate words):\n\n" "$sl_errors" "$sl_errors_nodups" "$sl_errors_dups" + printf "%s\n\n" "$sl_results" + result=1 + else + printf "Spellintian reports no errors\n" + fi + + # Run codespell to find some more + cs_results=$(xargs codespell --quiet 2 <<< "$spellcheck_files" 2>&1) + cs_errors=$(wc -l <<< "$cs_results") + if [ "$cs_errors" -ne 0 ]; then + printf "Codespell found %s errors:\n\n" "$cs_errors" + printf "%s\n\n" "$cs_results" + result=1 + else + printf "Codespell reports no errors\n" + fi + exit "$result" +elif [ "$TASK" = "codesmell" ]; then + result=0 + + if [ -z "$(which lizard)" ]; then + printf "Installing lizard...\n" + pip3 install lizard + fi + + # Run shellcheck for all shell scripts + printf "Running shellcheck...\n" + shell_files="$(find . -type f -iname \*.sh)" + xargs shellcheck -Cnever -s bash <<< "$shell_files" + if [ "$?" -ne "0" ]; then + result=1 + fi + + # Run cloc for some stats + printf "Code statistics:\n\n" + cloc ./ + + # Run lizard for the project + printf "Running lizard for code complexity analysis\n" + lizard ./ + if [ "$?" -ne "0" ]; then + result=1 + fi + + exit "$result" +elif [ "$TASK" = "sanitize" ]; then + # Run sanitized compile + ci_fold start "make_sanitize" + if ! make sanitize; then + printf "Failed to build\n" + exit 1 + fi + ci_fold end "make_sanitize" +elif [ "$TASK" = "windows" ]; then + ci_fold start "make_windows" + if ! make windows; then + printf "Failed to build\n" + exit 1 + fi + make -C backends lua.dll + ci_fold end "make_windows" + if [ "$(git describe)" == "$(git describe --abbrev=0)" ] || [ -n "$DEPLOY" ]; then + ci_fold start "deploy_windows" + mkdir ./deployment + mkdir ./deployment/backends + mkdir ./deployment/docs + # Strip the Windows binaries as they become huge quickly + strip midimonster.exe backends/*.dll + cp ./midimonster.exe ./deployment/ + cp ./backends/*.dll ./deployment/backends/ + cp ./backends/*.dll.disabled ./deployment/backends/ + cp ./monster.cfg ./deployment/monster.cfg + cp ./backends/*.md ./deployment/docs/ + cp -r ./configs ./deployment/ + cd ./deployment + zip -r "./midimonster-$(git describe)-windows.zip" "./" + find . ! -iname '*.zip' -delete + ci_fold end "deploy_windows" + fi +else + # Otherwise compile as normal + ci_fold start "make" + if ! make full; then + printf "Failed to build\n" + exit 1 + fi + ci_fold end "make" + if [ "$(git describe)" == "$(git describe --abbrev=0)" ] || [ -n "$DEPLOY" ]; then + ci_fold start "deploy_unix" + mkdir ./deployment + mkdir ./deployment/backends + mkdir ./deployment/docs + cp ./midimonster ./deployment/ + cp ./backends/*.so ./deployment/backends/ + cp ./monster.cfg ./deployment/monster.cfg + cp ./backends/*.md ./deployment/docs/ + cp -r ./configs ./deployment/ + cd ./deployment + tar czf "midimonster-$(git describe)-$OS.tgz" "./" + find . ! -iname '*.tgz' -delete + ci_fold end "deploy_unix" + fi +fi diff --git a/assets/midimonster.1 b/assets/midimonster.1 new file mode 100644 index 0000000..44c414e --- /dev/null +++ b/assets/midimonster.1 @@ -0,0 +1,42 @@ +.TH MIDIMONSTER 1 "December 2019" +.SH NAME +midimonster \- Multi-protocol translation tool +.SH SYNOPSIS +.B midimonster +.I config-file +.RB [ "-i" +.IR instance.option=value ] +.RB [ "-b" +.IR backend.option=value ] + +.B midimonster -v +.SH DESCRIPTION +.B MIDIMonster +allows the user to translate any channel on one supported protocol into channel(s) +on any other (or the same) supported protocol. +.SH OPTIONS +.TP +.I config-file +The configuration file to read. If not specified, a default configuration file is read. + +.TP +.BI "-i " instance.option=value +Supply an additional instance configuration option +.IR option " for " instance "." +Command-line overrides are applied when the instance is first mentioned in the configuration file. + +.TP +.BI "-b " backend.option=value +Supply an additional backend configuration option +.IR option " to " backend "." +Command-line overrides are applied when the backend is first mentioned in the configuration file. + +.B -v +Display version information +.SH "SEE ALSO" +Online documentation and repository at https://github.com/cbdevnet/midimonster + +For more and in-depth information see the homepage at https://midimonster.net/ +as well as the knowledge base at https://kb.midimonster.net/ +.SH AUTHOR +Fabian "cbdev" Stumpf diff --git a/assets/midimonster.ico b/assets/midimonster.ico new file mode 100644 index 0000000..9391160 Binary files /dev/null and b/assets/midimonster.ico differ diff --git a/assets/midimonster.rc b/assets/midimonster.rc new file mode 100644 index 0000000..45a88aa --- /dev/null +++ b/assets/midimonster.rc @@ -0,0 +1,22 @@ +#include "midimonster.h" + +0 ICON "midimonster.ico" +1 VERSIONINFO +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "control8r" + VALUE "FileDescription", "MIDIMonster" + VALUE "InternalName", "MIDIMonster Core (Windows Build)" + VALUE "FileVersion", MIDIMONSTER_VERSION + VALUE "OriginalFilename", "midimonster.exe" + VALUE "ProductName", "MIDIMonster" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/midimonster.1 b/midimonster.1 deleted file mode 100644 index 44c414e..0000000 --- a/midimonster.1 +++ /dev/null @@ -1,42 +0,0 @@ -.TH MIDIMONSTER 1 "December 2019" -.SH NAME -midimonster \- Multi-protocol translation tool -.SH SYNOPSIS -.B midimonster -.I config-file -.RB [ "-i" -.IR instance.option=value ] -.RB [ "-b" -.IR backend.option=value ] - -.B midimonster -v -.SH DESCRIPTION -.B MIDIMonster -allows the user to translate any channel on one supported protocol into channel(s) -on any other (or the same) supported protocol. -.SH OPTIONS -.TP -.I config-file -The configuration file to read. If not specified, a default configuration file is read. - -.TP -.BI "-i " instance.option=value -Supply an additional instance configuration option -.IR option " for " instance "." -Command-line overrides are applied when the instance is first mentioned in the configuration file. - -.TP -.BI "-b " backend.option=value -Supply an additional backend configuration option -.IR option " to " backend "." -Command-line overrides are applied when the backend is first mentioned in the configuration file. - -.B -v -Display version information -.SH "SEE ALSO" -Online documentation and repository at https://github.com/cbdevnet/midimonster - -For more and in-depth information see the homepage at https://midimonster.net/ -as well as the knowledge base at https://kb.midimonster.net/ -.SH AUTHOR -Fabian "cbdev" Stumpf diff --git a/midimonster.c b/midimonster.c index 3849953..51fe7ad 100644 --- a/midimonster.c +++ b/midimonster.c @@ -12,9 +12,9 @@ #define BACKEND_NAME "core" #define MM_SWAP_LIMIT 20 #include "midimonster.h" -#include "config.h" -#include "backend.h" -#include "plugin.h" +#include "core/config.h" +#include "core/backend.h" +#include "core/plugin.h" /* Core-internal structures */ typedef struct /*_event_collection*/ { diff --git a/midimonster.ico b/midimonster.ico deleted file mode 100644 index 9391160..0000000 Binary files a/midimonster.ico and /dev/null differ diff --git a/midimonster.rc b/midimonster.rc deleted file mode 100644 index 45a88aa..0000000 --- a/midimonster.rc +++ /dev/null @@ -1,22 +0,0 @@ -#include "midimonster.h" - -0 ICON "midimonster.ico" -1 VERSIONINFO -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "control8r" - VALUE "FileDescription", "MIDIMonster" - VALUE "InternalName", "MIDIMonster Core (Windows Build)" - VALUE "FileVersion", MIDIMONSTER_VERSION - VALUE "OriginalFilename", "midimonster.exe" - VALUE "ProductName", "MIDIMonster" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0409, 1252 - END -END -- cgit v1.2.3 From ca055614db57386f0e43d65bb10e501bdde699ef Mon Sep 17 00:00:00 2001 From: cbdev Date: Tue, 22 Jun 2021 03:29:08 +0200 Subject: Keep channel registry map in sync when updating identifiers (#76) --- backends/maweb.c | 2 +- core/backend.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- core/backend.h | 1 + midimonster.c | 4 ++-- midimonster.h | 25 ++++++++++++++++++++----- 5 files changed, 69 insertions(+), 10 deletions(-) (limited to 'midimonster.c') diff --git a/backends/maweb.c b/backends/maweb.c index 39ef7a6..8b878b0 100644 --- a/backends/maweb.c +++ b/backends/maweb.c @@ -1111,7 +1111,7 @@ static int maweb_start(size_t n, instance** inst){ //re-set channel identifiers for(p = 0; p < data->channels; p++){ - data->channel[p].chan->ident = p; + mm_channel_update(data->channel[p].chan, p); } //try to connect to any available host diff --git a/core/backend.c b/core/backend.c index 16e095c..8a8588f 100644 --- a/core/backend.c +++ b/core/backend.c @@ -94,9 +94,9 @@ int backends_notify(size_t nev, channel** c, channel_value* v){ MM_API channel* mm_channel(instance* inst, uint64_t ident, uint8_t create){ size_t u, bucket = channelstore_hash(inst, ident); - DBGPF("\tSearching for inst %" PRIu64 " ident %" PRIu64, inst, ident); + DBGPF("\tSearching for inst %" PRIu64 " ident %" PRIu64, (uint64_t) inst, ident); for(u = 0; u < channels.n[bucket]; u++){ - DBGPF("\tBucket %" PRIsize_t " entry %" PRIsize_t " inst %" PRIu64 " ident %" PRIu64, bucket, u, channels.entry[bucket][u]->instance, channels.entry[bucket][u]->ident); + DBGPF("\tBucket %" PRIsize_t " entry %" PRIsize_t " inst %" PRIu64 " ident %" PRIu64, bucket, u, (uint64_t) channels.entry[bucket][u]->instance, channels.entry[bucket][u]->ident); if(channels.entry[bucket][u]->instance == inst && channels.entry[bucket][u]->ident == ident){ DBGPF("Requested channel %" PRIu64 " on instance %s already exists, reusing (bucket %" PRIsize_t ", %" PRIsize_t " search steps)\n", ident, inst->name, bucket, u); @@ -128,6 +128,49 @@ MM_API channel* mm_channel(instance* inst, uint64_t ident, uint8_t create){ return channels.entry[bucket][(channels.n[bucket]++)]; } +MM_API void mm_channel_update(channel* chan, uint64_t ident){ + size_t bucket = channelstore_hash(chan->instance, chan->ident), new_bucket = channelstore_hash(chan->instance, ident); + size_t u; + + DBGPF("Updating identifier for inst %" PRIu64 " ident %" PRIu64 " (bucket %" PRIsize_t " to %" PRIsize_t ") to %" PRIu64, (uint64_t) chan->instance, chan->ident, bucket, new_bucket, ident); + + if(bucket == new_bucket){ + chan->ident = ident; + return; + } + + for(u = 0; u < channels.n[bucket]; u++){ + if(channels.entry[bucket][u]->instance == chan->instance + && channels.entry[bucket][u]->ident == chan->ident){ + break; + } + } + + if(u == channels.n[bucket]){ + DBGPF("Failed to find channel to update in bucket %" PRIsize_t, bucket); + return; + } + + DBGPF("Removing channel from slot %" PRIsize_t " of %" PRIsize_t " of bucket %" PRIsize_t, u, channels.n[bucket], bucket); + //remove channel from old bucket + for(; u < channels.n[bucket] - 1; u++){ + channels.entry[bucket][u] = channels.entry[bucket][u + 1]; + } + + //add to new bucket + channels.entry[new_bucket] = realloc(channels.entry[new_bucket], (channels.n[new_bucket] + 1) * sizeof(channel*)); + if(!channels.entry[new_bucket]){ + fprintf(stderr, "Failed to allocate memory\n"); + channels.n[new_bucket] = 0; + return; + } + + channels.entry[new_bucket][channels.n[new_bucket]] = chan; + chan->ident = ident; + channels.n[bucket]--; + channels.n[new_bucket]++; +} + instance* mm_instance(backend* b){ size_t u = 0, n = 0; diff --git a/core/backend.h b/core/backend.h index 6a69508..46c6c3a 100644 --- a/core/backend.h +++ b/core/backend.h @@ -12,6 +12,7 @@ instance* mm_instance(backend* b); /* Backend API */ MM_API channel* mm_channel(instance* inst, uint64_t ident, uint8_t create); +MM_API void mm_channel_update(channel* chan, uint64_t ident); MM_API instance* mm_instance_find(char* name, uint64_t ident); MM_API int mm_backend_instances(char* name, size_t* ninst, instance*** inst); MM_API int mm_backend_register(backend b); diff --git a/midimonster.c b/midimonster.c index 51fe7ad..5817ac7 100644 --- a/midimonster.c +++ b/midimonster.c @@ -346,7 +346,7 @@ static int core_process(size_t nfds, managed_fd* signaled_fds){ size_t u, swaps = 0; //run backend processing, collect events - DBGPF("%lu backend FDs signaled\n", nfds); + DBGPF("%lu backend FDs signaled", nfds); if(backends_handle(nfds, signaled_fds)){ return 1; } @@ -354,7 +354,7 @@ static int core_process(size_t nfds, managed_fd* signaled_fds){ //limit number of collector swaps per iteration to prevent complete deadlock while(routing.events->n && swaps < MM_SWAP_LIMIT){ //swap primary and secondary event collectors - DBGPF("Swapping event collectors, %lu events in primary\n", routing.events->n); + DBGPF("Swapping event collectors, %lu events in primary", routing.events->n); for(u = 0; u < sizeof(routing.pool) / sizeof(routing.pool[0]); u++){ if(routing.events != routing.pool + u){ secondary = routing.events; diff --git a/midimonster.h b/midimonster.h index 9552b7e..89688c4 100644 --- a/midimonster.h +++ b/midimonster.h @@ -227,15 +227,21 @@ MM_API int mm_backend_register(backend b); MM_API instance* mm_instance_find(char* backend, uint64_t ident); /* - * Provides a pointer to a channel structure, pre-filled with the provided - * instance reference and identifier. + * This function is the main interface to the core-provided channel registry. + * This API is just a convenience function. Creating and managing a + * backend-internal channel store is possible (and encouraged for performance + * reasons). + * + * Channels are identified by the (instance, ident) tuple within the registry. + * + * This API provides a pointer to a channel structure, pre-filled with the + * provided instance reference and identifier. * The `create` parameter is a boolean flag indicating whether a channel * matching the `ident` parameter should be created in the global channel store * if none exists yet. If the instance already registered a channel matching * `ident`, a pointer to the existing channel is returned. - * This API is just a convenience function. Creating and managing a - * backend-internal channel store is possible (and encouraged for performance - * reasons). When returning pointers from a backend-local channel store, the + * + * When returning pointers from a backend-local channel store, the * returned pointers must stay valid over the lifetime of the instance and * provide valid `instance` members, as they are used for callbacks. * For each channel with a non-NULL `impl` field registered using @@ -244,6 +250,15 @@ MM_API instance* mm_instance_find(char* backend, uint64_t ident); */ MM_API channel* mm_channel(instance* i, uint64_t ident, uint8_t create); +/* + * When using the core-provided channel registry, the identification + * member of the structure must only be updated using this API. + * The tuple of (instance, ident) is used as key to the backing + * storage of the channel registry, thus the registry must be notified + * of changes. + */ +MM_API void mm_channel_update(channel* c, uint64_t ident); + /* * Register (manage = 1) or unregister (manage = 0) a file descriptor to be * selected on. The backend will be notified when the descriptor becomes ready -- cgit v1.2.3 From 933ca8e600e9f481080ee42a4f77a376c7038b14 Mon Sep 17 00:00:00 2001 From: cbdev Date: Sat, 26 Jun 2021 18:36:12 +0200 Subject: Update debug messages --- core/backend.c | 10 +++++----- midimonster.c | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'midimonster.c') diff --git a/core/backend.c b/core/backend.c index 8a8588f..83121bd 100644 --- a/core/backend.c +++ b/core/backend.c @@ -51,7 +51,7 @@ int backends_handle(size_t nfds, managed_fd* fds){ //handle if there is data ready or the backend has active instances for polling if(n || registry.instances[u]){ - DBGPF("Notifying backend %s of %" PRIsize_t " waiting FDs\n", registry.backends[u].name, n); + DBGPF("Notifying backend %s of %" PRIsize_t " waiting FDs", registry.backends[u].name, n); rv |= registry.backends[u].process(n, fds); if(rv){ fprintf(stderr, "Backend %s failed to handle input\n", registry.backends[u].name); @@ -85,7 +85,7 @@ int backends_notify(size_t nev, channel** c, channel_value* v){ } //TODO eliminate duplicates - DBGPF("Calling handler for instance %s with %" PRIsize_t " events\n", c[u]->instance->name, n - u); + DBGPF("Calling handler for instance %s with %" PRIsize_t " events", c[u]->instance->name, n - u); rv |= c[u]->instance->backend->handle(c[u]->instance, n - u, c + u, v + u); } @@ -105,11 +105,11 @@ MM_API channel* mm_channel(instance* inst, uint64_t ident, uint8_t create){ } if(!create){ - DBGPF("Requested unknown channel %" PRIu64 " (bucket %" PRIsize_t ") on instance %s\n", ident, bucket, inst->name); + DBGPF("Requested unknown channel %" PRIu64 " (bucket %" PRIsize_t ") on instance %s", ident, bucket, inst->name); return NULL; } - DBGPF("Creating previously unknown channel %" PRIu64 " on instance %s, bucket %" PRIsize_t "\n", ident, inst->name, bucket); + DBGPF("Creating previously unknown channel %" PRIu64 " on instance %s, bucket %" PRIsize_t, ident, inst->name, bucket); channels.entry[bucket] = realloc(channels.entry[bucket], (channels.n[bucket] + 1) * sizeof(channel*)); if(!channels.entry[bucket]){ fprintf(stderr, "Failed to allocate memory\n"); @@ -353,7 +353,7 @@ static void channels_free(){ for(u = 0; u < sizeof(channels.n) / sizeof(channels.n[0]); u++){ DBGPF("Cleaning up channel registry bucket %" PRIsize_t " with %" PRIsize_t " channels", u, channels.n[u]); for(p = 0; p < channels.n[u]; p++){ - DBGPF("Destroying channel %" PRIu64 " on instance %s\n", channels.entry[u][p]->ident, channels.entry[u][p]->instance->name); + DBGPF("Destroying channel %" PRIu64 " on instance %s", channels.entry[u][p]->ident, channels.entry[u][p]->instance->name); //call the channel_free function if the backend supports it if(channels.entry[u][p]->impl && channels.entry[u][p]->instance->backend->channel_free){ channels.entry[u][p]->instance->backend->channel_free(channels.entry[u][p]); diff --git a/midimonster.c b/midimonster.c index 5817ac7..b73eeff 100644 --- a/midimonster.c +++ b/midimonster.c @@ -263,7 +263,7 @@ static fd_set fds_collect(int* max_fd){ *max_fd = -1; } - DBGPF("Building selector set from %lu FDs registered to core\n", fds); + DBGPF("Building selector set from %" PRIsize_t " FDs registered to core", fds); FD_ZERO(&rv_fds); for(u = 0; u < fds; u++){ if(fd[u].fd >= 0){ @@ -346,7 +346,7 @@ static int core_process(size_t nfds, managed_fd* signaled_fds){ size_t u, swaps = 0; //run backend processing, collect events - DBGPF("%lu backend FDs signaled", nfds); + DBGPF("%" PRIsize_t " backend FDs signaled", nfds); if(backends_handle(nfds, signaled_fds)){ return 1; } @@ -354,7 +354,7 @@ static int core_process(size_t nfds, managed_fd* signaled_fds){ //limit number of collector swaps per iteration to prevent complete deadlock while(routing.events->n && swaps < MM_SWAP_LIMIT){ //swap primary and secondary event collectors - DBGPF("Swapping event collectors, %lu events in primary", routing.events->n); + DBGPF("Swapping event collectors, %" PRIsize_t " events in primary", routing.events->n); for(u = 0; u < sizeof(routing.pool) / sizeof(routing.pool[0]); u++){ if(routing.events != routing.pool + u){ secondary = routing.events; -- cgit v1.2.3