// Path: voicesmith/src/de/jurihock/voicesmith/audio/HeadsetMode.java
// public enum HeadsetMode
// {
//     WIRED_HEADPHONES,
// 	WIRED_HEADSET,
// 	BLUETOOTH_HEADSET
// }
// 
// Path: voicesmith/src/de/jurihock/voicesmith/threads/AudioThread.java
// public abstract class AudioThread implements Runnable, Disposable
// {
// 	protected final Context	context;
// 	protected final AudioDevice	input, output;
// 
// 	private Thread				thread	= null;
// 
// 	public AudioThread(Context context, AudioDevice input, AudioDevice output)
// 	{
// 		this.context = context;
// 		this.input = input;
// 		this.output = output;
// 	}
// 
// 	public void configure(String value)
// 	{
// 		// ReentrantLock lock = new ReentrantLock(true);
// 		// lock.lock();
// 		// try { ... } finally { lock.unlock(); }
// 	}
// 
// 	public void dispose()
// 	{
// 		stop();
// 
// 		new Utils(context).log("Disposing an audio thread.");
// 	}
// 
// 	public boolean isRunning()
// 	{
// 		return (thread != null)
// 			&& (thread.getState() != Thread.State.TERMINATED);
// 	}
// 
// 	public void start()
// 	{
// 		if (isRunning()) return;
// 
// 		thread = new Thread(this);
// 		thread.start();
// 	}
// 
// 	public void stop()
// 	{
// 		if (!isRunning()) return;
// 
// 		thread.interrupt();
// 
// 		try
// 		{
// 			thread.join();
// 		}
// 		catch (InterruptedException exception)
// 		{
// 			new Utils(context).log(exception);
// 		}
// 		finally
// 		{
// 			thread = null;
// 		}
// 	}
// 
// 	public void run()
// 	{
// 		android.os.Process.setThreadPriority(
// 			android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
// 
// 		output.start();
// 		input.start();
// 
// 		doProcessing();
// 
// 		input.stop();
// 		output.stop();
// 	}
// 
// 	protected abstract void doProcessing();
// 
// 	public static AudioThread create(Context context, AudioDevice input, AudioDevice output, DAFX dafx)
// 	{
// 		switch (dafx)
// 		{
// 		case Robotize:
// 			return new RobotizeThread(context, input, output);
// 		case Transpose:
// 			return new TransposeThread(context, input, output);
// 		case Detune:
// 			return new DetuneThread(context, input, output);
// 		case Hoarseness:
// 			return new HoarsenessThread(context, input, output);
// 		default:
// 			throw new IllegalArgumentException("Illegal DAFX argument!");
// 		}
// 	}
// 
// 	public static AudioThread create(Context context, AudioDevice input, AudioDevice output, AAF aaf)
// 	{
// 		switch (aaf)
// 		{
// 		case FAF:
// 			return new TransposeThread(context, input, output);
// 		case DAF:
// 			return new DelayThread(context, input, output);
// 		case UnprocessedFeedback:
// 			return new LowDelayThread(context, input, output);
// 		default:
// 			throw new IllegalArgumentException("Illegal AAF argument!");
// 		}
// 	}
// }


import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.preference.PreferenceManager;
import de.jurihock.voicesmith.audio.HeadsetMode;
import de.jurihock.voicesmith.threads.AudioThread;
	}

	public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener)
	{
		preferences.unregisterOnSharedPreferenceChangeListener(listener);
	}

	public void reset()
	{
		preferences.edit().clear().commit();

        // There are no needs to show the Change Log again after reset
        this.setChangeLogShowed(true);
	}

    public boolean isChangeLogShowed()
    {
        return preferences.getBoolean("ChangeLog", false);
    }

    public boolean setChangeLogShowed(boolean value)
    {
        return preferences.edit().putBoolean("ChangeLog", value).commit();
    }

    public boolean isForceVolumeLevelOn()
    {
        return preferences.getBoolean("ForceVolumeLevel", true);
    }

// Path: voicesmith/src/de/jurihock/voicesmith/audio/HeadsetMode.java
// public enum HeadsetMode
// {
//     WIRED_HEADPHONES,
// 	WIRED_HEADSET,
// 	BLUETOOTH_HEADSET
// }
// 
// Path: voicesmith/src/de/jurihock/voicesmith/threads/AudioThread.java
// public abstract class AudioThread implements Runnable, Disposable
// {
// 	protected final Context	context;
// 	protected final AudioDevice	input, output;
// 
// 	private Thread				thread	= null;
// 
// 	public AudioThread(Context context, AudioDevice input, AudioDevice output)
// 	{
// 		this.context = context;
// 		this.input = input;
// 		this.output = output;
// 	}
// 
// 	public void configure(String value)
// 	{
// 		// ReentrantLock lock = new ReentrantLock(true);
// 		// lock.lock();
// 		// try { ... } finally { lock.unlock(); }
// 	}
// 
// 	public void dispose()
// 	{
// 		stop();
// 
// 		new Utils(context).log("Disposing an audio thread.");
// 	}
// 
// 	public boolean isRunning()
// 	{
// 		return (thread != null)
// 			&& (thread.getState() != Thread.State.TERMINATED);
// 	}
// 
// 	public void start()
// 	{
// 		if (isRunning()) return;
// 
// 		thread = new Thread(this);
// 		thread.start();
// 	}
// 
// 	public void stop()
// 	{
// 		if (!isRunning()) return;
// 
// 		thread.interrupt();
// 
// 		try
// 		{
// 			thread.join();
// 		}
// 		catch (InterruptedException exception)
// 		{
// 			new Utils(context).log(exception);
// 		}
// 		finally
// 		{
// 			thread = null;
// 		}
// 	}
// 
// 	public void run()
// 	{
// 		android.os.Process.setThreadPriority(
// 			android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
// 
// 		output.start();
// 		input.start();
// 
// 		doProcessing();
// 
// 		input.stop();
// 		output.stop();
// 	}
// 
// 	protected abstract void doProcessing();
// 
// 	public static AudioThread create(Context context, AudioDevice input, AudioDevice output, DAFX dafx)
// 	{
// 		switch (dafx)
// 		{
// 		case Robotize:
// 			return new RobotizeThread(context, input, output);
// 		case Transpose:
// 			return new TransposeThread(context, input, output);
// 		case Detune:
// 			return new DetuneThread(context, input, output);
// 		case Hoarseness:
// 			return new HoarsenessThread(context, input, output);
// 		default:
// 			throw new IllegalArgumentException("Illegal DAFX argument!");
// 		}
// 	}
// 
// 	public static AudioThread create(Context context, AudioDevice input, AudioDevice output, AAF aaf)
// 	{
// 		switch (aaf)
// 		{
// 		case FAF:
// 			return new TransposeThread(context, input, output);
// 		case DAF:
// 			return new DelayThread(context, input, output);
// 		case UnprocessedFeedback:
// 			return new LowDelayThread(context, input, output);
// 		default:
// 			throw new IllegalArgumentException("Illegal AAF argument!");
// 		}
// 	}
// }


// Path: voicesmith/src/de/jurihock/voicesmith/Preferences.java
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.preference.PreferenceManager;
import de.jurihock.voicesmith.audio.HeadsetMode;
import de.jurihock.voicesmith.threads.AudioThread;

	}

	public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener)
	{
		preferences.unregisterOnSharedPreferenceChangeListener(listener);
	}

	public void reset()
	{
		preferences.edit().clear().commit();

        // There are no needs to show the Change Log again after reset
        this.setChangeLogShowed(true);
	}

    public boolean isChangeLogShowed()
    {
        return preferences.getBoolean("ChangeLog", false);
    }

    public boolean setChangeLogShowed(boolean value)
    {
        return preferences.edit().putBoolean("ChangeLog", value).commit();
    }

    public boolean isForceVolumeLevelOn()
    {
        return preferences.getBoolean("ForceVolumeLevel", true);
    }

	public int getVolumeLevel(HeadsetMode mode)