+ in[nframes-1] = 1.0;
+
+ const float pan_law_attenuation = -3.0f;
+ const float scale = 2.0f - 4.0f * powf (10.0f,pan_law_attenuation/20.0f);
+
+ for (framecnt_t n = 0; n < nframes; ++n) {
+ float inVal = in[n];
+ float outVal = 1 - inVal;
+ out[n] = outVal * (scale * outVal + 1.0f - scale);
+ in[n] = inVal * (scale * inVal + 1.0f - scale);
+ }
+}
+
+EditMode
+string_to_edit_mode (string str)
+{
+ if (str == _("Splice")) {
+ return Splice;
+ } else if (str == _("Slide")) {
+ return Slide;
+ } else if (str == _("Lock")) {
+ return Lock;
+ }
+ fatal << string_compose (_("programming error: unknown edit mode string \"%1\""), str) << endmsg;
+ /*NOTREACHED*/
+ return Slide;
+}
+
+const char*
+edit_mode_to_string (EditMode mode)
+{
+ switch (mode) {
+ case Slide:
+ return _("Slide");
+
+ case Lock:
+ return _("Lock");
+
+ default:
+ case Splice:
+ return _("Splice");
+ }
+}
+
+SyncSource
+string_to_sync_source (string str)
+{
+ if (str == _("MIDI Timecode") || str == _("MTC")) {
+ return MTC;
+ }
+
+ if (str == _("MIDI Clock")) {
+ return MIDIClock;
+ }
+
+ if (str == _("JACK")) {
+ return JACK;
+ }
+
+ fatal << string_compose (_("programming error: unknown sync source string \"%1\""), str) << endmsg;
+ /*NOTREACHED*/
+ return JACK;
+}
+
+/** @param sh Return a short version of the string */
+const char*
+sync_source_to_string (SyncSource src, bool sh)
+{
+ switch (src) {
+ case JACK:
+ return _("JACK");
+
+ case MTC:
+ if (sh) {
+ return _("MTC");
+ } else {
+ return _("MIDI Timecode");
+ }
+
+ case MIDIClock:
+ return _("MIDI Clock");
+ }
+ /* GRRRR .... stupid, stupid gcc - you can't get here from there, all enum values are handled */
+ return _("JACK");
+}
+
+float
+meter_falloff_to_float (MeterFalloff falloff)
+{
+ switch (falloff) {
+ case MeterFalloffOff:
+ return METER_FALLOFF_OFF;
+ case MeterFalloffSlowest:
+ return METER_FALLOFF_SLOWEST;
+ case MeterFalloffSlow:
+ return METER_FALLOFF_SLOW;
+ case MeterFalloffMedium:
+ return METER_FALLOFF_MEDIUM;
+ case MeterFalloffFast:
+ return METER_FALLOFF_FAST;
+ case MeterFalloffFaster:
+ return METER_FALLOFF_FASTER;
+ case MeterFalloffFastest:
+ return METER_FALLOFF_FASTEST;
+ default:
+ return METER_FALLOFF_FAST;
+ }
+}
+
+MeterFalloff
+meter_falloff_from_float (float val)
+{
+ if (val == METER_FALLOFF_OFF) {
+ return MeterFalloffOff;
+ }
+ else if (val <= METER_FALLOFF_SLOWEST) {
+ return MeterFalloffSlowest;
+ }
+ else if (val <= METER_FALLOFF_SLOW) {
+ return MeterFalloffSlow;
+ }
+ else if (val <= METER_FALLOFF_MEDIUM) {
+ return MeterFalloffMedium;
+ }
+ else if (val <= METER_FALLOFF_FAST) {
+ return MeterFalloffFast;
+ }
+ else if (val <= METER_FALLOFF_FASTER) {
+ return MeterFalloffFaster;
+ }
+ else {
+ return MeterFalloffFastest;
+ }
+}
+
+AutoState
+ARDOUR::string_to_auto_state (std::string str)
+{
+ if (str == X_("Off")) {
+ return Off;
+ } else if (str == X_("Play")) {
+ return Play;
+ } else if (str == X_("Write")) {
+ return Write;
+ } else if (str == X_("Touch")) {
+ return Touch;
+ }
+
+ fatal << string_compose (_("programming error: %1 %2"), "illegal AutoState string: ", str) << endmsg;
+ /*NOTREACHED*/
+ return Touch;
+}