X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=aft.c;h=cc6026fa8518fe467b7c69bb898a020e25130467;hb=8355c4a3da89caf9b50b593aca55567a6b58a224;hp=6010d5def12175af7b3be545bd2d475aa7703b7b;hpb=d85f74ca004d40e251d58ce8eed31e6786a6a6a3;p=paraslash.git diff --git a/aft.c b/aft.c index 6010d5de..cc6026fa 100644 --- a/aft.c +++ b/aft.c @@ -313,14 +313,24 @@ enum afhi_offsets { 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 = 20, - /** EOF timeout in ms. */ - AFHI_EOF_OFFSET = 21, + /** The total number of chunks (4 bytes). */ + CHUNKS_TOTAL_OFFSET = 20, + /** The length of the audio file header (4 bytes). */ + HEADER_LEN_OFFSET = 24, + /** The start of the audio file header (4 bytes). */ + HEADER_OFFSET_OFFSET = 28, + /** The seconds part of the chunk time (4 bytes). */ + CHUNK_TV_TV_SEC_OFFSET = 32, + /** The microseconds part of the chunk time (4 bytes). */ + CHUNK_TV_TV_USEC_OFFSET = 36, + /** Number of channels is stored here. (1 byte) */ + AFHI_CHANNELS_OFFSET = 40, + /** EOF timeout in ms. (2 byte) */ + AFHI_EOF_OFFSET = 41, /** The tag info position. */ - AFHI_INFO_STRING_OFFSET = 23, + AFHI_INFO_STRING_OFFSET = 43, /** Minimal on-disk size of a valid afhi struct. */ - MIN_AFHI_SIZE = 24 + MIN_AFHI_SIZE = 44 }; static unsigned sizeof_afhi_buf(const struct afh_info *afhi) @@ -334,16 +344,19 @@ static void save_afhi(struct afh_info *afhi, char *buf) { if (!afhi) return; - write_u32(buf + AFHI_SECONDS_TOTAL_OFFSET, - afhi->seconds_total); + write_u32(buf + AFHI_SECONDS_TOTAL_OFFSET, 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_u32(buf + CHUNKS_TOTAL_OFFSET, afhi->chunks_total); + write_u32(buf + HEADER_LEN_OFFSET, afhi->header_len); + write_u32(buf + HEADER_OFFSET_OFFSET, afhi->header_offset); + write_u32(buf + CHUNK_TV_TV_SEC_OFFSET, afhi->chunk_tv.tv_sec); + write_u32(buf + CHUNK_TV_TV_USEC_OFFSET, afhi->chunk_tv.tv_usec); 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)); } static void load_afhi(const char *buf, struct afh_info *afhi) @@ -354,41 +367,26 @@ static void load_afhi(const char *buf, struct afh_info *afhi) afhi->header_offset = read_u32(buf + AFHI_HEADER_OFFSET_OFFSET); afhi->header_len = read_u32(buf + AFHI_HEADER_LEN_OFFSET); afhi->channels = read_u8(buf + AFHI_CHANNELS_OFFSET); + afhi->chunks_total = read_u32(buf + CHUNKS_TOTAL_OFFSET); + afhi->header_len = read_u32(buf + HEADER_LEN_OFFSET); + afhi->header_offset = read_u32(buf + HEADER_OFFSET_OFFSET); + afhi->chunk_tv.tv_sec = read_u32(buf + CHUNK_TV_TV_SEC_OFFSET); + afhi->chunk_tv.tv_usec = read_u32(buf + CHUNK_TV_TV_USEC_OFFSET); ms2tv(read_u16(buf + AFHI_EOF_OFFSET), &afhi->eof_tv); strcpy(afhi->info_string, buf + AFHI_INFO_STRING_OFFSET); } -//#define SIZEOF_CHUNK_TABLE(afhi) (((afhi)->chunks_total + 1) * sizeof(uint32_t)) - -static unsigned sizeof_chunk_info_buf(struct afh_info *afhi) +static unsigned sizeof_chunk_table(struct afh_info *afhi) { if (!afhi) return 0; - return 4 * (afhi->chunks_total + 1) + 20; - + return 4 * (afhi->chunks_total + 1); } -/** The offsets of the data contained in the AFTCOL_CHUNKS column. */ -enum chunk_info_offsets{ - /** The total number of chunks (4 bytes). */ - CHUNKS_TOTAL_OFFSET = 0, - /** The length of the audio file header (4 bytes). */ - HEADER_LEN_OFFSET = 4, - /** The start of the audio file header (4 bytes). */ - HEADER_OFFSET_OFFSET = 8, - /** The seconds part of the chunk time (4 bytes). */ - CHUNK_TV_TV_SEC_OFFSET = 12, - /** The microseconds part of the chunk time (4 bytes). */ - CHUNK_TV_TV_USEC = 16, - /** Chunk table entries start here. */ - CHUNK_TABLE_OFFSET = 20, -}; - static void save_chunk_table(struct afh_info *afhi, char *buf) { int i; - PARA_DEBUG_LOG("%lu chunks\n", afhi->chunks_total); for (i = 0; i <= afhi->chunks_total; i++) write_u32(buf + 4 * i, afhi->chunk_table[i]); } @@ -396,43 +394,12 @@ static void save_chunk_table(struct afh_info *afhi, char *buf) static void load_chunk_table(struct afh_info *afhi, char *buf) { int i; + + afhi->chunk_table = para_malloc(sizeof_chunk_table(afhi)); for (i = 0; i <= afhi->chunks_total; i++) afhi->chunk_table[i] = read_u32(buf + 4 * i); } -/* TODO: audio format handlers could just produce this */ -static void save_chunk_info(struct afh_info *afhi, char *buf) -{ - if (!afhi) - return; - write_u32(buf + CHUNKS_TOTAL_OFFSET, afhi->chunks_total); - write_u32(buf + HEADER_LEN_OFFSET, afhi->header_len); - write_u32(buf + HEADER_OFFSET_OFFSET, afhi->header_offset); - write_u32(buf + CHUNK_TV_TV_SEC_OFFSET, afhi->chunk_tv.tv_sec); - write_u32(buf + CHUNK_TV_TV_USEC, afhi->chunk_tv.tv_usec); - save_chunk_table(afhi, buf + CHUNK_TABLE_OFFSET); -} - -static int load_chunk_info(struct osl_object *obj, struct afh_info *afhi) -{ - char *buf = obj->data; - - if (obj->size < CHUNK_TABLE_OFFSET) - return -E_BAD_DATA_SIZE; - - afhi->chunks_total = read_u32(buf + CHUNKS_TOTAL_OFFSET); - afhi->header_len = read_u32(buf + HEADER_LEN_OFFSET); - afhi->header_offset = read_u32(buf + HEADER_OFFSET_OFFSET); - afhi->chunk_tv.tv_sec = read_u32(buf + CHUNK_TV_TV_SEC_OFFSET); - afhi->chunk_tv.tv_usec = read_u32(buf + CHUNK_TV_TV_USEC); - - if ((afhi->chunks_total + 1) * 4 + CHUNK_TABLE_OFFSET > obj->size) - return -E_BAD_DATA_SIZE; - afhi->chunk_table = para_malloc((afhi->chunks_total + 1) * 4); - load_chunk_table(afhi, buf + CHUNK_TABLE_OFFSET); - return 1; -} - /** * Get the row of the audio file table corresponding to the given path. * @@ -610,8 +577,7 @@ int get_afhi_of_row(const struct osl_row *row, struct afh_info *afhi) /* returns shmid on success */ static int save_afd(struct audio_file_data *afd) { - size_t size = sizeof(*afd) - + 4 * (afd->afhi.chunks_total + 1); + size_t size = sizeof(*afd) + sizeof_chunk_table(&afd->afhi); PARA_DEBUG_LOG("size: %zu\n", size); int shmid, ret = shm_new(size); @@ -647,7 +613,6 @@ int load_afd(int shmid, struct audio_file_data *afd) *afd = *(struct audio_file_data *)shm_afd; buf = shm_afd; buf += sizeof(*afd); - afd->afhi.chunk_table = para_malloc((afd->afhi.chunks_total + 1) * 4); load_chunk_table(&afd->afhi, buf); shm_detach(shm_afd); return 1; @@ -710,9 +675,7 @@ int open_and_update_audio_file(struct osl_row *aft_row, new_afsi.last_played = time(NULL); save_afsi(&new_afsi, &afsi_obj); /* in-place update */ - ret = load_chunk_info(&chunk_table_obj, &afd->afhi); - if (ret < 0) - goto err; + load_chunk_table(&afd->afhi, chunk_table_obj.data); { struct ls_data d = { .afhi = afd->afhi, @@ -733,9 +696,9 @@ int open_and_update_audio_file(struct osl_row *aft_row, aced.old_afsi = &old_afsi; afs_event(AFSI_CHANGE, NULL, &aced); ret = save_afd(afd); + free(afd->afhi.chunk_table); if (ret < 0) goto err; - free(afd->afhi.chunk_table); err: osl_close_disk_object(&chunk_table_obj); return ret; @@ -1418,7 +1381,7 @@ static void save_audio_file_info(HASH_TYPE *hash, const char *path, size_t path_len = strlen(path) + 1; size_t afhi_size = sizeof_afhi_buf(afhi); size_t size = AFTROW_PATH_OFFSET + path_len + afhi_size - + sizeof_chunk_info_buf(afhi); + + sizeof_chunk_table(afhi); char *buf = para_malloc(size); uint16_t pos; @@ -1438,7 +1401,7 @@ static void save_audio_file_info(HASH_TYPE *hash, const char *path, pos += afhi_size; PARA_DEBUG_LOG("size: %zu, chunks start at %d\n", size, pos); write_u16(buf + AFTROW_CHUNKS_OFFSET_POS, pos); - save_chunk_info(afhi, buf + pos); + save_chunk_table(afhi, buf + pos); PARA_DEBUG_LOG("last byte in buf: %p\n", buf + size - 1); obj->data = buf; obj->size = size;