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); }
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); }