]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - aft.c
Move enum ls_sorting_method from afs.h to aft.c and add documentation.
[paraslash.git] / aft.c
diff --git a/aft.c b/aft.c
index 1a0fdc79d5f591172b9edadb759baba072563b3a..f8e8f40b5013b300dad0c05abdce189639a42731 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -1,3 +1,11 @@
+/*
+ * Copyright (C) 2007 Andre Noll <maan@systemlinux.org>
+ *
+ * Licensed under the GPL v2. For licencing details see COPYING.
+ */
+
+/** \file aft.c Audio file table functions. */
+
 #include "para.h"
 #include "error.h"
 #include <sys/mman.h>
 #include "string.h"
 #include "vss.h"
 
-#define AFS_AUDIO_FILE_DIR "/home/mp3"
+#define AFS_AUDIO_FILE_DIR "/home/mp3" /* FIXME: Use cwd instead */
 
 static struct osl_table *audio_file_table;
 
+/** The different sorting methods of the ls command. */
+enum ls_sorting_method {
+       /** -sp (default) */
+       LS_SORT_BY_PATH,
+       /** -ss */
+       LS_SORT_BY_SCORE,
+       /** -sl */
+       LS_SORT_BY_LAST_PLAYED,
+       /** -sn */
+       LS_SORT_BY_NUM_PLAYED,
+       /** -sf */
+       LS_SORT_BY_FREQUENCY,
+       /** -sc */
+       LS_SORT_BY_CHANNELS,
+       /** -si */
+       LS_SORT_BY_IMAGE_ID,
+       /** -sy */
+       LS_SORT_BY_LYRICS_ID,
+       /** -sb */
+       LS_SORT_BY_BITRATE,
+       /** -sd */
+       LS_SORT_BY_DURATION,
+       /** -sa */
+       LS_SORT_BY_AUDIO_FORMAT,
+       /** -sh */
+       LS_SORT_BY_HASH,
+};
+
+/** The different listing modes of the ls command. */
+enum ls_listing_mode {
+       /** Default listing mode. */
+       LS_MODE_SHORT,
+       /** -l or -ll */
+       LS_MODE_LONG,
+       /** -lv */
+       LS_MODE_VERBOSE,
+       /** -lm */
+       LS_MODE_MBOX
+};
+
+/** The flags accepted by the ls command. */
+enum ls_flags {
+       /** -p */
+       LS_FLAG_FULL_PATH = 1,
+       /** -a */
+       LS_FLAG_ADMISSIBLE_ONLY = 2,
+       /** -r */
+       LS_FLAG_REVERSE = 4,
+};
+
+/**
+ * The size of the individual output fields of the ls command.
+ *
+ * These depend on the actual content being listed. If, for instance only files
+ * with duration less than an hour are being listed, then the duration with is
+ * made smaller because then the duration is listed as mm:ss rather than
+ * hh:mm:ss.
+ */
+struct ls_widths {
+       /** size of the score field. */
+       unsigned short score_width;
+       /** size of the image id field. */
+       unsigned short image_id_width;
+       /** size of the lyrics id field. */
+       unsigned short lyrics_id_width;
+       /** size of the bitrate field. */
+       unsigned short bitrate_width;
+       /** size of the frequency field. */
+       unsigned short frequency_width;
+       /** size of the duration field. */
+       unsigned short duration_width;
+       /** size of the num played field. */
+       unsigned short num_played_width;
+};
+
+/** Data passed to the different compare functions (called by qsort()). */
+struct ls_data {
+       /** Usual audio format handler information. */
+       struct audio_format_info afhi;
+       /** Audio file selector information. */
+       struct afs_info afsi;
+       /** The full path of the audio file. */
+       char *path;
+       /** The score value (if -a was given). */
+       long score;
+       /** The sha1 hash of audio file. */
+       HASH_TYPE *hash;
+};
+
+struct ls_options {
+       unsigned flags;
+       enum ls_sorting_method sorting;
+       enum ls_listing_mode mode;
+       char **patterns;
+       int num_patterns;
+       struct ls_widths widths;
+       uint32_t array_size;
+       uint32_t num_matching_paths;
+       struct ls_data *data;
+       struct ls_data **data_ptr;
+};
+
 /**
  * Describes the layout of the mmapped-afs info struct.
  *
@@ -733,7 +843,8 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts,
                        "channels: %d\n"
                        "duration: %s\n"
                        "num_played: %d\n"
-                       "last_played: %s\n\n",
+                       "last_played: %s\n"
+                       "tag info: %s\n",
                        (opts->flags & LS_FLAG_FULL_PATH)?
                                "path" : "file", d->path,
                        have_score? "score: " : "", score_buf,
@@ -748,7 +859,8 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts,
                        afhi->channels,
                        duration_buf,
                        afsi->num_played,
-                       last_played_time
+                       last_played_time,
+                       afhi->info_string
                );
                free(att_line);
                free(lyrics_line);
@@ -1722,10 +1834,12 @@ static int check_audio_file(struct osl_row *row, void *data)
        }
        ret = lyr_get_name_by_id(afsi.lyrics_id, &blob_name);
        if (ret < 0)
-               para_printf(pb, "%s lyrics id: %s\n", path, PARA_STRERROR(-ret));
+               para_printf(pb, "%s lyrics id %u: %s\n", path, afsi.lyrics_id,
+                       PARA_STRERROR(-ret));
        ret = img_get_name_by_id(afsi.image_id, &blob_name);
        if (ret < 0)
-               para_printf(pb, "%s image id: %s\n", path, PARA_STRERROR(-ret));
+               para_printf(pb, "%s image id %u: %s\n", path, afsi.image_id,
+                       PARA_STRERROR(-ret));
        return 1;
 }
 
@@ -1733,9 +1847,8 @@ int aft_check_callback(__a_unused const struct osl_object *query, struct osl_obj
 {
        struct para_buffer pb = {.buf = NULL};
 
+       para_printf(&pb, "checking audio file table...\n");
        audio_file_loop(&pb, check_audio_file);
-       if (!pb.size)
-               return 0;
        result->data = pb.buf;
        result->size = pb.size;
        return 1;
@@ -1771,10 +1884,9 @@ int aft_init(struct table_info *ti, const char *db)
 
        audio_file_table_desc.dir = db;
        ti->desc = &audio_file_table_desc;
-       ret = osl_open_table(ti->desc, &ti->table);
+       ret = osl_open_table(ti->desc, &audio_file_table);
        if (ret >= 0) {
                unsigned num;
-               audio_file_table = ti->table;
                osl_get_num_rows(audio_file_table, &num);
                PARA_INFO_LOG("audio file table contains %d files\n", num);
                return ret;