summaryrefslogtreecommitdiff
path: root/AudioManagerDaemon/src
diff options
context:
space:
mode:
Diffstat (limited to 'AudioManagerDaemon/src')
-rw-r--r--AudioManagerDaemon/src/CAmControlReceiver.cpp5
-rw-r--r--AudioManagerDaemon/src/CAmControlSender.cpp44
-rw-r--r--AudioManagerDaemon/src/CAmRoutingReceiver.cpp2
-rwxr-xr-xAudioManagerDaemon/src/main.cpp38
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));