code addition
This commit is contained in:
parent
b3ec1a7891
commit
c41044def4
2
Makefile
Normal file
2
Makefile
Normal file
@ -0,0 +1,2 @@
|
||||
all:
|
||||
g++ main.cpp -lasound -g -o TabletPcControl-server
|
132
main.cpp
132
main.cpp
@ -1,14 +1,20 @@
|
||||
#include "secret.h"
|
||||
#include <alsa/asoundlib.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <array>
|
||||
#include <cerrno>
|
||||
#include <codecvt>
|
||||
#include <csignal>
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <fcntl.h>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sched.h>
|
||||
#include <stdexcept>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -23,36 +29,58 @@
|
||||
|
||||
#define PORT 54321
|
||||
|
||||
std::string exec(std::string cmd) {
|
||||
std::array<char, 128> buffer;
|
||||
std::string result;
|
||||
std::unique_ptr<FILE, void (*)(FILE *)> 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<int>(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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user