/*
- * Copyright (C) 2007-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2012 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
#include "list.h"
#include "ipc.h"
#include "mm.h"
+#include "sideband.h"
/**
* Contains statistical data of the currently admissible audio files.
static struct mood *current_mood;
/**
- * Rough approximation to sqrt.
+ * Rough approximation to sqrt.
*
- * \param x Integer of which to calculate the sqrt.
+ * \param x Integer of which to calculate the sqrt.
*
- * \return An integer res with res * res <= x.
+ * \return An integer res with res * res <= x.
*/
-static uint64_t int_sqrt(uint64_t x)
+__a_const static uint64_t int_sqrt(uint64_t x)
{
uint64_t op, res, one = 1;
op = x;
char *mood_name;
struct osl_object mood_def;
struct mood_line_parser_data mlpd = {.line_num = 0};
- int ret = mood_get_name_and_def_by_row(mood_row, &mood_name, &mood_def);
+ int ret;
+ *m = NULL;
+ ret = mood_get_name_and_def_by_row(mood_row, &mood_name, &mood_def);
if (ret < 0)
return ret;
if (!*mood_name)
void mood_check_callback(int fd, __a_unused const struct osl_object *query)
{
struct para_buffer pb = {
- .max_size = SHMMAX,
- .private_data = &fd,
- .max_size_handler = pass_buffer_as_shm
+ .max_size = shm_get_shmmax(),
+ .private_data = &(struct afs_max_size_handler_data) {
+ .fd = fd,
+ .band = SBD_OUTPUT
+ },
+ .max_size_handler = afs_max_size_handler
};
int ret = para_printf(&pb, "checking moods...\n");
osl_rbtree_loop(moods_table, BLOBCOL_ID, &pb,
check_mood);
if (pb.offset)
- pass_buffer_as_shm(pb.buf, pb.offset, &fd);
+ pass_buffer_as_shm(fd, SBD_OUTPUT, pb.buf, pb.offset);
free(pb.buf);
}
*
* \sa mood_open(), mood_close().
*/
-int reload_current_mood(void)
+static int reload_current_mood(void)
{
int ret;
char *mood_name = NULL;
return ret;
}
+/**
+ * Notification callback for the moods table.
+ *
+ * \param event Type of the event just occurred.
+ * \param pb Unused.
+ * \param data Its type depends on the event.
+ *
+ * This function performs actions required due to the occurrence of the given
+ * event. Possible actions include reload of the current mood and update of the
+ * score of an audio file.
+ */
int moods_event_handler(enum afs_events event, __a_unused struct para_buffer *pb,
void *data)
{
+ int ret;
+
if (!current_mood)
return 0;
switch (event) {
case BLOB_ADD:
if (data == moods_table || data == playlists_table)
return 1; /* no reload necessary for these */
+ ret = clear_score_table();
+ if (ret < 0)
+ PARA_CRIT_LOG("clear score table returned %s\n",
+ para_strerror(-ret));
return reload_current_mood();
/* these also require reload of the score table */
case ATTRIBUTE_ADD:
return 1;
}
}
-