예제 #1
0
static void metadata_cb(const FLAC__StreamDecoder *, const FLAC__StreamMetadata *metadata, void *client_data)
{
	FLACClientData &client = *static_cast<FLACClientData *>(client_data);

	if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO && metadata->data.stream_info.total_samples != 0)
	{
		if(!sampleRate) sampleRate = metadata->data.stream_info.sample_rate;
		client.channels = metadata->data.stream_info.channels;

		if(!FLAC__format_sample_rate_is_subset(sampleRate))
		{
			// FLAC only supports 10 Hz granularity for frequencies above 65535 Hz if the streamable subset is chosen.
			FLAC__stream_encoder_set_streamable_subset(client.encoder, false);
		}
		FLAC__stream_encoder_set_channels(client.encoder, client.channels);
		FLAC__stream_encoder_set_bits_per_sample(client.encoder, metadata->data.stream_info.bits_per_sample);
		FLAC__stream_encoder_set_sample_rate(client.encoder, sampleRate <= FLAC__MAX_SAMPLE_RATE ? sampleRate : FLAC__MAX_SAMPLE_RATE);
		FLAC__stream_encoder_set_total_samples_estimate(client.encoder, metadata->data.stream_info.total_samples);
		FLAC__stream_encoder_set_compression_level(client.encoder, 8);
	} else if(metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT)
	{
		for(FLAC__uint32 i = 0; i < metadata->data.vorbis_comment.num_comments; i++)
		{
			const char *tag = reinterpret_cast<const char *>(metadata->data.vorbis_comment.comments[i].entry);
			const FLAC__uint32 length = metadata->data.vorbis_comment.comments[i].length;
			if(length > 11 && !_strnicmp(tag, "SAMPLERATE=", 11))
			{
				sampleRate = atoi(tag + 11);
			}
		}
		client.metadata.push_back(FLAC__metadata_object_clone(metadata));
	} else
	{
		client.metadata.push_back(FLAC__metadata_object_clone(metadata));
	}
}
예제 #2
0
FLAC__bool test_format(void)
{
	unsigned i;

	printf("\n+++ libFLAC unit test: format\n\n");

	for(i = 0; i < sizeof(SAMPLE_RATES)/sizeof(SAMPLE_RATES[0]); i++) {
		printf("testing FLAC__format_sample_rate_is_valid(%u)... ", SAMPLE_RATES[i].rate);
		if(FLAC__format_sample_rate_is_valid(SAMPLE_RATES[i].rate) != SAMPLE_RATES[i].valid) {
			printf("FAILED, expected %s, got %s\n", true_false_string_[SAMPLE_RATES[i].valid], true_false_string_[!SAMPLE_RATES[i].valid]);
			return false;
		}
		printf("OK\n");
	}

	for(i = 0; i < sizeof(SAMPLE_RATES)/sizeof(SAMPLE_RATES[0]); i++) {
		printf("testing FLAC__format_sample_rate_is_subset(%u)... ", SAMPLE_RATES[i].rate);
		if(FLAC__format_sample_rate_is_subset(SAMPLE_RATES[i].rate) != SAMPLE_RATES[i].subset) {
			printf("FAILED, expected %s, got %s\n", true_false_string_[SAMPLE_RATES[i].subset], true_false_string_[!SAMPLE_RATES[i].subset]);
			return false;
		}
		printf("OK\n");
	}

	for(i = 0; i < sizeof(VCENTRY_NAMES)/sizeof(VCENTRY_NAMES[0]); i++) {
		printf("testing FLAC__format_vorbiscomment_entry_name_is_legal(\"%s\")... ", VCENTRY_NAMES[i].string);
		if(FLAC__format_vorbiscomment_entry_name_is_legal(VCENTRY_NAMES[i].string) != VCENTRY_NAMES[i].valid) {
			printf("FAILED, expected %s, got %s\n", true_false_string_[VCENTRY_NAMES[i].valid], true_false_string_[!VCENTRY_NAMES[i].valid]);
			return false;
		}
		printf("OK\n");
	}

	for(i = 0; i < sizeof(VCENTRY_VALUES)/sizeof(VCENTRY_VALUES[0]); i++) {
		printf("testing FLAC__format_vorbiscomment_entry_value_is_legal(\"%s\", %u)... ", VCENTRY_VALUES[i].string, VCENTRY_VALUES[i].length);
		if(FLAC__format_vorbiscomment_entry_value_is_legal(VCENTRY_VALUES[i].string, VCENTRY_VALUES[i].length) != VCENTRY_VALUES[i].valid) {
			printf("FAILED, expected %s, got %s\n", true_false_string_[VCENTRY_VALUES[i].valid], true_false_string_[!VCENTRY_VALUES[i].valid]);
			return false;
		}
		printf("OK\n");
	}

	for(i = 0; i < sizeof(VCENTRY_VALUES_NT)/sizeof(VCENTRY_VALUES_NT[0]); i++) {
		printf("testing FLAC__format_vorbiscomment_entry_value_is_legal(\"%s\", -1)... ", VCENTRY_VALUES_NT[i].string);
		if(FLAC__format_vorbiscomment_entry_value_is_legal(VCENTRY_VALUES_NT[i].string, (unsigned)(-1)) != VCENTRY_VALUES_NT[i].valid) {
			printf("FAILED, expected %s, got %s\n", true_false_string_[VCENTRY_VALUES_NT[i].valid], true_false_string_[!VCENTRY_VALUES_NT[i].valid]);
			return false;
		}
		printf("OK\n");
	}

	for(i = 0; i < sizeof(VCENTRIES)/sizeof(VCENTRIES[0]); i++) {
		printf("testing FLAC__format_vorbiscomment_entry_is_legal(\"%s\", %u)... ", VCENTRIES[i].string, VCENTRIES[i].length);
		if(FLAC__format_vorbiscomment_entry_is_legal(VCENTRIES[i].string, VCENTRIES[i].length) != VCENTRIES[i].valid) {
			printf("FAILED, expected %s, got %s\n", true_false_string_[VCENTRIES[i].valid], true_false_string_[!VCENTRIES[i].valid]);
			return false;
		}
		printf("OK\n");
	}

	printf("\nPASSED!\n");
	return true;
}