summaryrefslogtreecommitdiff
path: root/AudioManagerDaemon/src
diff options
context:
space:
mode:
authorchristian mueller <christian.ei.mueller@bmw.de>2012-02-01 15:44:08 +0100
committerchristian mueller <christian.ei.mueller@bmw.de>2012-02-02 15:27:21 +0100
commit74cf9b985164be8c28a3cd1b11076900792594f8 (patch)
tree9e0cd72bbd6ef6a48385b0ea1907739f6537495f /AudioManagerDaemon/src
parent9f4c15a8e89d798077ca3edf7f786dbc740aa176 (diff)
downloadaudiomanager-74cf9b985164be8c28a3cd1b11076900792594f8.tar.gz
* add an out of memory handler
Diffstat (limited to 'AudioManagerDaemon/src')
-rw-r--r--AudioManagerDaemon/src/DatabaseHandler.cpp217
-rw-r--r--AudioManagerDaemon/src/main.cpp11
2 files changed, 208 insertions, 20 deletions
diff --git a/AudioManagerDaemon/src/DatabaseHandler.cpp b/AudioManagerDaemon/src/DatabaseHandler.cpp
index a8bc443..d9f81a6 100644
--- a/AudioManagerDaemon/src/DatabaseHandler.cpp
+++ b/AudioManagerDaemon/src/DatabaseHandler.cpp
@@ -81,6 +81,7 @@ DatabaseHandler::DatabaseHandler(std::string databasePath) :
mFirstStaticGateway(true), //
mFirstStaticSinkClass(true), //
mFirstStaticSourceClass(true), //
+ mFirstStaticCrossfader(true), //
mListConnectionFormat()
{
@@ -455,10 +456,89 @@ am_Error_e DatabaseHandler::enterSinkDB(const am_Sink_s & sinkData, am_sinkID_t
am_Error_e DatabaseHandler::enterCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID)
{
- //todo: implement crossfader
- (void) crossfaderData;
- (void) crossfaderID;
- return E_UNKNOWN;
+ assert(crossfaderData.crossfaderID<DYNAMIC_ID_BOUNDARY);
+ assert(crossfaderData.hotSink>=HS_MIN && crossfaderData.hotSink<=HS_MAX);
+ assert(!crossfaderData.name.empty());
+ assert(existSink(crossfaderData.sinkID_A));
+ assert(existSink(crossfaderData.sinkID_B));
+ assert(existSource(crossfaderData.sourceID));
+
+ sqlite3_stmt* query = NULL;
+ int eCode = 0;
+ std::string command;
+
+ //if gatewayData is zero and the first Static Sink was already entered, the ID is created
+ if (crossfaderData.crossfaderID == 0 && !mFirstStaticCrossfader)
+ {
+ command = "INSERT INTO " + std::string(CROSSFADER_TABLE) + "(name, sinkID_A, sinkID_B, sourceID, hotSink) VALUES (?,?,?,?,?)";
+ }
+ else
+ {
+ //check if the ID already exists
+ if (existcrossFader(crossfaderData.crossfaderID))
+ return E_ALREADY_EXISTS;
+ command = "INSERT INTO " + std::string(CROSSFADER_TABLE) + "(name, sinkID_A, sinkID_B, sourceID, hotSink, crossfaderID) VALUES (?,?,?,?,?,?)";
+ }
+
+ sqlite3_prepare_v2(mDatabase, command.c_str(), -1, &query, NULL);
+
+ sqlite3_bind_text(query, 1, crossfaderData.name.c_str(), crossfaderData.name.size(), SQLITE_STATIC);
+ sqlite3_bind_int(query, 2, crossfaderData.sinkID_A);
+ sqlite3_bind_int(query, 3, crossfaderData.sinkID_B);
+ sqlite3_bind_int(query, 4, crossfaderData.sourceID);
+ sqlite3_bind_int(query, 5, crossfaderData.hotSink);
+
+ //if the ID is not created, we add it to the query
+ if (crossfaderData.crossfaderID != 0)
+ {
+ sqlite3_bind_int(query, 6, crossfaderData.crossfaderID);
+ }
+
+ //if the first static sink is entered, we need to set it onto the boundary
+ else if (mFirstStaticCrossfader)
+ {
+ sqlite3_bind_int(query, 6, DYNAMIC_ID_BOUNDARY);
+ mFirstStaticCrossfader = false;
+ }
+
+ if ((eCode = sqlite3_step(query)) != SQLITE_DONE)
+ {
+ logError("DatabaseHandler::enterCrossfaderDB SQLITE Step error code:", eCode);
+ sqlite3_finalize(query);
+ return E_DATABASE_ERROR;
+ }
+
+ if ((eCode = sqlite3_finalize(query)) != SQLITE_OK)
+ {
+ logError("DatabaseHandler::enterCrossfaderDB SQLITE Finalize error code:", eCode);
+ sqlite3_finalize(query);
+ return E_DATABASE_ERROR;
+ }
+
+ //now read back the crossfaderID
+ command = "SELECT crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " WHERE name=?";
+ sqlite3_prepare_v2(mDatabase, command.c_str(), -1, &query, NULL);
+ sqlite3_bind_text(query, 1, crossfaderData.name.c_str(), crossfaderData.name.size(), SQLITE_STATIC);
+ if ((eCode = sqlite3_step(query)) == SQLITE_ROW)
+ {
+ crossfaderID = sqlite3_column_int(query, 0);
+ }
+ else
+ {
+ crossfaderID = 0;
+ logError("DatabaseHandler::enterCrossfaderDB database error!:", eCode);
+ sqlite3_finalize(query);
+ return E_DATABASE_ERROR;
+ }
+ sqlite3_finalize(query);
+
+ logInfo("DatabaseHandler::enterCrossfaderDB entered new crossfader with name=", crossfaderData.name, "sinkA= ", crossfaderData.sinkID_A, "sinkB=", crossfaderData.sinkID_B, "source=", crossfaderData.sourceID, "assigned ID:", crossfaderID);
+
+ am_Crossfader_s crossfader(crossfaderData);
+ crossfader.crossfaderID = crossfaderID;
+ if (mDatabaseObserver)
+ mDatabaseObserver->newCrossfader(crossfader);
+ return E_OK;
}
am_Error_e DatabaseHandler::enterGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID)
@@ -473,12 +553,14 @@ am_Error_e DatabaseHandler::enterGatewayDB(const am_Gateway_s & gatewayData, am_
assert(!gatewayData.convertionMatrix.empty());
assert(!gatewayData.listSinkFormats.empty());
assert(!gatewayData.listSourceFormats.empty());
+ assert(existSink(gatewayData.sinkID));
+ assert(existSource(gatewayData.sourceID));
sqlite3_stmt* query = NULL;
int eCode = 0;
std::string command;
- //if sinkID is zero and the first Static Sink was already entered, the ID is created
+ //if gatewayData is zero and the first Static Sink was already entered, the ID is created
if (gatewayData.gatewayID == 0 && !mFirstStaticGateway)
{
command = "INSERT INTO " + std::string(GATEWAY_TABLE) + "(name, sinkID, sourceID, domainSinkID, domainSourceID, controlDomainID) VALUES (?,?,?,?,?,?)";
@@ -1232,9 +1314,19 @@ am_Error_e DatabaseHandler::removeGatewayDB(const am_gatewayID_t gatewayID)
am_Error_e DatabaseHandler::removeCrossfaderDB(const am_crossfaderID_t crossfaderID)
{
- //todo: implement crossdfader
- (void) crossfaderID;
- return E_UNKNOWN;
+ assert(crossfaderID!=0);
+
+ if (!existcrossFader(crossfaderID))
+ {
+ return E_NON_EXISTENT;
+ }
+ std::string command = "DELETE from " + std::string(CROSSFADER_TABLE) + " WHERE crossfaderID=" + i2s(crossfaderID);
+ if (!sqQuery(command))
+ return E_DATABASE_ERROR;
+ logInfo("DatabaseHandler::removeDomainDB removed:", crossfaderID);
+ if (mDatabaseObserver)
+ mDatabaseObserver->removeCrossfader(crossfaderID);
+ return E_OK;
}
am_Error_e DatabaseHandler::removeDomainDB(const am_domainID_t domainID)
@@ -1619,10 +1711,39 @@ am_Error_e DatabaseHandler::getGatewayInfoDB(const am_gatewayID_t gatewayID, am_
am_Error_e DatabaseHandler::getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s & crossfaderData) const
{
- //todo: implement crossfader
- (void) crossfaderID;
- (void) crossfaderData;
- return E_UNKNOWN;
+ assert(crossfaderID!=0);
+ if (!existcrossFader(crossfaderID))
+ {
+ return E_NON_EXISTENT;
+ }
+ sqlite3_stmt* query = NULL;
+ int eCode = 0;
+ std::string command = "SELECT name, sinkID_A, sinkID_B, sourceID, hotSink,crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " WHERE crossfaderID=" + i2s(crossfaderID);
+ sqlite3_prepare_v2(mDatabase, command.c_str(), -1, &query, NULL);
+
+ while ((eCode = sqlite3_step(query)) == SQLITE_ROW)
+ {
+ crossfaderData.name = std::string((const char*) sqlite3_column_text(query, 0));
+ crossfaderData.sinkID_A = sqlite3_column_int(query, 1);
+ crossfaderData.sinkID_B = sqlite3_column_int(query, 2);
+ crossfaderData.sourceID = sqlite3_column_int(query, 3);
+ crossfaderData.hotSink = static_cast<am_HotSink_e>(sqlite3_column_int(query, 4));
+ crossfaderData.crossfaderID = sqlite3_column_int(query, 5);
+ }
+
+ if (eCode != SQLITE_DONE)
+ {
+ logError("DatabaseHandler::getCrossfaderInfoDB SQLITE error code:", eCode);
+ return E_DATABASE_ERROR;
+ }
+
+ if ((eCode = sqlite3_finalize(query)) != SQLITE_OK)
+ {
+ logError("DatabaseHandler::getCrossfaderInfoDB SQLITE Finalize error code:", eCode);
+ return E_DATABASE_ERROR;
+ }
+
+ return E_OK;
}
am_Error_e DatabaseHandler::getListSinksOfDomain(const am_domainID_t domainID, std::vector<am_sinkID_t> & listSinkID) const
@@ -1696,12 +1817,40 @@ am_Error_e DatabaseHandler::getListSourcesOfDomain(const am_domainID_t domainID,
return E_OK;
}
-am_Error_e DatabaseHandler::getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector<am_crossfaderID_t> & listGatewaysID) const
+am_Error_e DatabaseHandler::getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector<am_crossfaderID_t> & listCrossfader) const
{
- //todo: implement crossfader
- (void) listGatewaysID;
- (void) domainID;
- return E_UNKNOWN;
+ assert(domainID!=0);
+ listCrossfader.clear();
+ if (!existDomain(domainID))
+ {
+ return E_NON_EXISTENT;
+ }
+ sqlite3_stmt* query = NULL;
+ int eCode = 0;
+ am_crossfaderID_t temp;
+
+ std::string command = "SELECT c.crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " c," + std::string(SOURCE_TABLE) + " s WHERE c.sourceID=s.sourceID AND s.domainID=" + i2s(domainID);
+ sqlite3_prepare_v2(mDatabase, command.c_str(), -1, &query, NULL);
+
+ while ((eCode = sqlite3_step(query)) == SQLITE_ROW)
+ {
+ temp = sqlite3_column_int(query, 0);
+ listCrossfader.push_back(temp);
+ }
+
+ if (eCode != SQLITE_DONE)
+ {
+ logError("DatabaseHandler::getListCrossfadersOfDomain SQLITE error code:", eCode);
+ return E_DATABASE_ERROR;
+ }
+
+ if ((eCode = sqlite3_finalize(query)) != SQLITE_OK)
+ {
+ logError("DatabaseHandler::getListCrossfadersOfDomain SQLITE Finalize error code:", eCode);
+ return E_DATABASE_ERROR;
+ }
+
+ return E_OK;
}
@@ -2126,9 +2275,37 @@ am_Error_e DatabaseHandler::getListSourceClasses(std::vector<am_SourceClass_s> &
am_Error_e DatabaseHandler::getListCrossfaders(std::vector<am_Crossfader_s> & listCrossfaders) const
{
- //todo: implement crossfaders
- (void) listCrossfaders;
- return E_UNKNOWN;
+ listCrossfaders.clear();
+ sqlite3_stmt* query = NULL;
+ int eCode = 0;
+ am_Crossfader_s tempData;
+ std::string command = "SELECT name, sinkID_A, sinkID_B, sourceID, hotSink,crossfaderID FROM " + std::string(CROSSFADER_TABLE);
+ sqlite3_prepare_v2(mDatabase, command.c_str(), -1, &query, NULL);
+
+ while ((eCode = sqlite3_step(query)) == SQLITE_ROW)
+ {
+ tempData.name = std::string((const char*) sqlite3_column_text(query, 0));
+ tempData.sinkID_A = sqlite3_column_int(query, 1);
+ tempData.sinkID_B = sqlite3_column_int(query, 2);
+ tempData.sourceID = sqlite3_column_int(query, 3);
+ tempData.hotSink = static_cast<am_HotSink_e>(sqlite3_column_int(query, 4));
+ tempData.crossfaderID = sqlite3_column_int(query, 5);
+ listCrossfaders.push_back(tempData);
+ }
+
+ if (eCode != SQLITE_DONE)
+ {
+ logError("DatabaseHandler::getListCrossfaders SQLITE error code:", eCode);
+ return E_DATABASE_ERROR;
+ }
+
+ if ((eCode = sqlite3_finalize(query)) != SQLITE_OK)
+ {
+ logError("DatabaseHandler::getListCrossfaders SQLITE Finalize error code:", eCode);
+ return E_DATABASE_ERROR;
+ }
+
+ return E_OK;
}
am_Error_e DatabaseHandler::getListGateways(std::vector<am_Gateway_s> & listGateways) const
diff --git a/AudioManagerDaemon/src/main.cpp b/AudioManagerDaemon/src/main.cpp
index faaafdb..c4f4d0d 100644
--- a/AudioManagerDaemon/src/main.cpp
+++ b/AudioManagerDaemon/src/main.cpp
@@ -59,6 +59,7 @@
#include <csignal>
#include <cstring>
#include <cstdio>
+#include <new>
DLT_DECLARE_CONTEXT(AudioManager)
@@ -87,6 +88,13 @@ unsigned int telnetport = DEFAULT_TELNETPORT;
unsigned int maxConnections = MAX_TELNETCONNECTIONS;
int fd0, fd1, fd2;
+void OutOfMemoryHandler ()
+{
+ logError("No more memory - bye");
+ //todo: add gracefull dead here. Do what can be done persistence wise
+ exit (1);
+}
+
void daemonize()
{
umask(0);
@@ -242,6 +250,9 @@ int main(int argc, char *argv[])
signalChildAction.sa_flags = SA_NOCLDWAIT;
sigaction(SIGCHLD, &signalChildAction, NULL);
+ //register new out of memory handler
+ std::set_new_handler(&OutOfMemoryHandler);
+
//Instantiate all classes. Keep in same order !
#ifdef WITH_SOCKETHANDLER_LOOP
SocketHandler iSocketHandler;