From c41044def407300bfa127f0671d0e8cde7dae9ae Mon Sep 17 00:00:00 2001 From: PoliEcho Date: Sun, 8 Dec 2024 15:07:48 +0100 Subject: [PATCH] code addition --- Makefile | 2 + main.cpp | 132 +++++++++++++++++++++++++++++++++++++++++-------------- secret.h | 0 3 files changed, 101 insertions(+), 33 deletions(-) create mode 100644 Makefile create mode 100644 secret.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fcd9b1a --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +all: + g++ main.cpp -lasound -g -o TabletPcControl-server \ No newline at end of file diff --git a/main.cpp b/main.cpp index 5a8affb..7cef0cb 100644 --- a/main.cpp +++ b/main.cpp @@ -1,14 +1,20 @@ +#include "secret.h" +#include #include #include +#include #include #include +#include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -23,36 +29,58 @@ #define PORT 54321 -std::string exec(std::string cmd) { - std::array buffer; - std::string result; - std::unique_ptr pipe(popen(cmd.c_str(), "r"), - [](FILE *f) -> void { - // wrapper to ignore the return - // value from pclose() is - // needed with newer versions - // of gnu g++ - std::ignore = pclose(f); - }); - if (!pipe) { - throw std::runtime_error("popen() failed!"); - } - while (fgets(buffer.data(), static_cast(buffer.size()), pipe.get()) != - nullptr) { - result += buffer.data(); - } - return result; -} - 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 @@ -83,22 +111,60 @@ int main(int argc, char *argv[]) { // listening to the assigned socket listen(serverSocket, 5); +accept_new_connection: // accepting connection request int clientSocket = accept(serverSocket, nullptr, nullptr); - // recieving data - char buffer[1024] = {0}; - { - int RecvRetVal = recv(clientSocket, buffer, sizeof(buffer), 0); - if (RecvRetVal > sizeof(buffer) || RecvRetVal < 0) { - std::cerr << "recv() returned an error code\n"; - return RecvRetVal; - } - } - std::cout << "Message from client: " << buffer << std::endl; + pid_t pid; + pid = fork(); - // closing the socket. - close(serverSocket); + if (pid == -1) { + std::cerr << "Fork failed"; + safe_exit(-1); + + } else if (pid == 0) { + // child process + signal(SIGUSR1, exit); + char bufferSend[1024]; + int volume_percent = INTMAX_MIN; + int volume_percent_old; + while (1) { + volume_percent_old = volume_percent; + volume_percent = get_volume("Master"); + if (volume_percent != volume_percent_old) { + } + usleep(100000); + sprintf(bufferSend, "Volume: %d%%\n", get_volume("Master")); + if (send(clientSocket, bufferSend, strlen(bufferSend), 0) == -1) { + std::cerr << "send() returned an error code\n"; + safe_exit(-1); + } + sleep(1); + } + + } else { + // parent process + char bufferRecv[1024]; + // recieving data + while (1) { + memset(&bufferRecv, 0, sizeof(bufferRecv)); + int RecvRetVal = recv(clientSocket, bufferRecv, sizeof(bufferRecv), 0); + if (RecvRetVal > sizeof(bufferRecv) || RecvRetVal < 0) { + std::cerr << "recv() returned an error code\n"; + safe_exit(RecvRetVal); + } else if (RecvRetVal == 0) { + // detect if client disconected + kill(pid, SIGUSR1); + close(clientSocket); + goto accept_new_connection; + } + + std::cout << "Message from client: " << bufferRecv << std::endl; + } + + // closing the socket. + close(serverSocket); + } return 0; } \ No newline at end of file diff --git a/secret.h b/secret.h new file mode 100644 index 0000000..e69de29