TBLNUM_AUDIO_FILES,
/** The table for the paraslash attributes. See \ref attribute.c. */
TBLNUM_ATTRIBUTES,
- /**
- * Paraslash's scoring system is based on Gaussian normal
- * distributions, and the relevant data is stored in the rbtrees of an
- * osl table containing only volatile columns. See \ref score.c for
- * details.
+ /*
+ * Moods and playlists organize the current set of admissible files in
+ * an osl table which contains only volatile columns. Each row consists
+ * of a pointer to an audio file and the score value of this file.
*/
TBLNUM_SCORES,
/**
*/
static int open_next_audio_file(void)
{
- struct audio_file_data afd;
- int ret, shmid;
+ int ret, shmid, fd;
char buf[8];
- ret = open_and_update_audio_file(&afd);
+ ret = open_and_update_audio_file(&fd);
if (ret < 0) {
- PARA_ERROR_LOG("%s\n", para_strerror(-ret));
+ if (ret != -OSL_ERRNO_TO_PARA_ERROR(E_OSL_RB_KEY_NOT_FOUND))
+ PARA_ERROR_LOG("%s\n", para_strerror(-ret));
goto no_admissible_files;
}
shmid = ret;
}
*(uint32_t *)buf = NEXT_AUDIO_FILE;
*(uint32_t *)(buf + 4) = (uint32_t)shmid;
- ret = pass_afd(afd.fd, buf, 8);
- close(afd.fd);
+ ret = pass_afd(fd, buf, 8);
+ close(fd);
if (ret >= 0)
return ret;
destroy:
return write_all(server_socket, buf, 8);
}
-/* Never fails if arg == NULL */
static int activate_mood_or_playlist(const char *arg, int *num_admissible,
char **errmsg)
{
int ret;
if (!arg) {
- ret = change_current_mood(NULL, NULL); /* always successful */
mode = PLAY_MODE_MOOD;
+ ret = change_current_mood(NULL, errmsg);
+ if (ret < 0) {
+ if (num_admissible)
+ *num_admissible = 0;
+ return ret;
+ }
} else {
if (!strncmp(arg, "p/", 2)) {
ret = playlist_open(arg + 2);
{
int ret = activate_mood_or_playlist(arg, NULL, NULL);
if (ret < 0) {
- assert(arg);
PARA_WARNING_LOG("could not activate %s: %s\n", arg,
para_strerror(-ret));
- activate_mood_or_playlist(NULL, NULL, NULL);
+ if (arg)
+ activate_mood_or_playlist(NULL, NULL, NULL);
}
}
static void close_afs_tables(void)
{
int i;
- PARA_NOTICE_LOG("closing afs_tables\n");
+ PARA_NOTICE_LOG("closing afs tables\n");
for (i = 0; i < NUM_AFS_TABLES; i++)
afs_tables[i].close();
free(database_dir);
else {
char *home = para_homedir();
database_dir = make_message(
- "%s/.paraslash/afs_database-0.4", home);
+ "%s/.paraslash/afs_database-0.7", home);
free(home);
}
}
int i, ret;
register_signal_task(&s);
- INIT_LIST_HEAD(&afs_client_list);
+ init_list_head(&afs_client_list);
for (i = 0; i < NUM_AFS_TABLES; i++)
afs_tables[i].init(&afs_tables[i]);
ret = open_afs_tables();
}
ret = open_afs_tables();
if (ret < 0)
- para_printf(&aca->pbout, "cannot open afs tables\n");
+ para_printf(&aca->pbout, "cannot open afs tables: %s\n",
+ para_strerror(-ret));
out:
return ret;
}