io_error_t snd_write_header(const char *name, int type, int srate, int chans, mus_long_t samples, int format, const char *comment, int *loops) { int err; /* sndlib-style error */ /* trap mus_error locally here so that callers of open_temp_file can cleanup samplers and whatnot */ local_mus_error = MUS_NO_ERROR; old_error_handler = mus_error_set_handler(local_mus_error_to_snd); mus_sound_forget(name); mus_header_set_aiff_loop_info(loops); err = mus_write_header(name, type, srate, chans, samples, format, comment); /* err here is a mus error */ if (err != MUS_NO_ERROR) { if (errno == EMFILE) /* 0 => no error (err not actually returned unless it's -1) */ { err = too_many_files_cleanup(); if (err != -1) err = mus_write_header(name, type, srate, chans, samples, format, comment); else { mus_error_set_handler(old_error_handler); return(IO_TOO_MANY_OPEN_FILES); } } } else mus_header_set_aiff_loop_info(NULL); mus_error_set_handler(old_error_handler); return(sndlib_error_to_snd(local_mus_error)); }
const char *mus_array_to_file_with_error(const char *filename, mus_float_t *ddata, mus_long_t len, int srate, int channels) { /* put ddata into a sound file, taking byte order into account */ /* assume ddata is interleaved already if more than one channel */ int fd, err = MUS_NO_ERROR; mus_long_t oloc; mus_float_t *bufs[1]; mus_sound_forget(filename); err = mus_write_header(filename, MUS_NEXT, srate, channels, len * channels, MUS_OUT_FORMAT, "array->file"); if (err != MUS_NO_ERROR) return("mus_array_to_file can't create output file"); oloc = mus_header_data_location(); fd = mus_file_reopen_write(filename); lseek(fd, oloc, SEEK_SET); err = mus_file_open_descriptors(fd, filename, MUS_OUT_FORMAT, mus_bytes_per_sample(MUS_OUT_FORMAT), oloc, channels, MUS_NEXT); if (err != MUS_ERROR) { bufs[0] = ddata; err = mus_file_write(fd, 0, len - 1, 1, bufs); /* 1 = chans?? */ } mus_file_close(fd); if (err == MUS_ERROR) return("mus_array_to_file write error"); return(NULL); }
void snd_remove(const char *name, cache_remove_t forget) { int err; if (forget == REMOVE_FROM_CACHE) mus_sound_forget(name); /* no error here if not in sound tables */ ss->local_errno = 0; err = remove(name); if (err != 0) snd_warning("remove %s: %s", name, snd_io_strerror()); }
int mus_sound_close_output(int fd, mus_long_t bytes_of_data) { char *name; name = mus_file_fd_name(fd); if (name) { int err = MUS_ERROR, old_type; char *fname; fname = mus_strdup(name); old_type = mus_file_header_type(fd); err = mus_file_close(fd); /* this frees the original fd->name, so we copied above */ /* fd is NULL now */ mus_sound_forget(fname); mus_header_change_data_size(fname, old_type, bytes_of_data); free(fname); return(err); } return(MUS_ERROR); }
int mus_sound_open_output(const char *arg, int srate, int chans, int data_format, int header_type, const char *comment) { int fd = MUS_ERROR, err; mus_sound_initialize(); mus_sound_forget(arg); err = mus_write_header(arg, header_type, srate, chans, 0, data_format, comment); if (err != MUS_ERROR) { fd = mus_file_open_write(arg); if (fd != -1) mus_file_open_descriptors(fd, arg, data_format, mus_bytes_per_sample(data_format), mus_header_data_location(), chans, header_type); } return(fd); }