+ 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;