static sound_file *check_write_date(const char *name, sound_file *sf) { if (sf) { time_t date; date = local_file_write_date(name); if (date == sf->write_date) return(sf); if ((sf->header_type == MUS_RAW) && (mus_header_no_header(name))) { int chan; mus_long_t data_size; /* sound has changed since we last read it, but it has no header, so * the only sensible thing to check is the new length (i.e. caller * has set other fields by hand) */ sf->write_date = date; chan = mus_file_open_read(name); data_size = lseek(chan, 0L, SEEK_END); sf->true_file_length = data_size; sf->samples = mus_bytes_to_samples(sf->data_format, data_size); CLOSE(chan, name); return(sf); } /* otherwise our data base is out-of-date, so clear it out */ free_sound_file(sf); } return(NULL); }
int mus_sound_open_input(const char *arg) { int fd = -1; if (!(mus_file_probe(arg))) mus_error(MUS_CANT_OPEN_FILE, "mus_sound_open_input: can't open %s: %s", arg, STRERROR(errno)); else { sound_file *sf = NULL; mus_sound_initialize(); sf = get_sf(arg); if (sf) { fd = mus_file_open_read(arg); if (fd == -1) mus_error(MUS_CANT_OPEN_FILE, "mus_sound_open_input: can't open %s: %s", arg, STRERROR(errno)); else { mus_file_open_descriptors(fd, arg, sf->sample_type, sf->datum_size, sf->data_location, sf->chans, sf->header_type); lseek(fd, sf->data_location, SEEK_SET); if (sf->saved_data) mus_file_save_data(fd, sf->samples / sf->chans, sf->saved_data); } } } return(fd); }
static void reposition_file_buffers(snd_data *sd, mus_long_t index) { int fd = 0; bool reclose = false; if (index < 0) index = 0; /* if reading in reverse, don't fall off the start of the buffer */ if (sd->open == FD_CLOSED) { file_info *hdr; /* try to open it with sndlib descriptors */ fd = mus_file_open_read(sd->filename); if (fd == -1) { /* our file has disappeared?!? */ snd_error("%s is unreadable: %s?", sd->filename, snd_io_strerror()); return; } hdr = sd->hdr; /* these need to flush active data before hidden close and fixup the io indices */ snd_file_open_descriptors(fd, sd->filename, hdr->format, hdr->data_location, hdr->chans, hdr->type); during_open(fd, sd->filename, SND_REOPEN_CLOSED_FILE); /* fix up io->fd and whatever else is clobbered by mus_file_close */ sd->io->fd = fd; sd->open = FD_OPEN; reclose = true; } reposition_file_buffers_1(index, sd->io); if (reclose) { sd->open = FD_CLOSED; sd->io->fd = -1; mus_file_close(fd); } }
char *mus_sound_comment(const char *name) { mus_long_t start, end, len; char *sc = NULL; sound_file *sf = NULL; sf = get_sf(name); if (sf) { start = sf->comment_start; end = sf->comment_end; if (end == 0) { if (sf->aux_comment_start) { if ((sf->header_type == MUS_RIFF) || (sf->header_type == MUS_RF64)) sc = mus_header_riff_aux_comment(name, sf->aux_comment_start, sf->aux_comment_end); if ((sf->header_type == MUS_AIFF) || (sf->header_type == MUS_AIFC)) sc = mus_header_aiff_aux_comment(name, sf->aux_comment_start, sf->aux_comment_end); } } else { if (end <= sf->true_file_length) { len = end - start + 1; if (len > 0) { /* open and get the comment */ ssize_t bytes; int fd; char *auxcom; fd = mus_file_open_read(name); if (fd == -1) return(NULL); lseek(fd, start, SEEK_SET); sc = (char *)calloc(len + 1, sizeof(char)); bytes = read(fd, sc, len); CLOSE(fd, name); if (((sf->header_type == MUS_AIFF) || (sf->header_type == MUS_AIFC)) && (sf->aux_comment_start) && (bytes != 0)) { auxcom = mus_header_aiff_aux_comment(name, sf->aux_comment_start, sf->aux_comment_end); if (auxcom) { size_t full_len; full_len = strlen(auxcom) + strlen(sc) + 2; sc = (char *)realloc(sc, full_len * sizeof(char)); strcat(sc, "\n"); strcat(sc, auxcom); } } } } } } return(sc); }