From 4de8c66a03f66c0697575a56bf3dfb1b13d9a727 Mon Sep 17 00:00:00 2001 From: PoliEcho Date: Sun, 8 Dec 2024 15:32:54 +0100 Subject: [PATCH] refactoring --- Makefile | 39 ++++++++++++- build.sh | 4 ++ secret.h | 0 src/alsa.cpp | 115 +++++++++++++++++++++++++++++++++++++++ src/alsa.h | 4 ++ src/helper_funcs.cpp | 10 ++++ src/helper_funcs.h | 1 + main.cpp => src/main.cpp | 62 ++------------------- src/main.h | 1 + src/secret.h | 1 + 10 files changed, 177 insertions(+), 60 deletions(-) create mode 100755 build.sh delete mode 100644 secret.h create mode 100644 src/alsa.cpp create mode 100644 src/alsa.h create mode 100644 src/helper_funcs.cpp create mode 100644 src/helper_funcs.h rename main.cpp => src/main.cpp (64%) create mode 100644 src/main.h create mode 100644 src/secret.h diff --git a/Makefile b/Makefile index fcd9b1a..a33963b 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,37 @@ -all: - g++ main.cpp -lasound -g -o TabletPcControl-server \ No newline at end of file +# Compiler and flags +CPPC = g++ +CPPC_FLAGS = -s -O3 -lasound -Wall -Wextra +# Debug flags: +# CPPC_FLAGS = -ggdb -lncurses -lcurl -lmenu -lpanel -Wall -Wextra + + +SRC_PATH := src +OBJ_PATH := build/obj +BIN_PATH := build/bin + + +SRC_FILES := $(shell find $(SRC_PATH) -name '*.cpp') +# Generate corresponding object file paths by replacing src/ with build/obj/ +OBJ_FILES := $(patsubst $(SRC_PATH)/%.cpp,$(OBJ_PATH)/%.o,$(SRC_FILES)) + + +all: make-build-dir $(BIN_PATH)/TabletPcControl-server + + +make-build-dir: + mkdir -p $(OBJ_PATH) + mkdir -p $(BIN_PATH) + + +$(BIN_PATH)/TabletPcControl-server: $(OBJ_FILES) + $(CPPC) $(CPPC_FLAGS) $^ -o $@ + + +$(OBJ_PATH)/%.o: $(SRC_PATH)/%.cpp + $(CPPC) $(CPPC_FLAGS) -c $< -o $@ + + +clean: + rm -fr build + +.PHONY: all clean diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..577c4c7 --- /dev/null +++ b/build.sh @@ -0,0 +1,4 @@ +#!/bin/bash +read -p "enter secret password: " SECRET +echo "#define SECRET \"$SECRET\"" > src/secret.h +make -j$(nproc) \ No newline at end of file diff --git a/secret.h b/secret.h deleted file mode 100644 index e69de29..0000000 diff --git a/src/alsa.cpp b/src/alsa.cpp new file mode 100644 index 0000000..a9da70a --- /dev/null +++ b/src/alsa.cpp @@ -0,0 +1,115 @@ +#include "helper_funcs.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace alsa { +int get_volume(const char *selem_name) { + long min, max, volume; + snd_mixer_t *handle; + snd_mixer_selem_id_t *sid; + + // Open mixer + snd_mixer_open(&handle, 0); + snd_mixer_attach(handle, + "default"); // Use "default" for the default sound card + snd_mixer_selem_register(handle, NULL, NULL); + snd_mixer_load(handle); + + // Allocate and set mixer element ID + snd_mixer_selem_id_alloca(&sid); + snd_mixer_selem_id_set_name(sid, selem_name); + + // Find the mixer element + snd_mixer_elem_t *elem = snd_mixer_find_selem(handle, sid); + + int volume_percent; + if (elem) { + // Get the playback volume range + snd_mixer_selem_get_playback_volume_range(elem, &min, &max); + + // Get the current playback volume for front left channel + snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, + &volume); + + // Calculate the volume percentage + volume_percent = (volume - min) * 100 / (max - min); + + } else { + std::cerr << "Mixer element not found\n"; + snd_mixer_close(handle); + safe_exit(ENODEV); + } + + // Clean up + snd_mixer_close(handle); + return volume_percent; +} + +void set_volume(const char *selem_name, long volume_percent) { + long min, max; + snd_mixer_t *handle; + snd_mixer_selem_id_t *sid; + + // Open mixer + snd_mixer_open(&handle, 0); + snd_mixer_attach(handle, "default"); // Use "default" instead of hw:0 + snd_mixer_selem_register(handle, NULL, NULL); + snd_mixer_load(handle); + + // Allocate and set mixer element ID + snd_mixer_selem_id_alloca(&sid); + snd_mixer_selem_id_set_name(sid, selem_name); + + // Find the mixer element + snd_mixer_elem_t *elem = snd_mixer_find_selem(handle, sid); + + if (elem) { + // Get the playback volume range + snd_mixer_selem_get_playback_volume_range(elem, &min, &max); + + // Calculate the new volume value + long volume = min + (volume_percent * (max - min) / 100); + + // Set the playback volume + snd_mixer_selem_set_playback_volume_all(elem, volume); + printf("Volume set to %ld%%\n", volume_percent); + } else { + fprintf(stderr, "Mixer element not found\n"); + } + + // Clean up + snd_mixer_close(handle); +} + +int main(int argc, char *argv[]) { + if (argc != 3) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *selem_name = argv[1]; + long volume_percent = atol(argv[2]); + + set_volume(selem_name, volume_percent); + + return 0; +} +} // namespace alsa \ No newline at end of file diff --git a/src/alsa.h b/src/alsa.h new file mode 100644 index 0000000..d200a84 --- /dev/null +++ b/src/alsa.h @@ -0,0 +1,4 @@ +namespace alsa { +int get_volume(const char *selem_name); +void set_volume(const char *selem_name, long volume_percent); +} // namespace alsa \ No newline at end of file diff --git a/src/helper_funcs.cpp b/src/helper_funcs.cpp new file mode 100644 index 0000000..64841b2 --- /dev/null +++ b/src/helper_funcs.cpp @@ -0,0 +1,10 @@ +#include "main.h" +#include +#include +void safe_exit(int code) { + + std::clog << "Exiting\n"; + + close(serverSocket); + exit(code); +} \ No newline at end of file diff --git a/src/helper_funcs.h b/src/helper_funcs.h new file mode 100644 index 0000000..aa0e692 --- /dev/null +++ b/src/helper_funcs.h @@ -0,0 +1 @@ +void safe_exit(int code); \ No newline at end of file diff --git a/main.cpp b/src/main.cpp similarity index 64% rename from main.cpp rename to src/main.cpp index 7cef0cb..3dd0b8d 100644 --- a/main.cpp +++ b/src/main.cpp @@ -1,25 +1,21 @@ +#include "alsa.h" +#include "helper_funcs.h" #include "secret.h" #include #include -#include #include -#include #include #include #include #include #include -#include #include -#include #include #include #include -#include #include #include #include -#include #include #include #include @@ -31,56 +27,6 @@ int serverSocket; -void safe_exit(int code) { - - std::clog << "Exiting\n"; - - close(serverSocket); - exit(code); -} - -int get_volume(const char *selem_name) { - long min, max, volume; - snd_mixer_t *handle; - snd_mixer_selem_id_t *sid; - - // Open mixer - snd_mixer_open(&handle, 0); - snd_mixer_attach(handle, - "default"); // Use "default" for the default sound card - snd_mixer_selem_register(handle, NULL, NULL); - snd_mixer_load(handle); - - // Allocate and set mixer element ID - snd_mixer_selem_id_alloca(&sid); - snd_mixer_selem_id_set_name(sid, selem_name); - - // Find the mixer element - snd_mixer_elem_t *elem = snd_mixer_find_selem(handle, sid); - - int volume_percent; - if (elem) { - // Get the playback volume range - snd_mixer_selem_get_playback_volume_range(elem, &min, &max); - - // Get the current playback volume for front left channel - snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, - &volume); - - // Calculate the volume percentage - volume_percent = (volume - min) * 100 / (max - min); - - } else { - std::cerr << "Mixer element not found\n"; - snd_mixer_close(handle); - safe_exit(ENODEV); - } - - // Clean up - snd_mixer_close(handle); - return volume_percent; -} - int main(int argc, char *argv[]) { // signal handlers @@ -130,11 +76,11 @@ accept_new_connection: int volume_percent_old; while (1) { volume_percent_old = volume_percent; - volume_percent = get_volume("Master"); + volume_percent = alsa::get_volume("Master"); if (volume_percent != volume_percent_old) { } usleep(100000); - sprintf(bufferSend, "Volume: %d%%\n", get_volume("Master")); + sprintf(bufferSend, "Volume: %d%%\n", alsa::get_volume("Master")); if (send(clientSocket, bufferSend, strlen(bufferSend), 0) == -1) { std::cerr << "send() returned an error code\n"; safe_exit(-1); diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..3712c80 --- /dev/null +++ b/src/main.h @@ -0,0 +1 @@ +extern int serverSocket; \ No newline at end of file diff --git a/src/secret.h b/src/secret.h new file mode 100644 index 0000000..6dab2ed --- /dev/null +++ b/src/secret.h @@ -0,0 +1 @@ +#define SECRET "1234"