audioc.c: Always free IO buffer.
[paraslash.git] / afs.h
diff --git a/afs.h b/afs.h
index bcc36309dbda9c34a9a8c7298ecb8dab49298c8b..7145c41b9ee71d10ad1fcaeb492532176dfcc25a 100644 (file)
--- a/afs.h
+++ b/afs.h
@@ -1,5 +1,5 @@
 /*
- * 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.
  */
@@ -7,8 +7,6 @@
 /** \file afs.h Exported symbols of the audio file selector. */
 
 #include <regex.h>
-#include "osl.h"
-#include "hash.h"
 
 /** Audio file selector data stored in the audio file table. */
 struct afs_info {
@@ -22,7 +20,7 @@ struct afs_info {
        uint32_t image_id;
        /** Lyrics blob associated with this file (foreign key). */
        uint32_t lyrics_id;
-       /** Mp3, ogg or aac. */
+       /** Mp3, ogg, aac, wma, spx. */
        uint8_t audio_format_id;
        /** Amplification value. */
        uint8_t amp;
@@ -98,7 +96,13 @@ struct afs_table {
                void *data);
 };
 
-enum play_mode {PLAY_MODE_MOOD, PLAY_MODE_PLAYLIST};
+/** How audio files are selected by afs. */
+enum play_mode {
+       /** Admissible files are determined by a mood definition. */
+       PLAY_MODE_MOOD,
+       /** All listed files are admissible. */
+       PLAY_MODE_PLAYLIST,
+};
 
 /**
  * Data about one audio file.
@@ -114,29 +118,41 @@ struct ls_data {
        char *path;
        /** The score value (if -a was given). */
        long score;
-       /** The sha1 hash of audio file. */
-       HASH_TYPE *hash;
+       /** The hash value of audio file data. */
+       unsigned char *hash;
 };
 
-void make_empty_status_items(char *buf);
-
-/** At most that many bytes will be passed from afs to para_server. */
-#define VERBOSE_LS_OUTPUT_SIZE 4096
-
 /** Data about the current audio file, passed from afs to server. */
 struct audio_file_data {
-       /** Same info as ls -lv -p current audio_file. */
-       char verbose_ls_output[VERBOSE_LS_OUTPUT_SIZE];
        /** The open file descriptor to the current audio file. */
        int fd;
        /** Vss needs this for streaming. */
        struct afh_info afhi;
+       /** Size of the largest chunk. */
+       uint32_t max_chunk_size;
+       /** Needed to get the audio file header. */
+       uint8_t audio_format_id;
 };
 
+/**
+ * Codes used for communication between the server and the afs process.
+ *
+ * Before forking the afs child, para_server creates a bidirectional pipe
+ * through which both processes communicate. Usually para_server requests a new
+ * audio in order to start streaming or when the end of the current audio file
+ * has been reached.  The afs process responds to such a request by sending
+ * back an eight byte buffer. The first four bytes is the uint32_t
+ * representation of the code, usually \p NEXT_AUDIO_FILE if an admissible
+ * audio file was found, successfully opened and verified. The other four bytes
+ * represent the shared memory id of the shared memory area that contains
+ * details about the audio file to be streamed next. The open file descriptor
+ * of that file is also passed from afs to para_server through the same pipe.
+ */
 enum afs_server_code {
+       /** An audio file was successfully opened. */
        NEXT_AUDIO_FILE,
+       /** No admissible audio file was found. */
        NO_ADMISSIBLE_FILES,
-       AFD_CHANGE
 };
 
 /** Flags passed to for_each_matching_row(). */
@@ -165,6 +181,8 @@ struct pattern_match_data {
        struct osl_object patterns;
        /** Data pointer passed to the action function. */
        void *data;
+       /** Gets increased by one for each match. */
+       unsigned num_matches;
        /** For each matching row, this function will be called. */
        int (*action)(struct osl_table *table, struct osl_row *row, const char *name, void *data);
 };
@@ -188,7 +206,7 @@ typedef void callback_function(int fd, const struct osl_object *);
  * \sa \ref send_callback_request().
  */
 typedef int callback_result_handler(struct osl_object *result, void *private);
-int send_result(struct osl_object *result, void *fd_ptr);
+int sc_send_result(struct osl_object *result, void *private);
 int pass_buffer_as_shm(char *buf, size_t size, void *fd_ptr);
 
 __noreturn void afs_init(uint32_t cookie, int socket_fd);
@@ -204,9 +222,6 @@ int send_option_arg_callback_request(struct osl_object *options,
 int send_standard_callback_request(int argc,  char * const * const argv,
                callback_function *f, callback_result_handler *result_handler,
                void *private_result_data);
-int stdin_command(int fd, struct osl_object *arg_obj, callback_function *f,
-               unsigned max_len, callback_result_handler *result_handler,
-               void *private_result_data);
 int string_compare(const struct osl_object *obj1, const struct osl_object *obj2);
 int for_each_matching_row(struct pattern_match_data *pmd);
 
@@ -245,13 +260,6 @@ int get_afsi_object_of_row(const struct osl_row *row, struct osl_object *obj);
 int audio_file_loop(void *private_data, osl_rbtree_loop_func *func);
 void aft_check_callback(int fd, __a_unused const struct osl_object *query);
 
-/* mood */
-int change_current_mood(char *mood_name);
-void close_current_mood(void);
-int reload_current_mood(void);
-void mood_check_callback(int fd, __a_unused const struct osl_object *query);
-
-
 /* playlist */
 int playlist_open(char *name);
 void playlist_close(void);
@@ -289,21 +297,3 @@ enum blob_table_columns {
        /** A blob table has that many columns. */
        NUM_BLOB_COLUMNS
 };
-
-/** Define an osl table description for a blob table. */
-#define DEFINE_BLOB_TABLE_DESC(table_name) \
-       struct osl_table_description table_name ## _table_desc = { \
-               .name = #table_name, \
-               .num_columns = NUM_BLOB_COLUMNS, \
-               .flags = OSL_LARGE_TABLE, \
-               .column_descriptions = blob_cols \
-       };
-
-/** Define a pointer to an osl blob table with a canonical name. */
-#define DEFINE_BLOB_TABLE_PTR(table_name) struct osl_table *table_name ## _table;
-
-/** Define a blob table. */
-#define INIT_BLOB_TABLE(table_name) \
-       DEFINE_BLOB_TABLE_DESC(table_name); \
-       DEFINE_BLOB_TABLE_PTR(table_name);
-