revamp encoder/decoder interface to use set methods instead on args to init
diff --git a/src/libFLAC/stream_encoder.c b/src/libFLAC/stream_encoder.c
index eb18622..ba41d8f 100644
--- a/src/libFLAC/stream_encoder.c
+++ b/src/libFLAC/stream_encoder.c
@@ -130,6 +130,7 @@
 
 const char *FLAC__StreamEncoderStateString[] = {
 	"FLAC__STREAM_ENCODER_OK",
+	"FLAC__STREAM_ENCODER_INVALID_CALLBACK",
 	"FLAC__STREAM_ENCODER_INVALID_NUMBER_OF_CHANNELS",
 	"FLAC__STREAM_ENCODER_INVALID_BITS_PER_SAMPLE",
 	"FLAC__STREAM_ENCODER_INVALID_SAMPLE_RATE",
@@ -182,6 +183,29 @@
 
 	encoder->protected->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
 
+	encoder->protected->streamable_subset = true;
+	encoder->protected->do_mid_side_stereo = false;
+	encoder->protected->loose_mid_side_stereo = false;
+	encoder->protected->channels = 2;
+	encoder->protected->bits_per_sample = 16;
+	encoder->protected->sample_rate = 44100;
+	encoder->protected->blocksize = 1152;
+	encoder->protected->max_lpc_order = 0;
+	encoder->protected->qlp_coeff_precision = 0;
+	encoder->protected->do_qlp_coeff_prec_search = false;
+	encoder->protected->do_exhaustive_model_search = false;
+	encoder->protected->min_residual_partition_order = 0;
+	encoder->protected->max_residual_partition_order = 0;
+	encoder->protected->rice_parameter_search_dist = 0;
+	encoder->protected->total_samples_estimate = 0;
+	encoder->protected->seek_table = 0;
+	encoder->protected->padding = 0;
+	encoder->protected->last_metadata_is_last = true;
+
+	encoder->private->write_callback = 0;
+	encoder->private->metadata_callback = 0;
+	encoder->private->client_data = 0;
+
 	return encoder;
 }
 
@@ -202,59 +226,21 @@
  *
  ***********************************************************************/
 
-FLAC__StreamEncoderState FLAC__stream_encoder_init(
-	FLAC__StreamEncoder *encoder,
-	bool streamable_subset,
-	bool do_mid_side_stereo,
-	bool loose_mid_side_stereo,
-	unsigned channels,
-	unsigned bits_per_sample,
-	unsigned sample_rate,
-	unsigned blocksize,
-	unsigned max_lpc_order,
-	unsigned qlp_coeff_precision,
-	bool do_qlp_coeff_prec_search,
-	bool do_exhaustive_model_search,
-	unsigned min_residual_partition_order,
-	unsigned max_residual_partition_order,
-	unsigned rice_parameter_search_dist,
-	uint64 total_samples_estimate,
-	const FLAC__StreamMetaData_SeekTable *seek_table,
-	unsigned padding,
-	bool last_metadata_is_last,
-	FLAC__StreamEncoderWriteStatus (*write_callback)(const FLAC__StreamEncoder *encoder, const byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data),
-	void (*metadata_callback)(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetaData *metadata, void *client_data),
-	void *client_data)
+FLAC__StreamEncoderState FLAC__stream_encoder_init(FLAC__StreamEncoder *encoder)
 {
 	unsigned i;
 	FLAC__StreamMetaData padding_block;
 	FLAC__StreamMetaData seek_table_block;
 
 	FLAC__ASSERT(encoder != 0);
-	FLAC__ASSERT(write_callback != 0);
-	FLAC__ASSERT(metadata_callback != 0);
 
 	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
 		return encoder->protected->state = FLAC__STREAM_ENCODER_ALREADY_INITIALIZED;
 
 	encoder->protected->state = FLAC__STREAM_ENCODER_OK;
 
-	encoder->protected->streamable_subset = streamable_subset;
-	encoder->protected->do_mid_side_stereo = do_mid_side_stereo;
-	encoder->protected->loose_mid_side_stereo = loose_mid_side_stereo;
-	encoder->protected->channels = channels;
-	encoder->protected->bits_per_sample = bits_per_sample;
-	encoder->protected->sample_rate = sample_rate;
-	encoder->protected->blocksize = blocksize;
-	encoder->protected->max_lpc_order = max_lpc_order;
-	encoder->protected->qlp_coeff_precision = qlp_coeff_precision;
-	encoder->protected->do_qlp_coeff_prec_search = do_qlp_coeff_prec_search;
-	encoder->protected->do_exhaustive_model_search = do_exhaustive_model_search;
-	encoder->protected->min_residual_partition_order = min_residual_partition_order;
-	encoder->protected->max_residual_partition_order = max_residual_partition_order;
-	encoder->protected->rice_parameter_search_dist = rice_parameter_search_dist;
-	encoder->protected->total_samples_estimate = total_samples_estimate;
-	encoder->protected->seek_table = seek_table;
+	if(0 == encoder->private->write_callback || 0 == encoder->private->metadata_callback)
+		return encoder->protected->state = FLAC__STREAM_ENCODER_INVALID_CALLBACK;
 
 	if(encoder->protected->channels == 0 || encoder->protected->channels > FLAC__MAX_CHANNELS)
 		return encoder->protected->state = FLAC__STREAM_ENCODER_INVALID_NUMBER_OF_CHANNELS;
@@ -411,9 +397,6 @@
 		return encoder->protected->state;
 	}
 	FLAC__bitbuffer_init(&encoder->private->frame);
-	encoder->private->write_callback = write_callback;
-	encoder->private->metadata_callback = metadata_callback;
-	encoder->private->client_data = client_data;
 
 	/*
 	 * write the stream header
@@ -425,7 +408,7 @@
 		return encoder->protected->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
 
 	encoder->private->metadata.type = FLAC__METADATA_TYPE_STREAMINFO;
-	encoder->private->metadata.is_last = (encoder->protected->seek_table == 0 && padding == 0 && last_metadata_is_last);
+	encoder->private->metadata.is_last = (encoder->protected->seek_table == 0 && encoder->protected->padding == 0 && encoder->protected->last_metadata_is_last);
 	encoder->private->metadata.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
 	encoder->private->metadata.data.stream_info.min_blocksize = encoder->protected->blocksize; /* this encoder uses the same blocksize for the whole stream */
 	encoder->private->metadata.data.stream_info.max_blocksize = encoder->protected->blocksize;
@@ -444,7 +427,7 @@
 		if(!FLAC__seek_table_is_valid(encoder->protected->seek_table))
 			return encoder->protected->state = FLAC__STREAM_ENCODER_INVALID_SEEK_TABLE;
 		seek_table_block.type = FLAC__METADATA_TYPE_SEEKTABLE;
-		seek_table_block.is_last = (padding == 0 && last_metadata_is_last);
+		seek_table_block.is_last = (encoder->protected->padding == 0 && encoder->protected->last_metadata_is_last);
 		seek_table_block.length = encoder->protected->seek_table->num_points * FLAC__STREAM_METADATA_SEEKPOINT_LEN;
 		seek_table_block.data.seek_table = *encoder->protected->seek_table;
 		if(!FLAC__add_metadata_block(&seek_table_block, &encoder->private->frame))
@@ -452,10 +435,10 @@
 	}
 
 	/* add a PADDING block if requested */
-	if(padding > 0) {
+	if(encoder->protected->padding > 0) {
 		padding_block.type = FLAC__METADATA_TYPE_PADDING;
-		padding_block.is_last = last_metadata_is_last;
-		padding_block.length = padding;
+		padding_block.is_last = encoder->protected->last_metadata_is_last;
+		padding_block.length = encoder->protected->padding;
 		if(!FLAC__add_metadata_block(&padding_block, &encoder->private->frame))
 			return encoder->protected->state = FLAC__STREAM_ENCODER_FRAMING_ERROR;
 	}
@@ -539,77 +522,245 @@
 	encoder->protected->state = FLAC__STREAM_ENCODER_UNINITIALIZED;
 }
 
-FLAC__StreamEncoderState FLAC__stream_encoder_state(const FLAC__StreamEncoder *encoder)
+bool FLAC__stream_encoder_set_streamable_subset(const FLAC__StreamEncoder *encoder, bool value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->streamable_subset = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_do_mid_side_stereo(const FLAC__StreamEncoder *encoder, bool value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->do_mid_side_stereo = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder, bool value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->loose_mid_side_stereo = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_channels(const FLAC__StreamEncoder *encoder, unsigned value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->channels = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_bits_per_sample(const FLAC__StreamEncoder *encoder, unsigned value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->bits_per_sample = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_sample_rate(const FLAC__StreamEncoder *encoder, unsigned value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->sample_rate = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_blocksize(const FLAC__StreamEncoder *encoder, unsigned value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->blocksize = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_max_lpc_order(const FLAC__StreamEncoder *encoder, unsigned value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->max_lpc_order = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_qlp_coeff_precision(const FLAC__StreamEncoder *encoder, unsigned value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->qlp_coeff_precision = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder, bool value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->do_qlp_coeff_prec_search = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder, bool value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->do_exhaustive_model_search = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_min_residual_partition_order(const FLAC__StreamEncoder *encoder, unsigned value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->min_residual_partition_order = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_max_residual_partition_order(const FLAC__StreamEncoder *encoder, unsigned value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->max_residual_partition_order = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder, unsigned value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->rice_parameter_search_dist = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_total_samples_estimate(const FLAC__StreamEncoder *encoder, uint64 value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->total_samples_estimate = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_seek_table(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetaData_SeekTable *value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->seek_table = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_padding(const FLAC__StreamEncoder *encoder, unsigned value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->padding = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_last_metadata_is_last(const FLAC__StreamEncoder *encoder, bool value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->protected->last_metadata_is_last = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_write_callback(const FLAC__StreamEncoder *encoder, FLAC__StreamEncoderWriteStatus (*value)(const FLAC__StreamEncoder *encoder, const byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data))
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->private->write_callback = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_metadata_callback(const FLAC__StreamEncoder *encoder, void (*value)(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetaData *metadata, void *client_data))
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->private->metadata_callback = value;
+	return true;
+}
+
+bool FLAC__stream_encoder_set_client_data(const FLAC__StreamEncoder *encoder, void *value)
+{
+	if(encoder->protected->state != FLAC__STREAM_ENCODER_UNINITIALIZED)
+		return false;
+	encoder->private->client_data = value;
+	return true;
+}
+
+FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->state;
 }
 
-bool FLAC__stream_encoder_streamable_subset(const FLAC__StreamEncoder *encoder)
+bool FLAC__stream_encoder_get_streamable_subset(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->streamable_subset;
 }
 
-bool FLAC__stream_encoder_do_mid_side_stereo(const FLAC__StreamEncoder *encoder)
+bool FLAC__stream_encoder_get_do_mid_side_stereo(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->do_mid_side_stereo;
 }
 
-bool FLAC__stream_encoder_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder)
+bool FLAC__stream_encoder_get_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->loose_mid_side_stereo;
 }
 
-unsigned FLAC__stream_encoder_channels(const FLAC__StreamEncoder *encoder)
+unsigned FLAC__stream_encoder_get_channels(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->channels;
 }
 
-unsigned FLAC__stream_encoder_bits_per_sample(const FLAC__StreamEncoder *encoder)
+unsigned FLAC__stream_encoder_get_bits_per_sample(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->bits_per_sample;
 }
 
-unsigned FLAC__stream_encoder_sample_rate(const FLAC__StreamEncoder *encoder)
+unsigned FLAC__stream_encoder_get_sample_rate(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->sample_rate;
 }
 
-unsigned FLAC__stream_encoder_blocksize(const FLAC__StreamEncoder *encoder)
+unsigned FLAC__stream_encoder_get_blocksize(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->blocksize;
 }
 
-unsigned FLAC__stream_encoder_max_lpc_order(const FLAC__StreamEncoder *encoder)
+unsigned FLAC__stream_encoder_get_max_lpc_order(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->max_lpc_order;
 }
 
-unsigned FLAC__stream_encoder_qlp_coeff_precision(const FLAC__StreamEncoder *encoder)
+unsigned FLAC__stream_encoder_get_qlp_coeff_precision(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->qlp_coeff_precision;
 }
 
-bool FLAC__stream_encoder_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder)
+bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->do_qlp_coeff_prec_search;
 }
 
-bool FLAC__stream_encoder_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder)
+bool FLAC__stream_encoder_get_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->do_exhaustive_model_search;
 }
 
-unsigned FLAC__stream_encoder_min_residual_partition_order(const FLAC__StreamEncoder *encoder)
+unsigned FLAC__stream_encoder_get_min_residual_partition_order(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->min_residual_partition_order;
 }
 
-unsigned FLAC__stream_encoder_max_residual_partition_order(const FLAC__StreamEncoder *encoder)
+unsigned FLAC__stream_encoder_get_max_residual_partition_order(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->max_residual_partition_order;
 }
 
-unsigned FLAC__stream_encoder_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder)
+unsigned FLAC__stream_encoder_get_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder)
 {
 	return encoder->protected->rice_parameter_search_dist;
 }
@@ -1637,4 +1788,3 @@
 
 	return shift;
 }
-