int flac_write( const char* filename, const char *predicate, const char* uri ) { if (strcmp(predicate, LL_LICENSE) != 0) { return -LL_E_MODULE_WRITE_FAIL; /* We only know License */ } int ret = 1; FLAC__Metadata_SimpleIterator *iter = FLAC__metadata_simple_iterator_new(); if (FLAC__metadata_simple_iterator_init(iter,filename,false,false) && FLAC__metadata_simple_iterator_is_writable(iter)) { FLAC__bool found_vc = false; do { if (FLAC__metadata_simple_iterator_get_block_type(iter) == FLAC__METADATA_TYPE_VORBIS_COMMENT) { FLAC__StreamMetadata *vc; found_vc = true; vc = FLAC__metadata_simple_iterator_get_block(iter); if (uri) { FLAC__StreamMetadata_VorbisComment_Entry entry; FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(&entry, "LICENSE", uri); FLAC__metadata_object_vorbiscomment_replace_comment(vc,entry,true,false); } else { int i = FLAC__metadata_object_vorbiscomment_find_entry_from(vc,0,"LICENSE"); if (i != -1) { FLAC__metadata_object_vorbiscomment_delete_comment(vc,i); } } ret = FLAC__metadata_simple_iterator_set_block(iter, vc, true); FLAC__metadata_object_delete(vc); break; } } while (FLAC__metadata_simple_iterator_next(iter)); if (!found_vc && uri) { FLAC__StreamMetadata *vc = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT); FLAC__StreamMetadata_VorbisComment_Entry entry; FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(&entry, "LICENSE", uri); FLAC__metadata_object_vorbiscomment_append_comment(vc,entry,false); ret = FLAC__metadata_simple_iterator_insert_block_after(iter,vc,true); FLAC__metadata_object_delete(vc); } } else { ret = 0; } FLAC__metadata_simple_iterator_delete(iter); return ret; }
FLAC__bool flac__utils_set_channel_mask_tag(FLAC__StreamMetadata *object, FLAC__uint32 channel_mask) { FLAC__StreamMetadata_VorbisComment_Entry entry = { 0, 0 }; char tag[128]; FLAC__ASSERT(object); FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); FLAC__ASSERT(strlen(CHANNEL_MASK_TAG+1+2+16+1) <= sizeof(tag)); /* +1 for =, +2 for 0x, +16 for digits, +1 for NUL */ entry.entry = (FLAC__byte*)tag; #if defined _MSC_VER || defined __MINGW32__ if((entry.length = _snprintf(tag, sizeof(tag), "%s=0x%04X", CHANNEL_MASK_TAG, (unsigned)channel_mask)) >= sizeof(tag)) #else if((entry.length = snprintf(tag, sizeof(tag), "%s=0x%04X", CHANNEL_MASK_TAG, (unsigned)channel_mask)) >= sizeof(tag)) #endif return false; if(!FLAC__metadata_object_vorbiscomment_replace_comment(object, entry, /*all=*/true, /*copy=*/true)) return false; return true; }
// ======================================== // Vorbis comment utilities // ======================================== static bool SetVorbisComment(FLAC__StreamMetadata *block, const char *key, CFStringRef value) { assert(NULL != block); assert(NULL != key); // Remove the existing comment with this name if(-1 == FLAC__metadata_object_vorbiscomment_remove_entry_matching(block, key)) { log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("org.sbooth.AudioEngine.AudioMetadata.FLAC"); LOG4CXX_WARN(logger, "FLAC__metadata_object_vorbiscomment_remove_entry_matching() failed"); return false; } // Nothing left to do if value is NULL if(NULL == value) return true; CFIndex valueCStringSize = CFStringGetMaximumSizeForEncoding(CFStringGetLength(value), kCFStringEncodingUTF8) + 1; char valueCString [valueCStringSize]; if(!CFStringGetCString(value, valueCString, valueCStringSize, kCFStringEncodingUTF8)) { log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("org.sbooth.AudioEngine.AudioMetadata.FLAC"); LOG4CXX_WARN(logger, "CFStringGetCString() failed"); return false; } FLAC__StreamMetadata_VorbisComment_Entry entry; if(!FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(&entry, key, valueCString)) { log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("org.sbooth.AudioEngine.AudioMetadata.FLAC"); LOG4CXX_WARN(logger, "FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair() failed"); return false; } if(!FLAC__metadata_object_vorbiscomment_replace_comment(block, entry, false, false)) { log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("org.sbooth.AudioEngine.AudioMetadata.FLAC"); LOG4CXX_WARN(logger, "FLAC__metadata_object_vorbiscomment_replace_comment() failed"); return false; } return true; }