static void FLAC__decoder_metadata_callback(FLAC__StreamDecoder const * const flac, FLAC__StreamMetadata const * const metadata, void * const client_data) { sox_format_t * ft = (sox_format_t *) client_data; priv_t * p = (priv_t *)ft->priv; (void) flac; if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) { p->bits_per_sample = metadata->data.stream_info.bits_per_sample; p->channels = metadata->data.stream_info.channels; p->sample_rate = metadata->data.stream_info.sample_rate; p->total_samples = metadata->data.stream_info.total_samples; } else if (metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { size_t i; if (metadata->data.vorbis_comment.num_comments == 0) return; if (ft->oob.comments != NULL) { lsx_warn("multiple Vorbis comment block ignored"); return; } for (i = 0; i < metadata->data.vorbis_comment.num_comments; ++i) sox_append_comment(&ft->oob.comments, (char const *) metadata->data.vorbis_comment.comments[i].entry); } }
sox_comments_t sox_copy_comments(sox_comments_t comments) { sox_comments_t result = 0; if (comments) while (*comments) sox_append_comment(&result, *comments++); return result; }
void sox_append_comments(sox_comments_t * comments, char const * comment) { char * end; if (comment) { while ((end = strchr(comment, '\n'))) { size_t len = end - comment; char * c = lsx_malloc((len + 1) * sizeof(*c)); strncpy(c, comment, len); c[len] = '\0'; sox_append_comment(comments, c); comment += len + 1; free(c); } if (*comment) sox_append_comment(comments, comment); } }