X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=133fe672f1f576b2a5ce10e66c665dc8a91c8250;hp=c99b5ac52dc5f336d85d6a311fd80b0cd2f3ad9f;hb=045273c289eb3d972eea99df99967f680b06940f;hpb=a5b65db9da1cd81c25494429ea8adb5d76e5b32a diff --git a/aft.c b/aft.c index c99b5ac5..133fe672 100644 --- a/aft.c +++ b/aft.c @@ -96,20 +96,6 @@ struct ls_widths { unsigned short num_played_width; }; -/** Data passed to the different compare functions (called by qsort()). */ -struct ls_data { - /** Usual audio format handler information. */ - struct afh_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; -}; - /** Data passed from the ls command handler to its callback function. */ struct ls_options { /** The given command line flags. */ @@ -323,12 +309,18 @@ enum afhi_offsets { AFHI_BITRATE_OFFSET = 4, /** Position of the frequency. */ AFHI_FREQUENCY_OFFSET = 8, + /** Location of the audio file header. */ + AFHI_HEADER_OFFSET_OFFSET = 12, + /* Length of the audio file header. Zero means: No header. */ + AFHI_HEADER_LEN_OFFSET = 16, /** Number of channels is stored here. */ - AFHI_CHANNELS_OFFSET = 12, + AFHI_CHANNELS_OFFSET = 20, + /** EOF timeout in ms. */ + AFHI_EOF_OFFSET = 21, /** The tag info position. */ - AFHI_INFO_STRING_OFFSET = 13, + AFHI_INFO_STRING_OFFSET = 23, /** Minimal on-disk size of a valid afhi struct. */ - MIN_AFHI_SIZE = 14 + MIN_AFHI_SIZE = 24 }; static unsigned sizeof_afhi_buf(const struct afh_info *afhi) @@ -346,7 +338,10 @@ static void save_afhi(struct afh_info *afhi, char *buf) afhi->seconds_total); write_u32(buf + AFHI_BITRATE_OFFSET, afhi->bitrate); write_u32(buf + AFHI_FREQUENCY_OFFSET, afhi->frequency); + write_u32(buf + AFHI_HEADER_OFFSET_OFFSET, afhi->header_offset); + write_u32(buf + AFHI_HEADER_LEN_OFFSET, afhi->header_len); write_u8(buf + AFHI_CHANNELS_OFFSET, afhi->channels); + write_u16(buf + AFHI_EOF_OFFSET, tv2ms(&afhi->eof_tv)); strcpy(buf + AFHI_INFO_STRING_OFFSET, afhi->info_string); /* OK */ PARA_DEBUG_LOG("last byte written: %p\n", buf + AFHI_INFO_STRING_OFFSET + strlen(afhi->info_string)); } @@ -357,6 +352,9 @@ static void load_afhi(const char *buf, struct afh_info *afhi) afhi->bitrate = read_u32(buf + AFHI_BITRATE_OFFSET); afhi->frequency = read_u32(buf + AFHI_FREQUENCY_OFFSET); afhi->channels = read_u8(buf + AFHI_CHANNELS_OFFSET); + afhi->header_offset = read_u32(buf + AFHI_HEADER_OFFSET_OFFSET); + afhi->header_len = read_u32(buf + AFHI_HEADER_LEN_OFFSET); + ms2tv(read_u16(buf + AFHI_EOF_OFFSET), &afhi->eof_tv); strcpy(afhi->info_string, buf + AFHI_INFO_STRING_OFFSET); } @@ -675,7 +673,7 @@ int open_and_update_audio_file(struct osl_row *aft_row, struct audio_file_data * int ret = get_hash_of_row(aft_row, &aft_hash); struct afsi_change_event_data aced; struct osl_object map, chunk_table_obj; - char *tmp, *path; + char *path; if (ret < 0) return ret; @@ -716,13 +714,22 @@ int open_and_update_audio_file(struct osl_row *aft_row, struct audio_file_data * ret = load_chunk_info(&chunk_table_obj, &afd->afhi); if (ret < 0) goto err; - ret = get_attribute_text(&afd->afsi.attributes, " ", &tmp); - if (ret < 0) - goto err; - tmp[sizeof(afd->attributes_string) - 1] = '\0'; - strcpy(afd->attributes_string, tmp); /* OK */ - free(tmp); - + { + struct ls_data d = { + .afhi = afd->afhi, + .afsi = afd->afsi, + .path = path, + .score = afd->score, + .hash = file_hash + }; + struct para_buffer pb = {.buf = NULL}; + ret = make_status_items(&d, &pb); + if (ret < 0) + goto err; + strncpy(afd->afs_status_info, pb.buf, AFS_STATUS_INFO_SIZE); + afd->afs_status_info[AFS_STATUS_INFO_SIZE] = '\0'; + free(pb.buf); + } aced.aft_row = aft_row; aced.old_afsi = &afd->afsi; afs_event(AFSI_CHANGE, NULL, &aced); @@ -888,7 +895,6 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, att_lines = make_attribute_lines(att_buf, afsi); lyrics_line = make_lyrics_line(afsi); image_line = make_image_line(afsi); - /* TODO: Merge this with status items */ if (opts->mode == LS_MODE_VERBOSE) { para_printf(b, "%s: %s\n" /* path */ @@ -930,7 +936,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, "Received: from\nTo: bar\nFrom: a\n" "Subject: %s\n\n" /* path */ "%s%s%s" /* score */ - "%s" + "%s\n" /* attributes */ "hash: %s\n" "image_id: %s\n" "lyrics_id: %s\n" @@ -969,6 +975,19 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, return 1; } +int make_status_items(struct ls_data *d, struct para_buffer *pb) +{ + struct ls_options opts = { + .flags = LS_FLAG_FULL_PATH | LS_FLAG_ADMISSIBLE_ONLY, + .mode = LS_MODE_VERBOSE, + }; + time_t current_time; + + time(¤t_time); + return print_list_item(d, &opts, pb, current_time); +} + + static int ls_audio_format_compare(const void *a, const void *b) { struct ls_data *d1 = *(struct ls_data **)a, *d2 = *(struct ls_data **)b; @@ -1689,7 +1708,7 @@ static int add_one_audio_file(const char *path, const void *private_data) save_audio_file_info(hash, path, afhi_ptr, pad->flags, format_num, &obj); /* Ask afs to consider this entry for adding. */ ret = send_callback_request(com_add_callback, &obj, &result); - if (ret >= 0 && result.data && result.size) { + if (ret > 0) { ret2 = send_va_buffer(pad->fd, "%s", (char *)result.data); free(result.data); if (ret >= 0 && ret2 < 0)