/********************************************************************** Audacity: A Digital Audio Editor RecordingPrefs.cpp Joshua Haberman Dominic Mazzoni James Crook *******************************************************************//** \class RecordingPrefs \brief A PrefsPanel used to select recording options. Presents interface for user to update the various recording options like playthrough, latency correction, and others. *//********************************************************************/ #include "../Audacity.h" #include #include #include #include "../AudioIO.h" #include "../Envelope.h" #include "../Prefs.h" #include "../ShuttleGui.h" #include "RecordingPrefs.h" using std::min; RecordingPrefs::RecordingPrefs(wxWindow * parent) : PrefsPanel(parent, _("Recording")) { Populate(); } RecordingPrefs::~RecordingPrefs() { } void RecordingPrefs::Populate() { //------------------------- Main section -------------------- // Now construct the GUI itself. // Use 'eIsCreatingFromPrefs' so that the GUI is // initialised with values from gPrefs. ShuttleGui S(this, eIsCreatingFromPrefs); PopulateOrExchange(S); // ----------------------- End of main section -------------- } void RecordingPrefs::PopulateOrExchange(ShuttleGui & S) { wxTextCtrl *w; S.SetBorder(2); S.StartStatic(_("Playthrough")); { S.TieCheckBox(_("Overdub: &Play other tracks while recording new one"), wxT("/AudioIO/Duplex"), true); #if defined(__WXMAC__) S.TieCheckBox(_("&Hardware Playthrough: Listen while recording or monitoring new track"), wxT("/AudioIO/Playthrough"), false); #endif S.TieCheckBox(_("&Software Playthrough: Listen while recording or monitoring new track"), wxT("/AudioIO/SWPlaythrough"), false); #if !defined(__WXMAC__) S.AddUnits(wxString(wxT(" ")) + _("(uncheck when recording \"stereo mix\")")); #endif } S.EndStatic(); S.StartStatic( _("Latency")); { S.StartThreeColumn(); { // only show the following controls if we use Portaudio v19, because // for Portaudio v18 we always use default buffer sizes w = S.TieTextBox(_("Audio to &buffer:"), wxT("/AudioIO/LatencyDuration"), DEFAULT_LATENCY_DURATION, 9); S.AddUnits(_("milliseconds (higher = more latency)")); w->SetName(w->GetName() + wxT(" ") + _("milliseconds (higher = more latency)")); w = S.TieTextBox(_("L&atency correction:"), wxT("/AudioIO/LatencyCorrection"), DEFAULT_LATENCY_CORRECTION, 9); S.AddUnits(_("milliseconds (negative = backwards)")); w->SetName(w->GetName() + wxT(" ") + _("milliseconds (negative = backwards)")); } S.EndThreeColumn(); } S.EndStatic(); S.StartStatic(_("Sound Activated Recording")); { S.TieCheckBox(_("Sound Activated &Recording"), wxT("/AudioIO/SoundActivatedRecord"), false); S.StartMultiColumn(2, wxEXPAND); { S.SetStretchyCol(1); int dBRange = gPrefs->Read(wxT("/GUI/EnvdBRange"), ENV_DB_RANGE); S.TieSlider(_("Sound Activation Le&vel (dB):"), wxT("/AudioIO/SilenceLevel"), -50, 0, -dBRange); } S.EndMultiColumn(); } S.EndStatic(); #ifdef AUTOMATED_INPUT_LEVEL_ADJUSTMENT S.StartStatic(_("Automated Input Level Adjustment")); { S.TieCheckBox(_("Enable Automated Input Level Adjustment."), wxT("/AudioIO/AutomatedInputLevelAdjustment"), false); S.StartMultiColumn(2, wxEXPAND); { S.SetStretchyCol(1); S.TieSlider(_("Target Peak:"), wxT("/AudioIO/TargetPeak"), AILA_DEF_TARGET_PEAK, 100, 0); S.TieSlider(_("Within:"), wxT("/AudioIO/DeltaPeakVolume"), AILA_DEF_DELTA_PEAK, 100, 0); } S.EndMultiColumn(); S.StartThreeColumn(); { S.TieTextBox(_("Analysis Time:"), wxT("/AudioIO/AnalysisTime"), AILA_DEF_ANALYSIS_TIME, 9); S.AddUnits(_("milliseconds (time of one analysis)")); S.TieTextBox(_("Number of consecutive analysis:"), wxT("/AudioIO/NumberAnalysis"), AILA_DEF_NUMBER_ANALYSIS, 2); S.AddUnits(_("0 means endless")); } S.EndThreeColumn(); } S.EndStatic(); #endif } bool RecordingPrefs::Apply() { ShuttleGui S(this, eIsSavingToPrefs); PopulateOrExchange(S); double latencyDuration = DEFAULT_LATENCY_DURATION; gPrefs->Read(wxT("/AudioIO/LatencyDuration"), &latencyDuration); if (latencyDuration < 0) { gPrefs->Write(wxT("/AudioIO/LatencyDuration"), DEFAULT_LATENCY_DURATION); } #ifdef AUTOMATED_INPUT_LEVEL_ADJUSTMENT double targetpeak, deltapeak; gPrefs->Read(wxT("/AudioIO/TargetPeak"), &targetpeak); gPrefs->Read(wxT("/AudioIO/DeltaPeakVolume"), &deltapeak); if (targetpeak + deltapeak > 100.0 || targetpeak - deltapeak < 0.0) gPrefs->Write(wxT("/AudioIO/DeltaPeakVolume"), min(100.0 - targetpeak, targetpeak)); int value; gPrefs->Read(wxT("/AudioIO/AnalysisTime"), &value); if (value <= 0) gPrefs->Write(wxT("/AudioIO/AnalysisTime"), AILA_DEF_ANALYSIS_TIME); gPrefs->Read(wxT("/AudioIO/NumberAnalysis"), &value); if (value < 0) gPrefs->Write(wxT("/AudioIO/NumberAnalysis"), AILA_DEF_NUMBER_ANALYSIS); #endif return true; } // Indentation settings for Vim and Emacs and unique identifier for Arch, a // version control system. Please do not modify past this point. // // Local Variables: // c-basic-offset: 3 // indent-tabs-mode: nil // End: // // vim: et sts=3 sw=3 // arch-tag: d6904b91-a320-4194-8d60-caa9175b6bb4