public void extractFeatures(InputStream in, String name, Updater updater)
			throws Exception {
		// Pre-process the recording and extract the samples from the audio
		this.updater = updater;
		double[] samples = preProcessRecording(in, name);
		if(cancel.isCancel()){
			throw new ExplicitCancel("Killed after loading data");
		}
		// Calculate the window start indices
		LinkedList<Integer> window_start_indices_list = new LinkedList<Integer>();
		int this_start = 0;
		while (this_start < samples.length) {
			window_start_indices_list.add(new Integer(this_start));
			this_start += window_size - window_overlap_offset;
		}
		Integer[] window_start_indices_I = window_start_indices_list
				.toArray(new Integer[1]);
		int[] window_start_indices = new int[window_start_indices_I.length];

		// if were using a progress bar, set its max update
		if (updater != null) {
			updater.setFileLength(window_start_indices.length);
		}

		for (int i = 0; i < window_start_indices.length; i++)
			window_start_indices[i] = window_start_indices_I[i].intValue();

		// Extract the feature values from the samples
		double[][][] window_feature_values = getFeatures(samples,
				window_start_indices);

		// Find the feature averages and standard deviations if appropriate
//		AggregatorContainer aggContainer = new AggregatorContainer();
		// FeatureDefinition[][] overall_feature_definitions = new
		// FeatureDefinition[1][];
		// overall_feature_definitions[0] = null;
		// double[][] overall_feature_values = null;
		if (save_overall_recording_features) {
//			Aggregator[] aggList = new Aggregator[10];
//			aggList[0] = new Mean();
//			aggList[1] = new StandardDeviation();
//			aggList[2] = new AreaMoments();
//			aggList[2].setParameters(new String[]{"MFCC"},new String[]{});
//			aggList[3] = new AreaMoments();
//			aggList[3].setParameters(new String[]{"LPC"},new String[]{});
//			aggList[4] = new AreaMoments();
//			aggList[4].setParameters(new String[]{"Derivative of MFCC"},new String[]{});
//			aggList[5] = new AreaMoments();
//			aggList[5].setParameters(new String[]{"Derivative of LPC"},new String[]{});
//			aggList[6] = new AreaMoments();
//			aggList[6].setParameters(new String[]{"Derivative of Method of Moments"},new String[]{});
//			aggList[7] = new AreaMoments();
//			aggList[7].setParameters(new String[]{"Method of Moments"},new String[]{});
//			aggList[8] = new AreaMoments();
//			aggList[8].setParameters(new String[]{"Area Method of Moments"},new String[]{});
//			aggList[9] = new AreaMoments();
//			aggList[9].setParameters(new String[]{"Derivative of Area Method of Moments"},new String[]{});
//			aggList[2] = new MFCC();
//			aggList[2] = new MultipleFeatureHistogram(new FeatureExtractor[]{new RMS(),new ZeroCrossings()},8);
//			aggList[3] = new MultipleFeatureHistogram(new FeatureExtractor[]{new MFCC()},4);
			
//			aggContainer.add(aggList);
			aggregator.add(feature_extractors, features_to_save);
			aggregator.aggregate(window_feature_values);
		}
		// overall_feature_values = getOverallRecordingFeatures(
		// window_feature_values, overall_feature_definitions);

		// Save the feature values for this recording
		if (outputType == 0) {
			saveACEFeatureVectorsForARecording(window_feature_values,
					window_start_indices, name,
					aggregator);
		} else if (outputType == 1) {
			saveARFFFeatureVectorsForARecording(window_feature_values,
					window_start_indices, name,
					aggregator);
		}

		// Save the feature definitions
		if (!definitions_written && (outputType == 0)) {
			saveFeatureDefinitions(window_feature_values, aggregator);
		}
	}