diff options
Diffstat (limited to 'AudioManagerDaemon/src')
-rw-r--r-- | AudioManagerDaemon/src/CAmControlReceiver.cpp | 5 | ||||
-rw-r--r-- | AudioManagerDaemon/src/CAmControlSender.cpp | 44 | ||||
-rw-r--r-- | AudioManagerDaemon/src/CAmRoutingReceiver.cpp | 2 | ||||
-rwxr-xr-x | AudioManagerDaemon/src/main.cpp | 38 |
4 files changed, 81 insertions, 8 deletions
diff --git a/AudioManagerDaemon/src/CAmControlReceiver.cpp b/AudioManagerDaemon/src/CAmControlReceiver.cpp index a6506ad..79a5f65 100644 --- a/AudioManagerDaemon/src/CAmControlReceiver.cpp +++ b/AudioManagerDaemon/src/CAmControlReceiver.cpp @@ -21,6 +21,7 @@ #include "CAmControlReceiver.h" #include <cassert> +#include <stdlib.h> #include "config.h" #include "CAmDatabaseHandler.h" #include "CAmRoutingSender.h" @@ -483,6 +484,10 @@ void CAmControlReceiver::confirmControllerReady() void CAmControlReceiver::confirmControllerRundown() { //todo: one time implement here system interaction with NSM + logInfo("CAmControlReceiver::confirmControllerRundown got called"); + + logInfo("exit ..."); + exit(0); } am_Error_e CAmControlReceiver::getSocketHandler(CAmSocketHandler *& socketHandler) diff --git a/AudioManagerDaemon/src/CAmControlSender.cpp b/AudioManagerDaemon/src/CAmControlSender.cpp index 77cec9f..67457f3 100644 --- a/AudioManagerDaemon/src/CAmControlSender.cpp +++ b/AudioManagerDaemon/src/CAmControlSender.cpp @@ -23,6 +23,7 @@ #include <cassert> #include <fstream> #include <iostream> +#include <stdlib.h> #include <sstream> #include <stdexcept> #include "TAmPluginTemplate.h" @@ -34,10 +35,16 @@ namespace am #define REQUIRED_INTERFACE_VERSION_MAJOR 1 //!< major interface version. All versions smaller than this will be rejected #define REQUIRED_INTERFACE_VERSION_MINOR 0 //!< minor interface version. All versions smaller than this will be rejected -CAmControlSender::CAmControlSender(std::string controlPluginFile) : +CAmControlSender* CAmControlSender::mInstance=NULL; +CAmControlSender::CAmControlSender(std::string controlPluginFile,CAmSocketHandler* sockethandler) : + receiverCallbackT(this, &CAmControlSender::receiverCallback),// + checkerCallbackT(this, &CAmControlSender::checkerCallback),// + dispatcherCallbackT(this, &CAmControlSender::dispatcherCallback), // + mPipe(), // mlibHandle(NULL), // mController(NULL) { + assert(sockethandler); std::ifstream isfile(controlPluginFile.c_str()); if (!isfile) { @@ -45,6 +52,7 @@ CAmControlSender::CAmControlSender(std::string controlPluginFile) : } else if (!controlPluginFile.empty()) { + mInstance=this; IAmControlSend* (*createFunc)(); createFunc = getCreateFunction<IAmControlSend*()>(controlPluginFile, mlibHandle); assert(createFunc!=NULL); @@ -67,6 +75,15 @@ CAmControlSender::CAmControlSender(std::string controlPluginFile) : { logError("ControlSender::ControlSender: No controller loaded !"); } + if (pipe(mPipe) == -1) + { + logError("CAmControlSender could not create pipe!"); + } + + short event = 0; + sh_pollHandle_t handle; + event |= POLLIN; + sockethandler->addFDPoll(mPipe[0], event, NULL, &receiverCallbackT, &checkerCallbackT, &dispatcherCallbackT, NULL, handle); } CAmControlSender::~CAmControlSender() @@ -360,4 +377,29 @@ void CAmControlSender::confirmRoutingRundown() assert(mController); mController->confirmRoutingRundown(); } + +void CAmControlSender::receiverCallback(const pollfd pollfd, const sh_pollHandle_t handle, void* userData) +{ + (void) handle; + (void) userData; + //get the signal number from the socket + int16_t dummy; + read(pollfd.fd, &dummy, sizeof(dummy)); +} + +bool CAmControlSender::checkerCallback(const sh_pollHandle_t handle, void* userData) +{ + (void) handle; + (void) userData; + return (true); +} + +bool CAmControlSender::dispatcherCallback(const sh_pollHandle_t handle, void* userData) +{ + (void)handle; + (void)userData; + setControllerRundown(); + return (false); +} + } diff --git a/AudioManagerDaemon/src/CAmRoutingReceiver.cpp b/AudioManagerDaemon/src/CAmRoutingReceiver.cpp index 40ebd8d..f0821a9 100644 --- a/AudioManagerDaemon/src/CAmRoutingReceiver.cpp +++ b/AudioManagerDaemon/src/CAmRoutingReceiver.cpp @@ -356,7 +356,7 @@ void CAmRoutingReceiver::confirmRoutingRundown(const uint16_t handle) { mListRundownHandles.erase(std::remove(mListRundownHandles.begin(), mListRundownHandles.end(), handle), mListRundownHandles.end()); if (mWaitRundown && mListRundownHandles.empty()) - mpControlSender->confirmCommandRundown(); + mpControlSender->confirmRoutingRundown(); } uint16_t am::CAmRoutingReceiver::getStartupHandle() diff --git a/AudioManagerDaemon/src/main.cpp b/AudioManagerDaemon/src/main.cpp index b9eade1..b82d1ff 100755 --- a/AudioManagerDaemon/src/main.cpp +++ b/AudioManagerDaemon/src/main.cpp @@ -264,10 +264,37 @@ static void signalHandler(int sig, siginfo_t *siginfo, void *context) (void) sig; (void) siginfo; (void) context; - logError("signal handler was called, exit now..."); - gDispatchDone = 1; - //todo: maually fire the mainloop - exit(1); + + switch (sig) + { + /*ctl +c lets call direct controllerRundown, because we might be blocked at the moment. + But there is the risk of interrupting something important */ + case SIGINT: + logInfo("signal handler was called SIGINT"); + CAmControlSender::CallsetControllerRundown(); + break; + + /* huch- we are getting killed. Better take the fast but risky way: */ + case SIGQUIT: + logInfo("signal handler was called SIGQUIT"); + CAmControlSender::CallsetControllerRundown(); + break; + + /* more friendly here assuming systemd wants to stop us, so we can use the mainloop */ + case SIGTERM: + logInfo("signal handler was called SIGTERM"); + CAmControlSender::CallsetControllerRundownSafe(); + break; + + /* looks friendly, too, so lets take the long run */ + case SIGHUP: + logInfo("signal handler was called SIGHUP"); + CAmControlSender::CallsetControllerRundownSafe(); + break; + default: + logInfo("signal handler was called", sig); + break; + } } void mainProgram() @@ -286,7 +313,7 @@ void mainProgram() CAmDatabaseHandler iDatabaseHandler(databasePath); CAmRoutingSender iRoutingSender(listRoutingPluginDirs); CAmCommandSender iCommandSender(listCommandPluginDirs); - CAmControlSender iControlSender(controllerPlugin); + CAmControlSender iControlSender(controllerPlugin, &iSocketHandler); CAmRouter iRouter(&iDatabaseHandler, &iControlSender); #ifdef WITH_DBUS_WRAPPER @@ -354,7 +381,6 @@ int main(int argc, char *argv[], char** envp) sigaction(SIGQUIT, &signalAction, NULL); sigaction(SIGTERM, &signalAction, NULL); sigaction(SIGHUP, &signalAction, NULL); - sigaction(SIGQUIT, &signalAction, NULL); struct sigaction signalChildAction; memset(&signalChildAction, '\0', sizeof(signalChildAction)); |