es.po update by rafa, add ms win10 cygwin port, add pulseaudio, new config flags... master
authorGood Guy <good1.2guy@gmail.com>
Tue, 28 Jan 2020 01:48:36 +0000 (18:48 -0700)
committerGood Guy <good1.2guy@gmail.com>
Tue, 28 Jan 2020 01:48:36 +0000 (18:48 -0700)
59 files changed:
cinelerra-5.1/blds/cygwin.bld [new file with mode: 0755]
cinelerra-5.1/blds/cygwin.patch [new file with mode: 0644]
cinelerra-5.1/cinelerra/Makefile
cinelerra-5.1/cinelerra/adeviceprefs.C
cinelerra-5.1/cinelerra/adeviceprefs.h
cinelerra-5.1/cinelerra/adeviceprefs.inc
cinelerra-5.1/cinelerra/androidcontrol.C
cinelerra-5.1/cinelerra/assetpopup.C
cinelerra-5.1/cinelerra/audioalsa.C
cinelerra-5.1/cinelerra/audioalsa.h
cinelerra-5.1/cinelerra/audioconfig.C
cinelerra-5.1/cinelerra/audioconfig.h
cinelerra-5.1/cinelerra/audiodevice.C
cinelerra-5.1/cinelerra/audiodevice.h
cinelerra-5.1/cinelerra/audiodevice.inc
cinelerra-5.1/cinelerra/audioodevice.C
cinelerra-5.1/cinelerra/audiopulse.C [new file with mode: 0644]
cinelerra-5.1/cinelerra/audiopulse.h [new file with mode: 0644]
cinelerra-5.1/cinelerra/audiopulse.inc [new file with mode: 0644]
cinelerra-5.1/cinelerra/cwindow.inc
cinelerra-5.1/cinelerra/editpopup.C
cinelerra-5.1/cinelerra/indexfile.C
cinelerra-5.1/cinelerra/mainsession.C
cinelerra-5.1/cinelerra/mwindow.C
cinelerra-5.1/cinelerra/playbackconfig.C
cinelerra-5.1/cinelerra/playbackconfig.h
cinelerra-5.1/cinelerra/recordconfig.C
cinelerra-5.1/cinelerra/recordconfig.h
cinelerra-5.1/cinelerra/samples.C
cinelerra-5.1/cinelerra/samples.h
cinelerra-5.1/cinelerra/shuttle.h
cinelerra-5.1/cinelerra/shuttle.inc
cinelerra-5.1/cinelerra/swindow.C
cinelerra-5.1/cinelerra/trackcanvas.C
cinelerra-5.1/cinelerra/vdeviceprefs.C
cinelerra-5.1/configure.ac
cinelerra-5.1/guicast/bcbitmap.C
cinelerra-5.1/guicast/bcbitmap.h
cinelerra-5.1/guicast/bcclipboard.C
cinelerra-5.1/guicast/bcsignals.C
cinelerra-5.1/guicast/bctextbox.C
cinelerra-5.1/guicast/bctextbox.h
cinelerra-5.1/guicast/bctrace.C
cinelerra-5.1/guicast/bcwindowbase.C
cinelerra-5.1/guicast/bcwindowbase.h
cinelerra-5.1/guicast/bcwindowdraw.C
cinelerra-5.1/guicast/bcwindowevents.C
cinelerra-5.1/guicast/cstrdup.h
cinelerra-5.1/guicast/thread.h
cinelerra-5.1/plugins/chromakey/chromakey.C
cinelerra-5.1/plugins/denoisefft/denoisefft.C
cinelerra-5.1/plugins/mandelcuda/.swp [deleted file]
cinelerra-5.1/plugins/nbodycuda/.swp [deleted file]
cinelerra-5.1/plugins/shapewipe/Makefile
cinelerra-5.1/plugins/titler/titler.C
cinelerra-5.1/plugins/titler/titler.h
cinelerra-5.1/plugins/titler/titlerwindow.C
cinelerra-5.1/po/es.po
cinelerra-5.1/thirdparty/src/libxcb.patch1 [new file with mode: 0755]

diff --git a/cinelerra-5.1/blds/cygwin.bld b/cinelerra-5.1/blds/cygwin.bld
new file mode 100755 (executable)
index 0000000..270c42c
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/bash
+( ./autogen.sh
+  CYGWIN=1 CFLAGS="-g -O2" ./configure --with-single-user -without-gl \
+    --disable-static-build --without-lv2 --disable-lame --disable-twolame \
+    --without-oss --without-alsa --without-firewire --without-dv --without-dvb \
+    --without-video4linux2 --without-xxf86vm --without-ladspa-build \
+    --without-libzmpeg --without-commercial --without-thirdparty \
+    --without-vaapi --without-vdpau --without-shuttle \
+    --without-x10tv --without-wintv --without-ladspa
+  make
+  make install ) 2>&1 | tee log
diff --git a/cinelerra-5.1/blds/cygwin.patch b/cinelerra-5.1/blds/cygwin.patch
new file mode 100644 (file)
index 0000000..a984a7f
--- /dev/null
@@ -0,0 +1,212 @@
+diff --git a/cinelerra-5.1/cinelerra/Makefile b/cinelerra-5.1/cinelerra/Makefile
+index 645b273..e482dcd 100644
+--- a/cinelerra-5.1/cinelerra/Makefile
++++ b/cinelerra-5.1/cinelerra/Makefile
+@@ -428,13 +428,28 @@ LIBS := $(LIBRARIES)
+ ifneq ($(WANT_CIN_3RDPARTY),no)
+ LIBS += $(libraries)
+ else
++LIBS += -Wl,--export-all-symbols -g
++LIBS += -Wl,--out-implib,$(OBJDIR)/lib$(WANT_CIN).exe.a
++LIBS += -L$(FF_DIR)/lib
++LIBS += -Wl,-rpath-link=:$(FF_DIR)/lib
++LIBS += -Wl,--as-needed -Wl,--warn-common
++LIBS += -lavdevice
++LIBS += -lavfilter
++LIBS += -lavformat
++LIBS += -lavcodec
++LIBS += -lswresample
++LIBS += -lswscale
++LIBS += -lavutil
++
++LIBS += -lvpx -lwebp -lwebpmux
++LIBS += -ljpeg -lFLAC -lgif -lsndfile -ltiff
++
++LIBS += -lsecur32 -lole32 -luser32 -luser32 -lbcrypt -lshell32
+ LIBS += -lpthread -lm -lbz2 -llzma -lz -lpng -luuid
+-LIBS += -lX11 -lXau -lXdmcp -lXext -lXfixes -lXv -lXinerama
++LIBS += -lX11 -lXau -lXdmcp -lXext -lXfixes -lXinerama
++LIBS += -lintl -liconv
+ LIBS += -lfontconfig -lfreetype
+-LIBS += -lavcodec -lavdevice -lavfilter -lavformat -lavresample -lavutil
+-LIBS += -lswresample -lswscale
+-LIBS += -lvpx -lwebp -lwebpmux
+ LIBS += $(if $(filter fftw,$(static_pkgs)), -lfftw3)
+ LIBS += $(if $(filter flac,$(static_pkgs)), -lFLAC)
+@@ -454,7 +470,7 @@ LIBS += $(if $(filter x265,$(static_pkgs)), -lx265)
+ LIBS += $(if $(filter libvpx,$(static_pkgs)), -lvpx)
+ ifneq ($(WANT_GL),no)
+-LIBS += -lGL -lGLU -lGLX
++LIBS += -lGL -lGLU
+ endif
+ ifneq ($(WANT_XFT),no)
+ LIBS += -lXft
+@@ -548,7 +564,7 @@ CFLAGS += -DUSE_ALPHA
+ else
+-LDFLAGS1 = -Wl,-export-dynamic -g
++LDFLAGS1 = -Wl,-export-all-symbols -g
+ LDFLAGS2 = $(LDFLAGS)
+ LINKER = $(CXX) -o $(OUTPUT)
+@@ -566,7 +582,7 @@ all:       $(OUTPUT) $(CUTADS) $(BDWRITE) $(LV2UI)
+ $(OUTPUT): $(OBJS) $(THEME_DATA) $(DCRAW) $(LIBRARIES)
+       $(LINKER) `cat $(OBJDIR)/objs`
+       $(if $(findstring -g,$(CFLAGS)),objcopy --only-keep-debug $(OUTPUT) $(OUTPUT_G))
+-      $(if $(findstring -ggdb,$(CFLAGS)),,strip $(OUTPUT))
++      #$(if $(findstring -ggdb,$(CFLAGS)),,strip $(OUTPUT))
+       ln -f -s ../bin/$(WANT_CIN) ci
+ ifneq ($(WANT_COMMERCIAL),no)
+@@ -574,7 +590,7 @@ $(CUTADS): $(CUTOBJS) $(CUTLIBS) $(LIBRARIES)
+       @echo g++ -o $@ $(CUTOBJS)
+       @g++ $(CFLAGS) -pthread -o $@ $(CUTOBJS) $(CUTLIBS) $(LIBS)
+       $(if $(findstring -g,$(CFLAGS)),objcopy --only-keep-debug $(CUTADS) $(CUTADS).debuginfo)
+-      $(if $(findstring -ggdb,$(CFLAGS)),,strip $(CUTADS))
++      #$(if $(findstring -ggdb,$(CFLAGS)),,strip $(CUTADS))
+ install-cutads:
+       cp -av $(OBJDIR)/cutads $(BINDIR)/.
+@@ -586,7 +602,7 @@ $(BDWRITE):        $(BDWOBJS) $(LIBRARIES)
+       @echo g++ -o $@ $(BDWOBJS)
+       @g++ $(CFLAGS) -pthread -o $@ $(BDWOBJS) $(LIBS)
+       $(if $(findstring -g,$(CFLAGS)),objcopy --only-keep-debug $(BDWRITE) $(BDWRITE).debuginfo)
+-      $(if $(findstring -ggdb,$(CFLAGS)),,strip $(BDWRITE))
++      #$(if $(findstring -ggdb,$(CFLAGS)),,strip $(BDWRITE))
+ install-bdwrite:
+       cp -av $(OBJDIR)/bdwrite $(BINDIR)/.
+@@ -629,7 +645,7 @@ $(OBJDIR)/lv2ui: $(LV2OBJS)
+       @echo $(CXX) \`cat $(OBJDIR)/c_flags\` $^ -o $@
+       @$(CXX) `cat $(OBJDIR)/c_flags` $^ -o $@ $(LIBS) $(GTK2_LIBS)
+       $(if $(findstring -g,$(CFLAGS)),objcopy --only-keep-debug $(LV2UI) $(LV2UI).debuginfo)
+-      $(if $(findstring -ggdb,$(CFLAGS)),,strip $(LV2UI))
++      #$(if $(findstring -ggdb,$(CFLAGS)),,strip $(LV2UI))
+ .PHONY:       lv2ui
+ lv2ui:        $(LV2UI)
+diff --git a/cinelerra-5.1/db/tdb.h b/cinelerra-5.1/db/tdb.h
+index 8ee8800..9a17091 100644
+--- a/cinelerra-5.1/db/tdb.h
++++ b/cinelerra-5.1/db/tdb.h
+@@ -32,7 +32,7 @@ inline void operator delete[](void *t,size_t n) { free(t); }
+ #endif
+ #define ZMEDIA
+-#define ZFUTEX
++//#define ZFUTEX
+ #ifdef ZFUTEX
+ #include <unistd.h>
+ #include <endian.h>
+diff --git a/cinelerra-5.1/guicast/bcresources.C b/cinelerra-5.1/guicast/bcresources.C
+index 1d52855..fdab491 100644
+--- a/cinelerra-5.1/guicast/bcresources.C
++++ b/cinelerra-5.1/guicast/bcresources.C
+@@ -367,8 +367,8 @@ BC_Resources::BC_Resources(float x_scale, float y_scale)
+       BC_WindowBase::resources = this;
+       synchronous = 0;
+       vframe_shm = 0;
+-      use_shm = -1;
+-      shm_reply = 1;
++      use_shm = 0;
++      shm_reply = 0;
+       if( x_scale <= 0 ) x_scale = 1;
+       if( y_scale <= 0 ) y_scale = x_scale;
+diff --git a/cinelerra-5.1/guicast/filesystem.h b/cinelerra-5.1/guicast/filesystem.h
+index c976135..5613702 100644
+--- a/cinelerra-5.1/guicast/filesystem.h
++++ b/cinelerra-5.1/guicast/filesystem.h
+@@ -26,6 +26,9 @@
+ #include "bcwindowbase.inc"
+ #include "sizes.h"
++#define dirent64 dirent
++#define readdir64 readdir
++
+ class FileItem
+ {
+ public:
+diff --git a/cinelerra-5.1/plugin_config b/cinelerra-5.1/plugin_config
+index 56f4351..f7149bb 100644
+--- a/cinelerra-5.1/plugin_config
++++ b/cinelerra-5.1/plugin_config
+@@ -4,12 +4,21 @@ CFLAGS += -I../ -I$(CINELERRA) -I$(GUICAST) -I../colors -fPIC
+ CFLAGS += $(static_incs)
+ LFLAGS += $(static_libs)
+ LFLAGS += $(LDFLAGS)
++
++LFLAGS +=  -Wl,$(CINELERRA)/$(OBJDIR)/libcin.exe.a
++LFLAGS += -lintl -liconv
++ifneq ($(WANT_GL),no)
++LFLAGS += -lGL -lGLU
++endif
++
+ LDLINKER ?= $(CXX) -shared
+ $(shell mkdir -p $(OBJDIR))
++#SFX=plugin
++SFX=dll
+ PLUGIN_DIR := $(BINDIR)/plugins
+ OUTPUT_DIR = $(PLUGIN_DIR)/$($(PLUGIN))
+-OUTPUT = $(OUTPUT_DIR)/$(PLUGIN).plugin
++OUTPUT = $(OUTPUT_DIR)/$(PLUGIN).$(SFX)
+ OUTPUT_G = $(OBJDIR)/$(PLUGIN).debuginfo
+ $(shell echo $(CFLAGS) > $(OBJDIR)/c_flags)
+@@ -20,16 +29,16 @@ ifeq ($(OUTPUT_THEME),)
+ $(OUTPUT): $(OBJS) $(OUTPUT_DIR) $(OUTPUT_BINS)
+       $(LDLINKER) -o $(OUTPUT) $(OBJS) $(OUTPUT_BINS) `cat $(OBJDIR)/l_flags`
+       $(if $(findstring -g,$(CFLAGS)),objcopy --only-keep-debug $(OUTPUT) $(OUTPUT_G))
+-      $(if $(findstring -ggdb,$(CFLAGS)),,strip $(OUTPUT))
++      #$(if $(findstring -ggdb,$(CFLAGS)),,strip $(OUTPUT))
+ else
+ THEME_DATA = $(OBJDIR)/$(PLUGIN)_data.o
+ $(OUTPUT_THEME): $(OBJS) $(OUTPUT_DIR) $(THEME_DATA)
+-      $(LDLINKER) -o $(OUTPUT_THEME) $(OBJS) $(THEME_DATA) $(LDFLAGS)
++      $(LDLINKER) -o $(OUTPUT_THEME) $(OBJS) $(THEME_DATA) `cat $(OBJDIR)/l_flags`
+       $(if $(findstring -g,$(CFLAGS)),objcopy --only-keep-debug $(OUTPUT_THEME) $(OUTPUT_G))
+-      $(if $(findstring -ggdb,$(CFLAGS)),,strip $(OUTPUT_THEME))
++      #$(if $(findstring -ggdb,$(CFLAGS)),,strip $(OUTPUT_THEME))
+ $(THEME_DATA):
+       cd $(OBJDIR) && \
+diff --git a/cinelerra-5.1/plugins/Makefile b/cinelerra-5.1/plugins/Makefile
+index 22bc7dd..6404536 100644
+--- a/cinelerra-5.1/plugins/Makefile
++++ b/cinelerra-5.1/plugins/Makefile
+@@ -36,7 +36,6 @@ DIRS = $(OPENCV_OBJS) \
+       brightness \
+       burn \
+       C41 \
+-      cdripper \
+       chorus \
+       chromakey \
+       chromakeyhsv \
+@@ -176,6 +175,8 @@ DIRS = $(OPENCV_OBJS) \
+ #     denoisemjpeg \
+ # duplicate
+ #     vocoder \
++# not in bsd or win
++#     cdripper \
+ PLUGIN_DIR = $(BINDIR)/plugins
+ DATA = $(PLUGIN_DIR)/fonts $(PLUGIN_DIR)/shapes
+diff --git a/cinelerra-5.1/guicast/bcsignals.C b/cinelerra-5.1/guicast/bcsignals.C
+--- guicast/bcsignals.C        2020-01-27 07:27:45.332623800 -0700
++++ guicast/bcsignals.C        2020-01-27 07:28:11.443049600 -0700
+@@ -44,6 +44,7 @@
+ #include <sys/prctl.h>
+ #endif
+ #include <sys/types.h>
++#include <sys/wait.h>
+ BC_Signals* BC_Signals::global_signals = 0;
+ static int signal_done = 0;
index 7e69a50..645b273 100644 (file)
@@ -64,6 +64,7 @@ OBJS := $(OVERLAYS) \
        $(OBJDIR)/audioidevice.o \
        $(OBJDIR)/audioodevice.o \
        $(OBJDIR)/audiooss.o \
        $(OBJDIR)/audioidevice.o \
        $(OBJDIR)/audioodevice.o \
        $(OBJDIR)/audiooss.o \
+       $(OBJDIR)/audiopulse.o \
        $(OBJDIR)/audiov4l2mpeg.o \
        $(OBJDIR)/autoconf.o \
        $(OBJDIR)/automation.o \
        $(OBJDIR)/audiov4l2mpeg.o \
        $(OBJDIR)/autoconf.o \
        $(OBJDIR)/automation.o \
@@ -461,6 +462,9 @@ endif
 ifneq ($(WANT_ALSA),no)
 LIBS += -lasound
 endif
 ifneq ($(WANT_ALSA),no)
 LIBS += -lasound
 endif
+ifneq ($(WANT_PULSE),no)
+LIBS += -lpulse-simple -lpulse
+endif
 ifneq ($(WANT_OPENEXR),no)
 LIBS += -lIex -lIexMath -lIlmImf -lIlmImfUtil
 endif
 ifneq ($(WANT_OPENEXR),no)
 LIBS += -lIex -lIexMath -lIlmImf -lIlmImfUtil
 endif
index 60c9126..ddc75b2 100644 (file)
@@ -22,6 +22,7 @@
 #include "adeviceprefs.h"
 #include "audioalsa.h"
 #include "audiodevice.inc"
 #include "adeviceprefs.h"
 #include "audioalsa.h"
 #include "audiodevice.inc"
+#include "audiopulse.h"
 #include "bcsignals.h"
 #include "bitspopup.h"
 #include "edl.h"
 #include "bcsignals.h"
 #include "bitspopup.h"
 #include "edl.h"
@@ -91,7 +92,7 @@ void ADevicePrefs::reset()
        cine_path = 0;
        server_title = 0;
        port_title = 0;
        cine_path = 0;
        server_title = 0;
        port_title = 0;
-       esound_port = 0;
+       port = 0;
 }
 
 int ADevicePrefs::initialize(int creation)
 }
 
 int ADevicePrefs::initialize(int creation)
@@ -126,6 +127,9 @@ int ADevicePrefs::initialize(int creation)
        case AUDIO_ALSA:
                create_alsa_objs();
                break;
        case AUDIO_ALSA:
                create_alsa_objs();
                break;
+       case AUDIO_PULSE:
+               create_pulse_objs();
+               break;
        case AUDIO_ESOUND:
                create_esound_objs();
                break;
        case AUDIO_ESOUND:
                create_esound_objs();
                break;
@@ -167,6 +171,9 @@ int ADevicePrefs::delete_objects()
        case AUDIO_ALSA:
                delete_alsa_objs();
                break;
        case AUDIO_ALSA:
                delete_alsa_objs();
                break;
+       case AUDIO_PULSE:
+               delete_pulse_objs();
+               break;
        case AUDIO_ESOUND:
                delete_esound_objs();
                break;
        case AUDIO_ESOUND:
                delete_esound_objs();
                break;
@@ -205,9 +212,9 @@ int ADevicePrefs::delete_oss_objs()
 int ADevicePrefs::delete_esound_objs()
 {
        delete server_title;
 int ADevicePrefs::delete_esound_objs()
 {
        delete server_title;
+       delete server;
        delete port_title;
        delete port_title;
-       delete esound_server;
-       delete esound_port;
+       delete port;
        return 0;
 }
 
        return 0;
 }
 
@@ -246,6 +253,15 @@ int ADevicePrefs::delete_alsa_objs()
        return 0;
 }
 
        return 0;
 }
 
+int ADevicePrefs::delete_pulse_objs()
+{
+#ifdef HAVE_PULSE
+       delete server_title;
+       delete server;
+#endif
+       return 0;
+}
+
 int ADevicePrefs::delete_dvb_objs()
 {
        delete dvb_adapter_title;
 int ADevicePrefs::delete_dvb_objs()
 {
        delete dvb_adapter_title;
@@ -410,9 +426,7 @@ int ADevicePrefs::create_alsa_objs()
                                _("Stop playback locks up."));
                dialog->add_subwindow(alsa_workaround);
        }
                                _("Stop playback locks up."));
                dialog->add_subwindow(alsa_workaround);
        }
-
 #endif
 #endif
-
        return 0;
 }
 
        return 0;
 }
 
@@ -437,8 +451,8 @@ int ADevicePrefs::create_esound_objs()
        server_title = new BC_Title(x1, y, _("Server:"),
                        MEDIUMFONT, resources->text_default);
        dialog->add_subwindow(server_title);
        server_title = new BC_Title(x1, y, _("Server:"),
                        MEDIUMFONT, resources->text_default);
        dialog->add_subwindow(server_title);
-       esound_server = new ADeviceTextBox(x1, y + yS(20), output_char);
-       dialog->add_subwindow(esound_server);
+       server = new ADeviceTextBox(x1, y + yS(20), output_char);
+       dialog->add_subwindow(server);
 
        switch(mode) {
        case MODEPLAY:
 
        switch(mode) {
        case MODEPLAY:
@@ -451,12 +465,12 @@ int ADevicePrefs::create_esound_objs()
                output_int = &out_config->esound_out_port;
                break;
        }
                output_int = &out_config->esound_out_port;
                break;
        }
-       x1 += esound_server->get_w() + xS(5);
+       x1 += server->get_w() + xS(5);
        port_title = new BC_Title(x1, y, _("Port:"),
                        MEDIUMFONT, resources->text_default);
        dialog->add_subwindow(port_title);
        port_title = new BC_Title(x1, y, _("Port:"),
                        MEDIUMFONT, resources->text_default);
        dialog->add_subwindow(port_title);
-       esound_port = new ADeviceIntBox(x1, y + yS(20), output_int);
-       dialog->add_subwindow(esound_port);
+       port = new ADeviceIntBox(x1, y + yS(20), output_int);
+       dialog->add_subwindow(port);
        return 0;
 }
 
        return 0;
 }
 
@@ -615,6 +629,29 @@ int ADevicePrefs::create_v4l2mpeg_objs()
 }
 
 
 }
 
 
+int ADevicePrefs::create_pulse_objs()
+{
+#ifdef HAVE_PULSE
+       char *output_char = 0;
+       switch(mode) {
+       case MODEPLAY:
+               output_char = out_config->pulse_out_server;
+               break;
+       case MODERECORD:
+               output_char = in_config->pulse_in_server;
+               break;
+       }
+       int x1 = x, y1 = y;
+       x1 += menu->get_w() + xS(5);
+       dialog->add_subwindow(server_title = new BC_Title(x1, y1,
+               _("Server (blank for default):")));
+       y1 += server_title->get_h() + yS(5);
+       dialog->add_subwindow(server = new ADeviceTextBox(x1, y1, output_char));
+#endif
+       return 0;
+}
+
+
 ADriverMenu::ADriverMenu(int x, int y, ADevicePrefs *device_prefs,
        int do_input, int *output)
  : BC_PopupMenu(x, y, xS(125), adriver_to_string(*output), 1)
 ADriverMenu::ADriverMenu(int x, int y, ADevicePrefs *device_prefs,
        int do_input, int *output)
  : BC_PopupMenu(x, y, xS(125), adriver_to_string(*output), 1)
@@ -656,6 +693,9 @@ void ADriverMenu::create_objects()
 #ifdef HAVE_VIDEO4LINUX2
        if(do_input) add_item(new ADriverItem(this, AUDIO_V4L2MPEG_TITLE, AUDIO_V4L2MPEG));
 #endif
 #ifdef HAVE_VIDEO4LINUX2
        if(do_input) add_item(new ADriverItem(this, AUDIO_V4L2MPEG_TITLE, AUDIO_V4L2MPEG));
 #endif
+#ifdef HAVE_PULSE
+       add_item(new ADriverItem(this, AUDIO_PULSE_TITLE, AUDIO_PULSE));
+#endif
 }
 
 char* ADriverMenu::adriver_to_string(int driver)
 }
 
 char* ADriverMenu::adriver_to_string(int driver)
@@ -670,6 +710,9 @@ char* ADriverMenu::adriver_to_string(int driver)
        case AUDIO_ESOUND:
                sprintf(string, AUDIO_ESOUND_TITLE);
                break;
        case AUDIO_ESOUND:
                sprintf(string, AUDIO_ESOUND_TITLE);
                break;
+       case AUDIO_PULSE:
+               sprintf(string, AUDIO_PULSE_TITLE);
+               break;
        case AUDIO_NAS:
                sprintf(string, AUDIO_NAS_TITLE);
                break;
        case AUDIO_NAS:
                sprintf(string, AUDIO_NAS_TITLE);
                break;
index ebe5051..e7a480a 100644 (file)
 class OSSEnable;
 class ALSADevice;
 
 class OSSEnable;
 class ALSADevice;
 
+#include "adeviceprefs.inc"
 #include "bitspopup.inc"
 #include "guicast.h"
 #include "playbackconfig.inc"
 #include "preferencesthread.inc"
 #include "recordconfig.inc"
 
 #include "bitspopup.inc"
 #include "guicast.h"
 #include "playbackconfig.inc"
 #include "preferencesthread.inc"
 #include "recordconfig.inc"
 
-class ADriverMenu;
-class ADeviceTextBox;
-class ADeviceIntBox;
-class ADeviceTumbleBox;
-
 class ADevicePrefs
 {
 public:
 class ADevicePrefs
 {
 public:
@@ -74,6 +70,7 @@ private:
        int create_cine_objs();
        int create_dvb_objs();
        int create_v4l2mpeg_objs();
        int create_cine_objs();
        int create_dvb_objs();
        int create_v4l2mpeg_objs();
+       int create_pulse_objs();
 
        int delete_oss_objs();
        int delete_esound_objs();
 
        int delete_oss_objs();
        int delete_esound_objs();
@@ -81,6 +78,7 @@ private:
        int delete_alsa_objs();
        int delete_dvb_objs();
        int delete_v4l2mpeg_objs();
        int delete_alsa_objs();
        int delete_dvb_objs();
        int delete_v4l2mpeg_objs();
+       int delete_pulse_objs();
 
 // The output config resolved from playback strategy and render engine.
        AudioOutConfig *out_config;
 
 // The output config resolved from playback strategy and render engine.
        AudioOutConfig *out_config;
@@ -99,8 +97,8 @@ private:
        OSSEnable *oss_enable[MAXDEVICES];
        ADeviceTextBox *oss_path[MAXDEVICES];
        BitsPopup *oss_bits;
        OSSEnable *oss_enable[MAXDEVICES];
        ADeviceTextBox *oss_path[MAXDEVICES];
        BitsPopup *oss_bits;
-       ADeviceTextBox *esound_server;
-       ADeviceIntBox *esound_port;
+       ADeviceTextBox *server;
+       ADeviceIntBox *port;
        ADeviceIntBox *firewire_port;
        ADeviceIntBox *firewire_channel;
        ADeviceTextBox *firewire_path;
        ADeviceIntBox *firewire_port;
        ADeviceIntBox *firewire_channel;
        ADeviceTextBox *firewire_path;
index 0c8e110..f9c71f6 100644 (file)
 #define ADEVICEPREFS_INC
 
 class ADevicePrefs;
 #define ADEVICEPREFS_INC
 
 class ADevicePrefs;
+
 #ifndef MODEPLAY
 #define MODEPLAY 0
 #define MODERECORD 1
 #define MODEDUPLEX 2
 #endif
 
 #ifndef MODEPLAY
 #define MODEPLAY 0
 #define MODERECORD 1
 #define MODEDUPLEX 2
 #endif
 
+class ADriverMenu;
+class ADriverItem;
+class OSSEnable;
+class ADeviceTextBox;
+class ADeviceIntBox;
+class ADeviceTumbleBox;
+class ALSADevice;
 
 #endif
 
 #endif
index 61e43c9..f26aed4 100644 (file)
@@ -47,6 +47,9 @@ AndroidControl::AndroidControl(MWindowGUI *mwindow_gui)
 {
        this->mwindow_gui = mwindow_gui;
        Thread::start();
 {
        this->mwindow_gui = mwindow_gui;
        Thread::start();
+       done = -1;
+       sockfd = -1;
+       msg = 0;
 }
 
 bool AndroidControl::is_msg(const char *cp)
 }
 
 bool AndroidControl::is_msg(const char *cp)
index ba82816..56832ca 100644 (file)
@@ -420,7 +420,7 @@ int AssetPopupInsertMixer::handle_event()
 }
 
 AssetPopupPaste::AssetPopupPaste(MWindow *mwindow, AssetPopup *popup)
 }
 
 AssetPopupPaste::AssetPopupPaste(MWindow *mwindow, AssetPopup *popup)
- : BC_MenuItem(_("Paste"))
+ : BC_MenuItem(C_("Paste"))
 {
        this->mwindow = mwindow;
        this->popup = popup;
 {
        this->mwindow = mwindow;
        this->popup = popup;
index e5c9fdf..4a128a7 100644 (file)
@@ -145,64 +145,6 @@ void AudioALSA::list_devices(ArrayList<char*> *names, ArrayList<char*> *pcm_name
 
                snd_ctl_close(handle);
        }
 
                snd_ctl_close(handle);
        }
-
-#ifdef HAVE_PACTL
-// attempt to add pulseaudio "monitor" devices
-//  run: pactl list <sources>|<sinks>
-//   scan output for <Source/Sink> #n,  Name: <device>
-//   build alsa device config and add to alsa snd_config
-
-       const char *arg = 0;
-       switch( mode ) {
-               case MODERECORD:
-                       arg = "source";
-                       break;
-               case MODEPLAY:
-                       arg = "sink";
-                       break;
-       }
-       FILE *pactl = 0;
-       char line[BCTEXTLEN];
-       if( arg ) {
-               sprintf(line, "LANGUAGE=en_US.UTF-8 pactl list %ss", arg);
-               pactl = popen(line,"r");
-       }
-       if( pactl ) {
-               snd_config_update();
-               char name[BCTEXTLEN], pa_name[BCTEXTLEN], device[BCTEXTLEN];
-               name[0] = pa_name[0] = device[0] = 0;
-               int arg_len = strlen(arg);
-               while( fgets(line, sizeof(line), pactl) ) {
-                       if( !strncasecmp(line, arg, arg_len) ) {
-                               char *sp = name, *id = pa_name;
-                               for( char *cp=line; *cp && *cp!='\n'; *sp++=*cp++ )
-                                       *id++ = (*cp>='A' && *cp<='Z') ||
-                                               (*cp>='a' && *cp<='z') ||
-                                               (*cp>='0' && *cp<='9') ? *cp : '_';
-                               *sp++ = 0;  *id = 0;
-                               if( names )
-                                       names->append(cstrdup(name));
-                               continue;
-                       }
-                       if( sscanf(line, " Name: %s", device) != 1 ) continue;
-                       int len = strlen(pa_name);
-                       if( pcm_names )
-                               pcm_names->append(cstrdup(pa_name));
-                       char alsa_config[BCTEXTLEN];
-                       len = snprintf(alsa_config, sizeof(alsa_config),
-                               "pcm.!%s {\n type pulse\n device %s\n}\n"
-                               "ctl.!%s {\n type pulse\n device %s\n}\n",
-                               pa_name, device, pa_name, device);
-                       FILE *fp = fmemopen(alsa_config,len,"r");
-                       snd_input_t *inp;
-                       snd_input_stdio_attach(&inp, fp, 1);
-                       snd_config_load(snd_config, inp);
-                       name[0] = pa_name[0] = device[0] = 0;
-                       snd_input_close(inp);
-               }
-               pclose(pactl);
-       }
-#endif
 }
 
 void AudioALSA::translate_name(char *output, char *input, int mode)
 }
 
 void AudioALSA::translate_name(char *output, char *input, int mode)
@@ -215,6 +157,9 @@ void AudioALSA::translate_name(char *output, char *input, int mode)
 
        list_devices(&titles, &pcm_titles, mode);
 
 
        list_devices(&titles, &pcm_titles, mode);
 
+// attempt to add pulseaudio "monitor" devices
+       add_pulse_devices(mode, &titles, &pcm_titles);
+
        sprintf(output, "default");
        for(int i = 0; i < titles.total; i++)
        {
        sprintf(output, "default");
        for(int i = 0; i < titles.total; i++)
        {
@@ -676,4 +621,64 @@ snd_pcm_t* AudioALSA::get_input()
        return dsp_in;
 }
 
        return dsp_in;
 }
 
+void AudioALSA::add_pulse_devices(int mode,
+               ArrayList<char*> *names, ArrayList<char*> *pcm_names)
+{
+#ifdef HAVE_PACTL
+//  run: pactl list <sources>|<sinks>
+//   scan output for <Source/Sink> #n,  Name: <device>
+//   build alsa device config and add to alsa snd_config
+       const char *arg = 0;
+       switch( mode ) {
+       case MODERECORD:
+               arg = "source";
+               break;
+       case MODEPLAY:
+               arg = "sink";
+               break;
+       }
+       FILE *pactl = 0;
+       char line[BCTEXTLEN];
+       if( arg ) {
+               sprintf(line, "LANGUAGE=en_US.UTF-8 pactl list %ss", arg);
+               pactl = popen(line,"r");
+       }
+       if( pactl ) {
+               snd_config_update();
+               char name[BCTEXTLEN], pa_name[BCTEXTLEN], device[BCTEXTLEN];
+               name[0] = pa_name[0] = device[0] = 0;
+               int arg_len = strlen(arg);
+               while( fgets(line, sizeof(line), pactl) ) {
+                       if( !strncasecmp(line, arg, arg_len) ) {
+                               char *sp = name, *id = pa_name;
+                               for( char *cp=line; *cp && *cp!='\n'; *sp++=*cp++ )
+                                       *id++ = (*cp>='A' && *cp<='Z') ||
+                                               (*cp>='a' && *cp<='z') ||
+                                               (*cp>='0' && *cp<='9') ? *cp : '_';
+                               *sp++ = 0;  *id = 0;
+                               if( names )
+                                       names->append(cstrdup(name));
+                               continue;
+                       }
+                       if( sscanf(line, " Name: %s", device) != 1 ) continue;
+                       int len = strlen(pa_name);
+                       if( pcm_names )
+                               pcm_names->append(cstrdup(pa_name));
+                       char alsa_config[BCTEXTLEN];
+                       len = snprintf(alsa_config, sizeof(alsa_config),
+                               "pcm.!%s {\n type pulse\n device %s\n}\n"
+                               "ctl.!%s {\n type pulse\n device %s\n}\n",
+                               pa_name, device, pa_name, device);
+                       FILE *fp = fmemopen(alsa_config,len,"r");
+                       snd_input_t *inp;
+                       snd_input_stdio_attach(&inp, fp, 1);
+                       snd_config_load(snd_config, inp);
+                       name[0] = pa_name[0] = device[0] = 0;
+                       snd_input_close(inp);
+               }
+               pclose(pactl);
+       }
+#endif
+}
+
 #endif
 #endif
index 78d0831..5b919a2 100644 (file)
@@ -49,7 +49,8 @@ public:
        int flush_device();
        int interrupt_playback();
        int stop_output();
        int flush_device();
        int interrupt_playback();
        int stop_output();
-
+       static void add_pulse_devices(int mode,
+               ArrayList<char*> *name, ArrayList<char*> *pcm_name);
 private:
        int close_output();
        void translate_name(char *output, char *input, int mode);
 private:
        int close_output();
        void translate_name(char *output, char *input, int mode);
index 44c5eab..33e4ce1 100644 (file)
@@ -37,6 +37,7 @@ AudioConfig::AudioConfig()
        oss_in_channels = 2;
        oss_in_bits = 16;
        strcpy(esound_in_server, "");
        oss_in_channels = 2;
        oss_in_bits = 16;
        strcpy(esound_in_server, "");
+       strpcy(pulse_in_server, "");
        esound_in_port = 0;
 
        audio_out_driver = AUDIO_ALSA;
        esound_in_port = 0;
 
        audio_out_driver = AUDIO_ALSA;
@@ -44,6 +45,7 @@ AudioConfig::AudioConfig()
        oss_out_channels = 2;
        oss_out_bits = 16;
        strpcy(esound_out_server, "");
        oss_out_channels = 2;
        oss_out_bits = 16;
        strpcy(esound_out_server, "");
+       strpcy(pulse_out_server, "");
        esound_out_port = 0;
 
        audio_duplex_driver = AUDIO_ALSA;
        esound_out_port = 0;
 
        audio_duplex_driver = AUDIO_ALSA;
@@ -65,6 +67,7 @@ AudioConfig& AudioConfig::operator=(AudioConfig &that)
        afirewire_in_port = that.afirewire_in_port;
        afirewire_in_channel = that.afirewire_in_channel;
        strcpy(esound_in_server, that.esound_in_server);
        afirewire_in_port = that.afirewire_in_port;
        afirewire_in_channel = that.afirewire_in_channel;
        strcpy(esound_in_server, that.esound_in_server);
+       strcpy(pulse_in_server, that.pulse_in_server);
        esound_in_port = that.esound_in_port;
        strcpy(oss_in_device, that.oss_in_device);
        oss_in_channels = that.oss_in_channels;
        esound_in_port = that.esound_in_port;
        strcpy(oss_in_device, that.oss_in_device);
        oss_in_channels = that.oss_in_channels;
@@ -74,6 +77,7 @@ AudioConfig& AudioConfig::operator=(AudioConfig &that)
        audio_out_driver = that.audio_out_driver;
        strcpy(oss_out_device, that.oss_out_device);
        strcpy(esound_out_server, that.esound_out_server);
        audio_out_driver = that.audio_out_driver;
        strcpy(oss_out_device, that.oss_out_device);
        strcpy(esound_out_server, that.esound_out_server);
+       strcpy(pulse_out_server, that.pulse_out_server);
        esound_out_port = that.esound_out_port;
        oss_out_channels = that.oss_out_channels;
        oss_out_bits = that.oss_out_bits;
        esound_out_port = that.esound_out_port;
        oss_out_channels = that.oss_out_channels;
        oss_out_bits = that.oss_out_bits;
@@ -103,6 +107,8 @@ int AudioConfig::load_defaults(BC_Hash *defaults)
        oss_in_bits =                 defaults->get("OSS_IN_BITS", 16);
        sprintf(esound_in_server, "");
                                      defaults->get("ESOUND_IN_SERVER", esound_in_server);
        oss_in_bits =                 defaults->get("OSS_IN_BITS", 16);
        sprintf(esound_in_server, "");
                                      defaults->get("ESOUND_IN_SERVER", esound_in_server);
+       sprintf(pulse_in_server, "");
+                                     defaults->get("PULSE_IN_SERVER", pulse_in_server);
        esound_in_port =              defaults->get("ESOUND_IN_PORT", 0);
 
        audio_out_driver =                defaults->get("AUDIO_OUT_DRIVER", AUDIO_ALSA);
        esound_in_port =              defaults->get("ESOUND_IN_PORT", 0);
 
        audio_out_driver =                defaults->get("AUDIO_OUT_DRIVER", AUDIO_ALSA);
@@ -113,6 +119,8 @@ int AudioConfig::load_defaults(BC_Hash *defaults)
        oss_out_bits =                defaults->get("OUT_BITS", 16);
        sprintf(esound_out_server, "");
                                      defaults->get("ESOUND_OUT_SERVER", esound_out_server);
        oss_out_bits =                defaults->get("OUT_BITS", 16);
        sprintf(esound_out_server, "");
                                      defaults->get("ESOUND_OUT_SERVER", esound_out_server);
+       sprintf(pulse_out_server, "");
+                                     defaults->get("PULSE_OUT_SERVER", pulse_out_server);
        esound_out_port =             defaults->get("ESOUND_OUT_PORT", 0);
 
        audio_duplex_driver =         defaults->get("AUDIO_DUPLEX_DRIVER", AUDIO_ALSA);
        esound_out_port =             defaults->get("ESOUND_OUT_PORT", 0);
 
        audio_duplex_driver =         defaults->get("AUDIO_DUPLEX_DRIVER", AUDIO_ALSA);
@@ -135,6 +143,7 @@ int AudioConfig::save_defaults(BC_Hash *defaults)
        defaults->update("OSS_IN_CHANNELS", oss_in_channels);
        defaults->update("OSS_IN_BITS", oss_in_bits);
        defaults->update("ESOUND_IN_SERVER", esound_in_server);
        defaults->update("OSS_IN_CHANNELS", oss_in_channels);
        defaults->update("OSS_IN_BITS", oss_in_bits);
        defaults->update("ESOUND_IN_SERVER", esound_in_server);
+       defaults->update("PULSE_IN_SERVER", pulse_in_server);
        defaults->update("ESOUND_IN_PORT", esound_in_port);
 
        defaults->update("AUDIO_OUT_DRIVER", audio_out_driver);
        defaults->update("ESOUND_IN_PORT", esound_in_port);
 
        defaults->update("AUDIO_OUT_DRIVER", audio_out_driver);
@@ -143,6 +152,7 @@ int AudioConfig::save_defaults(BC_Hash *defaults)
        defaults->update("OUT_CHANNELS", oss_out_channels);
        defaults->update("OUT_BITS", oss_out_bits);
        defaults->update("ESOUND_OUT_SERVER", esound_out_server);
        defaults->update("OUT_CHANNELS", oss_out_channels);
        defaults->update("OUT_BITS", oss_out_bits);
        defaults->update("ESOUND_OUT_SERVER", esound_out_server);
+       defaults->update("PULSE_OUT_SERVER", pulse_out_server);
        defaults->update("ESOUND_OUT_PORT", esound_out_port);
 
        defaults->update("AUDIO_DUPLEX_DRIVER", audio_duplex_driver);
        defaults->update("ESOUND_OUT_PORT", esound_out_port);
 
        defaults->update("AUDIO_DUPLEX_DRIVER", audio_duplex_driver);
index f8f8391..fb1fb79 100644 (file)
@@ -43,12 +43,14 @@ public:
        int oss_in_bits;
        int afirewire_in_port, afirewire_in_channel;
        char esound_in_server[1024];
        int oss_in_bits;
        int afirewire_in_port, afirewire_in_channel;
        char esound_in_server[1024];
+       char pulse_in_server[1024];
        int esound_in_port;
 
 // Output
        int audio_out_driver;
        char oss_out_device[1024];
        char esound_out_server[1024];
        int esound_in_port;
 
 // Output
        int audio_out_driver;
        char oss_out_device[1024];
        char esound_out_server[1024];
+       char pulse_out_server[1024];
        int esound_out_port;
        int oss_out_channels;
        int oss_out_bits;
        int esound_out_port;
        int oss_out_channels;
        int oss_out_bits;
index 956d4a1..0904ed5 100644 (file)
 #endif
 #include "audioalsa.h"
 #include "audiodvb.h"
 #endif
 #include "audioalsa.h"
 #include "audiodvb.h"
-#include "audiov4l2mpeg.h"
 #include "audioesound.h"
 #include "audiooss.h"
 #include "audioesound.h"
 #include "audiooss.h"
+#include "audiopulse.h"
+#include "audiov4l2mpeg.h"
 #include "asset.h"
 #include "bctimer.h"
 #include "condition.h"
 #include "asset.h"
 #include "bctimer.h"
 #include "condition.h"
@@ -257,6 +258,12 @@ int AudioDevice::create_lowlevel(AudioLowLevel* &lowlevel, int driver,int in)
                        lowlevel = new AudioV4L2MPEG(this);
                        break;
 #endif
                        lowlevel = new AudioV4L2MPEG(this);
                        break;
 #endif
+
+#ifdef HAVE_PULSE
+               case AUDIO_PULSE:
+                       lowlevel = new AudioPulse(this);
+                       break;
+#endif
                }
        }
        return 0;
                }
        }
        return 0;
index ed39773..2c12d9c 100644 (file)
 
 #include "audioalsa.inc"
 #include "audioconfig.inc"
 
 #include "audioalsa.inc"
 #include "audioconfig.inc"
-#include "audiodvb.inc"
 #include "audiodevice.inc"
 #include "audiodevice.inc"
+#include "audiodvb.inc"
 #include "audioesound.inc"
 #include "audiooss.inc"
 #include "audioesound.inc"
 #include "audiooss.inc"
+#include "audiopulse.inc"
 #include "audiov4l2mpeg.inc"
 #include "bctimer.inc"
 #include "binary.h"
 #include "audiov4l2mpeg.inc"
 #include "bctimer.inc"
 #include "binary.h"
@@ -89,6 +90,7 @@ public:
        friend class AudioDVB;
        friend class AudioV4L2MPEG;
        friend class AudioOSS;
        friend class AudioDVB;
        friend class AudioV4L2MPEG;
        friend class AudioOSS;
+       friend class AudioPulse;
        friend class AudioESound;
        friend class Audio1394;
        friend class VDevice1394;
        friend class AudioESound;
        friend class Audio1394;
        friend class VDevice1394;
index be99c05..fdfd948 100644 (file)
@@ -41,6 +41,7 @@ enum
        AUDIO_IEC61883,
        AUDIO_DVB,
        AUDIO_V4L2MPEG,
        AUDIO_IEC61883,
        AUDIO_DVB,
        AUDIO_V4L2MPEG,
+       AUDIO_PULSE,
 };
 
 #define AUDIO_OSS_TITLE "OSS"
 };
 
 #define AUDIO_OSS_TITLE "OSS"
@@ -55,5 +56,6 @@ enum
 #endif
 #define AUDIO_DVB_TITLE "DVB"
 #define        AUDIO_V4L2MPEG_TITLE "V4L2 MPEG"
 #endif
 #define AUDIO_DVB_TITLE "DVB"
 #define        AUDIO_V4L2MPEG_TITLE "V4L2 MPEG"
+#define AUDIO_PULSE_TITLE "Pulse Audio"
 
 #endif
 
 #endif
index 2beb4c8..e4f2cd0 100644 (file)
@@ -375,11 +375,15 @@ void AudioDevice::run_output()
                output_buffer_t *obfr = &output[buffer_num];
                obfr->play_lock->lock("AudioDevice::run 1");
                if( !is_playing_back || playback_interrupted ) break;
                output_buffer_t *obfr = &output[buffer_num];
                obfr->play_lock->lock("AudioDevice::run 1");
                if( !is_playing_back || playback_interrupted ) break;
-               if( obfr->last_buffer ) { lowlevel_out->flush_device(); break; }
+               if( obfr->last_buffer ) {
+                       if( lowlevel_out ) lowlevel_out->flush_device();
+                       break;
+               }
 // get size for position information
 // write converted buffer synchronously
                double bfr_time = obfr->bfr_time;
 // get size for position information
 // write converted buffer synchronously
                double bfr_time = obfr->bfr_time;
-               int result = lowlevel_out->write_buffer(obfr->buffer, obfr->size);
+               int result = !lowlevel_out ? -1 :
+                       lowlevel_out->write_buffer(obfr->buffer, obfr->size);
 // allow writing to the buffer
                obfr->arm_lock->unlock();
                if( !result ) {
 // allow writing to the buffer
                obfr->arm_lock->unlock();
                if( !result ) {
diff --git a/cinelerra-5.1/cinelerra/audiopulse.C b/cinelerra-5.1/cinelerra/audiopulse.C
new file mode 100644 (file)
index 0000000..78db187
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+ * CINELERRA
+ * Copyright (C) 2008-2019 Adam Williams <broadcast at earthling dot net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ */
+
+#ifdef HAVE_PULSE
+#include "audiopulse.h"
+#include "adeviceprefs.h"
+#include "bctimer.h"
+#include "cstrdup.h"
+#include "language.h"
+#include "mutex.h"
+#include "playbackconfig.h"
+#include "recordconfig.h"
+
+#include <pulse/pulseaudio.h>
+#include <pulse/simple.h>
+
+AudioPulse::AudioPulse(AudioDevice *device)
+ : AudioLowLevel(device)
+{
+       buffer_position = 0;
+       timer_position = 0;
+       timer = new Timer;
+       timer_lock = new Mutex("AudioPulse::timer_lock");
+       dsp_in = 0;
+       dsp_out = 0;
+       period_usecs = 1000000;
+       frag_usecs = period_usecs / 32;
+       wr_spec = 0;
+       rd_spec = 0;
+}
+
+AudioPulse::~AudioPulse()
+{
+       delete (pa_sample_spec *)wr_spec;
+       delete (pa_sample_spec *)rd_spec;
+       delete timer_lock;
+       delete timer;
+       close_all();
+}
+
+int AudioPulse::open_input()
+{
+       pa_sample_spec *ss = new pa_sample_spec();
+       rd_spec = (void *)ss;
+
+       ss->format = PA_SAMPLE_S16LE;
+       ss->rate = device->in_samplerate; 
+       ss->channels = device->get_ichannels();   
+       device->in_bits = 16;
+       return init_input();
+}
+
+int AudioPulse::init_input()
+{
+       pa_sample_spec *ss = (pa_sample_spec *)rd_spec;
+       int error = 0;
+       char *server = 0;
+       if( device->in_config->pulse_in_server[0] )
+               server = device->in_config->pulse_in_server;
+       dsp_in = pa_simple_new(server, PROGRAM_NAME, PA_STREAM_RECORD, 
+               0, "recording", ss, 0, 0, &error);
+       if( !dsp_in ) {
+               printf("AudioPulse::open_input %d: failed server=%s %s\n", __LINE__, 
+                       server, pa_strerror(error));
+               return 1;
+       }
+
+       return 0;
+}
+
+
+int AudioPulse::open_output()
+{
+       pa_sample_spec *ss = new pa_sample_spec();
+       wr_spec = (void *)ss;
+       ss->format = PA_SAMPLE_S16LE;
+       ss->rate = device->out_samplerate;
+       ss->channels = device->get_ochannels();
+       device->out_bits = 16;
+       return init_output();
+}
+
+int AudioPulse::init_output()
+{
+       pa_sample_spec *ss = (pa_sample_spec *)wr_spec;
+       int error = 0;
+       char *server = device->out_config->pulse_out_server[0] ?
+               device->out_config->pulse_out_server : 0;
+       dsp_out = pa_simple_new(server, PROGRAM_NAME, PA_STREAM_PLAYBACK, 
+               NULL, "playback", ss, 0, 0, &error);
+       if( !dsp_out ) {
+               printf("AudioPulse::open_output %d: failed server=%s %s\n", 
+                       __LINE__, server, pa_strerror(error));
+               return 1;
+       }
+       timer->update();
+       device->device_buffer = 0;
+       buffer_position = 0;
+       return 0;
+}
+
+
+int AudioPulse::close_all()
+{
+       if( dsp_out ) {
+               int error = 0;
+               pa_simple_flush((pa_simple*)dsp_out, &error);
+               pa_simple_free((pa_simple*)dsp_out);
+               dsp_out = 0;
+       }
+
+       if( dsp_in ) {
+               pa_simple_free((pa_simple*)dsp_in);
+               dsp_in = 0;
+       }
+       delete (pa_sample_spec *)wr_spec;  wr_spec = 0;
+       delete (pa_sample_spec *)rd_spec;  rd_spec = 0;
+       buffer_position = 0;
+       timer_position = 0;
+       return 0;
+}
+
+int64_t AudioPulse::device_position()
+{
+       timer_lock->lock("AudioPulse::device_position");
+       int64_t samples = timer->get_scaled_difference(device->out_samplerate);
+       int64_t result = timer_position + samples;
+       timer_lock->unlock();
+       return result;
+}
+
+int AudioPulse::write_buffer(char *buffer, int size)
+{
+       if( !dsp_out && init_output() )
+               return 1;
+       int error = 0;
+       timer_lock->lock("AudioPulse::write_buffer");
+       int64_t usecs = pa_simple_get_latency((pa_simple*)dsp_out, &error);
+       int64_t delay = device->out_samplerate * usecs / 1000000;
+       timer_position = buffer_position - delay;
+       timer->update();
+       timer_lock->unlock();
+
+       AudioThread *audio_out = device->audio_out;
+       int sample_size = (device->out_bits / 8) * device->get_ochannels();
+       int samples = device->out_samplerate * frag_usecs / 1000000;
+       int64_t frag_bytes = samples * sample_size;
+
+       buffer_position += size / sample_size;
+       int ret = 0;
+        while( !ret && size > 0 && !device->playback_interrupted ) {
+               audio_out->Thread::enable_cancel();
+               usecs = pa_simple_get_latency((pa_simple*)dsp_out, &error);
+               if( usecs < period_usecs ) {
+                       int64_t len = size;
+                       if( len > frag_bytes ) len = frag_bytes;
+                       if( pa_simple_write((pa_simple*)dsp_out, buffer, len, &error) < 0 )
+                               ret = 1;
+                       buffer += len;  size -= len;
+               }
+               else
+                       usleep(frag_usecs);
+               audio_out->Thread::disable_cancel();
+       }
+       if( ret )
+               printf("AudioPulse::write_buffer %d: %s\n", 
+                       __LINE__, pa_strerror(error));
+       return ret;
+}
+
+int AudioPulse::read_buffer(char *buffer, int size)
+{
+       if( !dsp_in && init_input() )
+               return 1;
+
+       int error = 0;
+       int result = pa_simple_read((pa_simple*)dsp_in, buffer, size, &error);
+       if( result < 0 ) {
+               printf("AudioPulse::read_buffer %d: %s\n", 
+                       __LINE__, pa_strerror(error));
+               return 1;
+       }
+
+//printf("AudioPulse::read_buffer %d %d\n", __LINE__, size);
+
+       return 0;
+}
+
+int AudioPulse::output_wait()
+{
+       int error = 0;
+       pa_usec_t latency = pa_simple_get_latency((pa_simple*)dsp_out, &error);
+       int64_t udelay = latency;
+        while( udelay > 0 && !device->playback_interrupted ) {
+                int64_t usecs = udelay;
+                if( usecs > 100000 ) usecs = 100000;
+                usleep(usecs);
+                udelay -= usecs;
+        }
+        if( device->playback_interrupted &&
+            !device->out_config->interrupt_workaround )
+               pa_simple_flush((pa_simple*)dsp_out, &error);
+        return 0;
+}
+
+int AudioPulse::flush_device()
+{
+       if( dsp_out ) {
+               output_wait();
+               int error = 0;
+               pa_simple_drain((pa_simple*)dsp_out, &error);
+       }
+       return 0;
+}
+
+int AudioPulse::interrupt_playback()
+{
+       if( !dsp_out ) {
+               return 1;
+       }
+
+       int error = 0;
+       int result = pa_simple_flush((pa_simple*)dsp_out, &error);
+       if( result < 0 ) {
+               printf("AudioPulse::interrupt_playback %d: %s\n", 
+                       __LINE__,
+                       pa_strerror(error));
+               return 1;
+       }
+
+       return 0;
+}
+
+#endif
diff --git a/cinelerra-5.1/cinelerra/audiopulse.h b/cinelerra-5.1/cinelerra/audiopulse.h
new file mode 100644 (file)
index 0000000..1739c25
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * CINELERRA
+ * Copyright (C) 2008-2019 Adam Williams <broadcast at earthling dot net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ */
+
+#ifndef AUDIOPULSE_H
+#define AUDIOPULSE_H
+
+#include "arraylist.h"
+#include "audiodevice.h"
+#include "bctimer.inc"
+
+
+class AudioPulse : public AudioLowLevel
+{
+public:
+       AudioPulse(AudioDevice *device);
+       ~AudioPulse();
+    
+       int open_input();
+       int init_input();
+       int open_output();
+       int init_output();
+       int close_all();
+       int64_t device_position();
+       int write_buffer(char *buffer, int size);
+       int read_buffer(char *buffer, int size);
+       int output_wait();
+       int flush_device();
+       int interrupt_playback();
+
+// the pulse audio handles
+       void *dsp_out;
+       void *dsp_in;
+       void *wr_spec;
+       void *rd_spec;
+
+       int64_t buffer_position;
+       int64_t timer_position;
+       int64_t frag_usecs, period_usecs;
+       Timer *timer;
+       Mutex *timer_lock;
+
+       int64_t samples_output() { return buffer_position; }
+};
+
+#endif
diff --git a/cinelerra-5.1/cinelerra/audiopulse.inc b/cinelerra-5.1/cinelerra/audiopulse.inc
new file mode 100644 (file)
index 0000000..c0b3865
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * CINELERRA
+ * Copyright (C) 2008-2019 Adam Williams <broadcast at earthling dot net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ */
+
+
+#ifndef AUDIOPULSE_INC
+#define AUDIOPULSE_INC
+
+
+
+
+class AudioPulse;
+
+
+
+#endif
index a3ceb1d..6742988 100644 (file)
@@ -23,6 +23,5 @@
 #define CWINDOW_INC
 
 class CWindow;
 #define CWINDOW_INC
 
 class CWindow;
-class KeyEvCWindowHandler;
 
 #endif
 
 #endif
index e0c40b9..2011bcf 100644 (file)
@@ -213,7 +213,7 @@ int EditPopupCutPack::handle_event()
 }
 
 EditPopupMute::EditPopupMute(MWindow *mwindow, EditPopup *popup)
 }
 
 EditPopupMute::EditPopupMute(MWindow *mwindow, EditPopup *popup)
- : BC_MenuItem(_("Mute"),_("Ctrl-m"),'m')
+ : BC_MenuItem(C_("Mute"),_("Ctrl-m"),'m')
 {
        this->mwindow = mwindow;
        this->popup = popup;
 {
        this->mwindow = mwindow;
        this->popup = popup;
index 3c6fd97..87b8853 100644 (file)
 
 #include <sys/types.h>
 #include <sys/stat.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#ifdef HAVE_ISOFS
 #include <linux/iso_fs.h>
 #include <linux/iso_fs.h>
+#endif
 
 // check for isofs volume_id for dvd/cdrom
 
 static int udf_volume_id(const char *path, char *fname)
 {
 
 // check for isofs volume_id for dvd/cdrom
 
 static int udf_volume_id(const char *path, char *fname)
 {
+       int result = 1;
+#ifdef HAVE_ISOFS
        struct stat st;
        if( stat(path,&st) ) return 1;
        // search mounted devices
        FILE *fp = fopen("/proc/mounts","r");
        if( !fp ) return 1;
 
        struct stat st;
        if( stat(path,&st) ) return 1;
        // search mounted devices
        FILE *fp = fopen("/proc/mounts","r");
        if( !fp ) return 1;
 
-       int result = 1;
        while( result && !feof(fp) && !ferror(fp) ) {
                char devpath[BCTEXTLEN], mpath[BCTEXTLEN];
                char options[BCTEXTLEN], line[BCTEXTLEN];
        while( result && !feof(fp) && !ferror(fp) ) {
                char devpath[BCTEXTLEN], mpath[BCTEXTLEN];
                char options[BCTEXTLEN], line[BCTEXTLEN];
@@ -122,6 +125,7 @@ static int udf_volume_id(const char *path, char *fname)
        }
 
        fclose(fp);
        }
 
        fclose(fp);
+#endif
        return result;
 }
 
        return result;
 }
 
index 5862b94..a21297e 100644 (file)
@@ -243,16 +243,20 @@ void MainSession::default_window_positions(int window_config)
                case 1024: right_w = 1280;  break;
                case 1200: right_w = 1600;  break;
                case 1080: right_w = 1920;  break;
                case 1024: right_w = 1280;  break;
                case 1200: right_w = 1600;  break;
                case 1080: right_w = 1920;  break;
-               default:   right_w = root_w/2;  break;
+               default:
+                       dual_head = 0;
+                       break;
                }
                }
-               if( window_config == 1 ) {
-                       root_x = root_w - right_w;
-                       root_w = right_w;
-               }
-               else {
-                       // use same aspect ratio to compute left height
-                       root_w -= right_w;
-                       root_h = (root_w*root_h) / right_w;
+               if( dual_head ) {
+                       if( window_config == 1 ) {
+                               root_x = root_w - right_w;
+                               root_w = right_w;
+                       }
+                       else {
+                               // use same aspect ratio to compute left height
+                               root_w -= right_w;
+                               root_h = (root_w*root_h) / right_w;
+                       }
                }
        }
 
                }
        }
 
index 988e49a..c959af2 100644 (file)
@@ -268,7 +268,9 @@ MWindow::~MWindow()
        delete beeper;
        delete create_bd;       create_bd = 0;
        delete create_dvd;      create_dvd = 0;
        delete beeper;
        delete create_bd;       create_bd = 0;
        delete create_dvd;      create_dvd = 0;
+#ifdef HAVE_SHUTTLE
        delete shuttle;         shuttle = 0;
        delete shuttle;         shuttle = 0;
+#endif
 #ifdef HAVE_WINTV
        delete wintv;           wintv = 0;
 #endif
 #ifdef HAVE_WINTV
        delete wintv;           wintv = 0;
 #endif
@@ -675,6 +677,7 @@ int MWindow::init_plugins(MWindow *mwindow, Preferences *preferences)
 
 int MWindow::init_ladspa_plugins(MWindow *mwindow, Preferences *preferences)
 {
 
 int MWindow::init_ladspa_plugins(MWindow *mwindow, Preferences *preferences)
 {
+#ifdef HAVE_LADSPA
        char *path = getenv("LADSPA_PATH");
        char ladspa_path[BCTEXTLEN];
        if( !path ) {
        char *path = getenv("LADSPA_PATH");
        char ladspa_path[BCTEXTLEN];
        if( !path ) {
@@ -719,6 +722,7 @@ int MWindow::init_ladspa_plugins(MWindow *mwindow, Preferences *preferences)
                }
                fclose(fp);
        }
                }
                fclose(fp);
        }
+#endif
        return 1;
 }
 
        return 1;
 }
 
@@ -742,7 +746,7 @@ void MWindow::scan_plugin_index(MWindow *mwindow, Preferences *preferences, FILE
        char plugin_path[BCTEXTLEN];
        sprintf(plugin_path, "%s/%s", plug_dir, plug_path);
        FileSystem fs;
        char plugin_path[BCTEXTLEN];
        sprintf(plugin_path, "%s/%s", plug_dir, plug_path);
        FileSystem fs;
-       fs.set_filter( "[*.plugin][*.so]" );
+       fs.set_filter( "[*.plugin][*.so][*.dll]" );
        int result = fs.update(plugin_path);
        if( result || !fs.dir_list.total ) return;
        int vis_id = idx++;
        int result = fs.update(plugin_path);
        if( result || !fs.dir_list.total ) return;
        int vis_id = idx++;
index 22fee71..24976c5 100644 (file)
@@ -30,10 +30,13 @@ AudioOutConfig::AudioOutConfig()
        fragment_size = 16384;
 #ifdef HAVE_ALSA
        driver = AUDIO_ALSA;
        fragment_size = 16384;
 #ifdef HAVE_ALSA
        driver = AUDIO_ALSA;
+#else
+#ifdef HAVE_PULSE
+       driver = AUDIO_PULSE;
 #else
        driver = AUDIO_OSS;
 #endif
 #else
        driver = AUDIO_OSS;
 #endif
-
+#endif
        audio_offset = 0.0;
        map51_2 = 0;
        play_gain = 1.0;
        audio_offset = 0.0;
        map51_2 = 0;
        play_gain = 1.0;
@@ -48,6 +51,8 @@ AudioOutConfig::AudioOutConfig()
        esound_out_server[0] = 0;
        esound_out_port = 0;
 
        esound_out_server[0] = 0;
        esound_out_port = 0;
 
+       pulse_out_server[0] = 0;
+
        sprintf(alsa_out_device, "default");
        alsa_out_bits = 16;
        interrupt_workaround = 0;
        sprintf(alsa_out_device, "default");
        alsa_out_bits = 16;
        interrupt_workaround = 0;
@@ -85,12 +90,10 @@ int AudioOutConfig::operator==(AudioOutConfig &that)
                !strcmp(oss_out_device[0], that.oss_out_device[0]) &&
                (oss_out_bits == that.oss_out_bits) &&
 
                !strcmp(oss_out_device[0], that.oss_out_device[0]) &&
                (oss_out_bits == that.oss_out_bits) &&
 
-
-
                !strcmp(esound_out_server, that.esound_out_server) &&
                (esound_out_port == that.esound_out_port) &&
 
                !strcmp(esound_out_server, that.esound_out_server) &&
                (esound_out_port == that.esound_out_port) &&
 
-
+               !strcmp(pulse_out_server, that.pulse_out_server) &&
 
                !strcmp(alsa_out_device, that.alsa_out_device) &&
                (alsa_out_bits == that.alsa_out_bits) &&
 
                !strcmp(alsa_out_device, that.alsa_out_device) &&
                (alsa_out_bits == that.alsa_out_bits) &&
@@ -126,6 +129,9 @@ void AudioOutConfig::copy_from(AudioOutConfig *src)
 
        strcpy(esound_out_server, src->esound_out_server);
        esound_out_port = src->esound_out_port;
 
        strcpy(esound_out_server, src->esound_out_server);
        esound_out_port = src->esound_out_port;
+
+       strcpy(pulse_out_server, src->pulse_out_server);
+
        for(int i = 0; i < MAXDEVICES; i++)
        {
                oss_enable[i] = src->oss_enable[i];
        for(int i = 0; i < MAXDEVICES; i++)
        {
                oss_enable[i] = src->oss_enable[i];
@@ -171,8 +177,11 @@ int AudioOutConfig::load_defaults(BC_Hash *defaults, int active_config)
        interrupt_workaround = defaults->getf(interrupt_workaround, "%sALSA_INTERRUPT_WORKAROUND", prefix);
 
        defaults->getf(esound_out_server, "%sESOUND_OUT_SERVER", prefix);
        interrupt_workaround = defaults->getf(interrupt_workaround, "%sALSA_INTERRUPT_WORKAROUND", prefix);
 
        defaults->getf(esound_out_server, "%sESOUND_OUT_SERVER", prefix);
+       defaults->getf(pulse_out_server, "%sPULSE_OUT_SERVER", prefix);
        esound_out_port = defaults->getf(esound_out_port, "%sESOUND_OUT_PORT", prefix);
 
        esound_out_port = defaults->getf(esound_out_port, "%sESOUND_OUT_PORT", prefix);
 
+       defaults->getf(pulse_out_server, "%sPULSE_OUT_SERVER", prefix);
+
        firewire_channel = defaults->getf(firewire_channel, "%sAFIREWIRE_OUT_CHANNEL", prefix);
        firewire_port = defaults->getf(firewire_port, "%sAFIREWIRE_OUT_PORT", prefix);
        defaults->getf(firewire_path, "%sAFIREWIRE_OUT_PATH", prefix);
        firewire_channel = defaults->getf(firewire_channel, "%sAFIREWIRE_OUT_CHANNEL", prefix);
        firewire_port = defaults->getf(firewire_port, "%sAFIREWIRE_OUT_PORT", prefix);
        defaults->getf(firewire_path, "%sAFIREWIRE_OUT_PATH", prefix);
@@ -211,8 +220,11 @@ int AudioOutConfig::save_defaults(BC_Hash *defaults, int active_config)
        defaults->updatef(interrupt_workaround, "%sALSA_INTERRUPT_WORKAROUND", prefix);
 
        defaults->updatef(esound_out_server, "%sESOUND_OUT_SERVER", prefix);
        defaults->updatef(interrupt_workaround, "%sALSA_INTERRUPT_WORKAROUND", prefix);
 
        defaults->updatef(esound_out_server, "%sESOUND_OUT_SERVER", prefix);
+       defaults->updatef(pulse_out_server, "%sPULSE_OUT_SERVER", prefix);
        defaults->updatef(esound_out_port, "%sESOUND_OUT_PORT", prefix);
 
        defaults->updatef(esound_out_port, "%sESOUND_OUT_PORT", prefix);
 
+       defaults->updatef(pulse_out_server, "%sPULSE_OUT_SERVER", prefix);
+
        defaults->updatef(firewire_channel, "%sAFIREWIRE_OUT_CHANNEL", prefix);
        defaults->updatef(firewire_port, "%sAFIREWIRE_OUT_PORT", prefix);
        defaults->updatef(firewire_path, "%sAFIREWIRE_OUT_PATH", prefix);
        defaults->updatef(firewire_channel, "%sAFIREWIRE_OUT_CHANNEL", prefix);
        defaults->updatef(firewire_port, "%sAFIREWIRE_OUT_PORT", prefix);
        defaults->updatef(firewire_path, "%sAFIREWIRE_OUT_PATH", prefix);
index 1896a5d..c4a83d3 100644 (file)
@@ -58,7 +58,8 @@ public:
 
        char esound_out_server[BCTEXTLEN];
        int esound_out_port;
 
        char esound_out_server[BCTEXTLEN];
        int esound_out_port;
-
+// PulseAudio
+       char pulse_out_server[BCTEXTLEN];
 // ALSA options
        char alsa_out_device[BCTEXTLEN];
        int alsa_out_bits;
 // ALSA options
        char alsa_out_device[BCTEXTLEN];
        int alsa_out_bits;
index 2ea355b..749a5e6 100644 (file)
@@ -48,7 +48,7 @@ AudioInConfig::AudioInConfig()
        strcpy(firewire_path, "/dev/raw1394");
        esound_in_server[0] = 0;
        esound_in_port = 0;
        strcpy(firewire_path, "/dev/raw1394");
        esound_in_server[0] = 0;
        esound_in_port = 0;
-
+       pulse_in_server[0] = 0;
        sprintf(alsa_in_device, "default");
        alsa_in_bits = 16;
        in_samplerate = 48000;
        sprintf(alsa_in_device, "default");
        alsa_in_bits = 16;
        in_samplerate = 48000;
@@ -100,6 +100,8 @@ void AudioInConfig::copy_from(AudioInConfig *src)
        strcpy(esound_in_server, src->esound_in_server);
        esound_in_port = src->esound_in_port;
 
        strcpy(esound_in_server, src->esound_in_server);
        esound_in_port = src->esound_in_port;
 
+       strcpy(pulse_in_server, src->pulse_in_server);
+
        for(int i = 0; i < MAXDEVICES; i++)
        {
                oss_enable[i] = src->oss_enable[i];
        for(int i = 0; i < MAXDEVICES; i++)
        {
                oss_enable[i] = src->oss_enable[i];
@@ -139,8 +141,9 @@ int AudioInConfig::load_defaults(BC_Hash *defaults)
        }
        oss_in_bits = defaults->get("R_OSS_IN_BITS", oss_in_bits);
        defaults->get("R_ESOUND_IN_SERVER", esound_in_server);
        }
        oss_in_bits = defaults->get("R_OSS_IN_BITS", oss_in_bits);
        defaults->get("R_ESOUND_IN_SERVER", esound_in_server);
+       defaults->get("R_PULSE_IN_SERVER", pulse_in_server);
        esound_in_port = defaults->get("R_ESOUND_IN_PORT", esound_in_port);
        esound_in_port = defaults->get("R_ESOUND_IN_PORT", esound_in_port);
-
+       defaults->get("R_PULSE_IN_SERVER", pulse_in_server);
        defaults->get("R_ALSA_IN_DEVICE", alsa_in_device);
        alsa_in_bits = defaults->get("R_ALSA_IN_BITS", alsa_in_bits);
        in_samplerate = defaults->get("R_IN_SAMPLERATE", in_samplerate);
        defaults->get("R_ALSA_IN_DEVICE", alsa_in_device);
        alsa_in_bits = defaults->get("R_ALSA_IN_BITS", alsa_in_bits);
        in_samplerate = defaults->get("R_IN_SAMPLERATE", in_samplerate);
@@ -170,8 +173,9 @@ int AudioInConfig::save_defaults(BC_Hash *defaults)
 
        defaults->update("R_OSS_IN_BITS", oss_in_bits);
        defaults->update("R_ESOUND_IN_SERVER", esound_in_server);
 
        defaults->update("R_OSS_IN_BITS", oss_in_bits);
        defaults->update("R_ESOUND_IN_SERVER", esound_in_server);
+       defaults->update("R_PULSE_IN_SERVER", pulse_in_server);
        defaults->update("R_ESOUND_IN_PORT", esound_in_port);
        defaults->update("R_ESOUND_IN_PORT", esound_in_port);
-
+       defaults->update("R_PULSE_IN_SERVER", pulse_in_server);
        defaults->update("R_ALSA_IN_DEVICE", alsa_in_device);
        defaults->update("R_ALSA_IN_BITS", alsa_in_bits);
        defaults->update("R_IN_SAMPLERATE", in_samplerate);
        defaults->update("R_ALSA_IN_DEVICE", alsa_in_device);
        defaults->update("R_ALSA_IN_BITS", alsa_in_bits);
        defaults->update("R_IN_SAMPLERATE", in_samplerate);
index c650c00..54f031b 100644 (file)
@@ -54,6 +54,7 @@ public:
 
        char esound_in_server[BCTEXTLEN];
        int esound_in_port;
 
        char esound_in_server[BCTEXTLEN];
        int esound_in_port;
+       char pulse_in_server[BCTEXTLEN];
        char alsa_in_device[BCTEXTLEN];
        int alsa_in_bits;
        char dvb_in_adapter[BCTEXTLEN];
        char alsa_in_device[BCTEXTLEN];
        int alsa_in_bits;
        char dvb_in_adapter[BCTEXTLEN];
index e22d28e..a4749bb 100644 (file)
@@ -24,7 +24,8 @@
 // An object which contains samples
 
 
 // An object which contains samples
 
 
-
+#include "bcresources.h"
+#include "bcwindowbase.h"
 #include "samples.h"
 #include <stdio.h>
 #include <sys/shm.h>
 #include "samples.h"
 #include <stdio.h>
 #include <sys/shm.h>
@@ -46,8 +47,15 @@ Samples::Samples(int samples)
 Samples::Samples(Samples *src)
 {
        reset();
 Samples::Samples(Samples *src)
 {
        reset();
-       share(src->get_shmid());
-       set_allocated(src->get_allocated());
+       int src_sz = src->get_allocated();
+       if( use_shm ) {
+               share(src->get_shmid());
+               set_allocated(src_sz);
+       }
+       else {
+               share(src->data);
+               set_allocated(0);
+       }
        set_offset(src->get_offset());
 }
 
        set_offset(src->get_offset());
 }
 
@@ -58,7 +66,8 @@ Samples::~Samples()
 
 void Samples::reset()
 {
 
 void Samples::reset()
 {
-       use_shm = 1;
+       BC_Resources *resources = BC_WindowBase::get_resources();
+       use_shm = !resources || !resources->use_shm ? 0 : 1;
        shmid = -1;
        data = 0;
        allocated = 0;
        shmid = -1;
        data = 0;
        allocated = 0;
@@ -71,7 +80,7 @@ void Samples::clear_objects()
        {
                if(data) shmdt(data);
        }
        {
                if(data) shmdt(data);
        }
-       else
+       else if( allocated )
        {
                delete [] data;
        }
        {
                delete [] data;
        }
@@ -95,16 +104,31 @@ void Samples::share(int shmid)
        this->allocated = 0;
        this->shmid = shmid;
 }
        this->allocated = 0;
        this->shmid = shmid;
 }
+void Samples::share(double *buffer)
+{
+       if(data)
+       {
+               if(use_shm)
+                       shmdt(data);
+               else
+                       delete [] data;
+       }
+       this->use_shm = 0;
+       data = buffer;
+       this->allocated = 0;
+       this->shmid = -1;
+}
+
 
 void Samples::allocate(int samples, int use_shm)
 {
 
 void Samples::allocate(int samples, int use_shm)
 {
-       if(data &&
+       if( !this->use_shm ) use_shm = 0;
+       if( data &&
                this->allocated >= samples &&
                this->allocated >= samples &&
-               this->use_shm == use_shm) return;
+               this->use_shm == use_shm ) return;
 
 
-       if(data)
-       {
-               if(this->use_shm)
+       if( data ) {
+               if( this->use_shm )
                        shmdt(data);
                else
                        delete [] data;
                        shmdt(data);
                else
                        delete [] data;
@@ -112,8 +136,7 @@ void Samples::allocate(int samples, int use_shm)
 
        this->use_shm = use_shm;
 
 
        this->use_shm = use_shm;
 
-       if(use_shm)
-       {
+       if( use_shm ) {
                shmid = shmget(IPC_PRIVATE,
                        (samples + 1) * sizeof(double),
                        IPC_CREAT | 0777);
                shmid = shmget(IPC_PRIVATE,
                        (samples + 1) * sizeof(double),
                        IPC_CREAT | 0777);
@@ -121,18 +144,12 @@ void Samples::allocate(int samples, int use_shm)
        // This causes it to automatically delete when the program exits.
                shmctl(shmid, IPC_RMID, 0);
        }
        // This causes it to automatically delete when the program exits.
                shmctl(shmid, IPC_RMID, 0);
        }
-       else
-       {
+       else {
                shmid = -1;
                data = new double[samples];
        }
 
                shmid = -1;
                data = new double[samples];
        }
 
-
        this->allocated = samples;
        this->allocated = samples;
-
-
-
-
 }
 
 // Get the buffer
 }
 
 // Get the buffer
index dc19756..a6cf599 100644 (file)
@@ -41,6 +41,7 @@ public:
        void reset();
        void clear_objects();
        void share(int shmid);
        void reset();
        void clear_objects();
        void share(int shmid);
+       void share(double *buffer);
        void allocate(int samples, int use_shm);
 // Get the buffer
        double* get_data();
        void allocate(int samples, int use_shm);
 // Get the buffer
        double* get_data();
index 6793a03..06406d5 100644 (file)
@@ -1,5 +1,6 @@
 #ifndef __SHUTTLE_H__
 #define __SHUTTLE_H__
 #ifndef __SHUTTLE_H__
 #define __SHUTTLE_H__
+#ifdef HAVE_SHUTTLE
 
 #include "arraylist.h"
 #include "bcwindowbase.inc"
 
 #include "arraylist.h"
 #include "bcwindowbase.inc"
@@ -20,8 +21,7 @@
 // delay in ms before processing each XTest event
 // CurrentTime means no delay
 #define DELAY CurrentTime
 // delay in ms before processing each XTest event
 // CurrentTime means no delay
 #define DELAY CurrentTime
-// playback max speed -64x .. 64x
-#define SHUTTLE_MAX_SPEED 64.
+
 #define SHUTTLE_INTERFACE 0
 
 // protocol for events from the shuttlepro HUD device
 #define SHUTTLE_INTERFACE 0
 
 // protocol for events from the shuttlepro HUD device
@@ -257,3 +257,4 @@ public:
 };
 
 #endif
 };
 
 #endif
+#endif
index 5919e9d..db6b37f 100644 (file)
@@ -9,4 +9,7 @@ class Translation;
 class Translations;
 class Shuttle;
 
 class Translations;
 class Shuttle;
 
+// playback max speed -64x .. 64x
+#define SHUTTLE_MAX_SPEED 64.
+
 #endif
 #endif
index 770556c..289ae26 100644 (file)
@@ -841,8 +841,11 @@ void SWindowGUI::save_spumux_data()
                if( !track->record ) continue;
                char *cp = track_title, *ep = cp+sizeof(track_title)-6;
                for( const char *bp=track->title; cp<ep && *bp!=0; ) {
                if( !track->record ) continue;
                char *cp = track_title, *ep = cp+sizeof(track_title)-6;
                for( const char *bp=track->title; cp<ep && *bp!=0; ) {
-                       int b = butf8(bp), c = !iswalnum(b) ? '_' : b;
-                       butf8(c, cp);
+                       int wch = butf8(bp); // iswalnum(wch) broken by MS port
+                       if( !( (wch >= 'A' && wch <= 'Z') ||
+                              (wch >= 'a' && wch <= 'z') ||
+                              (wch >= '0' && wch <= '9') ) ) wch = '_';
+                       butf8(wch, cp);
                }
                *cp = 0;
                snprintf(ext,len,"-%s.udvd",track_title);
                }
                *cp = 0;
                snprintf(ext,len,"-%s.udvd",track_title);
index 2ac5ccc..88e07d8 100644 (file)
@@ -1896,6 +1896,8 @@ void TrackCanvas::draw_hard_edges()
                for(Edit *edit = track->edits->first; edit; edit = edit->next) {
                        if( !edit->hard_left && !edit->hard_right ) continue;
                        edit_dimensions(edit, x, y, w, h);
                for(Edit *edit = track->edits->first; edit; edit = edit->next) {
                        if( !edit->hard_left && !edit->hard_right ) continue;
                        edit_dimensions(edit, x, y, w, h);
+                       if( !MWindowGUI::visible(x, x + w, 0, get_w()) ||
+                           !MWindowGUI::visible(y, y + h, 0, get_h()) ) continue;
                        set_color(GREEN);
                        set_opaque();
                        int y1 = y;
                        set_color(GREEN);
                        set_opaque();
                        int y1 = y;
index fbd9697..3245c16 100644 (file)
@@ -515,7 +515,9 @@ void VDriverMenu::create_objects()
        else
        {
                add_item(new VDriverItem(this, PLAYBACK_X11_TITLE, PLAYBACK_X11));
        else
        {
                add_item(new VDriverItem(this, PLAYBACK_X11_TITLE, PLAYBACK_X11));
+#ifdef HAVE_XV
                add_item(new VDriverItem(this, PLAYBACK_X11_XV_TITLE, PLAYBACK_X11_XV));
                add_item(new VDriverItem(this, PLAYBACK_X11_XV_TITLE, PLAYBACK_X11_XV));
+#endif
 #ifdef HAVE_GL
 // Check runtime glx version. pbuffer needs >= 1.3
                if(get_opengl_server_version() >= 103)
 #ifdef HAVE_GL
 // Check runtime glx version. pbuffer needs >= 1.3
                if(get_opengl_server_version() >= 103)
index 599a835..b0c4e77 100644 (file)
@@ -29,8 +29,6 @@ CFG_CFLAGS+=" -I/usr/include/freetype2 -I/usr/local/include/freetype2"
 CFG_CFLAGS+=" -I/usr/include/uuid -I/usr/local/include/uuid"
 CFG_CFLAGS+=" -I/usr/include/mjpegtools -I/usr/local/include/mjpegtools"
 
 CFG_CFLAGS+=" -I/usr/include/uuid -I/usr/local/include/uuid"
 CFG_CFLAGS+=" -I/usr/include/mjpegtools -I/usr/local/include/mjpegtools"
 
-CFG_LDFLAGS+=" -z noexecstack"
-
 AC_DEFUN([CHECK_WITH], [
 AC_ARG_WITH([$1],
   AC_HELP_STRING([--with-[$1]], [$2 ($4)]),
 AC_DEFUN([CHECK_WITH], [
 AC_ARG_WITH([$1],
   AC_HELP_STRING([--with-[$1]], [$2 ($4)]),
@@ -41,12 +39,12 @@ AC_SUBST([WANT_$3])
 CHECK_WITH([jobs],[parallel build jobs],[JOBS],[auto])
 CHECK_WITH([exec-name],[binary executable name],[CIN],[cin])
 CHECK_WITH([single-user],[to install cin in bin],[CINBIN_BUILD],[no])
 CHECK_WITH([jobs],[parallel build jobs],[JOBS],[auto])
 CHECK_WITH([exec-name],[binary executable name],[CIN],[cin])
 CHECK_WITH([single-user],[to install cin in bin],[CINBIN_BUILD],[no])
-CHECK_WITH([ladspa-build],[build ladspa library],[LADSPA_BUILD],[yes])
 CHECK_WITH([lv2],[lv2 library support],[LV2],[yes])
 CHECK_WITH([cinlib],[cinelerra library path],[CINLIB_DIR],[auto])
 CHECK_WITH([cindat],[cinelerra share path],[CINDAT_DIR],[auto])
 CHECK_WITH([plugin-dir],[plugin install dir],[PLUGIN_DIR],[auto])
 CHECK_WITH([ladspa-dir],[ladspa install dir],[LADSPA_DIR],[auto])
 CHECK_WITH([lv2],[lv2 library support],[LV2],[yes])
 CHECK_WITH([cinlib],[cinelerra library path],[CINLIB_DIR],[auto])
 CHECK_WITH([cindat],[cinelerra share path],[CINDAT_DIR],[auto])
 CHECK_WITH([plugin-dir],[plugin install dir],[PLUGIN_DIR],[auto])
 CHECK_WITH([ladspa-dir],[ladspa install dir],[LADSPA_DIR],[auto])
+CHECK_WITH([ladspa-build],[build ladspa library],[LADSPA_BUILD],[yes])
 CHECK_WITH([config-dir],[.bcast config dir],[CONFIG_DIR],[$$HOME/.bcast5])
 CHECK_WITH([nested-dir],[nested proxy dir],[NESTED_DIR],[$$HOME/Videos])
 CHECK_WITH([snap-dir],[snapshot/grabshot dir],[SNAP_DIR],[$$HOME/Pictures])
 CHECK_WITH([config-dir],[.bcast config dir],[CONFIG_DIR],[$$HOME/.bcast5])
 CHECK_WITH([nested-dir],[nested proxy dir],[NESTED_DIR],[$$HOME/Videos])
 CHECK_WITH([snap-dir],[snapshot/grabshot dir],[SNAP_DIR],[$$HOME/Pictures])
@@ -538,8 +536,6 @@ CHECK_LIB([XEXT], [Xext], [XShmQueryExtension])
 CHECK_HEADERS([XEXT], [Xlib XShm extention], [X11/Xlib.h X11/extensions/XShm.h X11/extensions/shape.h])
 CHECK_LIB([XINERAMA], [Xinerama], [XineramaQueryExtension])
 CHECK_HEADERS([XINERAMA], [Xinerama headers], [X11/extensions/Xinerama.h])
 CHECK_HEADERS([XEXT], [Xlib XShm extention], [X11/Xlib.h X11/extensions/XShm.h X11/extensions/shape.h])
 CHECK_LIB([XINERAMA], [Xinerama], [XineramaQueryExtension])
 CHECK_HEADERS([XINERAMA], [Xinerama headers], [X11/extensions/Xinerama.h])
-CHECK_LIB([XV], [Xv], [XvQueryExtension])
-CHECK_HEADERS([XV], [Xlib Xv extention], [X11/Xlib.h X11/extensions/Xvlib.h])
 CHECK_LIB([XFIXES], [Xfixes], [XFixesQueryVersion])
 CHECK_LIB([BZ2], [bz2], [BZ2_bzDecompress])
 CHECK_LIB([FONTCONFIG], [fontconfig], [FcInit])
 CHECK_LIB([XFIXES], [Xfixes], [XFixesQueryVersion])
 CHECK_LIB([BZ2], [bz2], [BZ2_bzDecompress])
 CHECK_LIB([FONTCONFIG], [fontconfig], [FcInit])
@@ -650,6 +646,10 @@ CHECK_WANT([GL], [auto], [use opengl], [
  CHECK_LIB([GL], [GLU], [gluOrtho2D])
  CHECK_HEADERS([GL], [opengl headers], [GL/gl.h GL/glext.h GL/glu.h GL/glx.h])])
 
  CHECK_LIB([GL], [GLU], [gluOrtho2D])
  CHECK_HEADERS([GL], [opengl headers], [GL/gl.h GL/glext.h GL/glu.h GL/glx.h])])
 
+CHECK_WANT([XV], [auto], [use xv], [
+ CHECK_LIB([xv], [Xv], [XvQueryExtension])
+ CHECK_HEADERS([xv], [Xlib Xv extention], [X11/Xlib.h X11/extensions/Xvlib.h])])
+
 CHECK_WANT([OSS], [auto], [use OSS audio], [
  CHECK_HEADERS([OSS], [oss headers], [sys/soundcard.h])])
 
 CHECK_WANT([OSS], [auto], [use OSS audio], [
  CHECK_HEADERS([OSS], [oss headers], [sys/soundcard.h])])
 
@@ -690,6 +690,22 @@ CHECK_WANT([ESOUND], [no], [use esd], [
  CHECK_LIB([audiofile], [audiofile], [afOpenFile])
  CHECK_HEADERS([audiofile], [audiofile headers], [audiofile.h])])
 
  CHECK_LIB([audiofile], [audiofile], [afOpenFile])
  CHECK_HEADERS([audiofile], [audiofile headers], [audiofile.h])])
 
+CHECK_WANT([PULSE], [auto], [use pulseaudio], [
+ CHECK_LIB([pulse_simple], [pulse-simple], [pa_simple_new])
+ CHECK_HEADERS([pulse_simple], [pulse-simple headers], [pulse/simple.h])
+ CHECK_LIB([pulse], [pulse], [pa_context_new])
+ CHECK_HEADERS([pulse], [pulse headers], [pulse/error.h])])
+
+CHECK_WANT([ISOFS], [auto], [use isofs], [
+ CHECK_HEADERS([isofs], [isofs headers], [linux/isofs.h])])
+
+if test "x$WANT_LADSPA_BUILD" != "xyes" ; then
+ CHECK_WANT([LADSPA], [auto], [ladspa plugin clients], [
+  CHECK_HEADERS([ladspa], [ladspa headers], [ladspa.h])])
+else
+ WANT_LADSPA=yes
+fi
+
 CHECK_WANT([SHUTTLE], [yes], [shuttle dev support], [
  CHECK_HEADERS([keysyms], [x11 keysym defs], [X11/keysymdef.h])])
 if test "x$WANT_SHUTTLE" = "xno"; then
 CHECK_WANT([SHUTTLE], [yes], [shuttle dev support], [
  CHECK_HEADERS([keysyms], [x11 keysym defs], [X11/keysymdef.h])])
 if test "x$WANT_SHUTTLE" = "xno"; then
@@ -888,9 +904,9 @@ echo ""
 if test "x$WANT_CIN_3RDPARTY" != "xno"; then
   CFG_CFLAGS+=" -DHAVE_CIN_3RDPARTY"
 fi
 if test "x$WANT_CIN_3RDPARTY" != "xno"; then
   CFG_CFLAGS+=" -DHAVE_CIN_3RDPARTY"
 fi
-for v in GL XFT XXF86VM OSS ALSA FIREWIRE DV DVB \
-        VIDEO4LINUX2 ESOUND PACTL OPENEXR LV2 \
-        COMMERCIAL LIBZMPEG SHUTTLE SHUTTLE_USB \
+for v in GL XFT XXF86VM OSS ALSA FIREWIRE DV DVB LADSPA \
+        VIDEO4LINUX2 ESOUND PULSE PACTL OPENEXR LV2 \
+        COMMERCIAL LIBZMPEG SHUTTLE SHUTTLE_USB XV \
         VAAPI VDPAU CUDA NV WINTV X10TV; do
   eval vv="\$WANT_$v"
   if test "x$vv" != "xno"; then
         VAAPI VDPAU CUDA NV WINTV X10TV; do
   eval vv="\$WANT_$v"
   if test "x$vv" != "xno"; then
@@ -1071,6 +1087,22 @@ if test "x$CFG_LDFLAGS" != "x" ; then
   echo ""
 fi
 
   echo ""
 fi
 
+if test "x$CYGWIN" != "x" ; then
+  echo 'FF_DIR ?= /usr/local'
+  echo 'CFLAGS += -I$(FF_DIR)/include'
+  echo 'LDFLAGS += -L$(FF_DIR)/lib'
+  echo ""
+  echo "CFLAGS += -DNO_BTRACE"
+  echo "CFLAGS += -DNO_GDB"
+  echo "CFLAGS += -DNO_CTX"
+  echo "CFLAGS += -DNO_PRCTL"
+  echo "CFLAGS += -DNO_TID"
+  echo "CFLAGS += -DNO_XSELECT"
+  echo ""
+else
+  LDFLAGS+=" -z noexecstack"
+fi
+
 if test "x$WANT_X264_HIDEPTH" = "xyes" ; then
   X264_CFG_PARAMS="$X264_CFG_PARAMS --bit-depth=10"
 fi
 if test "x$WANT_X264_HIDEPTH" = "xyes" ; then
   X264_CFG_PARAMS="$X264_CFG_PARAMS --bit-depth=10"
 fi
@@ -1153,3 +1185,4 @@ fi
 if test "x$X265_CFG_PARAMS" != "x" ; then
   echo "x265.cfg_params :=$X265_CFG_PARAMS -DENABLE_SHARED=no"
 fi
 if test "x$X265_CFG_PARAMS" != "x" ; then
   echo "x265.cfg_params :=$X265_CFG_PARAMS -DENABLE_SHARED=no"
 fi
+
index 2d8b621..81842bb 100644 (file)
 
 #include <string.h>
 #include <unistd.h>
 
 #include <string.h>
 #include <unistd.h>
+
+#ifdef HAVE_XV
 #include <X11/extensions/Xvlib.h>
 #include <X11/extensions/Xvlib.h>
+#endif
 
 int BC_Bitmap::max_active_buffers = 0;
 int BC_Bitmap::zombies = 0;
 
 int BC_Bitmap::max_active_buffers = 0;
 int BC_Bitmap::zombies = 0;
@@ -124,6 +127,8 @@ void BC_Bitmap::reque(BC_BitmapImage *bfr)
        avail_lock->unlock();
 }
 
        avail_lock->unlock();
 }
 
+
+#ifdef HAVE_XV
 BC_XvShmImage::BC_XvShmImage(BC_Bitmap *bitmap, int index,
        int w, int h, int color_model)
  : BC_BitmapImage(bitmap, index)
 BC_XvShmImage::BC_XvShmImage(BC_Bitmap *bitmap, int index,
        int w, int h, int color_model)
  : BC_BitmapImage(bitmap, index)
@@ -166,6 +171,7 @@ BC_XvShmImage::~BC_XvShmImage()
        XShmDetach(top_level->display, &shm_info);
        shmdt(shm_info.shmaddr);
 }
        XShmDetach(top_level->display, &shm_info);
        shmdt(shm_info.shmaddr);
 }
+#endif
 
 
 BC_XShmImage::BC_XShmImage(BC_Bitmap *bitmap, int index,
 
 
 BC_XShmImage::BC_XShmImage(BC_Bitmap *bitmap, int index,
@@ -211,6 +217,7 @@ BC_XShmImage::~BC_XShmImage()
 
 
 
 
 
 
+#ifdef HAVE_XV
 BC_XvImage::BC_XvImage(BC_Bitmap *bitmap, int index,
        int w, int h, int color_model)
  : BC_BitmapImage(bitmap, index)
 BC_XvImage::BC_XvImage(BC_Bitmap *bitmap, int index,
        int w, int h, int color_model)
  : BC_BitmapImage(bitmap, index)
@@ -237,6 +244,7 @@ BC_XvImage::~BC_XvImage()
 {
        XFree(xv_image);
 }
 {
        XFree(xv_image);
 }
+#endif
 
 
 BC_XImage::BC_XImage(BC_Bitmap *bitmap, int index,
 
 
 BC_XImage::BC_XImage(BC_Bitmap *bitmap, int index,
@@ -371,13 +379,16 @@ BC_BitmapImage *BC_Bitmap::new_buffer(int type, int idx)
        BC_BitmapImage *buffer = 0;
        if( idx < 0 ) {
                if( type == bmXShmImage ) type = bmXImage;
        BC_BitmapImage *buffer = 0;
        if( idx < 0 ) {
                if( type == bmXShmImage ) type = bmXImage;
+#ifdef HAVE_XV
                else if( type ==  bmXvShmImage ) type = bmXvImage;
                else if( type ==  bmXvShmImage ) type = bmXvImage;
+#endif
        }
        switch( type ) {
        default:
        case bmXImage:
                buffer = new BC_XImage(this, idx, w, h, color_model);
                break;
        }
        switch( type ) {
        default:
        case bmXImage:
                buffer = new BC_XImage(this, idx, w, h, color_model);
                break;
+#ifdef HAVE_XV
        case bmXvImage:
                buffer = new BC_XvImage(this, idx, w, h, color_model);
                break;
        case bmXvImage:
                buffer = new BC_XvImage(this, idx, w, h, color_model);
                break;
@@ -387,6 +398,7 @@ BC_BitmapImage *BC_Bitmap::new_buffer(int type, int idx)
        case bmXvShmImage:
                buffer = new BC_XvShmImage(this, idx, w, h, color_model);
                break;
        case bmXvShmImage:
                buffer = new BC_XvShmImage(this, idx, w, h, color_model);
                break;
+#endif
        }
        if( buffer->is_zombie() ) ++zombies;
        return buffer;
        }
        if( buffer->is_zombie() ) ++zombies;
        return buffer;
@@ -445,11 +457,19 @@ int BC_Bitmap::allocate_data()
                else if( bsz >= 0x400000 ) max_buffer_count /= 8;
                else if( bsz >= 0x100000 ) max_buffer_count /= 4;
                else if( bsz >= 0x10000 ) max_buffer_count /= 2;
                else if( bsz >= 0x400000 ) max_buffer_count /= 8;
                else if( bsz >= 0x100000 ) max_buffer_count /= 4;
                else if( bsz >= 0x10000 ) max_buffer_count /= 2;
-               type = hardware_scaling() ? bmXvShmImage : bmXShmImage;
+               type =
+#ifdef HAVE_XV
+                       hardware_scaling() ? bmXvShmImage :
+#endif
+                       bmXShmImage;
                count = MIN_BITMAP_BUFFERS;
        }
        else // use unshared memory.
                count = MIN_BITMAP_BUFFERS;
        }
        else // use unshared memory.
-               type = hardware_scaling() ? bmXvImage : bmXImage;
+               type =
+#ifdef HAVE_XV
+                       hardware_scaling() ? bmXvImage :
+#endif
+                       bmXImage;
        update_buffers(count);
        return 0;
 }
        update_buffers(count);
        return 0;
 }
@@ -531,6 +551,7 @@ int BC_XShmImage::write_drawable(Drawable &pixmap, GC &gc,
        return 0;
 }
 
        return 0;
 }
 
+#ifdef HAVE_XV
 int BC_XvImage::write_drawable(Drawable &pixmap, GC &gc,
        int source_x, int source_y, int source_w, int source_h,
        int dest_x, int dest_y, int dest_w, int dest_h)
 int BC_XvImage::write_drawable(Drawable &pixmap, GC &gc,
        int source_x, int source_y, int source_w, int source_h,
        int dest_x, int dest_y, int dest_w, int dest_h)
@@ -552,6 +573,7 @@ int BC_XvShmImage::write_drawable(Drawable &pixmap, GC &gc,
                dest_x, dest_y, dest_w, dest_h, bitmap->shm_reply);
        return 0;
 }
                dest_x, dest_y, dest_w, dest_h, bitmap->shm_reply);
        return 0;
 }
+#endif
 
 int BC_Bitmap::write_drawable(Drawable &pixmap, GC &gc,
                int source_x, int source_y, int source_w, int source_h,
 
 int BC_Bitmap::write_drawable(Drawable &pixmap, GC &gc,
                int source_x, int source_y, int source_w, int source_h,
index f065000..95b5868 100644 (file)
 #include <sys/ipc.h>
 #include <sys/shm.h>
 #include <X11/extensions/XShm.h>
 #include <sys/ipc.h>
 #include <sys/shm.h>
 #include <X11/extensions/XShm.h>
+#ifdef HAVE_XV
 #include <X11/extensions/Xvlib.h>
 #include <X11/extensions/Xvlib.h>
+#else
+typedef struct _XvImage XvImage;
+#endif
 
 #include "bcwindowbase.inc"
 #include "bcbitmap.inc"
 
 #include "bcwindowbase.inc"
 #include "bcbitmap.inc"
@@ -58,8 +62,10 @@ class BC_BitmapImage : public ListItem<BC_BitmapImage> {
        friend class BC_Bitmap;
        friend class BC_XImage;
        friend class BC_XShmImage;
        friend class BC_Bitmap;
        friend class BC_XImage;
        friend class BC_XShmImage;
+#ifdef HAVE_XV
        friend class BC_XvImage;
        friend class BC_XvShmImage;
        friend class BC_XvImage;
        friend class BC_XvShmImage;
+#endif
        friend class BC_ActiveBitmaps;
 protected:
        int read_frame_rgb(VFrame* frame);
        friend class BC_ActiveBitmaps;
 protected:
        int read_frame_rgb(VFrame* frame);
@@ -122,6 +128,7 @@ public:
        int read_drawable(Drawable &pixmap, int source_x, int source_y);
 };
 
        int read_drawable(Drawable &pixmap, int source_x, int source_y);
 };
 
+#ifdef HAVE_XV
 class BC_XvImage : public BC_BitmapImage {
        long xv_offset(int i) { return xv_image->offsets[i]; }
        unsigned char* xv_plane(int i) { return get_data() + xv_offset(i); }
 class BC_XvImage : public BC_BitmapImage {
        long xv_offset(int i) { return xv_image->offsets[i]; }
        unsigned char* xv_plane(int i) { return get_data() + xv_offset(i); }
@@ -151,15 +158,17 @@ public:
                int source_x, int source_y, int source_w, int source_h,
                int dest_x, int dest_y, int dest_w, int dest_h);
 };
                int source_x, int source_y, int source_w, int source_h,
                int dest_x, int dest_y, int dest_w, int dest_h);
 };
-
+#endif
 
 
 class BC_Bitmap
 {
        friend class BC_XImage;
        friend class BC_XShmImage;
 
 
 class BC_Bitmap
 {
        friend class BC_XImage;
        friend class BC_XShmImage;
+#ifdef HAVE_XV
        friend class BC_XvImage;
        friend class BC_XvShmImage;
        friend class BC_XvImage;
        friend class BC_XvShmImage;
+#endif
        friend class BC_BitmapImage;
        friend class BC_ActiveBitmaps;
        int buffer_count, max_buffer_count;
        friend class BC_BitmapImage;
        friend class BC_ActiveBitmaps;
        int buffer_count, max_buffer_count;
index aa3b2f0..7fa70fc 100644 (file)
@@ -113,18 +113,24 @@ void BC_Clipboard::run()
        XEvent event;
        int done = 0;
 #ifndef SINGLE_THREAD
        XEvent event;
        int done = 0;
 #ifndef SINGLE_THREAD
+#ifndef NO_XSELECT
        int x_fd = ConnectionNumber(out_display);
        int x_fd = ConnectionNumber(out_display);
+#endif
 #endif
 
        while(!done) {
 #ifndef SINGLE_THREAD
 // see bcwindowevents.C regarding XNextEvent
 #endif
 
        while(!done) {
 #ifndef SINGLE_THREAD
 // see bcwindowevents.C regarding XNextEvent
+#ifndef NO_XSELECT
                fd_set x_fds;
                FD_ZERO(&x_fds);
                FD_SET(x_fd, &x_fds);
                struct timeval tv;
                tv.tv_sec = 0;  tv.tv_usec = 200000;
                select(x_fd + 1, &x_fds, 0, 0, &tv);
                fd_set x_fds;
                FD_ZERO(&x_fds);
                FD_SET(x_fd, &x_fds);
                struct timeval tv;
                tv.tv_sec = 0;  tv.tv_usec = 200000;
                select(x_fd + 1, &x_fds, 0, 0, &tv);
+#else
+               usleep(100000);
+#endif
                XLockDisplay(out_display);
 
                while( XPending(out_display) ) {
                XLockDisplay(out_display);
 
                while( XPending(out_display) ) {
index c68e39a..ffc8a1c 100644 (file)
 #include "bckeyboard.h"
 #include "bcresources.h"
 #include "cstrdup.h"
 #include "bckeyboard.h"
 #include "bcresources.h"
 #include "cstrdup.h"
+#include "filesystem.h"
 
 #include <ctype.h>
 #include <dirent.h>
 
 #include <ctype.h>
 #include <dirent.h>
+#ifndef NO_BTRACE
 #include <execinfo.h>
 #include <execinfo.h>
+#endif
 #include <fcntl.h>
 #include <pwd.h>
 #include <stdio.h>
 #include <fcntl.h>
 #include <pwd.h>
 #include <stdio.h>
@@ -37,7 +40,9 @@
 #include <sys/stat.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
+#ifndef NO_PRCTL
 #include <sys/prctl.h>
 #include <sys/prctl.h>
+#endif
 #include <sys/types.h>
 
 BC_Signals* BC_Signals::global_signals = 0;
 #include <sys/types.h>
 
 BC_Signals* BC_Signals::global_signals = 0;
@@ -182,6 +187,7 @@ static const char* signal_titles[] =
 
 void BC_Signals::dump_stack(FILE *fp)
 {
 
 void BC_Signals::dump_stack(FILE *fp)
 {
+#ifndef NO_BTRACE
        void *buffer[256];
        int total = backtrace (buffer, 256);
        char **result = backtrace_symbols (buffer, total);
        void *buffer[256];
        int total = backtrace (buffer, 256);
        char **result = backtrace_symbols (buffer, total);
@@ -190,6 +196,7 @@ void BC_Signals::dump_stack(FILE *fp)
        {
                fprintf(fp, "%s\n", result[i]);
        }
        {
                fprintf(fp, "%s\n", result[i]);
        }
+#endif
 }
 
 // Kill subprocesses
 }
 
 // Kill subprocesses
@@ -270,15 +277,18 @@ static void signal_entry_recoverable(int signum)
                getpid());
 }
 
                getpid());
 }
 
+#ifndef NO_PRCTL
 // used to terminate child processes when program terminates
 static void handle_exit(int signum)
 {
 //printf("child %d exit\n", getpid());
        exit(0);
 }
 // used to terminate child processes when program terminates
 static void handle_exit(int signum)
 {
 //printf("child %d exit\n", getpid());
        exit(0);
 }
+#endif
 
 void BC_Signals::set_sighup_exit(int enable)
 {
 
 void BC_Signals::set_sighup_exit(int enable)
 {
+#ifndef NO_PRCTL
        if( enable ) {
 // causes SIGHUP to be generated when parent dies
                signal(SIGHUP, handle_exit);
        if( enable ) {
 // causes SIGHUP to be generated when parent dies
                signal(SIGHUP, handle_exit);
@@ -291,6 +301,7 @@ void BC_Signals::set_sighup_exit(int enable)
                signal(SIGHUP, signal_entry);
                prctl(PR_SET_PDEATHSIG, 0,0,0,0);
        }
                signal(SIGHUP, signal_entry);
                prctl(PR_SET_PDEATHSIG, 0,0,0,0);
        }
+#endif
 }
 
 BC_Signals::BC_Signals()
 }
 
 BC_Signals::BC_Signals()
@@ -379,6 +390,7 @@ const char* BC_Signals::sig_to_str(int number)
 }
 
 
 }
 
 
+#ifndef NO_CTX
 #include <ucontext.h>
 #include <sys/wait.h>
 #include "thread.h"
 #include <ucontext.h>
 #include <sys/wait.h>
 #include "thread.h"
@@ -463,6 +475,8 @@ static void reg_dump(FILE *fp,sigregs_t *rp) {}
 #error gotta have IP
 #endif
 
 #error gotta have IP
 #endif
 
+// HAVE_CTX
+#endif
 
 static void handle_dump(int n, siginfo_t * info, void *sc)
 {
 
 static void handle_dump(int n, siginfo_t * info, void *sc)
 {
@@ -474,13 +488,16 @@ static void handle_dump(int n, siginfo_t * info, void *sc)
 // it is not necessary to be root if ptrace is allowed via:
 // echo 0 > /proc/sys/kernel/yama/ptrace_scope (usually set to 1)
 //     if( uid != 0 ) return;
 // it is not necessary to be root if ptrace is allowed via:
 // echo 0 > /proc/sys/kernel/yama/ptrace_scope (usually set to 1)
 //     if( uid != 0 ) return;
-       ucontext_t *uc = (ucontext_t *)sc;
        int pid = getpid(), tid = gettid();
        int pid = getpid(), tid = gettid();
+       void *ip = 0;
+#ifndef NO_CTX
+       ucontext_t *uc = (ucontext_t *)sc;
        struct sigregs_t *c = (struct sigregs_t *)&uc->uc_mcontext;
        struct sigregs_t *c = (struct sigregs_t *)&uc->uc_mcontext;
-       uint8_t *ip = (uint8_t *)c->IP;
+       ip = (void *)c->IP;
+#endif
        fprintf(stderr,"** %s at %p in pid %d, tid %d\n",
                n==SIGSEGV? "segv" : n==SIGINT? "intr" : "trap",
        fprintf(stderr,"** %s at %p in pid %d, tid %d\n",
                n==SIGSEGV? "segv" : n==SIGINT? "intr" : "trap",
-               (void*)ip, pid, tid);
+               ip, pid, tid);
        FILE *fp = 0;
        char fn[PATH_MAX];
        if( BC_Signals::trap_path ) {
        FILE *fp = 0;
        char fn[PATH_MAX];
        if( BC_Signals::trap_path ) {
@@ -491,7 +508,7 @@ static void handle_dump(int n, siginfo_t * info, void *sc)
                fprintf(stderr,"writing debug data to %s\n", fn);
                fprintf(fp,"** %s at %p in pid %d, tid %d\n",
                        n==SIGSEGV? "segv" : n==SIGINT? "intr" : "trap",
                fprintf(stderr,"writing debug data to %s\n", fn);
                fprintf(fp,"** %s at %p in pid %d, tid %d\n",
                        n==SIGSEGV? "segv" : n==SIGINT? "intr" : "trap",
-                       (void*)c->IP, pid, tid);
+                       ip, pid, tid);
        }
        else {
                strcpy(fn, "stdout");
        }
        else {
                strcpy(fn, "stdout");
@@ -521,6 +538,7 @@ static void handle_dump(int n, siginfo_t * info, void *sc)
        fprintf(fp,"\nSTATUS:\n");   bc_copy_textfile(INT_MAX, fp,"/proc/%d/status",pid);
        fprintf(fp,"\nFD:\n");       bc_list_openfiles(INT_MAX, fp,"/proc/%d/fd", pid);
        fprintf(fp,"\nMAPS:\n");     bc_copy_textfile(INT_MAX, fp,"/proc/%d/maps",pid);
        fprintf(fp,"\nSTATUS:\n");   bc_copy_textfile(INT_MAX, fp,"/proc/%d/status",pid);
        fprintf(fp,"\nFD:\n");       bc_list_openfiles(INT_MAX, fp,"/proc/%d/fd", pid);
        fprintf(fp,"\nMAPS:\n");     bc_copy_textfile(INT_MAX, fp,"/proc/%d/maps",pid);
+#ifndef NO_CTX
        char proc_mem[64];
        if( tid > 0 && tid != pid )
                sprintf(proc_mem,"/proc/%d/task/%d/mem",pid,tid);
        char proc_mem[64];
        if( tid > 0 && tid != pid )
                sprintf(proc_mem,"/proc/%d/task/%d/mem",pid,tid);
@@ -530,7 +548,7 @@ static void handle_dump(int n, siginfo_t * info, void *sc)
        if( pfd >= 0 ) {
                fprintf(fp,"\nCODE:\n");
                for( int i=-32; i<32; ) {
        if( pfd >= 0 ) {
                fprintf(fp,"\nCODE:\n");
                for( int i=-32; i<32; ) {
-                       uint8_t v;  void *vp = (void *)(ip + i);
+                       uint8_t v;  void *vp = (void *)((char*)ip + i);
                        if( !(i & 7) ) fprintf(fp,"%p:  ", vp);
                        if( pread(pfd,&v,sizeof(v),(off_t)vp) != sizeof(v) ) break;
                        fprintf(fp,"%c%02x", !i ? '>' : ' ', v);
                        if( !(i & 7) ) fprintf(fp,"%p:  ", vp);
                        if( pread(pfd,&v,sizeof(v),(off_t)vp) != sizeof(v) ) break;
                        fprintf(fp,"%c%02x", !i ? '>' : ' ', v);
@@ -541,10 +559,11 @@ static void handle_dump(int n, siginfo_t * info, void *sc)
        }
        else
                fprintf(fp,"err opening: %s, %m\n", proc_mem);
        }
        else
                fprintf(fp,"err opening: %s, %m\n", proc_mem);
-
        reg_dump(fp, c);
        reg_dump(fp, c);
+#endif
        fprintf(fp,"\n\n");
        if( fp != stdout ) fclose(fp);
        fprintf(fp,"\n\n");
        if( fp != stdout ) fclose(fp);
+#ifndef NO_GDB
        char cmd[1024], *cp = cmd;
        cp += sprintf(cp, "exec gdb /proc/%d/exe -p %d --batch --quiet "
                "-ex \"thread apply all info registers\" "
        char cmd[1024], *cp = cmd;
        cp += sprintf(cp, "exec gdb /proc/%d/exe -p %d --batch --quiet "
                "-ex \"thread apply all info registers\" "
@@ -566,5 +585,6 @@ static void handle_dump(int n, siginfo_t * info, void *sc)
        }
         char *const argv[4] = { (char*) "/bin/sh", (char*) "-c", cmd, 0 };
         execvp(argv[0], &argv[0]);
        }
         char *const argv[4] = { (char*) "/bin/sh", (char*) "-c", cmd, 0 };
         execvp(argv[0], &argv[0]);
+#endif
 }
 
 }
 
index 128d514..f300e66 100644 (file)
@@ -58,14 +58,14 @@ BC_TextBox::BC_TextBox(int x, int y, int w, int rows,
 }
 
 BC_TextBox::BC_TextBox(int x, int y, int w, int rows,
 }
 
 BC_TextBox::BC_TextBox(int x, int y, int w, int rows,
-       int size, wchar_t *wtext, int has_border, int font)
+       int size, wchr_t *wtext, int has_border, int font)
  : BC_SubWindow(x, y, w, 0, -1)
 {
        is_utf8 = 1;
        skip_cursor = 0;
        reset_parameters(rows, has_border, font, size);
  : BC_SubWindow(x, y, w, 0, -1)
 {
        is_utf8 = 1;
        skip_cursor = 0;
        reset_parameters(rows, has_border, font, size);
-       wdemand(wcslen(wtext));
-       wcsncpy(this->wtext, wtext, wsize);
+       wdemand(wstrlen(wtext));
+       wstrncpy(this->wtext, wtext, wsize);
 }
 
 BC_TextBox::BC_TextBox(int x, int y, int w, int rows,
 }
 
 BC_TextBox::BC_TextBox(int x, int y, int w, int rows,
@@ -79,15 +79,15 @@ BC_TextBox::BC_TextBox(int x, int y, int w, int rows,
 }
 
 BC_TextBox::BC_TextBox(int x, int y, int w, int rows,
 }
 
 BC_TextBox::BC_TextBox(int x, int y, int w, int rows,
-       const wchar_t *wtext, int has_border, int font, int is_utf8)
+       const wchr_t *wtext, int has_border, int font, int is_utf8)
  : BC_SubWindow(x, y, w, 0, -1)
 {
        this->is_utf8 = is_utf8;
        skip_cursor = 0;
        reset_parameters(rows, has_border, font, BCTEXTLEN);
        wsize = BCTEXTLEN;
  : BC_SubWindow(x, y, w, 0, -1)
 {
        this->is_utf8 = is_utf8;
        skip_cursor = 0;
        reset_parameters(rows, has_border, font, BCTEXTLEN);
        wsize = BCTEXTLEN;
-       wtext = new wchar_t[wsize+1];
-       wcsncpy(this->wtext, wtext, wsize);
+       wtext = new wchr_t[wsize+1];
+       wstrncpy(this->wtext, wtext, wsize);
        this->wtext[wsize] = 0;
 }
 
        this->wtext[wsize] = 0;
 }
 
@@ -224,20 +224,20 @@ int BC_TextBox::wtext_update()
                int nsize = tsize > 0 ? tsize : tlen + BCTEXTLEN;
                wdemand(nsize);
                wlen = BC_Resources::encode(src_enc, dst_enc, text, tlen,
                int nsize = tsize > 0 ? tsize : tlen + BCTEXTLEN;
                wdemand(nsize);
                wlen = BC_Resources::encode(src_enc, dst_enc, text, tlen,
-                       (char*)wtext, wsize*sizeof(wchar_t)) / sizeof(wchar_t);
+                       (char*)wtext, wsize*sizeof(wchr_t)) / sizeof(wchr_t);
                dirty = 0;
        }
        wtext[wlen] = 0;
        return wlen;
 }
 
                dirty = 0;
        }
        wtext[wlen] = 0;
        return wlen;
 }
 
-int BC_TextBox::text_update(const wchar_t *wcp, int wsz, char *tcp, int tsz)
+int BC_TextBox::text_update(const wchr_t *wcp, int wsz, char *tcp, int tsz)
 {
        const char *src_enc = BC_Resources::wide_encoding;
        const char *dst_enc = BC_Resources::encoding;
 {
        const char *src_enc = BC_Resources::wide_encoding;
        const char *dst_enc = BC_Resources::encoding;
-       if( wsz < 0 ) wsz = wcslen(wcp);
+       if( wsz < 0 ) wsz = wstrlen(wcp);
        int len = BC_Resources::encode(src_enc, dst_enc,
        int len = BC_Resources::encode(src_enc, dst_enc,
-               (char*)wcp, wsz*sizeof(wchar_t), tcp, tsz);
+               (char*)wcp, wsz*sizeof(wchr_t), tcp, tsz);
        tcp[len] = 0;
        return len;
 }
        tcp[len] = 0;
        return len;
 }
@@ -460,11 +460,11 @@ int BC_TextBox::update(const char *text)
        return 0;
 }
 
        return 0;
 }
 
-int BC_TextBox::update(const wchar_t *wtext)
+int BC_TextBox::update(const wchr_t *wtext)
 {
 {
-       int wtext_len = wcslen(wtext);
+       int wtext_len = wstrlen(wtext);
        wdemand(wtext_len);
        wdemand(wtext_len);
-       wcsncpy(this->wtext, wtext, wsize);
+       wstrncpy(this->wtext, wtext, wsize);
        this->wlen = wtext_len;
        if(highlight_letter1 > wtext_len) highlight_letter1 = wtext_len;
        if(highlight_letter2 > wtext_len) highlight_letter2 = wtext_len;
        this->wlen = wtext_len;
        if(highlight_letter1 > wtext_len) highlight_letter1 = wtext_len;
        if(highlight_letter2 > wtext_len) highlight_letter2 = wtext_len;
@@ -541,7 +541,7 @@ const char* BC_TextBox::get_text()
        return text;
 }
 
        return text;
 }
 
-const wchar_t* BC_TextBox::get_wtext()
+const wchr_t* BC_TextBox::get_wtext()
 {
        wtext_update();
        return wtext;
 {
        wtext_update();
        return wtext;
@@ -664,7 +664,7 @@ void BC_TextBox::draw(int flush)
        for(i=0, k=text_y; i < wtext_len && k < get_h(); k += text_height) {
 // Draw row of text
                row_begin = i;
        for(i=0, k=text_y; i < wtext_len && k < get_h(); k += text_height) {
 // Draw row of text
                row_begin = i;
-               wchar_t *wtext_row = &wtext[i];
+               wchr_t *wtext_row = &wtext[i];
                for( ; i<wtext_len && wtext[i]!='\n'; ++i );
                if( (row_end=i) < wtext_len ) ++i;
 
                for( ; i<wtext_len && wtext[i]!='\n'; ++i );
                if( (row_end=i) < wtext_len ) ++i;
 
@@ -1120,7 +1120,7 @@ int BC_TextBox::repeat_event(int64_t duration)
 void BC_TextBox::default_keypress(int &dispatch_event, int &result)
 {
        int key = top_level->get_keypress(), len;
 void BC_TextBox::default_keypress(int &dispatch_event, int &result)
 {
        int key = top_level->get_keypress(), len;
-       wchar_t *wkeys = top_level->get_wkeystring(&len);
+       wchr_t *wkeys = top_level->get_wkeystring(&len);
        switch( key ) {
        case KPENTER:   key = '\n';     goto kpchr;
        case KPMINUS:   key = '-';      goto kpchr;
        switch( key ) {
        case KPENTER:   key = '\n';     goto kpchr;
        case KPMINUS:   key = '-';      goto kpchr;
@@ -1158,7 +1158,7 @@ int BC_TextBox::keypress_event()
        last_keypress = get_keypress();
 
        if( unicode_active >= 0 ) {
        last_keypress = get_keypress();
 
        if( unicode_active >= 0 ) {
-               wchar_t wch = 0;
+               wchr_t wch = 0;
                int wlen =  -1;
                switch( last_keypress ) {
 //unicode active acitons
                int wlen =  -1;
                switch( last_keypress ) {
 //unicode active acitons
@@ -1642,7 +1642,7 @@ int BC_TextBox::keypress_event()
                                case 'u': case 'U': {
                                        if( shift_down() ) {
                                                unicode_active = ibeam_letter;
                                case 'u': case 'U': {
                                        if( shift_down() ) {
                                                unicode_active = ibeam_letter;
-                                               wchar_t wkey = 'U';
+                                               wchr_t wkey = 'U';
                                                insert_text(&wkey, 1);
                                                find_ibeam(1);
                                                highlight_letter1 = unicode_active;
                                                insert_text(&wkey, 1);
                                                find_ibeam(1);
                                                highlight_letter1 = unicode_active;
@@ -1737,7 +1737,7 @@ int BC_TextBox::wdemand(int len)
 {
        if( wtext && wsize >= len ) return 0;
        int nsize = len + wlen/2 + BCTEXTLEN;
 {
        if( wtext && wsize >= len ) return 0;
        int nsize = len + wlen/2 + BCTEXTLEN;
-       wchar_t *ntext = new wchar_t[nsize+1];
+       wchr_t *ntext = new wchr_t[nsize+1];
        ntext[nsize] = 0;
        memcpy(ntext, wtext, wsize*sizeof(wtext[0]));
        delete [] wtext;  wtext = ntext;  wsize = nsize;
        ntext[nsize] = 0;
        memcpy(ntext, wtext, wsize*sizeof(wtext[0]));
        delete [] wtext;  wtext = ntext;  wsize = nsize;
@@ -1756,9 +1756,9 @@ int BC_TextBox::tdemand(int len)
        return 1;
 }
 
        return 1;
 }
 
-void BC_TextBox::insert_text(const wchar_t *wcp, int len)
+void BC_TextBox::insert_text(const wchr_t *wcp, int len)
 {
 {
-       if( len < 0 ) len = wcslen(wcp);
+       if( len < 0 ) len = wstrlen(wcp);
        int wtext_len = wtext_update();
        wdemand(wtext_len + len + 1);
        if( unicode_active < 0 && highlight_letter1 < highlight_letter2 ) {
        int wtext_len = wtext_update();
        wdemand(wtext_len + len + 1);
        if( unicode_active < 0 && highlight_letter1 < highlight_letter2 ) {
@@ -2101,11 +2101,11 @@ void BC_TextBox::paste_selection(int clipboard_num)
        int len = clipboard_len(clipboard_num);
        if( len > 0 )
        {
        int len = clipboard_len(clipboard_num);
        if( len > 0 )
        {
-               char cstring[len];  wchar_t wstring[len];
+               char cstring[len];  wchr_t wstring[len];
                from_clipboard(cstring, len, clipboard_num);  --len;
 //printf("BC_TextBox::paste_selection %d '%*.*s'\n",len,len,len,cstring);
                len = BC_Resources::encode(BC_Resources::encoding, BC_Resources::wide_encoding,
                from_clipboard(cstring, len, clipboard_num);  --len;
 //printf("BC_TextBox::paste_selection %d '%*.*s'\n",len,len,len,cstring);
                len = BC_Resources::encode(BC_Resources::encoding, BC_Resources::wide_encoding,
-                       cstring,len, (char *)wstring,(len+1)*sizeof(wchar_t)) / sizeof(wchar_t);
+                       cstring,len, (char *)wstring,(len+1)*sizeof(wchr_t)) / sizeof(wchr_t);
                insert_text(wstring, len);
                last_keypress = 0;
        }
                insert_text(wstring, len);
                last_keypress = 0;
        }
@@ -2212,7 +2212,7 @@ BC_ScrollTextBox::BC_ScrollTextBox(BC_WindowBase *parent_window,
 
 BC_ScrollTextBox::BC_ScrollTextBox(BC_WindowBase *parent_window,
        int x, int y, int w, int rows,
 
 BC_ScrollTextBox::BC_ScrollTextBox(BC_WindowBase *parent_window,
        int x, int y, int w, int rows,
-       const wchar_t *default_wtext, int default_size)
+       const wchr_t *default_wtext, int default_size)
 {
        this->parent_window = parent_window;
        this->x = x;
 {
        this->parent_window = parent_window;
        this->x = x;
@@ -2263,7 +2263,7 @@ void BC_ScrollTextBox::update(const char *text)
        update_scrollbars();
 }
 
        update_scrollbars();
 }
 
-void BC_ScrollTextBox::update(const wchar_t *wtext)
+void BC_ScrollTextBox::update(const wchr_t *wtext)
 {
        this->text->update(wtext);
        update_scrollbars();
 {
        this->text->update(wtext);
        update_scrollbars();
@@ -2289,7 +2289,7 @@ int BC_ScrollTextBox::button_release_event()
 
 int BC_ScrollTextBox::get_h() { return text->get_h(); }
 const char *BC_ScrollTextBox::get_text() { return text->get_text(); }
 
 int BC_ScrollTextBox::get_h() { return text->get_h(); }
 const char *BC_ScrollTextBox::get_text() { return text->get_text(); }
-const wchar_t *BC_ScrollTextBox::get_wtext() { return text->get_wtext(); }
+const wchr_t *BC_ScrollTextBox::get_wtext() { return text->get_wtext(); }
 
 int BC_ScrollTextBox::get_buttonpress()
 {
 
 int BC_ScrollTextBox::get_buttonpress()
 {
@@ -2325,10 +2325,10 @@ BC_ScrollTextBoxText::BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const char *te
        this->gui = gui;
 }
 
        this->gui = gui;
 }
 
-BC_ScrollTextBoxText::BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const wchar_t *wtext)
+BC_ScrollTextBoxText::BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const wchr_t *wtext)
  : BC_TextBox(gui->x, gui->y,
        gui->w - get_resources()->vscroll_data[SCROLL_HANDLE_UP]->get_w(),
  : BC_TextBox(gui->x, gui->y,
        gui->w - get_resources()->vscroll_data[SCROLL_HANDLE_UP]->get_w(),
-       gui->rows, gui->default_size, (wchar_t*)wtext, 1, MEDIUMFONT)
+       gui->rows, gui->default_size, (wchr_t*)wtext, 1, MEDIUMFONT)
 {
        this->gui = gui;
 }
 {
        this->gui = gui;
 }
@@ -2469,7 +2469,7 @@ BC_PopupTextBoxText::BC_PopupTextBoxText(BC_PopupTextBox *popup, int x, int y, c
        this->popup = popup;
 }
 
        this->popup = popup;
 }
 
-BC_PopupTextBoxText::BC_PopupTextBoxText(BC_PopupTextBox *popup, int x, int y, const wchar_t *wtext)
+BC_PopupTextBoxText::BC_PopupTextBoxText(BC_PopupTextBox *popup, int x, int y, const wchr_t *wtext)
  : BC_TextBox(x, y, popup->text_w, 1, wtext, BCTEXTLEN)
 {
        this->popup = popup;
  : BC_TextBox(x, y, popup->text_w, 1, wtext, BCTEXTLEN)
 {
        this->popup = popup;
@@ -2569,7 +2569,7 @@ int BC_PopupTextBox::handle_event()
 }
 
 const char *BC_PopupTextBox::get_text() { return textbox->get_text(); }
 }
 
 const char *BC_PopupTextBox::get_text() { return textbox->get_text(); }
-const wchar_t *BC_PopupTextBox::get_wtext() { return textbox->get_wtext(); }
+const wchr_t *BC_PopupTextBox::get_wtext() { return textbox->get_wtext(); }
 int BC_PopupTextBox::get_number() { return list_item; }
 void BC_PopupTextBox::set_number(int v) { list_item = v; }
 int BC_PopupTextBox::get_x() { return x; }
 int BC_PopupTextBox::get_number() { return list_item; }
 void BC_PopupTextBox::set_number(int v) { list_item = v; }
 int BC_PopupTextBox::get_x() { return x; }
@@ -2774,7 +2774,7 @@ const char* BC_TumbleTextBox::get_text()
        return textbox->get_text();
 }
 
        return textbox->get_text();
 }
 
-const wchar_t* BC_TumbleTextBox::get_wtext()
+const wchr_t* BC_TumbleTextBox::get_wtext()
 {
        return textbox->get_wtext();
 }
 {
        return textbox->get_wtext();
 }
index f96446d..ec41427 100644 (file)
@@ -55,17 +55,17 @@ class BC_TextBox : public BC_SubWindow
 // may be local fixed/dynamic, or shared fixed ref via set_text
        char *text;
 // always local dynamic
 // may be local fixed/dynamic, or shared fixed ref via set_text
        char *text;
 // always local dynamic
-       wchar_t *wtext;
+       wchr_t *wtext;
 public:
 // size > 0: fixed buffer, size == 0: dynamic buffer
 // size < 0: fixed shared buffer via set_text
        BC_TextBox(int x, int y, int w, int rows, int size, char *text,
                int has_border=1, int font=MEDIUMFONT);
 public:
 // size > 0: fixed buffer, size == 0: dynamic buffer
 // size < 0: fixed shared buffer via set_text
        BC_TextBox(int x, int y, int w, int rows, int size, char *text,
                int has_border=1, int font=MEDIUMFONT);
-       BC_TextBox(int x, int y, int w, int rows, int size, wchar_t *wtext,
+       BC_TextBox(int x, int y, int w, int rows, int size, wchr_t *wtext,
                int has_border=1, int font=MEDIUMFONT);
        BC_TextBox(int x, int y, int w, int rows, const char *text,
                int has_border=1, int font=MEDIUMFONT, int is_utf8=1);
                int has_border=1, int font=MEDIUMFONT);
        BC_TextBox(int x, int y, int w, int rows, const char *text,
                int has_border=1, int font=MEDIUMFONT, int is_utf8=1);
-       BC_TextBox(int x, int y, int w, int rows, const wchar_t *wtext,
+       BC_TextBox(int x, int y, int w, int rows, const wchr_t *wtext,
                int has_border=1, int font=MEDIUMFONT, int is_utf8=1);
        BC_TextBox(int x, int y, int w, int rows, int64_t text,
                int has_border=1, int font=MEDIUMFONT);
                int has_border=1, int font=MEDIUMFONT, int is_utf8=1);
        BC_TextBox(int x, int y, int w, int rows, int64_t text,
                int has_border=1, int font=MEDIUMFONT);
@@ -87,7 +87,7 @@ public:
        void set_selection(int char1, int char2, int ibeam);
        void wset_selection(int char1, int char2, int ibeam);
        int update(const char *text);
        void set_selection(int char1, int char2, int ibeam);
        void wset_selection(int char1, int char2, int ibeam);
        int update(const char *text);
-       int update(const wchar_t *wtext);
+       int update(const wchr_t *wtext);
        int update(int64_t value);
        int update(float value);
        void disable();
        int update(int64_t value);
        int update(float value);
        void disable();
@@ -110,7 +110,7 @@ public:
        int activate();
        int deactivate();
        const char* get_text();
        int activate();
        int deactivate();
        const char* get_text();
-       const wchar_t* get_wtext();
+       const wchr_t* get_wtext();
        void set_text(char *text, int isz);
        int wdemand(int len);
        int tdemand(int len);
        void set_text(char *text, int isz);
        int wdemand(int len);
        int tdemand(int len);
@@ -177,7 +177,7 @@ private:
        void copy_selection(int clipboard_num);
        void paste_selection(int clipboard_num);
        void delete_selection(int letter1, int letter2, int text_len);
        void copy_selection(int clipboard_num);
        void paste_selection(int clipboard_num);
        void delete_selection(int letter1, int letter2, int text_len);
-       void insert_text(const wchar_t *wcp, int len=-1);
+       void insert_text(const wchr_t *wcp, int len=-1);
 // Reformat text according to separators.
 // ibeam_left causes the ibeam to move left.
        int is_separator(const char *txt, int i);
 // Reformat text according to separators.
 // ibeam_left causes the ibeam to move left.
        int is_separator(const char *txt, int i);
@@ -195,7 +195,7 @@ private:
        int tstrcmp(const char *cp);
        char *tstrcpy(const char *cp);
        char *tstrcat(const char *cp);
        int tstrcmp(const char *cp);
        char *tstrcpy(const char *cp);
        char *tstrcat(const char *cp);
-       int text_update(const wchar_t *wcp, int wsz, char *tcp, int tsz);
+       int text_update(const wchr_t *wcp, int wsz, char *tcp, int tsz);
        int wtext_update();
 
 // Top left of text relative to window
        int wtext_update();
 
 // Top left of text relative to window
@@ -257,7 +257,7 @@ class BC_ScrollTextBox
        BC_ScrollTextBoxYScroll *yscroll;
        BC_WindowBase *parent_window;
        const char *default_text;
        BC_ScrollTextBoxYScroll *yscroll;
        BC_WindowBase *parent_window;
        const char *default_text;
-       const wchar_t *default_wtext;
+       const wchr_t *default_wtext;
        int default_size;
        int x, y, w, rows;
 
        int default_size;
        int x, y, w, rows;
 
@@ -270,7 +270,7 @@ public:
                const char *default_text, int default_size=BCTEXTLEN);
         BC_ScrollTextBox(BC_WindowBase *parent_window,
                 int x, int y, int w, int rows,
                const char *default_text, int default_size=BCTEXTLEN);
         BC_ScrollTextBox(BC_WindowBase *parent_window,
                 int x, int y, int w, int rows,
-                const wchar_t *default_wtext, int default_size=BCTEXTLEN);
+                const wchr_t *default_wtext, int default_size=BCTEXTLEN);
        virtual ~BC_ScrollTextBox();
        void create_objects();
 
        virtual ~BC_ScrollTextBox();
        void create_objects();
 
@@ -281,7 +281,7 @@ public:
        void set_text(char *text, int isz);
        int set_text_row(int n);
        void update(const char *text);
        void set_text(char *text, int isz);
        int set_text_row(int n);
        void update(const char *text);
-       void update(const wchar_t *wtext);
+       void update(const wchr_t *wtext);
        void reposition_window(int x, int y, int w, int rows);
        void update_scrollbars();
 // accessors
        void reposition_window(int x, int y, int w, int rows);
        void update_scrollbars();
 // accessors
@@ -295,7 +295,7 @@ public:
 // forward functions
        int get_h();
        const char *get_text();
 // forward functions
        int get_h();
        const char *get_text();
-       const wchar_t *get_wtext();
+       const wchr_t *get_wtext();
        int get_buttonpress();
        void wset_selection(int char1, int char2, int ibeam);
        void set_selection(int char1, int char2, int ibeam);
        int get_buttonpress();
        void wset_selection(int char1, int char2, int ibeam);
        void set_selection(int char1, int char2, int ibeam);
@@ -306,7 +306,7 @@ class BC_ScrollTextBoxText : public BC_TextBox
 {
 public:
        BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const char *text);
 {
 public:
        BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const char *text);
-       BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const wchar_t *wtext);
+       BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const wchr_t *wtext);
        virtual ~BC_ScrollTextBoxText();
        int handle_event();
        int motion_event();
        virtual ~BC_ScrollTextBoxText();
        int handle_event();
        int motion_event();
@@ -351,7 +351,7 @@ public:
        virtual int handle_event();
 
        const char *get_text();
        virtual int handle_event();
 
        const char *get_text();
-       const wchar_t *get_wtext();
+       const wchr_t *get_wtext();
        int get_number();
        void set_number(int v);
        int get_x();
        int get_number();
        void set_number(int v);
        int get_x();
@@ -376,7 +376,7 @@ private:
        int x, y, text_w, list_h;
        int list_format, list_item;
        const char *default_text;
        int x, y, text_w, list_h;
        int list_format, list_item;
        const char *default_text;
-       const wchar_t *default_wtext;
+       const wchr_t *default_wtext;
        ArrayList<BC_ListBoxItem*> *list_items;
        BC_PopupTextBoxText *textbox;
        BC_PopupTextBoxList *listbox;
        ArrayList<BC_ListBoxItem*> *list_items;
        BC_PopupTextBoxText *textbox;
        BC_PopupTextBoxList *listbox;
@@ -387,7 +387,7 @@ class BC_PopupTextBoxText : public BC_TextBox
 {
 public:
        BC_PopupTextBoxText(BC_PopupTextBox *popup, int x, int y, const char *text);
 {
 public:
        BC_PopupTextBoxText(BC_PopupTextBox *popup, int x, int y, const char *text);
-       BC_PopupTextBoxText(BC_PopupTextBox *popup, int x, int y, const wchar_t *wtext);
+       BC_PopupTextBoxText(BC_PopupTextBox *popup, int x, int y, const wchr_t *wtext);
        virtual ~BC_PopupTextBoxText();
        int handle_event();
        BC_PopupTextBox *popup;
        virtual ~BC_PopupTextBoxText();
        int handle_event();
        BC_PopupTextBox *popup;
@@ -428,7 +428,7 @@ public:
        virtual int handle_up_event();
        virtual int handle_down_event();
        const char* get_text();
        virtual int handle_up_event();
        virtual int handle_down_event();
        const char* get_text();
-       const wchar_t* get_wtext();
+       const wchr_t* get_wtext();
        BC_TextBox* get_textbox();
        int update(const char *value);
        int update(int64_t value);
        BC_TextBox* get_textbox();
        int update(const char *value);
        int update(int64_t value);
index 7e45392..2d08b46 100644 (file)
@@ -309,7 +309,7 @@ void BC_Trace::dump_traces(FILE *fp)
        }
 }
 
        }
 }
 
-void trace_info::set_owner() { owner = pthread_self(); }
+void trace_info::set_owner() { owner = (unsigned long)pthread_self(); }
 void trace_info::unset_owner() { owner = 0; }
 
 void BC_Trace::dump_locks(FILE *fp)
 void trace_info::unset_owner() { owner = 0; }
 
 void BC_Trace::dump_locks(FILE *fp)
@@ -322,7 +322,7 @@ void BC_Trace::dump_locks(FILE *fp)
                fprintf(fp,"    %p %s, %s %p%s",
                        p->info, p->title, p->loc,
                        (void*)p->tid, p->is_owner ? " *" : "");
                fprintf(fp,"    %p %s, %s %p%s",
                        p->info, p->title, p->loc,
                        (void*)p->tid, p->is_owner ? " *" : "");
-               if( p->info->owner && p->info->owner != p->tid )
+               if( p->info->owner && p->info->owner != (unsigned long)p->tid )
                        fprintf(fp," %p", (void*)p->info->owner);
                fprintf(fp,"\n");
        }
                        fprintf(fp," %p", (void*)p->info->owner);
                fprintf(fp,"\n");
        }
index 9a730f9..a35645a 100644 (file)
@@ -57,7 +57,9 @@
 #include <typeinfo>
 
 #include <X11/extensions/Xinerama.h>
 #include <typeinfo>
 
 #include <X11/extensions/Xinerama.h>
+#ifdef HAVE_XV
 #include <X11/extensions/Xvlib.h>
 #include <X11/extensions/Xvlib.h>
+#endif
 #include <X11/extensions/shape.h>
 #include <X11/XF86keysym.h>
 #include <X11/Sunkeysym.h>
 #include <X11/extensions/shape.h>
 #include <X11/XF86keysym.h>
 #include <X11/Sunkeysym.h>
@@ -205,9 +207,10 @@ BC_WindowBase::~BC_WindowBase()
                        XFree(xinerama_info);
                xinerama_screens = 0;
                xinerama_info = 0;
                        XFree(xinerama_info);
                xinerama_screens = 0;
                xinerama_info = 0;
+#ifdef HAVE_XV
                if( xvideo_port_id >= 0 )
                        XvUngrabPort(display, xvideo_port_id, CurrentTime);
                if( xvideo_port_id >= 0 )
                        XvUngrabPort(display, xvideo_port_id, CurrentTime);
-
+#endif
                unlock_window();
 // Must be last reference to display.
 // _XftDisplayInfo needs a lock.
                unlock_window();
 // Must be last reference to display.
 // _XftDisplayInfo needs a lock.
@@ -869,8 +872,11 @@ int BC_WindowBase::keysym_lookup(XEvent *event)
        wkey_string_length = 0;
 
        if( input_context ) {
        wkey_string_length = 0;
 
        if( input_context ) {
+               wchar_t wkey[4];
                wkey_string_length = XwcLookupString(input_context,
                wkey_string_length = XwcLookupString(input_context,
-                       (XKeyEvent*)event, wkey_string, 4, &keysym, 0);
+                       (XKeyEvent*)event, wkey, 4, &keysym, 0);
+               for( int i=0; i<wkey_string_length; ++i )
+                       wkey_string[i] = wkey[i];
 //printf("keysym_lookup 1 %d %d %lx %x %x %x %x\n", wkey_string_length, keysym,
 //  wkey_string[0], wkey_string[1], wkey_string[2], wkey_string[3]);
 
 //printf("keysym_lookup 1 %d %d %lx %x %x %x %x\n", wkey_string_length, keysym,
 //  wkey_string[0], wkey_string[1], wkey_string[2], wkey_string[3]);
 
@@ -2421,7 +2427,7 @@ void BC_WindowBase::init_glyphs()
                "`abcdefghijklmnopqrstuvwxyz{|}~");
        for( int font=SMALLFONT; font<=LARGEFONT; ++font ) {
                set_font(font);
                "`abcdefghijklmnopqrstuvwxyz{|}~");
        for( int font=SMALLFONT; font<=LARGEFONT; ++font ) {
                set_font(font);
-               draw_text(5,5, text, 0);
+               draw_text(5,5, text);
        }
        set_font(cur_font);
        XUngrabServer(display);
        }
        set_font(cur_font);
        XUngrabServer(display);
@@ -2944,10 +2950,10 @@ int BC_WindowBase::get_text_width(int font, const char *text, int length)
        return w;
 }
 
        return w;
 }
 
-int BC_WindowBase::get_text_width(int font, const wchar_t *text, int length)
+int BC_WindowBase::get_text_width(int font, const wchr_t *text, int length)
 {
        int i, j, w = 0;
 {
        int i, j, w = 0;
-       if( length < 0 ) length = wcslen(text);
+       if( length < 0 ) length = wstrlen(text);
 
        for( i=j=0; i<length && text[i]; ++i ) {
                if( text[i] != '\n' ) continue;
 
        for( i=j=0; i<length && text[i]; ++i ) {
                if( text[i] != '\n' ) continue;
@@ -3114,6 +3120,7 @@ int BC_WindowBase::accel_available(int color_model, int lock_it)
 
 int BC_WindowBase::grab_port_id(int color_model)
 {
 
 int BC_WindowBase::grab_port_id(int color_model)
 {
+#ifdef HAVE_XV
        if( !get_resources()->use_xvideo ||     // disabled
            !get_resources()->use_shm )         // Only local server is fast enough.
                return -1;
        if( !get_resources()->use_xvideo ||     // disabled
            !get_resources()->use_shm )         // Only local server is fast enough.
                return -1;
@@ -3160,8 +3167,10 @@ int BC_WindowBase::grab_port_id(int color_model)
        }
 
        XvFreeAdaptorInfo(info);
        }
 
        XvFreeAdaptorInfo(info);
-
        return xvideo_port_id;
        return xvideo_port_id;
+#else
+       return -1;
+#endif
 }
 
 
 }
 
 
@@ -4039,7 +4048,7 @@ int BC_WindowBase::ctrl_down()
        return top_level->ctrl_mask;
 }
 
        return top_level->ctrl_mask;
 }
 
-wchar_t* BC_WindowBase::get_wkeystring(int *length)
+wchr_t* BC_WindowBase::get_wkeystring(int *length)
 {
        if(length)
                *length = top_level->wkey_string_length;
 {
        if(length)
                *length = top_level->wkey_string_length;
index 7e36cd6..6ce2128 100644 (file)
 //typedef void* GLXContext;
 #endif
 
 //typedef void* GLXContext;
 #endif
 
+typedef uint32_t wchr_t;
+
+static inline size_t wstrlen(const wchr_t *s)
+{
+       size_t len = 0;
+       while( s[len] ) ++len;
+       return len;
+}
+
+static inline wchr_t *wstrncpy(wchr_t *dest, const wchr_t *src, size_t n)
+{
+       for( wchr_t *dp=dest; n>0 && (*dp++=*src++); --n );
+       return dest;
+}
+
+
 class BC_ResizeCall
 {
 public:
 class BC_ResizeCall
 {
 public:
@@ -313,7 +329,7 @@ public:
        int get_buttonpress();
        int get_has_focus();
        int get_dragging();
        int get_buttonpress();
        int get_has_focus();
        int get_dragging();
-       wchar_t* get_wkeystring(int *length = 0);
+       wchr_t* get_wkeystring(int *length = 0);
        int get_keypress();
        int get_keysym() { return keysym; }
 #ifdef X_HAVE_UTF8_STRING
        int get_keypress();
        int get_keysym() { return keysym; }
 #ifdef X_HAVE_UTF8_STRING
@@ -341,7 +357,7 @@ public:
        int get_text_descent(int font);
        int get_text_height(int font, const char *text = 0);
        int get_text_width(int font, const char *text, int length = -1);
        int get_text_descent(int font);
        int get_text_height(int font, const char *text = 0);
        int get_text_width(int font, const char *text, int length = -1);
-       int get_text_width(int font, const wchar_t *text, int length = -1);
+       int get_text_width(int font, const wchr_t *text, int length = -1);
 // truncate the text with ... & return a new string
        char *get_truncated_text(int font, const char *text, int max_w);
        BC_Clipboard* get_clipboard();
 // truncate the text with ... & return a new string
        char *get_truncated_text(int font, const char *text, int max_w);
        BC_Clipboard* get_clipboard();
@@ -405,10 +421,10 @@ public:
        void draw_text_line(int x, int y, const char *text, int len, BC_Pixmap *pixmap = 0);
        void draw_xft_text(int x, int y, const char *text, int len,
                BC_Pixmap *pixmap = 0, int is_utf8 = 0);
        void draw_text_line(int x, int y, const char *text, int len, BC_Pixmap *pixmap = 0);
        void draw_xft_text(int x, int y, const char *text, int len,
                BC_Pixmap *pixmap = 0, int is_utf8 = 0);
-       void draw_xft_text(int x, int y, const wchar_t *text,
+       void draw_xft_text(int x, int y, const wchr_t *text,
                int length, BC_Pixmap *pixmap);
        int draw_single_text(int draw, int font,
                int length, BC_Pixmap *pixmap);
        int draw_single_text(int draw, int font,
-               int x, int y, const wchar_t *text, int length = -1, BC_Pixmap *pixmap = 0);
+               int x, int y, const wchr_t *text, int length = -1, BC_Pixmap *pixmap = 0);
        void draw_center_text(int x, int y, const char *text, int length = -1);
        void draw_line(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap = 0);
        void draw_polygon(ArrayList<int> *x, ArrayList<int> *y, BC_Pixmap *pixmap = 0);
        void draw_center_text(int x, int y, const char *text, int length = -1);
        void draw_line(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap = 0);
        void draw_polygon(ArrayList<int> *x, ArrayList<int> *y, BC_Pixmap *pixmap = 0);
@@ -574,7 +590,7 @@ private:
        Cursor create_grab_cursor();
 // Get width of a single line.  Used by get_text_width
        int get_single_text_width(int font, const char *text, int length);
        Cursor create_grab_cursor();
 // Get width of a single line.  Used by get_text_width
        int get_single_text_width(int font, const char *text, int length);
-       int get_single_text_width(int font, const wchar_t *text, int length);
+       int get_single_text_width(int font, const wchr_t *text, int length);
        int allocate_color_table();
        int init_gc();
        int init_fonts();
        int allocate_color_table();
        int init_gc();
        int init_fonts();
@@ -724,7 +740,7 @@ private:
 // Last key pressed
        int key_pressed;
        int wkey_string_length;
 // Last key pressed
        int key_pressed;
        int wkey_string_length;
-       wchar_t wkey_string[4];
+       wchr_t wkey_string[4];
 #ifdef X_HAVE_UTF8_STRING
        char* key_pressed_utf8;
 #endif
 #ifdef X_HAVE_UTF8_STRING
        char* key_pressed_utf8;
 #endif
index ab44e7c..eb35b63 100644 (file)
@@ -211,21 +211,21 @@ void BC_WindowBase::draw_xft_text(int x, int y,
        const char *text, int length, BC_Pixmap *pixmap, int is_utf8)
 {
        int l = length + 1;
        const char *text, int length, BC_Pixmap *pixmap, int is_utf8)
 {
        int l = length + 1;
-       wchar_t wide_text[l];
+       wchr_t wide_text[l];
        length = BC_Resources::encode(
                is_utf8 ? "UTF8" : BC_Resources::encoding, BC_Resources::wide_encoding,
        length = BC_Resources::encode(
                is_utf8 ? "UTF8" : BC_Resources::encoding, BC_Resources::wide_encoding,
-               (char*)text, length, (char*)wide_text, l*sizeof(wchar_t)) / sizeof(wchar_t);
+               (char*)text, length, (char*)wide_text, l*sizeof(wchr_t)) / sizeof(wchr_t);
        draw_xft_text(x, y, wide_text, length, pixmap);
 }
 
 void BC_WindowBase::draw_xft_text(int x, int y,
        draw_xft_text(x, y, wide_text, length, pixmap);
 }
 
 void BC_WindowBase::draw_xft_text(int x, int y,
-       const wchar_t *text, int length, BC_Pixmap *pixmap)
+       const wchr_t *text, int length, BC_Pixmap *pixmap)
 {
        int dy = -1;
 {
        int dy = -1;
-       const wchar_t *wsp = text, *wep = wsp + length;
+       const wchr_t *wsp = text, *wep = wsp + length;
        int font = top_level->current_font;
        while( wsp < wep ) {
        int font = top_level->current_font;
        while( wsp < wep ) {
-               const wchar_t *wcp = wsp;
+               const wchr_t *wcp = wsp;
                while( wcp < wep && *wcp != '\n' ) ++wcp;
                int len = wcp - wsp;
                if( len > 0 )
                while( wcp < wep && *wcp != '\n' ) ++wcp;
                int len = wcp - wsp;
                if( len > 0 )
@@ -272,16 +272,16 @@ void BC_WindowBase::xft_draw_string(XftColor *xft_color, XftFont *xft_font,
        }
 }
 
        }
 }
 
-int BC_WindowBase::get_single_text_width(int font, const wchar_t *text, int length)
+int BC_WindowBase::get_single_text_width(int font, const wchr_t *text, int length)
 {
        return draw_single_text(0, font, 0,0, text, length);
 }
 
 int BC_WindowBase::draw_single_text(int draw, int font,
 {
        return draw_single_text(0, font, 0,0, text, length);
 }
 
 int BC_WindowBase::draw_single_text(int draw, int font,
-       int x, int y, const wchar_t *text, int length, BC_Pixmap *pixmap)
+       int x, int y, const wchr_t *text, int length, BC_Pixmap *pixmap)
 {
        if( length < 0 )
 {
        if( length < 0 )
-               length = wcslen(text);
+               length = wstrlen(text);
        if( !length ) return 0;
 
        if( !get_resources()->use_xft ) {
        if( !length ) return 0;
 
        if( !get_resources()->use_xft ) {
@@ -319,7 +319,7 @@ int BC_WindowBase::draw_single_text(int draw, int font,
        int x0 = x;
        XftFont *basefont = top_level->get_xft_struct(font);
        XftFont *curfont = 0, *altfont = 0;
        int x0 = x;
        XftFont *basefont = top_level->get_xft_struct(font);
        XftFont *curfont = 0, *altfont = 0;
-       const wchar_t *up = text, *ubp = up, *uep = ubp + length;
+       const wchr_t *up = text, *ubp = up, *uep = ubp + length;
 
        while( up < uep ) {
                XftFont *xft_font = 0;
 
        while( up < uep ) {
                XftFont *xft_font = 0;
index fa79458..f05665f 100644 (file)
@@ -74,7 +74,9 @@ void BC_WindowEvents::run()
 // listening anymore and XCloseDisplay locks up.
        XEvent *event;
 #ifndef SINGLE_THREAD
 // listening anymore and XCloseDisplay locks up.
        XEvent *event;
 #ifndef SINGLE_THREAD
+#ifndef NO_XSELECT
        int x_fd = ConnectionNumber(window->display);
        int x_fd = ConnectionNumber(window->display);
+#endif
 #endif
 
        while(!done)
 #endif
 
        while(!done)
@@ -89,6 +91,7 @@ void BC_WindowEvents::run()
 // This came from a linuxquestions post.
 // We can get a file descriptor for the X display & use select instead of XNextEvent.
 // The newest X11 library requires locking the display to use XNextEvent.
 // This came from a linuxquestions post.
 // We can get a file descriptor for the X display & use select instead of XNextEvent.
 // The newest X11 library requires locking the display to use XNextEvent.
+#ifndef NO_XSELECT
                fd_set x_fds;
                FD_ZERO(&x_fds);
                FD_SET(x_fd, &x_fds);
                fd_set x_fds;
                FD_ZERO(&x_fds);
                FD_SET(x_fd, &x_fds);
@@ -96,6 +99,9 @@ void BC_WindowEvents::run()
                tv.tv_sec = 0;  tv.tv_usec = 200000;
 //printf("BC_WindowEvents::run %d %s\n", __LINE__, window->title);
                select(x_fd + 1, &x_fds, 0, 0, &tv);
                tv.tv_sec = 0;  tv.tv_usec = 200000;
 //printf("BC_WindowEvents::run %d %s\n", __LINE__, window->title);
                select(x_fd + 1, &x_fds, 0, 0, &tv);
+#else
+               usleep(100000);
+#endif
                XLockDisplay(window->display);
                while(!done && XPending(window->display))
                {
                XLockDisplay(window->display);
                while(!done && XPending(window->display))
                {
index 59227cb..db95285 100644 (file)
@@ -4,7 +4,6 @@
 #include <stdarg.h>
 #include <stdint.h>
 #include <string.h>
 #include <stdarg.h>
 #include <stdint.h>
 #include <string.h>
-#include <wctype.h>
 
 static inline char *cstrcat(int n, ...) {
   int len = 0;  va_list va;  va_start(va,n);
 
 static inline char *cstrcat(int n, ...) {
   int len = 0;  va_list va;  va_start(va,n);
@@ -58,23 +57,33 @@ static inline int butf8(unsigned int v, char *&cp)
 }
 
 static inline int bstrcasecmp(const char *ap, const char *bp)
 }
 
 static inline int bstrcasecmp(const char *ap, const char *bp)
-{
-       int a, b, ret;
+{ // not really correct, but what was left after MS port
+       int ret, a, b;
        do {
        do {
-               a = towlower(butf8(ap));  b = towlower(butf8(bp));
+               if( (a=butf8(ap)) >= 'A' && a <= 'Z' ) a += 'a' - 'A';
+               if( (b=butf8(bp)) >= 'A' && b <= 'Z' ) b += 'a' - 'A';
        } while( !(ret=a-b) && a && b );
        return ret;
 }
 
 static inline const char *bstrcasestr(const char *src, const char *tgt)
 {
        } while( !(ret=a-b) && a && b );
        return ret;
 }
 
 static inline const char *bstrcasestr(const char *src, const char *tgt)
 {
-       int ssz = strlen(src), tsz = strlen(tgt), ret = 0;
+       int ssz = strlen(src), tsz = strlen(tgt);
        const char *cp = tgt;
        const char *cp = tgt;
-       wchar_t wtgt[tsz + 1], *tp = wtgt;
-       while( *cp ) *tp++ = towlower(butf8(cp));
+       uint32_t wtgt[tsz+1], *tp = wtgt;
+       while( *cp ) {
+               int wch = butf8(cp);
+               if( wch >= 'A' && wch <= 'Z' ) wch += 'a' - 'A';
+               *tp++ = wch;
+       }
+       *tp = 0;
        for( tsz=tp-wtgt; ssz>=tsz; ++src,--ssz ) {
                cp = src;   tp = wtgt;
        for( tsz=tp-wtgt; ssz>=tsz; ++src,--ssz ) {
                cp = src;   tp = wtgt;
-               for( int i=tsz; --i>=0 && !(ret=towlower(butf8(cp))-*tp); ++tp );
+               int ret = 0, wch = 0;
+               for( int i=tsz; --i>=0 && !ret && (wch=butf8(cp)); ) {
+                       if( wch >= 'A' && wch <= 'Z' ) wch += 'a' - 'A';
+                       ret = wch - *tp++;
+               }
                if( !ret ) return src;
        }
        return 0;
                if( !ret ) return src;
        }
        return 0;
index 7ad81b2..79f3e71 100644 (file)
 #include <stdio.h>
 #include <pthread.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <pthread.h>
 #include <unistd.h>
+
+#ifndef NO_TID
 #include <sys/syscall.h>
 
 // glibc >= 2.30 provides gettid() in unistd
 #if !defined(__GLIBC_PREREQ) || !__GLIBC_PREREQ(2, 30)
 static inline int gettid() { return syscall(SYS_gettid, 0, 0, 0); }
 #endif
 #include <sys/syscall.h>
 
 // glibc >= 2.30 provides gettid() in unistd
 #if !defined(__GLIBC_PREREQ) || !__GLIBC_PREREQ(2, 30)
 static inline int gettid() { return syscall(SYS_gettid, 0, 0, 0); }
 #endif
+#else
+static inline long gettid() { return (long)pthread_self(); }
+#endif
 
 // The thread does not autodelete by default.
 // If autodelete is 1 the thread autodeletes.
 
 // The thread does not autodelete by default.
 // If autodelete is 1 the thread autodeletes.
index 6ec5af6..c627200 100644 (file)
@@ -809,7 +809,7 @@ SET_TRACE
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glDisable(GL_BLEND);
 SET_TRACE
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glDisable(GL_BLEND);
 SET_TRACE
-       return 0;
 #endif
 #endif
+       return 0;
 }
 
 }
 
index 5737d4c..7f84a76 100644 (file)
@@ -434,7 +434,7 @@ void DenoiseFFTEffect::collect_noise()
        for(int i = 0; i < config.samples; i += WINDOW_SIZE)
        {
                collect_engine->process_buffer(collection_start,
        for(int i = 0; i < config.samples; i += WINDOW_SIZE)
        {
                collect_engine->process_buffer(collection_start,
-                       WINDOW_SIZE, (Samples*)0, get_direction());
+                       WINDOW_SIZE, (Samples**)0, get_direction());
                collection_start += step * WINDOW_SIZE;
                total_windows++;
        }
                collection_start += step * WINDOW_SIZE;
                total_windows++;
        }
diff --git a/cinelerra-5.1/plugins/mandelcuda/.swp b/cinelerra-5.1/plugins/mandelcuda/.swp
deleted file mode 100644 (file)
index 5d9b1b9..0000000
Binary files a/cinelerra-5.1/plugins/mandelcuda/.swp and /dev/null differ
diff --git a/cinelerra-5.1/plugins/nbodycuda/.swp b/cinelerra-5.1/plugins/nbodycuda/.swp
deleted file mode 100644 (file)
index 5d9b1b9..0000000
Binary files a/cinelerra-5.1/plugins/nbodycuda/.swp and /dev/null differ
index 85e9b30..b5e1963 100644 (file)
@@ -1,6 +1,7 @@
 include ../../plugin_defs
 
 OBJS = $(OBJDIR)/shapewipe.o
 include ../../plugin_defs
 
 OBJS = $(OBJDIR)/shapewipe.o
+LFLAGS += -lpng
 
 PLUGIN = shapewipe
 
 
 PLUGIN = shapewipe
 
index 88d6501..0fc6669 100644 (file)
@@ -145,7 +145,7 @@ int TitleConfig::equivalent(TitleConfig &that)
 //             fade_in == that.fade_in && fade_out == that.fade_out &&
 //             EQUIV(pixels_per_second, that.pixels_per_second) &&
                wlen == that.wlen &&
 //             fade_in == that.fade_in && fade_out == that.fade_out &&
 //             EQUIV(pixels_per_second, that.pixels_per_second) &&
                wlen == that.wlen &&
-               !memcmp(wtext, that.wtext, wlen * sizeof(wchar_t)) &&
+               !memcmp(wtext, that.wtext, wlen * sizeof(wchr_t)) &&
                title_x == that.title_x && title_y == that.title_y &&
                title_w == that.title_w && title_h == that.title_h &&
 //             window_w == that.window_w && window_h == that.window_h &&
                title_x == that.title_x && title_y == that.title_y &&
                title_w == that.title_w && title_h == that.title_h &&
 //             window_w == that.window_w && window_h == that.window_h &&
@@ -180,7 +180,7 @@ void TitleConfig::copy_from(TitleConfig &that)
        fade_out = that.fade_out;
        pixels_per_second = that.pixels_per_second;
        demand(wlen = that.wlen);
        fade_out = that.fade_out;
        pixels_per_second = that.pixels_per_second;
        demand(wlen = that.wlen);
-       memcpy(wtext, that.wtext, that.wlen * sizeof(wchar_t));
+       memcpy(wtext, that.wtext, that.wlen * sizeof(wchr_t));
        title_x = that.title_x;  title_y = that.title_y;
        title_w = that.title_w;  title_h = that.title_h;
        window_w = that.window_w;  window_h = that.window_h;
        title_x = that.title_x;  title_y = that.title_y;
        title_w = that.title_w;  title_h = that.title_h;
        window_w = that.window_w;  window_h = that.window_h;
@@ -218,7 +218,7 @@ void TitleConfig::interpolate(TitleConfig &prev, TitleConfig &next,
        fade_out = prev.fade_out;
        pixels_per_second = prev.pixels_per_second;
        demand(wlen = prev.wlen);
        fade_out = prev.fade_out;
        pixels_per_second = prev.pixels_per_second;
        demand(wlen = prev.wlen);
-       memcpy(wtext, prev.wtext, prev.wlen * sizeof(wchar_t));
+       memcpy(wtext, prev.wtext, prev.wlen * sizeof(wchr_t));
        wtext[wlen] = 0;
        this->title_x = prev.title_x == next.title_x ? prev.title_x :
                prev.title_x * prev_scale + next.title_x * next_scale;
        wtext[wlen] = 0;
        this->title_x = prev.title_x == next.title_x ? prev.title_x :
                prev.title_x * prev_scale + next.title_x * next_scale;
@@ -245,7 +245,7 @@ int TitleConfig::demand(long sz)
        if( wtext && wsize >= sz ) return 0;
        delete [] wtext;
        wsize = sz + wlen/2 + 0x1000;
        if( wtext && wsize >= sz ) return 0;
        delete [] wtext;
        wsize = sz + wlen/2 + 0x1000;
-       wtext = new wchar_t[wsize+1];
+       wtext = new wchr_t[wsize+1];
        wtext[wsize] = 0;
        return 1;
 }
        wtext[wsize] = 0;
        return 1;
 }
@@ -254,7 +254,7 @@ void TitleConfig::to_wtext(const char *from_enc, const char *text, int tlen)
 {
        demand(tlen);
        wlen = BC_Resources::encode(from_enc, BC_Resources::wide_encoding,
 {
        demand(tlen);
        wlen = BC_Resources::encode(from_enc, BC_Resources::wide_encoding,
-               (char*)text,tlen, (char *)wtext,sizeof(*wtext)*wsize) / sizeof(wchar_t);
+               (char*)text,tlen, (char *)wtext,sizeof(*wtext)*wsize) / sizeof(wchr_t);
        while( wlen > 0 && !wtext[wlen-1] ) --wlen;
 }
 
        while( wlen > 0 && !wtext[wlen-1] ) --wlen;
 }
 
@@ -1325,15 +1325,15 @@ BC_FontEntry* TitleMain::config_font()
 }
 
 
 }
 
 
-static inline bool is_ltr(wchar_t wch) { return iswalpha(wch); }
-static inline bool is_nbr(wchar_t wch) { return iswdigit(wch); }
-static inline bool is_ws(wchar_t wch) { return wch==' ' || wch=='\t'; }
-static inline bool is_idch(wchar_t wch) { return is_ltr(wch) || is_nbr(wch) || wch=='_'; }
+static inline bool is_ltr(wchr_t wch) { return iswalpha(wch); }
+static inline bool is_nbr(wchr_t wch) { return iswdigit(wch); }
+static inline bool is_ws(wchr_t wch) { return wch==' ' || wch=='\t'; }
+static inline bool is_idch(wchr_t wch) { return is_ltr(wch) || is_nbr(wch) || wch=='_'; }
 
 // return eof=-1, chr=0, opener=1, closer=2
 
 // return eof=-1, chr=0, opener=1, closer=2
-int TitleParser::wget(wchar_t &wch)
+int TitleParser::wget(wchr_t &wch)
 {
 {
-       wchar_t *wip = wid, *wtp = wtxt;  *wip = 0;  *wtp = 0;
+       wchr_t *wip = wid, *wtp = wtxt;  *wip = 0;  *wtp = 0;
        int ilen = sizeof(wid)/sizeof(wid[0]);
        int tlen = sizeof(wtxt)/sizeof(wtxt[0]);
        int ich;
        int ilen = sizeof(wid)/sizeof(wid[0]);
        int tlen = sizeof(wtxt)/sizeof(wtxt[0]);
        int ich;
@@ -1370,15 +1370,15 @@ int TitleParser::wget(wchar_t &wch)
        wch = ich;
        return ret;
 }
        wch = ich;
        return ret;
 }
-int TitleParser::tget(wchar_t &wch)
+int TitleParser::tget(wchr_t &wch)
 {
        int ret = wget(wch);
        if( ret > 0 ) {
 {
        int ret = wget(wch);
        if( ret > 0 ) {
-               int wid_len = wcslen(wid)+1;
+               int wid_len = wstrlen(wid)+1;
                BC_Resources::encode(
                        BC_Resources::wide_encoding, plugin->config.encoding,
                        (char*)wid,wid_len*sizeof(wid[0]), (char *)id,sizeof(id));
                BC_Resources::encode(
                        BC_Resources::wide_encoding, plugin->config.encoding,
                        (char*)wid,wid_len*sizeof(wid[0]), (char *)id,sizeof(id));
-               int wtxt_len = wcslen(wtxt)+1;
+               int wtxt_len = wstrlen(wtxt)+1;
                BC_Resources::encode(
                        BC_Resources::wide_encoding, plugin->config.encoding,
                        (char*)wtxt,wtxt_len*sizeof(wtxt[0]), (char *)text,sizeof(text));
                BC_Resources::encode(
                        BC_Resources::wide_encoding, plugin->config.encoding,
                        (char*)wtxt,wtxt_len*sizeof(wtxt[0]), (char *)text,sizeof(text));
@@ -1670,7 +1670,7 @@ void TitleMain::load_glyphs()
        int total_packages = 0;
 
        while( !wchrs.eof() ) {
        int total_packages = 0;
 
        while( !wchrs.eof() ) {
-               wchar_t wch1 = wchrs.wcur(), wch;
+               wchr_t wch1 = wchrs.wcur(), wch;
                long ipos = wchrs.tell();
                int ret = wchrs.tget(wch);
                if( ret > 0 ) {
                long ipos = wchrs.tell();
                int ret = wchrs.tget(wch);
                if( ret > 0 ) {
@@ -1778,7 +1778,7 @@ int TitleMain::get_text()
                if( !row ) row = title_rows.add();
                TitleChar *chr = 0;
                long ipos = wchrs.tell();
                if( !row ) row = title_rows.add();
                TitleChar *chr = 0;
                long ipos = wchrs.tell();
-               wchar_t wch1 = wchrs.wcur(), wch;
+               wchr_t wch1 = wchrs.wcur(), wch;
                int ret = wchrs.tget(wch);
                if( ret < 0 || wch == '\n' ) {
                        if( row->x1 > row->x2 ) row->x1 = row->x2 = 0;
                int ret = wchrs.tget(wch);
                if( ret < 0 || wch == '\n' ) {
                        if( row->x1 > row->x2 ) row->x1 = row->x2 = 0;
@@ -2554,7 +2554,7 @@ void TitleMain::save_data(KeyFrame *keyframe)
        char text[tsz];
        int text_len = BC_Resources::encode(
                BC_Resources::wide_encoding, DEFAULT_ENCODING,
        char text[tsz];
        int text_len = BC_Resources::encode(
                BC_Resources::wide_encoding, DEFAULT_ENCODING,
-               (char*)config.wtext, config.wlen*sizeof(wchar_t),
+               (char*)config.wtext, config.wlen*sizeof(wchr_t),
                text, tsz);
        output.append_text(text, text_len);
        output.tag.set_title("/TITLE");
                text, tsz);
        output.append_text(text, text_len);
        output.tag.set_title("/TITLE");
@@ -2621,15 +2621,15 @@ void TitleMain::read_data(KeyFrame *keyframe)
        }
 }
 
        }
 }
 
-void TitleMain::insert_text(const wchar_t *wtxt, int pos)
+void TitleMain::insert_text(const wchr_t *wtxt, int pos)
 {
 {
-       int len = wcslen(wtxt);
+       int len = wstrlen(wtxt);
        int wlen = config.wlen;
        if( pos < 0 ) pos = 0;
        if( pos > wlen ) pos = wlen;
        config.demand(wlen + len);
        int wsize1 = config.wsize-1;
        int wlen = config.wlen;
        if( pos < 0 ) pos = 0;
        if( pos > wlen ) pos = wlen;
        config.demand(wlen + len);
        int wsize1 = config.wsize-1;
-       wchar_t *wtext = config.wtext;
+       wchr_t *wtext = config.wtext;
        for( int i=wlen, j=wlen+len; --i>=pos; ) {
                if( --j >= wsize1 ) continue;
                wtext[j] = wtext[i];
        for( int i=wlen, j=wlen+len; --i>=pos; ) {
                if( --j >= wsize1 ) continue;
                wtext[j] = wtext[i];
index cf4a203..c047f99 100644 (file)
@@ -161,7 +161,7 @@ public:
        double fade_in, fade_out;
        float pixels_per_second; // Speed of motion
 // Text to display
        double fade_in, fade_out;
        float pixels_per_second; // Speed of motion
 // Text to display
-       wchar_t *wtext;
+       wchr_t *wtext;
        long wsize, wlen;
 // Position in frame relative to top left
        float title_x, title_y;
        long wsize, wlen;
 // Position in frame relative to top left
        float title_x, title_y;
@@ -233,7 +233,7 @@ public:
 // Position of each image box in a row
 class TitleChar {
 public:
 // Position of each image box in a row
 class TitleChar {
 public:
-       wchar_t wch;
+       wchr_t wch;
        int typ, flags;
        void *vp;
        int x, y;
        int typ, flags;
        void *vp;
        int x, y;
@@ -502,7 +502,7 @@ public:
 
 class TitleParser
 {
 
 class TitleParser
 {
-       const wchar_t *bfr, *out, *lmt;
+       const wchr_t *bfr, *out, *lmt;
 public:
        TitleMain *plugin;
 
 public:
        TitleMain *plugin;
 
@@ -511,9 +511,9 @@ public:
        bool eof() { return out >= lmt; }
        int wcur() { return eof() ? -1 : *out; }
        int wnext() { return eof() ? -1 : *out++; }
        bool eof() { return out >= lmt; }
        int wcur() { return eof() ? -1 : *out; }
        int wnext() { return eof() ? -1 : *out++; }
-       int wget(wchar_t &wch);
-       int tget(wchar_t &wch);
-       wchar_t wid[BCSTRLEN], wtxt[BCTEXTLEN];
+       int wget(wchr_t &wch);
+       int tget(wchr_t &wch);
+       wchr_t wid[BCSTRLEN], wtxt[BCTEXTLEN];
        char id[BCSTRLEN], text[BCTEXTLEN];
        int set_attributes(int ret);
 
        char id[BCSTRLEN], text[BCTEXTLEN];
        int set_attributes(int ret);
 
@@ -587,7 +587,7 @@ public:
        void update_gui();
        void save_data(KeyFrame *keyframe);
        void read_data(KeyFrame *keyframe);
        void update_gui();
        void save_data(KeyFrame *keyframe);
        void read_data(KeyFrame *keyframe);
-       void insert_text(const wchar_t *wtxt, int pos);
+       void insert_text(const wchr_t *wtxt, int pos);
 
        void build_previews(TitleWindow *gui);
        void reset_render();
 
        void build_previews(TitleWindow *gui);
        void reset_render();
index 84f50a3..4c87915 100644 (file)
@@ -530,9 +530,9 @@ int TitleWindow::insert_ibeam(const char *txt, int ofs)
 {
        int ibeam = cur_ibeam;
        int ilen = strlen(txt)+1;
 {
        int ibeam = cur_ibeam;
        int ilen = strlen(txt)+1;
-       wchar_t wtxt[ilen];
+       wchr_t wtxt[ilen];
        int len = BC_Resources::encode(client->config.encoding, BC_Resources::wide_encoding,
        int len = BC_Resources::encode(client->config.encoding, BC_Resources::wide_encoding,
-               (char*)txt,ilen, (char *)wtxt,ilen*sizeof(wtxt[0])) / sizeof(wchar_t);
+               (char*)txt,ilen, (char *)wtxt,ilen*sizeof(wtxt[0])) / sizeof(wchr_t);
        client->insert_text(wtxt, ibeam);
        while( len > 0 && !wtxt[len] ) --len;
        int adv = len+1 + ofs;
        client->insert_text(wtxt, ibeam);
        while( len > 0 && !wtxt[len] ) --len;
        int adv = len+1 + ofs;
@@ -582,7 +582,8 @@ void TitleWindow::update_gui()
        fade_out->update((float)client->config.fade_out);
        font->update(client->config.font);
        check_style(client->config.font,0);
        fade_out->update((float)client->config.fade_out);
        font->update(client->config.font);
        check_style(client->config.font,0);
-       text->update(client->config.wtext ? &client->config.wtext[0] : L"");
+       wchr_t wz[1] = { 0 };
+       text->update(client->config.wtext ? &client->config.wtext[0] : wz);
        speed->update(client->config.pixels_per_second);
        outline->update((int64_t)client->config.outline_size);
 #ifdef USE_STROKER
        speed->update(client->config.pixels_per_second);
        outline->update((int64_t)client->config.outline_size);
 #ifdef USE_STROKER
@@ -987,10 +988,10 @@ int TitleText::button_press_event()
 int TitleText::handle_event()
 {
        window->fonts_popup->deactivate();
 int TitleText::handle_event()
 {
        window->fonts_popup->deactivate();
-       const wchar_t *wtext = get_wtext();
-       long wlen = wcslen(wtext);
+       const wchr_t *wtext = get_wtext();
+       long wlen = wstrlen(wtext);
        client->config.demand(wlen);
        client->config.demand(wlen);
-       wcsncpy(client->config.wtext, wtext, client->config.wsize);
+       wstrncpy(client->config.wtext, wtext, client->config.wsize);
        client->config.wlen = wlen;
        window->update_stats();
        window->send_configure_change();
        client->config.wlen = wlen;
        window->update_stats();
        window->send_configure_change();
index 4fa976f..38326d9 100644 (file)
@@ -8,14 +8,14 @@ msgstr ""
 "Project-Id-Version: Cinelerra 5.1\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2016-10-15 14:02-0600\n"
 "Project-Id-Version: Cinelerra 5.1\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2016-10-15 14:02-0600\n"
-"PO-Revision-Date: 2019-11-17 11:16-0300\n"
+"PO-Revision-Date: 2020-01-26 00:30+0100\n"
 "Last-Translator: Sergio Daniel Gomez <sergio.sgsistemas@gmail.com>\n"
 "Language-Team: SPANISH <LL@li.org>\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Last-Translator: Sergio Daniel Gomez <sergio.sgsistemas@gmail.com>\n"
 "Language-Team: SPANISH <LL@li.org>\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.2.4\n"
+"X-Generator: Poedit 2.0.6\n"
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-14 11:47-0700\n"
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-14 11:47-0700\n"
@@ -26,16 +26,26 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-01-21 13:56-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
 
 
-#: guicast/bcbutton.C:266 guicast/bcbutton.C:274 guicast/bcbutton.C:490
-#: cinelerra/preferencesthread.C:669
+#: guicast/bcbutton.C:266 guicast/bcbutton.C:274 guicast/bcbutton.C:494
+#: cinelerra/preferencesthread.C:672
 msgid "OK"
 msgstr "OK"
 
 #: guicast/bcbutton.C:322 guicast/bcbutton.C:330 guicast/bcbutton.C:338
 msgid "OK"
 msgstr "OK"
 
 #: guicast/bcbutton.C:322 guicast/bcbutton.C:330 guicast/bcbutton.C:338
-#: guicast/bcbutton.C:517 guicast/bcbutton.C:519 guicast/bcbutton.C:526
+#: guicast/bcbutton.C:521 guicast/bcbutton.C:523 guicast/bcbutton.C:530
 #: cinelerra/confirmquit.C:108 cinelerra/confirmquit.C:110
 #: cinelerra/confirmquit.C:108 cinelerra/confirmquit.C:110
-#: cinelerra/preferencesthread.C:742 cinelerra/preferencesthread.C:744
+#: cinelerra/preferencesthread.C:745 cinelerra/preferencesthread.C:747
 msgid "Cancel"
 msgstr "Cancelar"
 
 msgid "Cancel"
 msgstr "Cancelar"
 
@@ -68,89 +78,89 @@ msgstr "BC_DisplayInfo::init_window: no se puede conectar el servidor X.\n"
 msgid "Recent paths"
 msgstr "Rutas recientes"
 
 msgid "Recent paths"
 msgstr "Rutas recientes"
 
-#: guicast/bcfilebox.C:243
+#: guicast/bcfilebox.C:237
 msgid "Change the filter"
 msgstr "Cambiar el filtro"
 
 msgid "Change the filter"
 msgstr "Cambiar el filtro"
 
-#: guicast/bcfilebox.C:261
+#: guicast/bcfilebox.C:255
 msgid "Size numeric format"
 msgid "Size numeric format"
-msgstr "Tamaño formato numérico"
+msgstr "Formato numérico del tamaño"
 
 
-#: guicast/bcfilebox.C:287
+#: guicast/bcfilebox.C:281
 msgid "Submit the directory"
 msgid "Submit the directory"
-msgstr "Meter el directorio"
+msgstr "Enviar la carpeta"
 
 
-#: guicast/bcfilebox.C:312
+#: guicast/bcfilebox.C:306
 msgid "Descend directory"
 msgid "Descend directory"
-msgstr "Bajar el directorio"
+msgstr "Bajar la carpeta"
 
 
-#: guicast/bcfilebox.C:314
+#: guicast/bcfilebox.C:308
 msgid "Submit the file"
 msgid "Submit the file"
-msgstr "Enviar el archivo"
+msgstr "Aceptar la operación"
 
 
-#: guicast/bcfilebox.C:333
+#: guicast/bcfilebox.C:327
 msgid "Cancel the operation"
 msgstr "Cancelar la operación"
 
 msgid "Cancel the operation"
 msgstr "Cancelar la operación"
 
-#: guicast/bcfilebox.C:354 cinelerra/awindowgui.C:3478
+#: guicast/bcfilebox.C:348 cinelerra/awindowgui.C:3493
 #: cinelerra/folderlistmenu.C:61
 msgid "Display text"
 #: cinelerra/folderlistmenu.C:61
 msgid "Display text"
-msgstr "Mostrar texto"
+msgstr "Vista de Lista"
 
 
-#: guicast/bcfilebox.C:368 cinelerra/awindowgui.C:3469
+#: guicast/bcfilebox.C:362 cinelerra/awindowgui.C:3484
 #: cinelerra/folderlistmenu.C:61
 msgid "Display icons"
 #: cinelerra/folderlistmenu.C:61
 msgid "Display icons"
-msgstr "Mostrar iconos"
+msgstr "Vista de Iconos"
 
 
-#: guicast/bcfilebox.C:382
+#: guicast/bcfilebox.C:376
 msgid "Create new folder"
 msgstr "Crear nueva carpeta"
 
 msgid "Create new folder"
 msgstr "Crear nueva carpeta"
 
-#: guicast/bcfilebox.C:395
+#: guicast/bcfilebox.C:389
 msgid "Rename file"
 msgstr "Cambiar el nombre de archivo"
 
 msgid "Rename file"
 msgstr "Cambiar el nombre de archivo"
 
-#: guicast/bcfilebox.C:407
+#: guicast/bcfilebox.C:401
 msgid "Up a directory"
 msgid "Up a directory"
-msgstr "Subir un directorio"
+msgstr "Subir una carpeta"
 
 
-#: guicast/bcfilebox.C:421
+#: guicast/bcfilebox.C:415
 msgid "Delete files"
 msgstr "Eliminar archivos"
 
 msgid "Delete files"
 msgstr "Eliminar archivos"
 
-#: guicast/bcfilebox.C:435
+#: guicast/bcfilebox.C:429
 msgid "Refresh"
 msgstr "Actualizar"
 
 msgid "Refresh"
 msgstr "Actualizar"
 
-#: guicast/bcfilebox.C:617 cinelerra/channelinfo.C:1330
+#: guicast/bcfilebox.C:611 cinelerra/channelinfo.C:1330
 msgid "Directory:"
 msgid "Directory:"
-msgstr "Directorio:"
+msgstr "Carpeta:"
 
 
-#: guicast/bcfilebox.C:627 cinelerra/awindowgui.C:3177
+#: guicast/bcfilebox.C:621 cinelerra/awindowgui.C:3192
 msgid "Search:"
 msgstr "Buscar:"
 
 msgid "Search:"
 msgstr "Buscar:"
 
-#: guicast/bcfilebox.C:659
+#: guicast/bcfilebox.C:653
 msgid "File:"
 msgid "File:"
-msgstr "Archivo:"
+msgstr "Nombre del Archivo:"
 
 
-#: guicast/bcfilebox.C:665
+#: guicast/bcfilebox.C:659
 msgid "Specify filter:"
 msgid "Specify filter:"
-msgstr "Filtro Activo:"
+msgstr "Especificar filtro:"
 
 
-#: guicast/bcfilebox.C:1365 cinelerra/binfolder.C:1673
+#: guicast/bcfilebox.C:1357 cinelerra/binfolder.C:1673
 msgid ": New folder"
 msgstr ": Nueva carpeta"
 
 msgid ": New folder"
 msgstr ": Nueva carpeta"
 
-#: guicast/bcfilebox.C:1380
+#: guicast/bcfilebox.C:1372
 msgid ": Rename"
 msgstr ": Cambiar el nombre"
 
 msgid ": Rename"
 msgstr ": Cambiar el nombre"
 
-#: guicast/bcfilebox.C:1395
+#: guicast/bcfilebox.C:1387
 msgid ": Delete"
 msgstr ": Borrar"
 
 msgid ": Delete"
 msgstr ": Borrar"
 
-#: guicast/bcfilebox.inc:47 cinelerra/mainmenu.C:101
+#: guicast/bcfilebox.inc:47 cinelerra/mainmenu.C:102
 msgid "File"
 msgstr "Archivo"
 
 msgid "File"
 msgstr "Archivo"
 
@@ -170,11 +180,11 @@ msgstr "Ext."
 msgid "Enter the name of the folder:"
 msgstr "Introduzca el nombre de la carpeta:"
 
 msgid "Enter the name of the folder:"
 msgstr "Introduzca el nombre de la carpeta:"
 
-#: guicast/bcnewfolder.C:51 cinelerra/pluginclient.C:557
+#: guicast/bcnewfolder.C:51 cinelerra/pluginclient.C:538
 msgid "Untitled"
 msgstr "Sin título"
 
 msgid "Untitled"
 msgstr "Sin título"
 
-#: guicast/bcpopup.C:32 guicast/bcpopup.C:38 cinelerra/canvas.C:1118
+#: guicast/bcpopup.C:32 guicast/bcpopup.C:38 cinelerra/canvas.C:1110
 msgid "Fullscreen"
 msgstr "Pantalla Completa"
 
 msgid "Fullscreen"
 msgstr "Pantalla Completa"
 
@@ -199,17 +209,17 @@ msgstr "Introducir un nuevo nombre para el archivo:"
 msgid "Conversion from %s to %s is not available\n"
 msgstr "La conversión de %s a %s no está disponible\n"
 
 msgid "Conversion from %s to %s is not available\n"
 msgstr "La conversión de %s a %s no está disponible\n"
 
-#: guicast/bctextbox.C:2901 cinelerra/editpopup.C:134
+#: guicast/bctextbox.C:2901 cinelerra/editpopup.C:188
 msgid "Cut"
 msgstr "Cortar"
 
 msgid "Cut"
 msgstr "Cortar"
 
-#: guicast/bctextbox.C:2915 cinelerra/clippopup.C:240 cinelerra/editpopup.C:105
-#: cinelerra/mainmenu.C:885 cinelerra/proxypopup.C:205 cinelerra/savefile.C:242
+#: guicast/bctextbox.C:2915 cinelerra/clippopup.C:247 cinelerra/editpopup.C:159
+#: cinelerra/mainmenu.C:889 cinelerra/proxypopup.C:205 cinelerra/savefile.C:242
 msgid "Copy"
 msgstr "Copiar"
 
 msgid "Copy"
 msgstr "Copiar"
 
-#: guicast/bctextbox.C:2928 cinelerra/assetpopup.C:313
-#: cinelerra/clippopup.C:273 cinelerra/editpopup.C:191 cinelerra/mainmenu.C:898
+#: guicast/bctextbox.C:2928 cinelerra/assetpopup.C:423
+#: cinelerra/clippopup.C:280 cinelerra/editpopup.C:245 cinelerra/mainmenu.C:902
 #: cinelerra/proxypopup.C:238 cinelerra/swindow.C:547
 msgid "Paste"
 msgstr "Pegar"
 #: cinelerra/proxypopup.C:238 cinelerra/swindow.C:547
 msgid "Paste"
 msgstr "Pegar"
@@ -217,7 +227,7 @@ msgstr "Pegar"
 #: guicast/bctheme.C:511
 #, c-format
 msgid "Theme::get_image: %s not found.\n"
 #: guicast/bctheme.C:511
 #, c-format
 msgid "Theme::get_image: %s not found.\n"
-msgstr "Theme::obtener_imagen: %s no encontrado.\n"
+msgstr "Tema::obtener_imagen: %s no encontrado.\n"
 
 #: guicast/bctheme.C:522
 #, c-format
 
 #: guicast/bctheme.C:522
 #, c-format
@@ -227,7 +237,11 @@ msgstr "BC_Theme::check_used: Las imágenes no se utilizan.\n"
 #: guicast/bcwindow3d.C:65
 #, c-format
 msgid "%s: opengl initialization failed failed\n"
 #: guicast/bcwindow3d.C:65
 #, c-format
 msgid "%s: opengl initialization failed failed\n"
-msgstr "%s: opengl initialization failed failed\n"
+msgstr "%s: falló la inicialización de opengl\n"
+
+#: guicast/bcwindowbase.C:2419
+msgid " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
+msgstr " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
 
 #: guicast/test.C:165
 msgid ""
 
 #: guicast/test.C:165
 msgid ""
@@ -241,41 +255,41 @@ msgstr ""
 msgid "Hello world"
 msgstr "Hola mundo"
 
 msgid "Hello world"
 msgstr "Hola mundo"
 
-#: guicast/units.h:39
+#: guicast/units.h:41
 msgid "Hours:Minutes:Seconds.xxx"
 msgstr "Horas: Minutos: Segundos.xxx"
 
 msgid "Hours:Minutes:Seconds.xxx"
 msgstr "Horas: Minutos: Segundos.xxx"
 
-#: guicast/units.h:42
+#: guicast/units.h:44
 msgid "Hours:Minutes:Seconds:Frames"
 msgstr "Horas:Minutos:Segundos:Fotogramas"
 
 msgid "Hours:Minutes:Seconds:Frames"
 msgstr "Horas:Minutos:Segundos:Fotogramas"
 
-#: guicast/units.h:44 cinelerra/patchbay.C:83 cinelerra/transitionpopup.C:141
+#: guicast/units.h:46 cinelerra/patchbay.C:83 cinelerra/transitionpopup.C:141
 #: plugins/motion51/motionwindow51.C:51
 msgid "Samples"
 msgstr "Muestras"
 
 #: plugins/motion51/motionwindow51.C:51
 msgid "Samples"
 msgstr "Muestras"
 
-#: guicast/units.h:46
+#: guicast/units.h:48
 msgid "Hex Samples"
 msgstr "Muestras Hex"
 
 msgid "Hex Samples"
 msgstr "Muestras Hex"
 
-#: guicast/units.h:48 cinelerra/patchbay.C:84 cinelerra/transitionpopup.C:140
+#: guicast/units.h:50 cinelerra/patchbay.C:84 cinelerra/transitionpopup.C:140
 msgid "Frames"
 msgstr "Fotogramas"
 
 msgid "Frames"
 msgstr "Fotogramas"
 
-#: guicast/units.h:60
+#: guicast/units.h:62
 msgid "Feet-frames"
 msgid "Feet-frames"
-msgstr "Feet-fotogramas"
+msgstr "Fotos x Pie (USA)"
 
 
-#: guicast/units.h:65 guicast/units.h:68
+#: guicast/units.h:67 guicast/units.h:70
 msgid "Hours:Minutes:Seconds"
 msgstr "Horas:Minutos:Segundos"
 
 msgid "Hours:Minutes:Seconds"
 msgstr "Horas:Minutos:Segundos"
 
-#: guicast/units.h:71 cinelerra/interfaceprefs.C:194 cinelerra/patchbay.C:93
+#: guicast/units.h:73 cinelerra/interfaceprefs.C:203 cinelerra/patchbay.C:93
 #: cinelerra/transitionpopup.C:139
 msgid "Seconds"
 #: cinelerra/transitionpopup.C:139
 msgid "Seconds"
-msgstr "Segundos"
+msgstr "Seg"
 
 
-#: guicast/units.h:76
+#: guicast/units.h:78
 msgid "Minutes:Seconds"
 msgstr "Minutos: Segundos"
 
 msgid "Minutes:Seconds"
 msgstr "Minutos: Segundos"
 
@@ -309,65 +323,65 @@ msgstr ""
 #: cinelerra/adcuts.C:30
 #, c-format
 msgid "cuts to %s complete\n"
 #: cinelerra/adcuts.C:30
 #, c-format
 msgid "cuts to %s complete\n"
-msgstr "cuts to %s complete\n"
+msgstr "cortes a %s completos\n"
 
 
-#: cinelerra/adeviceprefs.C:299 cinelerra/vdeviceprefs.C:332
+#: cinelerra/adeviceprefs.C:305 cinelerra/vdeviceprefs.C:332
 #: cinelerra/vdeviceprefs.C:344 cinelerra/vdeviceprefs.C:361
 msgid "Device path:"
 msgstr "Ruta del dispositivo:"
 
 #: cinelerra/vdeviceprefs.C:344 cinelerra/vdeviceprefs.C:361
 msgid "Device path:"
 msgstr "Ruta del dispositivo:"
 
-#: cinelerra/adeviceprefs.C:320 cinelerra/adeviceprefs.C:390
-#: cinelerra/adeviceprefs.C:579 cinelerra/adeviceprefs.C:596
-#: cinelerra/adeviceprefs.C:598 cinelerra/assetedit.C:371
+#: cinelerra/adeviceprefs.C:326 cinelerra/adeviceprefs.C:396
+#: cinelerra/adeviceprefs.C:585 cinelerra/adeviceprefs.C:602
+#: cinelerra/adeviceprefs.C:604 cinelerra/assetedit.C:371
 #: cinelerra/fileformat.C:88 cinelerra/formatwindow.C:48
 msgid "Bits:"
 msgstr "Bits:"
 
 #: cinelerra/fileformat.C:88 cinelerra/formatwindow.C:48
 msgid "Bits:"
 msgstr "Bits:"
 
-#: cinelerra/adeviceprefs.C:369
+#: cinelerra/adeviceprefs.C:375
 msgid "Device:"
 msgstr "Dispositivo:"
 
 msgid "Device:"
 msgstr "Dispositivo:"
 
-#: cinelerra/adeviceprefs.C:404
+#: cinelerra/adeviceprefs.C:410
 msgid "Stop playback locks up."
 msgid "Stop playback locks up."
-msgstr "Evitar que el play se bloquee."
+msgstr "Parar la reproducción si se bloquea."
 
 
-#: cinelerra/adeviceprefs.C:431
+#: cinelerra/adeviceprefs.C:437
 msgid "Server:"
 msgstr "Servidor:"
 
 msgid "Server:"
 msgstr "Servidor:"
 
-#: cinelerra/adeviceprefs.C:449 cinelerra/adeviceprefs.C:502
-#: cinelerra/interfaceprefs.C:133 cinelerra/performanceprefs.C:167
+#: cinelerra/adeviceprefs.C:455 cinelerra/adeviceprefs.C:508
+#: cinelerra/interfaceprefs.C:134 cinelerra/performanceprefs.C:167
 #: cinelerra/vdeviceprefs.C:277
 msgid "Port:"
 msgstr "Puerto:"
 
 #: cinelerra/vdeviceprefs.C:277
 msgid "Port:"
 msgstr "Puerto:"
 
-#: cinelerra/adeviceprefs.C:482 cinelerra/vdeviceprefs.C:259
+#: cinelerra/adeviceprefs.C:488 cinelerra/vdeviceprefs.C:259
 msgid "Device Path:"
 msgstr "Ruta de Dispositivo:"
 
 msgid "Device Path:"
 msgstr "Ruta de Dispositivo:"
 
-#: cinelerra/adeviceprefs.C:522 cinelerra/channeledit.C:997
-#: cinelerra/vdeviceprefs.C:295
+#: cinelerra/adeviceprefs.C:528 cinelerra/channeledit.C:997
+#: cinelerra/vdeviceprefs.C:295 plugins/compressormulti/comprmultigui.C:190
 msgid "Channel:"
 msgstr "Canal:"
 
 msgid "Channel:"
 msgstr "Canal:"
 
-#: cinelerra/adeviceprefs.C:546 cinelerra/vdeviceprefs.C:318
+#: cinelerra/adeviceprefs.C:552 cinelerra/vdeviceprefs.C:318
 msgid "Syt Offset:"
 msgstr "Compensación Syt:"
 
 msgid "Syt Offset:"
 msgstr "Compensación Syt:"
 
-#: cinelerra/adeviceprefs.C:564 cinelerra/adeviceprefs.C:566
+#: cinelerra/adeviceprefs.C:570 cinelerra/adeviceprefs.C:572
 #: cinelerra/vdeviceprefs.C:214 cinelerra/vdeviceprefs.C:216
 msgid "DVB Adapter:"
 msgstr "Adaptador DVB:"
 
 #: cinelerra/vdeviceprefs.C:214 cinelerra/vdeviceprefs.C:216
 msgid "DVB Adapter:"
 msgstr "Adaptador DVB:"
 
-#: cinelerra/adeviceprefs.C:572 cinelerra/vdeviceprefs.C:221
+#: cinelerra/adeviceprefs.C:578 cinelerra/vdeviceprefs.C:221
 msgid "dev:"
 msgstr "disp:"
 
 msgid "dev:"
 msgstr "disp:"
 
-#: cinelerra/adeviceprefs.C:587 cinelerra/adeviceprefs.C:606
+#: cinelerra/adeviceprefs.C:593 cinelerra/adeviceprefs.C:612
 msgid "Follow audio config"
 msgid "Follow audio config"
-msgstr "Seguir config audio"
+msgstr "Sigue la configuración de audio"
 
 
-#: cinelerra/amodule.C:472
+#: cinelerra/amodule.C:268
 #, c-format
 msgid "AModule::import_samples Couldn't open %s.\n"
 msgstr "AModule::importar_samples No se pudo abrir %s.\n"
 #, c-format
 msgid "AModule::import_samples Couldn't open %s.\n"
 msgstr "AModule::importar_samples No se pudo abrir %s.\n"
@@ -381,8 +395,8 @@ msgstr "Automatización"
 msgid "Plugin %d"
 msgstr "Plugin %d"
 
 msgid "Plugin %d"
 msgstr "Plugin %d"
 
-#: cinelerra/apanel.C:86 cinelerra/editpopup.C:162 cinelerra/gwindowgui.C:71
-#: cinelerra/keyframepopup.C:569 cinelerra/mainmenu.C:247
+#: cinelerra/apanel.C:86 cinelerra/gwindowgui.C:71
+#: cinelerra/keyframepopup.C:569 cinelerra/mainmenu.C:251
 msgid "Mute"
 msgstr "Silenciar"
 
 msgid "Mute"
 msgstr "Silenciar"
 
@@ -396,172 +410,184 @@ msgstr "Reproducir"
 msgid "fade"
 msgstr "desvanecer"
 
 msgid "fade"
 msgstr "desvanecer"
 
-#: cinelerra/apatchgui.C:304 cinelerra/gwindowgui.C:79 cinelerra/mainmenu.C:249
+#: cinelerra/apatchgui.C:304 cinelerra/gwindowgui.C:79 cinelerra/mainmenu.C:253
 msgid "Pan"
 msgid "Pan"
-msgstr "Pan"
+msgstr "Panorámica"
 
 #: cinelerra/apatchgui.C:314 cinelerra/apatchgui.C:322
 msgid "pan"
 
 #: cinelerra/apatchgui.C:314 cinelerra/apatchgui.C:322
 msgid "pan"
-msgstr "pan"
+msgstr "panorámica"
 
 #: cinelerra/apatchgui.C:370 cinelerra/mixersalign.C:73
 #: cinelerra/mixersalign.C:188 cinelerra/vpatchgui.C:485
 msgid "Mixer"
 msgstr "Mezclador"
 
 
 #: cinelerra/apatchgui.C:370 cinelerra/mixersalign.C:73
 #: cinelerra/mixersalign.C:188 cinelerra/vpatchgui.C:485
 msgid "Mixer"
 msgstr "Mezclador"
 
-#: cinelerra/appearanceprefs.C:78
+#: cinelerra/appearanceprefs.C:79
 msgid "Layout:"
 msgstr "Diseño:"
 
 msgid "Layout:"
 msgstr "Diseño:"
 
-#: cinelerra/appearanceprefs.C:84
+#: cinelerra/appearanceprefs.C:85
 msgid "Theme:"
 msgstr "Tema:"
 
 msgid "Theme:"
 msgstr "Tema:"
 
-#: cinelerra/appearanceprefs.C:91
+#: cinelerra/appearanceprefs.C:92
 msgid "Plugin Icons:"
 msgstr "Complemento Íconos:"
 
 msgid "Plugin Icons:"
 msgstr "Complemento Íconos:"
 
-#: cinelerra/appearanceprefs.C:100
+#: cinelerra/appearanceprefs.C:101
 msgid "Layout Scale:"
 msgstr "Escala de diseño:"
 
 msgid "Layout Scale:"
 msgstr "Escala de diseño:"
 
-#: cinelerra/appearanceprefs.C:104
+#: cinelerra/appearanceprefs.C:105
 msgid "View thumbnail size:"
 msgid "View thumbnail size:"
-msgstr "Ver tamaño de miniatura:"
+msgstr "Tamaño de miniatura:"
 
 
-#: cinelerra/appearanceprefs.C:108
+#: cinelerra/appearanceprefs.C:109
 msgid "Vicon quality:"
 msgstr "Calidad de Vicon:"
 
 msgid "Vicon quality:"
 msgstr "Calidad de Vicon:"
 
-#: cinelerra/appearanceprefs.C:112
+#: cinelerra/appearanceprefs.C:113
 msgid "Vicon color mode:"
 msgstr "Modo de color de Vicon:"
 
 msgid "Vicon color mode:"
 msgstr "Modo de color de Vicon:"
 
-#: cinelerra/appearanceprefs.C:122
+#: cinelerra/appearanceprefs.C:123
 msgid "Time Format:"
 msgid "Time Format:"
-msgstr "Formato de hora:"
-
-#: cinelerra/appearanceprefs.C:125
-msgid "Flags:"
-msgstr "Banderines:"
+msgstr "Formato de Tiempo:"
 
 
-#: cinelerra/appearanceprefs.C:157
+#: cinelerra/appearanceprefs.C:150
 msgid "Frames per foot:"
 msgid "Frames per foot:"
-msgstr "Fotogramas por foot:"
+msgstr "Fotogramas por pie:"
 
 
-#: cinelerra/appearanceprefs.C:172 cinelerra/channeledit.C:1417
+#: cinelerra/appearanceprefs.C:164 cinelerra/channeledit.C:1417
 #: cinelerra/channeledit.C:1491 plugins/chromakey/chromakey.C:135
 #: cinelerra/channeledit.C:1491 plugins/chromakey/chromakey.C:135
-#: plugins/chromakeyhsv/chromakey.C:187 plugins/sketcher/sketcherwindow.C:334
-#: plugins/sketcher/sketcherwindow.C:335 plugins/titler/titlerwindow.C:352
+#: plugins/chromakeyhsv/chromakey.C:187 plugins/sketcher/sketcherwindow.C:386
+#: plugins/sketcher/sketcherwindow.C:387 plugins/titler/titlerwindow.C:352
 msgid "Color:"
 msgstr "Color:"
 
 msgid "Color:"
 msgstr "Color:"
 
-#: cinelerra/appearanceprefs.C:175
+#: cinelerra/appearanceprefs.C:167
 msgid "Highlighting Inversion color:"
 msgid "Highlighting Inversion color:"
-msgstr "Resaltado del color de inversión:"
+msgstr "Resaltando el color de inversión:"
 
 
-#: cinelerra/appearanceprefs.C:182
+#: cinelerra/appearanceprefs.C:174
 msgid "Composer BG Color:"
 msgstr "Color de fondo del compositor:"
 
 msgid "Composer BG Color:"
 msgstr "Color de fondo del compositor:"
 
-#: cinelerra/appearanceprefs.C:192
+#: cinelerra/appearanceprefs.C:184
 msgid "YUV color space:"
 msgstr "Espacio de color YUV:"
 
 msgid "YUV color space:"
 msgstr "Espacio de color YUV:"
 
-#: cinelerra/appearanceprefs.C:199
+#: cinelerra/appearanceprefs.C:191
 msgid "YUV color range:"
 msgstr "Rango de color YUV:"
 
 msgid "YUV color range:"
 msgstr "Rango de color YUV:"
 
-#: cinelerra/appearanceprefs.C:458
+#: cinelerra/appearanceprefs.C:202
+msgid "Warnings:"
+msgstr "Advertencias:"
+
+#: cinelerra/appearanceprefs.C:223
+msgid "Flags:"
+msgstr "Banderines:"
+
+#: cinelerra/appearanceprefs.C:473
 msgid "Use thumbnails in resource window"
 msgid "Use thumbnails in resource window"
-msgstr "Usar miniaturas en la ventana de clips"
+msgstr "Usar miniaturas en la ventana de recursos"
 
 
-#: cinelerra/appearanceprefs.C:519 plugins/descratch/descratch.C:625
+#: cinelerra/appearanceprefs.C:534 plugins/descratch/descratch.C:625
 msgid "Low"
 msgstr "Bajo"
 
 msgid "Low"
 msgstr "Bajo"
 
-#: cinelerra/appearanceprefs.C:520
+#: cinelerra/appearanceprefs.C:535
 msgid "Med"
 msgstr "Medio"
 
 msgid "Med"
 msgstr "Medio"
 
-#: cinelerra/appearanceprefs.C:521 plugins/descratch/descratch.C:626
+#: cinelerra/appearanceprefs.C:536 plugins/descratch/descratch.C:626
 msgid "High"
 msgstr "Intenso"
 
 msgid "High"
 msgstr "Intenso"
 
-#: cinelerra/appearanceprefs.C:556
+#: cinelerra/appearanceprefs.C:571
 msgid "Show tip of the day"
 msgstr "Mostrar sugerencia del día"
 
 msgid "Show tip of the day"
 msgstr "Mostrar sugerencia del día"
 
-#: cinelerra/appearanceprefs.C:569
+#: cinelerra/appearanceprefs.C:584
 msgid "ffmpeg probe warns rebuild indexes"
 msgstr "tubería ffmpeg advierte reconstrucción de índices"
 
 msgid "ffmpeg probe warns rebuild indexes"
 msgstr "tubería ffmpeg advierte reconstrucción de índices"
 
-#: cinelerra/appearanceprefs.C:582
+#: cinelerra/appearanceprefs.C:597
 msgid "EDL version warns if mismatched"
 msgstr "Versión EDL advierte si no coinciden"
 
 msgid "EDL version warns if mismatched"
 msgstr "Versión EDL advierte si no coinciden"
 
-#: cinelerra/appearanceprefs.C:595
+#: cinelerra/appearanceprefs.C:610
+msgid "Stack warns if reference not modified"
+msgstr "La pila advierte si la referencia no se modifica"
+
+#: cinelerra/appearanceprefs.C:623
 msgid "Create Bluray warns if not root"
 msgstr "Crear advertencias de Bluray si no es root"
 
 msgid "Create Bluray warns if not root"
 msgstr "Crear advertencias de Bluray si no es root"
 
-#: cinelerra/appearanceprefs.C:608
+#: cinelerra/appearanceprefs.C:636
+msgid "Warn on creating file references"
+msgstr "Warn on creating file references"
+
+#: cinelerra/appearanceprefs.C:650
 msgid "Popups activate on button up"
 msgid "Popups activate on button up"
-msgstr "Popups activar el botón de arriba"
+msgstr "Las ventanas emergentes se activan al presionar el botón"
 
 
-#: cinelerra/appearanceprefs.C:621
+#: cinelerra/appearanceprefs.C:663
 msgid "Set Input Focus when window entered"
 msgid "Set Input Focus when window entered"
-msgstr "Establecer el enfoque de entrada cuando se entra en la ventana"
+msgstr "Establecer el enfoque cuando se entra en la ventana"
 
 
-#: cinelerra/appearanceprefs.C:634
+#: cinelerra/appearanceprefs.C:676
 msgid "Click to activate text focus"
 msgstr "Clic para activar foco en texto"
 
 msgid "Click to activate text focus"
 msgstr "Clic para activar foco en texto"
 
-#: cinelerra/appearanceprefs.C:650
+#: cinelerra/appearanceprefs.C:692
 msgid "Click to deactivate text focus"
 msgstr "Click para desactivar foco en texto"
 
 msgid "Click to deactivate text focus"
 msgstr "Click para desactivar foco en texto"
 
-#: cinelerra/appearanceprefs.C:666
+#: cinelerra/appearanceprefs.C:708
 msgid "Always show next frame"
 msgstr "Siempre mostrar fotograma siguiente"
 
 msgid "Always show next frame"
 msgstr "Siempre mostrar fotograma siguiente"
 
-#: cinelerra/appearanceprefs.C:679
+#: cinelerra/appearanceprefs.C:721
 msgid "Autocolor assets"
 msgstr "Color automático de recursos"
 
 msgid "Autocolor assets"
 msgstr "Color automático de recursos"
 
-#: cinelerra/appearanceprefs.C:711
+#: cinelerra/appearanceprefs.C:753
 msgid "BT601"
 msgstr "BT601"
 
 msgid "BT601"
 msgstr "BT601"
 
-#: cinelerra/appearanceprefs.C:712
+#: cinelerra/appearanceprefs.C:754
 msgid "BT709"
 msgstr "BT709"
 
 msgid "BT709"
 msgstr "BT709"
 
-#: cinelerra/appearanceprefs.C:713
+#: cinelerra/appearanceprefs.C:755
 msgid "BT2020"
 msgstr "BT2020"
 
 msgid "BT2020"
 msgstr "BT2020"
 
-#: cinelerra/appearanceprefs.C:755 cinelerra/compresspopup.C:39
-#: cinelerra/file.inc:109
+#: cinelerra/appearanceprefs.C:797 cinelerra/compresspopup.C:39
+#: cinelerra/file.inc:110
 msgid "JPEG"
 msgstr "JPEG"
 
 msgid "JPEG"
 msgstr "JPEG"
 
-#: cinelerra/appearanceprefs.C:756 cinelerra/file.inc:113
+#: cinelerra/appearanceprefs.C:798 cinelerra/file.inc:114
 msgid "MPEG"
 msgstr "MPEG"
 
 msgid "MPEG"
 msgstr "MPEG"
 
-#: cinelerra/appearanceprefs.C:798
+#: cinelerra/appearanceprefs.C:840
 msgid "Perpetual session"
 msgstr "Sesión perpetua"
 
 msgid "Perpetual session"
 msgstr "Sesión perpetua"
 
-#: cinelerra/appearanceprefs.C:811
+#: cinelerra/appearanceprefs.C:853
 msgid "Clears before toggle"
 msgstr "Se borra antes de alternar"
 
 msgid "Clears before toggle"
 msgstr "Se borra antes de alternar"
 
-#: cinelerra/appearanceprefs.C:824
+#: cinelerra/appearanceprefs.C:866
 msgid "Timeline Rectify Audio"
 msgstr "Rectificar línea de tiempo de audio"
 
 msgid "Timeline Rectify Audio"
 msgstr "Rectificar línea de tiempo de audio"
 
-#: cinelerra/appearanceprefs.C:837
+#: cinelerra/appearanceprefs.C:879
 msgid "Composer BG color"
 msgstr "Color de fondo del compositor"
 
 msgid "Composer BG color"
 msgstr "Color de fondo del compositor"
 
@@ -579,7 +605,7 @@ msgstr "Seleccionar un archivo para este clip:"
 
 #: cinelerra/assetedit.C:266
 msgid "File format:"
 
 #: cinelerra/assetedit.C:266
 msgid "File format:"
-msgstr "Formato de archivo:"
+msgstr "Formato del archivo:"
 
 #: cinelerra/assetedit.C:275
 msgid "Bytes:"
 
 #: cinelerra/assetedit.C:275
 msgid "Bytes:"
@@ -644,7 +670,7 @@ msgstr "Velocidad de fotograma:"
 
 #: cinelerra/assetedit.C:475 cinelerra/scale.C:214 cinelerra/scale.C:216
 #: cinelerra/setformat.C:363 plugins/freeverb/freeverb.C:332
 
 #: cinelerra/assetedit.C:475 cinelerra/scale.C:214 cinelerra/scale.C:216
 #: cinelerra/setformat.C:363 plugins/freeverb/freeverb.C:332
-#: plugins/photoscale/photoscale.C:66 plugins/sketcher/sketcherwindow.C:308
+#: plugins/photoscale/photoscale.C:66 plugins/sketcher/sketcherwindow.C:356
 msgid "Width:"
 msgstr "Ancho:"
 
 msgid "Width:"
 msgstr "Ancho:"
 
@@ -686,83 +712,126 @@ msgstr ": Ruta"
 msgid "Select a file"
 msgstr "Seleccionar un archivo"
 
 msgid "Select a file"
 msgstr "Seleccionar un archivo"
 
-#: cinelerra/assetpopup.C:86 cinelerra/clippopup.C:75
+#: cinelerra/assetpopup.C:89 cinelerra/clippopup.C:76
 msgid "Match..."
 msgstr "Ajusta todo.."
 
 msgid "Match..."
 msgstr "Ajusta todo.."
 
-#: cinelerra/assetpopup.C:91 cinelerra/proxypopup.C:70
+#: cinelerra/assetpopup.C:94 cinelerra/proxypopup.C:70
 msgid "Remove..."
 msgstr "Eliminar..."
 
 msgid "Remove..."
 msgstr "Eliminar..."
 
-#: cinelerra/assetpopup.C:151 cinelerra/clippopup.C:136
+#: cinelerra/assetpopup.C:176 cinelerra/clippopup.C:143
 #: cinelerra/proxypopup.C:101
 msgid "Info..."
 #: cinelerra/proxypopup.C:101
 msgid "Info..."
-msgstr "Info ..."
+msgstr "Información..."
+
+#: cinelerra/assetpopup.C:208 cinelerra/clippopup.C:451
+#: cinelerra/editpopup.C:98
+msgid "Open EDL"
+msgstr "Abrir EDL"
+
+#: cinelerra/assetpopup.C:230 cinelerra/editpopup.C:116
+#: cinelerra/mwindow.C:2109
+#, c-format
+msgid ""
+"Error: unable to open:\n"
+"  %s"
+msgstr ""
+"Error: no se puede abrir:\n"
+" %s"
+
+#: cinelerra/assetpopup.C:236 cinelerra/editpopup.C:122
+#: cinelerra/mwindow.C:2134
+#, c-format
+msgid ""
+"Error: unable to load:\n"
+"  %s"
+msgstr ""
+"Error: no se puede cargar:\n"
+" %s"
 
 
-#: cinelerra/assetpopup.C:183
+#: cinelerra/assetpopup.C:248 cinelerra/mwindow.C:3973
+#, c-format
+msgid ""
+"media is not EDL:\n"
+"%s"
+msgstr ""
+"los medios no son EDL:\n"
+"%s"
+
+#: cinelerra/assetpopup.C:254 cinelerra/clippopup.C:474
+#: cinelerra/mwindowgui.C:2347
+msgid "Close EDL"
+msgstr "Cerrar EDL"
+
+#: cinelerra/assetpopup.C:275
+msgid "EDL to clip"
+msgstr "EDL al clip"
+
+#: cinelerra/assetpopup.C:293
 msgid "Rebuild index"
 msgid "Rebuild index"
-msgstr "Reconstruir índice"
+msgstr "Reconstruir el índice"
 
 
-#: cinelerra/assetpopup.C:202 cinelerra/channeledit.C:553
+#: cinelerra/assetpopup.C:312 cinelerra/channeledit.C:553
 msgid "Sort"
 msgstr "Ordenar"
 
 msgid "Sort"
 msgstr "Ordenar"
 
-#: cinelerra/assetpopup.C:220 cinelerra/clippopup.C:184
-#: cinelerra/mainmenu.C:242 cinelerra/proxypopup.C:149
+#: cinelerra/assetpopup.C:330 cinelerra/clippopup.C:191
+#: cinelerra/mainmenu.C:246 cinelerra/proxypopup.C:149
 msgid "View"
 msgstr "Ver"
 
 msgid "View"
 msgstr "Ver"
 
-#: cinelerra/assetpopup.C:247 cinelerra/clippopup.C:211
+#: cinelerra/assetpopup.C:357 cinelerra/clippopup.C:218
 #: cinelerra/proxypopup.C:176
 msgid "View in new window"
 msgstr "Ver en una nueva ventana"
 
 #: cinelerra/proxypopup.C:176
 msgid "View in new window"
 msgstr "Ver en una nueva ventana"
 
-#: cinelerra/assetpopup.C:275
+#: cinelerra/assetpopup.C:385
 msgid "Open Mixers"
 msgid "Open Mixers"
-msgstr "Abrir mezcladores"
+msgstr "Abrir en mezclador"
 
 
-#: cinelerra/assetpopup.C:294
+#: cinelerra/assetpopup.C:404
 msgid "Insert Mixers"
 msgid "Insert Mixers"
-msgstr "Insertar clips"
+msgstr "Insertar en mezclador"
 
 
-#: cinelerra/assetpopup.C:331 cinelerra/clippopup.C:291
+#: cinelerra/assetpopup.C:441 cinelerra/clippopup.C:298
 msgid "Match project size"
 msgstr "Ajusta al tamaño del proyecto"
 
 msgid "Match project size"
 msgstr "Ajusta al tamaño del proyecto"
 
-#: cinelerra/assetpopup.C:344 cinelerra/clippopup.C:305
+#: cinelerra/assetpopup.C:454 cinelerra/clippopup.C:312
 msgid "Match frame rate"
 msgstr "Ajusta velocidad de fotograma"
 
 msgid "Match frame rate"
 msgstr "Ajusta velocidad de fotograma"
 
-#: cinelerra/assetpopup.C:357 cinelerra/clippopup.C:319
+#: cinelerra/assetpopup.C:467 cinelerra/clippopup.C:326
 msgid "Match all"
 msgstr "Ajusta todo"
 
 msgid "Match all"
 msgstr "Ajusta todo"
 
-#: cinelerra/assetpopup.C:371 cinelerra/proxypopup.C:256
+#: cinelerra/assetpopup.C:481 cinelerra/proxypopup.C:256
 msgid "Remove from project"
 msgstr "Eliminar del proyecto"
 
 msgid "Remove from project"
 msgstr "Eliminar del proyecto"
 
-#: cinelerra/assetpopup.C:393 cinelerra/proxypopup.C:277
+#: cinelerra/assetpopup.C:502 cinelerra/proxypopup.C:277
 msgid "Remove from disk"
 msgstr "Eliminar del disco"
 
 msgid "Remove from disk"
 msgstr "Eliminar del disco"
 
-#: cinelerra/assetpopup.C:433 cinelerra/proxypopup.C:314
+#: cinelerra/assetpopup.C:539 cinelerra/proxypopup.C:314
 #: plugins/descratch/descratch.C:627
 msgid "All"
 msgstr "Todos"
 
 #: plugins/descratch/descratch.C:627
 msgid "All"
 msgstr "Todos"
 
-#: cinelerra/assetpopup.C:434 cinelerra/proxypopup.C:315
+#: cinelerra/assetpopup.C:540 cinelerra/proxypopup.C:315
 msgid "Used"
 msgstr "Usado"
 
 msgid "Used"
 msgstr "Usado"
 
-#: cinelerra/assetpopup.C:435 cinelerra/proxypopup.C:316
+#: cinelerra/assetpopup.C:541 cinelerra/proxypopup.C:316
 msgid "Unused"
 msgstr "No usado"
 
 msgid "Unused"
 msgstr "No usado"
 
-#: cinelerra/assetpopup.C:436 cinelerra/channeledit.C:153
-#: cinelerra/ffmpeg.C:1864 cinelerra/ffmpeg.C:1911 cinelerra/fileexr.C:200
+#: cinelerra/assetpopup.C:542 cinelerra/channeledit.C:153
+#: cinelerra/ffmpeg.C:1887 cinelerra/ffmpeg.C:1934 cinelerra/fileexr.C:200
 #: cinelerra/fileffmpeg.C:545 cinelerra/fileffmpeg.C:717
 #: cinelerra/proxypopup.C:317 cinelerra/recordbatches.C:309
 #: cinelerra/fileffmpeg.C:545 cinelerra/fileffmpeg.C:717
 #: cinelerra/proxypopup.C:317 cinelerra/recordbatches.C:309
-#: cinelerra/recordgui.C:323 cinelerra/rescale.C:7
+#: cinelerra/recordgui.C:323 cinelerra/recordgui.C:772 cinelerra/rescale.C:7
 #: cinelerra/sharedlocation.C:144 cinelerra/sharedlocation.C:149
 #: cinelerra/sharedlocation.C:162 cinelerra/vwindowgui.C:270
 #: plugins/descratch/descratch.C:624 plugins/findobj/findobjwindow.C:887
 #: cinelerra/sharedlocation.C:144 cinelerra/sharedlocation.C:149
 #: cinelerra/sharedlocation.C:162 cinelerra/vwindowgui.C:270
 #: plugins/descratch/descratch.C:624 plugins/findobj/findobjwindow.C:887
@@ -772,82 +841,82 @@ msgstr "No usado"
 msgid "None"
 msgstr "Ninguno"
 
 msgid "None"
 msgstr "Ninguno"
 
-#: cinelerra/assetpopup.C:443 cinelerra/assetpopup.C:450
+#: cinelerra/assetpopup.C:549 cinelerra/assetpopup.C:556
 #: plugins/titler/titler.h:39
 msgid "png"
 msgstr "png"
 
 #: plugins/titler/titler.h:39
 msgid "png"
 msgstr "png"
 
-#: cinelerra/assetpopup.C:444 cinelerra/assetpopup.C:451
+#: cinelerra/assetpopup.C:550 cinelerra/assetpopup.C:557
 msgid "jpeg"
 msgstr "jpg"
 
 msgid "jpeg"
 msgstr "jpg"
 
-#: cinelerra/assetpopup.C:445 cinelerra/assetpopup.C:452
+#: cinelerra/assetpopup.C:551 cinelerra/assetpopup.C:558
 msgid "tiff"
 msgstr "tiff"
 
 msgid "tiff"
 msgstr "tiff"
 
-#: cinelerra/assetpopup.C:446 cinelerra/assetpopup.C:453
+#: cinelerra/assetpopup.C:552 cinelerra/assetpopup.C:559
 msgid "ppm"
 msgstr "ppm"
 
 msgid "ppm"
 msgstr "ppm"
 
-#: cinelerra/assetpopup.C:458 cinelerra/loadfile.C:46
+#: cinelerra/assetpopup.C:564 cinelerra/loadfile.C:47
 msgid "Load files..."
 msgstr "Cargar archivos ..."
 
 msgid "Load files..."
 msgstr "Cargar archivos ..."
 
-#: cinelerra/assetpopup.C:490
+#: cinelerra/assetpopup.C:590
 msgid "Copy file list"
 msgstr "Copiar lista de archivos"
 
 msgid "Copy file list"
 msgstr "Copiar lista de archivos"
 
-#: cinelerra/assetpopup.C:532
+#: cinelerra/assetpopup.C:632
 msgid "Nothing selected"
 msgstr "Nada seleccionado"
 
 msgid "Nothing selected"
 msgstr "Nada seleccionado"
 
-#: cinelerra/assetpopup.C:581
+#: cinelerra/assetpopup.C:681
 msgid ": Copy File List"
 msgstr ": Copiar lista de archivos"
 
 msgid ": Copy File List"
 msgstr ": Copiar lista de archivos"
 
-#: cinelerra/assetpopup.C:599
+#: cinelerra/assetpopup.C:699
 msgid "List of asset paths:"
 msgstr "Lista de rutas de recursos:"
 
 msgid "List of asset paths:"
 msgstr "Lista de rutas de recursos:"
 
-#: cinelerra/assetpopup.C:625
+#: cinelerra/assetpopup.C:725
 msgid "Paste file list"
 msgstr "Pegar lista de archivo"
 
 msgid "Paste file list"
 msgstr "Pegar lista de archivo"
 
-#: cinelerra/assetpopup.C:713
+#: cinelerra/assetpopup.C:814
 msgid ": Paste File List"
 msgstr ": Pegar lista de archivo"
 
 msgid ": Paste File List"
 msgstr ": Pegar lista de archivo"
 
-#: cinelerra/assetpopup.C:731
+#: cinelerra/assetpopup.C:832
 msgid "Enter list of asset paths:"
 msgstr "Ingresar lista de rutas de recursos:"
 
 msgid "Enter list of asset paths:"
 msgstr "Ingresar lista de rutas de recursos:"
 
-#: cinelerra/assetpopup.C:757
+#: cinelerra/assetpopup.C:858
 msgid "Snapshot..."
 msgstr "Instantánea..."
 
 msgid "Snapshot..."
 msgstr "Instantánea..."
 
-#: cinelerra/assetpopup.C:799
+#: cinelerra/assetpopup.C:901
 msgid "snap"
 msgstr "instantánea"
 
 msgid "snap"
 msgstr "instantánea"
 
-#: cinelerra/assetpopup.C:870
+#: cinelerra/assetpopup.C:972
 msgid "snapshot render failed"
 msgstr "error en el renderizado de instantáneas"
 
 msgid "snapshot render failed"
 msgstr "error en el renderizado de instantáneas"
 
-#: cinelerra/assetpopup.C:878
+#: cinelerra/assetpopup.C:980
 msgid "Grabshot..."
 msgstr "Captura de imágenes...."
 
 msgid "Grabshot..."
 msgstr "Captura de imágenes...."
 
-#: cinelerra/assetpopup.C:1024
+#: cinelerra/assetpopup.C:1127
 msgid "grab"
 msgstr "captura"
 
 msgid "grab"
 msgstr "captura"
 
-#: cinelerra/assetpopup.C:1091
+#: cinelerra/assetpopup.C:1194
 msgid "grabshot render failed"
 msgstr "error en el renderizado de capturas"
 
 #: cinelerra/assetremove.C:32
 msgid ": Remove assets"
 msgid "grabshot render failed"
 msgstr "error en el renderizado de capturas"
 
 #: cinelerra/assetremove.C:32
 msgid ": Remove assets"
-msgstr ": Eliminar clips"
+msgstr ": Eliminar clips activos"
 
 #: cinelerra/assetremove.C:65
 msgid "Permanently remove from disk?"
 
 #: cinelerra/assetremove.C:65
 msgid "Permanently remove from disk?"
@@ -883,15 +952,20 @@ msgstr "Dispositivo configurado ALSA no soporta el funcionamiento del canal %d\n
 msgid " Configured ALSA device does not support %u Hz playback.\n"
 msgstr " Dispositivo configurado ALSA no es compatible con la reproducción %u Hz.\n"
 
 msgid " Configured ALSA device does not support %u Hz playback.\n"
 msgstr " Dispositivo configurado ALSA no es compatible con la reproducción %u Hz.\n"
 
+#: cinelerra/audioalsa.C:582
+#, c-format
+msgid "AudioALSA::write_buffer err %d(%s) at sample %jd\n"
+msgstr "AudioALSA::escritura_de_buffer err %d(%s) en la muestra %jd\n"
+
 #: cinelerra/audiooss.C:213 cinelerra/audiooss.C:215 cinelerra/audiooss.C:219
 #: cinelerra/audiooss.C:221
 #, c-format
 msgid "%s failed\n"
 #: cinelerra/audiooss.C:213 cinelerra/audiooss.C:215 cinelerra/audiooss.C:219
 #: cinelerra/audiooss.C:221
 #, c-format
 msgid "%s failed\n"
-msgstr "%s fallido\n"
+msgstr "%s falló\n"
 
 #: cinelerra/avc1394transport.C:175 cinelerra/playtransport.C:384
 msgid "Rewind ( Home )"
 
 #: cinelerra/avc1394transport.C:175 cinelerra/playtransport.C:384
 msgid "Rewind ( Home )"
-msgstr "Rebobinar (home)"
+msgstr "Rebobinar (inicio)"
 
 #: cinelerra/avc1394transport.C:200
 msgid "Fast Reverse ( + )"
 
 #: cinelerra/avc1394transport.C:200
 msgid "Fast Reverse ( + )"
@@ -899,11 +973,11 @@ msgstr "Invertir rápido (+)"
 
 #: cinelerra/avc1394transport.C:224
 msgid "Reverse Play ( 6 )"
 
 #: cinelerra/avc1394transport.C:224
 msgid "Reverse Play ( 6 )"
-msgstr "Reproducir invertir (6)"
+msgstr "Reproducir al revés (6)"
 
 #: cinelerra/avc1394transport.C:256
 msgid "Stop ( 0 )"
 
 #: cinelerra/avc1394transport.C:256
 msgid "Stop ( 0 )"
-msgstr "Stop (0)"
+msgstr "Parar (0)"
 
 #: cinelerra/avc1394transport.C:281
 msgid "Play ( 3 )"
 
 #: cinelerra/avc1394transport.C:281
 msgid "Play ( 3 )"
@@ -915,7 +989,7 @@ msgstr "Pausar"
 
 #: cinelerra/avc1394transport.C:337
 msgid "Fast Forward ( Enter )"
 
 #: cinelerra/avc1394transport.C:337
 msgid "Fast Forward ( Enter )"
-msgstr "Avanzar Rapido (Enter)"
+msgstr "Avanzar Rapido (Intro)"
 
 #: cinelerra/avc1394transport.C:365 cinelerra/playtransport.C:475
 msgid "Jump to end ( End )"
 
 #: cinelerra/avc1394transport.C:365 cinelerra/playtransport.C:475
 msgid "Jump to end ( End )"
@@ -947,7 +1021,7 @@ msgstr "Clips"
 
 #: cinelerra/awindowgui.C:94 cinelerra/binfolder.C:1783
 msgid "Media"
 
 #: cinelerra/awindowgui.C:94 cinelerra/binfolder.C:1783
 msgid "Media"
-msgstr "Medios de comunicación"
+msgstr "Medios Multimedia"
 
 #: cinelerra/awindowgui.C:95
 msgid "Proxy"
 
 #: cinelerra/awindowgui.C:95
 msgid "Proxy"
@@ -955,11 +1029,11 @@ msgstr "Proxy"
 
 #: cinelerra/awindowgui.C:100
 msgid "Full Play"
 
 #: cinelerra/awindowgui.C:100
 msgid "Full Play"
-msgstr "Reproducir completa"
+msgstr "Reproducir todo"
 
 #: cinelerra/awindowgui.C:101
 msgid "Mouse Over"
 
 #: cinelerra/awindowgui.C:101
 msgid "Mouse Over"
-msgstr "Puntero sobre"
+msgstr "Ratón sobre"
 
 #: cinelerra/awindowgui.C:102
 msgid "Src Target"
 
 #: cinelerra/awindowgui.C:102
 msgid "Src Target"
@@ -969,144 +1043,144 @@ msgstr "Objectivo de origen"
 msgid "No Play"
 msgstr "No Reproducir"
 
 msgid "No Play"
 msgstr "No Reproducir"
 
-#: cinelerra/awindowgui.C:962 cinelerra/awindowgui.C:1021
+#: cinelerra/awindowgui.C:977 cinelerra/awindowgui.C:1036
 #, c-format
 msgid "Reading %s"
 msgstr "Leyendo %s"
 
 #, c-format
 msgid "Reading %s"
 msgstr "Leyendo %s"
 
-#: cinelerra/awindowgui.C:1104 cinelerra/awindowgui.C:1153
+#: cinelerra/awindowgui.C:1119 cinelerra/awindowgui.C:1168
 #, c-format
 msgid "Rendering %s"
 msgstr "Renderizando %s"
 
 #, c-format
 msgid "Rendering %s"
 msgstr "Renderizando %s"
 
-#: cinelerra/awindowgui.C:1258
+#: cinelerra/awindowgui.C:1273
 msgid ": Resources"
 msgid ": Resources"
-msgstr "Recursos"
+msgstr "Recursos"
 
 
-#: cinelerra/awindowgui.C:1428 cinelerra/awindowgui.C:2364
-#: cinelerra/awindowgui.C:2384
+#: cinelerra/awindowgui.C:1443 cinelerra/awindowgui.C:2379
+#: cinelerra/awindowgui.C:2399
 msgid "awindowgui#Title"
 msgstr "Título"
 
 msgid "awindowgui#Title"
 msgstr "Título"
 
-#: cinelerra/awindowgui.C:1429 cinelerra/awindowgui.C:2365
+#: cinelerra/awindowgui.C:1444 cinelerra/awindowgui.C:2380
 msgid "Comments"
 msgstr "Comentarios"
 
 msgid "Comments"
 msgstr "Comentarios"
 
-#: cinelerra/awindowgui.C:1516
+#: cinelerra/awindowgui.C:1531
 msgid "Visibility"
 msgstr "Visibilidad"
 
 msgid "Visibility"
 msgstr "Visibilidad"
 
-#: cinelerra/awindowgui.C:1744
+#: cinelerra/awindowgui.C:1759
 msgid ": Remove plugin"
 msgstr ": Eliminar plugin"
 
 msgid ": Remove plugin"
 msgstr ": Eliminar plugin"
 
-#: cinelerra/awindowgui.C:1774
+#: cinelerra/awindowgui.C:1789
 msgid "remove plugin?"
 msgid "remove plugin?"
-msgstr "eliminar complemento?"
+msgstr "eliminar plugin?"
 
 
-#: cinelerra/awindowgui.C:1803
+#: cinelerra/awindowgui.C:1818
 #, c-format
 msgid "remove %s\n"
 msgstr "eliminar %s\n"
 
 #, c-format
 msgid "remove %s\n"
 msgstr "eliminar %s\n"
 
-#: cinelerra/awindowgui.C:2209
+#: cinelerra/awindowgui.C:2224
 msgid "Proxy clip"
 msgid "Proxy clip"
-msgstr "Información del clip"
+msgstr "Clip de Proxy"
 
 
-#: cinelerra/awindowgui.C:2383
+#: cinelerra/awindowgui.C:2398
 msgid "Time Stamps"
 msgstr "Marcas de tiempo"
 
 msgid "Time Stamps"
 msgstr "Marcas de tiempo"
 
-#: cinelerra/awindowgui.C:3131
+#: cinelerra/awindowgui.C:3146
 msgid "No info available"
 msgstr "Ninguna información disponible"
 
 msgid "No info available"
 msgstr "Ninguna información disponible"
 
-#: cinelerra/awindowgui.C:3224
+#: cinelerra/awindowgui.C:3239
 msgid "Delete asset from disk"
 msgstr "Borrar clip desde el disco"
 
 msgid "Delete asset from disk"
 msgstr "Borrar clip desde el disco"
 
-#: cinelerra/awindowgui.C:3237
+#: cinelerra/awindowgui.C:3252
 msgid "Delete asset from project"
 msgstr "Borrar los clips de proyecto"
 
 msgid "Delete asset from project"
 msgstr "Borrar los clips de proyecto"
 
-#: cinelerra/awindowgui.C:3266
+#: cinelerra/awindowgui.C:3281
 msgid "Redraw index"
 msgstr "Volver a dibujar índice"
 
 msgid "Redraw index"
 msgstr "Volver a dibujar índice"
 
-#: cinelerra/awindowgui.C:3279
+#: cinelerra/awindowgui.C:3294
 msgid "Paste asset on recordable tracks"
 msgstr "Pegar clip en pistas grabables"
 
 msgid "Paste asset on recordable tracks"
 msgstr "Pegar clip en pistas grabables"
 
-#: cinelerra/awindowgui.C:3292
+#: cinelerra/awindowgui.C:3307
 msgid "Append asset in new tracks"
 msgstr "Agregar clip en una nueva pista"
 
 msgid "Append asset in new tracks"
 msgstr "Agregar clip en una nueva pista"
 
-#: cinelerra/awindowgui.C:3305
+#: cinelerra/awindowgui.C:3320
 msgid "View asset"
 msgstr "Ver recurso"
 
 msgid "View asset"
 msgstr "Ver recurso"
 
-#: cinelerra/awindowgui.C:3349 cinelerra/fileffmpeg.C:1015
+#: cinelerra/awindowgui.C:3364 cinelerra/fileffmpeg.C:1015
 msgid "ffmpeg"
 msgstr "ffmpeg"
 
 msgid "ffmpeg"
 msgstr "ffmpeg"
 
-#: cinelerra/awindowgui.C:3350
+#: cinelerra/awindowgui.C:3365
 msgid "ladspa"
 msgstr "ladspa"
 
 msgid "ladspa"
 msgstr "ladspa"
 
-#: cinelerra/awindowgui.C:3351
+#: cinelerra/awindowgui.C:3366
 msgid "lv2"
 msgstr "lv2"
 
 msgid "lv2"
 msgstr "lv2"
 
-#: cinelerra/awindowgui.C:3352
+#: cinelerra/awindowgui.C:3367
 msgid "audio_tools"
 msgid "audio_tools"
-msgstr "audio_tools"
+msgstr "audio_herramientas"
 
 
-#: cinelerra/awindowgui.C:3353
+#: cinelerra/awindowgui.C:3368
 msgid "audio_transitions"
 msgid "audio_transitions"
-msgstr "audio_transitions"
+msgstr "audio_transiciones"
 
 
-#: cinelerra/awindowgui.C:3354
+#: cinelerra/awindowgui.C:3369
 msgid "blending"
 msgstr "mezcla"
 
 msgid "blending"
 msgstr "mezcla"
 
-#: cinelerra/awindowgui.C:3355
+#: cinelerra/awindowgui.C:3370
 msgid "colors"
 msgstr "colores"
 
 msgid "colors"
 msgstr "colores"
 
-#: cinelerra/awindowgui.C:3356
+#: cinelerra/awindowgui.C:3371
 msgid "exotic"
 msgstr "exótico"
 
 msgid "exotic"
 msgstr "exótico"
 
-#: cinelerra/awindowgui.C:3357
+#: cinelerra/awindowgui.C:3372
 msgid "transforms"
 msgstr "transformadas"
 
 msgid "transforms"
 msgstr "transformadas"
 
-#: cinelerra/awindowgui.C:3358
+#: cinelerra/awindowgui.C:3373
 msgid "tv_effects"
 msgid "tv_effects"
-msgstr "tv_effects"
+msgstr "tv_efectos"
 
 
-#: cinelerra/awindowgui.C:3359
+#: cinelerra/awindowgui.C:3374
 msgid "video_tools"
 msgid "video_tools"
-msgstr "video_tools"
+msgstr "video_herramientas"
 
 
-#: cinelerra/awindowgui.C:3360
+#: cinelerra/awindowgui.C:3375
 msgid "video_transitions"
 msgid "video_transitions"
-msgstr "video_transitions"
+msgstr "video_transiciones"
 
 
-#: cinelerra/awindowgui.C:3472
+#: cinelerra/awindowgui.C:3487
 msgid "Display icons packed"
 msgstr "Mostrar iconos empaquetados"
 
 msgid "Display icons packed"
 msgstr "Mostrar iconos empaquetados"
 
-#: cinelerra/awindowgui.C:3475
+#: cinelerra/awindowgui.C:3490
 msgid "Display icon list"
 msgstr "Mostrar lista de íconos"
 
 msgid "Display icon list"
 msgstr "Mostrar lista de íconos"
 
-#: cinelerra/awindowgui.C:3485 cinelerra/clippopup.C:166
+#: cinelerra/awindowgui.C:3500 cinelerra/clippopup.C:173
 #: cinelerra/folderlistmenu.C:92 cinelerra/proxypopup.C:131
 msgid "Sort items"
 msgstr "Organizar objectos"
 
 #: cinelerra/folderlistmenu.C:92 cinelerra/proxypopup.C:131
 msgid "Sort items"
 msgstr "Organizar objectos"
 
-#: cinelerra/awindowgui.C:3539 cinelerra/channeledit.C:476
+#: cinelerra/awindowgui.C:3554 cinelerra/channeledit.C:476
 msgid "Select"
 msgstr "Seleccionar"
 
 msgid "Select"
 msgstr "Seleccionar"
 
@@ -1134,18 +1208,18 @@ msgstr "Existe"
 #: cinelerra/recordengine.C:701
 #, c-format
 msgid "Untimed"
 #: cinelerra/recordengine.C:701
 #, c-format
 msgid "Untimed"
-msgstr "No programado"
+msgstr "Sin Tiempo"
 
 #: cinelerra/batch.C:139 cinelerra/recordengine.C:694
 #: cinelerra/recordengine.C:702
 #, c-format
 msgid "Timed"
 
 #: cinelerra/batch.C:139 cinelerra/recordengine.C:694
 #: cinelerra/recordengine.C:702
 #, c-format
 msgid "Timed"
-msgstr "Programado"
+msgstr "Cronometrado"
 
 
-#: cinelerra/batch.C:141 cinelerra/batchrender.C:960 cinelerra/ffmpeg.C:3068
-#: cinelerra/ffmpeg.C:3176 cinelerra/file.C:1257 cinelerra/file.C:1284
-#: cinelerra/interfaceprefs.C:542 cinelerra/interlacemodes.h:27
-#: cinelerra/loadmode.C:110 cinelerra/new.C:873 cinelerra/record.C:736
+#: cinelerra/batch.C:141 cinelerra/batchrender.C:960 cinelerra/ffmpeg.C:3091
+#: cinelerra/ffmpeg.C:3199 cinelerra/file.C:1263 cinelerra/file.C:1290
+#: cinelerra/interfaceprefs.C:551 cinelerra/interlacemodes.h:27
+#: cinelerra/loadmode.C:116 cinelerra/new.C:873 cinelerra/record.C:741
 #: cinelerra/vdeviceprefs.C:657 plugins/motion2point/motionwindow.C:791
 #: plugins/motion2point/motionwindow.C:862 plugins/timefront/timefront.C:421
 #: plugins/titler/titler.C:2336
 #: cinelerra/vdeviceprefs.C:657 plugins/motion2point/motionwindow.C:791
 #: plugins/motion2point/motionwindow.C:862 plugins/timefront/timefront.C:421
 #: plugins/titler/titler.C:2336
@@ -1167,11 +1241,11 @@ msgstr "Etiquetado"
 msgid "Farmed"
 msgstr "Criado"
 
 msgid "Farmed"
 msgstr "Criado"
 
-#: cinelerra/batchrender.C:65 plugins/compressor/compressor.C:1021
+#: cinelerra/batchrender.C:65 cinelerra/compressortools.C:522
 msgid "Output"
 msgstr "Salida"
 
 msgid "Output"
 msgstr "Salida"
 
-#: cinelerra/batchrender.C:65
+#: cinelerra/batchrender.C:65 cinelerra/loadmode.C:55
 msgid "EDL"
 msgstr "EDL"
 
 msgid "EDL"
 msgstr "EDL"
 
@@ -1181,13 +1255,13 @@ msgstr "Transcurrido"
 
 #: cinelerra/batchrender.C:69
 msgid "Batch Render..."
 
 #: cinelerra/batchrender.C:69
 msgid "Batch Render..."
-msgstr "Batch Render..."
+msgstr "Renderizar por lotes..."
 
 #: cinelerra/batchrender.C:69
 msgid "Shift-B"
 msgstr "Mayús-B"
 
 
 #: cinelerra/batchrender.C:69
 msgid "Shift-B"
 msgstr "Mayús-B"
 
-#: cinelerra/batchrender.C:390 cinelerra/bdcreate.C:291
+#: cinelerra/batchrender.C:390 cinelerra/bdcreate.C:294
 #: cinelerra/dvdcreate.C:359
 #, c-format
 msgid "Unable to save: %s"
 #: cinelerra/dvdcreate.C:359
 #, c-format
 msgid "Unable to save: %s"
@@ -1203,7 +1277,7 @@ msgstr "pulse Cancelar para abandonar renderizado por lotes"
 msgid "EDL %s not found.\n"
 msgstr "EDL %s no encontrado.\n"
 
 msgid "EDL %s not found.\n"
 msgstr "EDL %s no encontrado.\n"
 
-#: cinelerra/batchrender.C:493 cinelerra/file.C:236 cinelerra/formatcheck.C:47
+#: cinelerra/batchrender.C:493 cinelerra/file.C:237 cinelerra/formatcheck.C:47
 #: cinelerra/formatcheck.C:58 cinelerra/formatcheck.C:67
 #: cinelerra/menueffects.C:148 cinelerra/menueffects.C:159
 #: cinelerra/menueffects.C:247 cinelerra/menueffects.C:255
 #: cinelerra/formatcheck.C:58 cinelerra/formatcheck.C:67
 #: cinelerra/menueffects.C:148 cinelerra/menueffects.C:159
 #: cinelerra/menueffects.C:247 cinelerra/menueffects.C:255
@@ -1238,7 +1312,7 @@ msgstr "%d trabajo EDLs de archivo de renderizado con y sin etiquetas\n"
 
 #: cinelerra/batchrender.C:726
 msgid ": Batch Render"
 
 #: cinelerra/batchrender.C:726
 msgid ": Batch Render"
-msgstr ": Batch Render"
+msgstr ": Renderizar por lotes"
 
 #: cinelerra/batchrender.C:758
 msgid "Output path:"
 
 #: cinelerra/batchrender.C:758
 msgid "Output path:"
@@ -1271,17 +1345,17 @@ msgid "Close"
 msgstr "Cerrar"
 
 #: cinelerra/batchrender.C:1040 cinelerra/recordbatches.C:469
 msgstr "Cerrar"
 
 #: cinelerra/batchrender.C:1040 cinelerra/recordbatches.C:469
-#: plugins/crikey/crikeywindow.C:593 plugins/sketcher/sketcherwindow.C:833
-#: plugins/sketcher/sketcherwindow.C:1215 plugins/tracer/tracerwindow.C:598
+#: plugins/crikey/crikeywindow.C:593 plugins/sketcher/sketcherwindow.C:922
+#: plugins/sketcher/sketcherwindow.C:1304 plugins/tracer/tracerwindow.C:598
 msgid "New"
 msgstr "Nuevo"
 
 #: cinelerra/batchrender.C:1052 cinelerra/channeledit.C:577
 msgid "New"
 msgstr "Nuevo"
 
 #: cinelerra/batchrender.C:1052 cinelerra/channeledit.C:577
-#: cinelerra/clippopup.C:333 cinelerra/cwindowtool.C:1905
+#: cinelerra/clippopup.C:340 cinelerra/cwindowtool.C:1905
 #: cinelerra/cwindowtool.C:1959 cinelerra/dbwindow.C:240
 #: cinelerra/keyframegui.C:742 cinelerra/labelpopup.C:87
 #: cinelerra/recordbatches.C:487 plugins/piano/piano.C:835
 #: cinelerra/cwindowtool.C:1959 cinelerra/dbwindow.C:240
 #: cinelerra/keyframegui.C:742 cinelerra/labelpopup.C:87
 #: cinelerra/recordbatches.C:487 plugins/piano/piano.C:835
-#: plugins/synthesizer/synthesizer.C:1305
+#: plugins/synthesizer/synthesizer.C:1311
 msgid "Delete"
 msgstr "Borrar"
 
 msgid "Delete"
 msgstr "Borrar"
 
@@ -1333,20 +1407,20 @@ msgstr "Inicio"
 msgid "warn if jobs/session mismatched"
 msgstr "advertir si los trabajos / sesiones no coinciden"
 
 msgid "warn if jobs/session mismatched"
 msgstr "advertir si los trabajos / sesiones no coinciden"
 
-#: cinelerra/batchrender.C:1403 cinelerra/bdcreate.C:690
+#: cinelerra/batchrender.C:1403 cinelerra/bdcreate.C:689
 #: cinelerra/dvdcreate.C:822 cinelerra/performanceprefs.C:400
 msgid "Use render farm"
 msgstr "Usar granja de renderizado"
 
 #: cinelerra/dvdcreate.C:822 cinelerra/performanceprefs.C:400
 msgid "Use render farm"
 msgstr "Usar granja de renderizado"
 
-#: cinelerra/bdcreate.C:80
+#: cinelerra/bdcreate.C:83
 msgid "BD Render..."
 msgstr "BD Render ..."
 
 msgid "BD Render..."
 msgstr "BD Render ..."
 
-#: cinelerra/bdcreate.C:80
+#: cinelerra/bdcreate.C:83
 msgid "Ctrl-d"
 msgstr "Ctrl-d"
 
 msgid "Ctrl-d"
 msgstr "Ctrl-d"
 
-#: cinelerra/bdcreate.C:159 cinelerra/dvdcreate.C:165
+#: cinelerra/bdcreate.C:162 cinelerra/dvdcreate.C:165
 #, c-format
 msgid ""
 "Unable to save: %s\n"
 #, c-format
 msgid ""
 "Unable to save: %s\n"
@@ -1355,132 +1429,132 @@ msgstr ""
 "No se puede guardar: %s\n"
 "-- %s"
 
 "No se puede guardar: %s\n"
 "-- %s"
 
-#: cinelerra/bdcreate.C:226 cinelerra/dvdcreate.C:295
+#: cinelerra/bdcreate.C:229 cinelerra/dvdcreate.C:295
 #, c-format
 msgid "No EDL/Session"
 msgstr "No EDL / Sesión"
 
 #, c-format
 msgid "No EDL/Session"
 msgstr "No EDL / Sesión"
 
-#: cinelerra/bdcreate.C:235 cinelerra/dvdcreate.C:303
+#: cinelerra/bdcreate.C:238 cinelerra/dvdcreate.C:303
 #, c-format
 msgid "No content: %s"
 msgstr "Sin contenido: %s"
 
 #, c-format
 msgid "No content: %s"
 msgstr "Sin contenido: %s"
 
-#: cinelerra/bdcreate.C:243 cinelerra/dvdcreate.C:311
+#: cinelerra/bdcreate.C:246 cinelerra/dvdcreate.C:311
 #, c-format
 msgid ""
 "Unable to create directory: %s\n"
 "-- %s"
 msgstr ""
 #, c-format
 msgid ""
 "Unable to create directory: %s\n"
 "-- %s"
 msgstr ""
-"No se puede crear el directorio: %s\n"
+"No se puede crear la carpeta: %s\n"
 "-- %s"
 
 "-- %s"
 
-#: cinelerra/bdcreate.C:387 cinelerra/dvdcreate.C:509
+#: cinelerra/bdcreate.C:386 cinelerra/dvdcreate.C:509
 #: plugins/scaleratio/scaleratio.C:96
 msgid "Scale Ratio"
 msgstr "Relación de escala"
 
 #: plugins/scaleratio/scaleratio.C:96
 msgid "Scale Ratio"
 msgstr "Relación de escala"
 
-#: cinelerra/bdcreate.C:424
+#: cinelerra/bdcreate.C:423
 msgid "create bd"
 msgstr "crear bd"
 
 msgid "create bd"
 msgstr "crear bd"
 
-#: cinelerra/bdcreate.C:490
+#: cinelerra/bdcreate.C:489
 msgid "Must be root to mount UDFS images\n"
 msgstr "Debe ser root para montar imágenes UDFS\n"
 
 msgid "Must be root to mount UDFS images\n"
 msgstr "Debe ser root para montar imágenes UDFS\n"
 
-#: cinelerra/bdcreate.C:500 cinelerra/dvdcreate.C:630
+#: cinelerra/bdcreate.C:499 cinelerra/dvdcreate.C:630
 msgid "end setup, start batch render"
 msgstr "fin de configuración, comienzo de renderizado por lotes"
 
 msgid "end setup, start batch render"
 msgstr "fin de configuración, comienzo de renderizado por lotes"
 
-#: cinelerra/bdcreate.C:577 cinelerra/dvdcreate.C:708
+#: cinelerra/bdcreate.C:576 cinelerra/dvdcreate.C:708
 msgid "disk space: "
 msgstr "espacio del disco: "
 
 msgid "disk space: "
 msgstr "espacio del disco: "
 
-#: cinelerra/bdcreate.C:619 cinelerra/dvdcreate.C:751
+#: cinelerra/bdcreate.C:618 cinelerra/dvdcreate.C:751
 #: plugins/deinterlace/deinterlace.C:84 plugins/denoisemjpeg/denoisemjpeg.C:248
 msgid "Deinterlace"
 msgstr "Desentrelazado"
 
 #: plugins/deinterlace/deinterlace.C:84 plugins/denoisemjpeg/denoisemjpeg.C:248
 msgid "Deinterlace"
 msgstr "Desentrelazado"
 
-#: cinelerra/bdcreate.C:639 cinelerra/dvdcreate.C:771 plugins/ivtc/ivtc.C:76
+#: cinelerra/bdcreate.C:638 cinelerra/dvdcreate.C:771 plugins/ivtc/ivtc.C:76
 msgid "Inverse Telecine"
 msgstr "Telecine Inverso"
 
 msgid "Inverse Telecine"
 msgstr "Telecine Inverso"
 
-#: cinelerra/bdcreate.C:659 cinelerra/dvdcreate.C:791
+#: cinelerra/bdcreate.C:658 cinelerra/dvdcreate.C:791
 msgid "Resize Tracks"
 msgstr "Cambiar el tamaño de las Pistas"
 
 msgid "Resize Tracks"
 msgstr "Cambiar el tamaño de las Pistas"
 
-#: cinelerra/bdcreate.C:670 cinelerra/dvdcreate.C:802
-#: cinelerra/scopewindow.C:1330 plugins/colorbalance/colorbalance.C:507
+#: cinelerra/bdcreate.C:669 cinelerra/dvdcreate.C:802
+#: cinelerra/scopewindow.C:1330 plugins/colorbalance/colorbalance.C:506
 #: plugins/gamma/gamma.C:451 plugins/histogram/histogram.C:99
 #: plugins/interpolate/interpolate.C:246
 msgid "Histogram"
 msgstr "Histograma"
 
 #: plugins/gamma/gamma.C:451 plugins/histogram/histogram.C:99
 #: plugins/interpolate/interpolate.C:246
 msgid "Histogram"
 msgstr "Histograma"
 
-#: cinelerra/bdcreate.C:680 cinelerra/dvdcreate.C:812
+#: cinelerra/bdcreate.C:679 cinelerra/dvdcreate.C:812
 msgid "Chapters at Labels"
 msgstr "Capítulos en las etiquetas"
 
 msgid "Chapters at Labels"
 msgstr "Capítulos en las etiquetas"
 
-#: cinelerra/bdcreate.C:701 cinelerra/dvdcreate.C:832
+#: cinelerra/bdcreate.C:700 cinelerra/dvdcreate.C:832
 msgid "Audio 5.1"
 msgstr "Audio 5.1"
 
 msgid "Audio 5.1"
 msgstr "Audio 5.1"
 
-#: cinelerra/bdcreate.C:712
+#: cinelerra/bdcreate.C:711
 msgid ": Create BD"
 msgstr ": Crear BD"
 
 msgid ": Create BD"
 msgstr ": Crear BD"
 
-#: cinelerra/bdcreate.C:749 cinelerra/channeledit.C:990
+#: cinelerra/bdcreate.C:748 cinelerra/channeledit.C:990
 #: cinelerra/clipedit.C:163 cinelerra/dvdcreate.C:890
 msgid "Title:"
 msgstr "Título:"
 
 #: cinelerra/clipedit.C:163 cinelerra/dvdcreate.C:890
 msgid "Title:"
 msgstr "Título:"
 
-#: cinelerra/bdcreate.C:755 cinelerra/dvdcreate.C:896
+#: cinelerra/bdcreate.C:754 cinelerra/dvdcreate.C:896
 msgid "Work path:"
 msgstr "Camino del trabajo:"
 
 msgid "Work path:"
 msgstr "Camino del trabajo:"
 
-#: cinelerra/bdcreate.C:762 cinelerra/dvdcreate.C:903
+#: cinelerra/bdcreate.C:761 cinelerra/dvdcreate.C:903
 msgid "Work path"
 msgstr "Camino del trabajo"
 
 msgid "Work path"
 msgstr "Camino del trabajo"
 
-#: cinelerra/bdcreate.C:762 cinelerra/dvdcreate.C:903
+#: cinelerra/bdcreate.C:761 cinelerra/dvdcreate.C:903
 msgid "Select a Work directory:"
 msgid "Select a Work directory:"
-msgstr "Seleccionar un directorio de trabajo:"
+msgstr "Seleccionar una carpeta de trabajo:"
 
 
-#: cinelerra/bdcreate.C:768 cinelerra/dvdcreate.C:909
+#: cinelerra/bdcreate.C:767 cinelerra/dvdcreate.C:909
 msgid "Media:"
 msgid "Media:"
-msgstr "Medios de comunicación:"
+msgstr "Medios Multimedia:"
 
 
-#: cinelerra/bdcreate.C:779 cinelerra/dvdcreate.C:920 cinelerra/recordgui.C:224
+#: cinelerra/bdcreate.C:778 cinelerra/dvdcreate.C:920 cinelerra/recordgui.C:224
 msgid "Format:"
 msgstr "Formato:"
 
 msgid "Format:"
 msgstr "Formato:"
 
-#: cinelerra/bdcreate.C:786 cinelerra/dvdcreate.C:926
+#: cinelerra/bdcreate.C:785 cinelerra/dvdcreate.C:926
 #: cinelerra/resizetrackthread.C:125 plugins/pitch/pitch.C:418
 #: plugins/scale/scalewin.C:52
 msgid "Scale:"
 msgstr "Escala:"
 
 #: cinelerra/resizetrackthread.C:125 plugins/pitch/pitch.C:418
 #: plugins/scale/scalewin.C:52
 msgid "Scale:"
 msgstr "Escala:"
 
-#: cinelerra/bdcreate.C:1020
+#: cinelerra/bdcreate.C:1019
 msgid "* non-standard format"
 msgstr "* formato no estandar"
 
 msgid "* non-standard format"
 msgstr "* formato no estandar"
 
-#: cinelerra/binfolder.C:39
+#: cinelerra/binfolder.C:39 plugins/sketcher/sketcherwindow.C:296
 msgid "Off"
 msgid "Off"
-msgstr "apagado"
+msgstr "Apagado"
 
 #: cinelerra/binfolder.C:40
 msgid "And"
 
 #: cinelerra/binfolder.C:40
 msgid "And"
-msgstr "y"
+msgstr "And"
 
 #: cinelerra/binfolder.C:41
 msgid "Or"
 
 #: cinelerra/binfolder.C:41
 msgid "Or"
-msgstr "o"
+msgstr "Or"
 
 #: cinelerra/binfolder.C:42
 msgid "And Not"
 
 #: cinelerra/binfolder.C:42
 msgid "And Not"
-msgstr "y no"
+msgstr "No And"
 
 #: cinelerra/binfolder.C:43
 msgid "Or Not"
 
 #: cinelerra/binfolder.C:43
 msgid "Or Not"
-msgstr "o no"
+msgstr "No Or"
 
 #: cinelerra/binfolder.C:47
 msgid "Patterns"
 
 #: cinelerra/binfolder.C:47
 msgid "Patterns"
@@ -1508,7 +1582,7 @@ msgstr "Altura"
 
 #: cinelerra/binfolder.C:53 cinelerra/performanceprefs.C:227
 msgid "Framerate"
 
 #: cinelerra/binfolder.C:53 cinelerra/performanceprefs.C:227
 msgid "Framerate"
-msgstr "Fotogramas por segundos"
+msgstr "FPS"
 
 #: cinelerra/binfolder.C:54
 msgid "Samplerate"
 
 #: cinelerra/binfolder.C:54
 msgid "Samplerate"
@@ -1536,7 +1610,7 @@ msgstr "Mayor o igual >="
 
 #: cinelerra/binfolder.C:63
 msgid "Gt  > "
 
 #: cinelerra/binfolder.C:63
 msgid "Gt  > "
-msgstr "Mayor >"
+msgstr "Mayor > "
 
 #: cinelerra/binfolder.C:64
 msgid "Ne  !="
 
 #: cinelerra/binfolder.C:64
 msgid "Ne  !="
@@ -1548,7 +1622,7 @@ msgstr "Menor o igual <="
 
 #: cinelerra/binfolder.C:66
 msgid "Lt  < "
 
 #: cinelerra/binfolder.C:66
 msgid "Lt  < "
-msgstr "Menor <"
+msgstr "Menor < "
 
 #: cinelerra/binfolder.C:67
 msgid "Matches"
 
 #: cinelerra/binfolder.C:67
 msgid "Matches"
@@ -1626,7 +1700,7 @@ msgstr "Objetivo"
 msgid "Op"
 msgstr "Op"
 
 msgid "Op"
 msgstr "Op"
 
-#: cinelerra/binfolder.C:1460 cinelerra/colorpicker.C:209
+#: cinelerra/binfolder.C:1460 cinelerra/colorpicker.C:259
 #: cinelerra/keyframegui.C:57 plugins/histogram/histogramwindow.C:63
 #: plugins/histogram_bezier/bistogramwindow.C:68
 msgid "Value"
 #: cinelerra/keyframegui.C:57 plugins/histogram/histogramwindow.C:63
 #: plugins/histogram_bezier/bistogramwindow.C:68
 msgid "Value"
@@ -1634,26 +1708,25 @@ msgstr "Valor"
 
 #: cinelerra/binfolder.C:1611 cinelerra/shbtnprefs.C:152
 #: plugins/overlayaudio/overlayaudio.C:174 plugins/piano/piano.C:814
 
 #: cinelerra/binfolder.C:1611 cinelerra/shbtnprefs.C:152
 #: plugins/overlayaudio/overlayaudio.C:174 plugins/piano/piano.C:814
-#: plugins/synthesizer/synthesizer.C:1285
+#: plugins/synthesizer/synthesizer.C:1291
 msgid "Add"
 msgstr "Agregar"
 
 msgid "Add"
 msgstr "Agregar"
 
-#: cinelerra/binfolder.C:1635 cinelerra/mainmenu.C:940
+#: cinelerra/binfolder.C:1635 cinelerra/mainmenu.C:944
 #: cinelerra/shbtnprefs.C:172
 msgid "Del"
 #: cinelerra/shbtnprefs.C:172
 msgid "Del"
-msgstr "Del"
+msgstr "Supr"
 
 #: cinelerra/binfolder.C:1655 cinelerra/cwindowtool.C:367
 #: cinelerra/fileffmpeg.C:1092 cinelerra/fileffmpeg.C:1497
 
 #: cinelerra/binfolder.C:1655 cinelerra/cwindowtool.C:367
 #: cinelerra/fileffmpeg.C:1092 cinelerra/fileffmpeg.C:1497
-#: cinelerra/keyframegui.C:780 cinelerra/loadfile.C:204
-#: cinelerra/loadfile.C:214 cinelerra/loadfile.C:216
+#: cinelerra/keyframegui.C:780 cinelerra/loadfile.C:199
 #: cinelerra/mixersalign.C:428 cinelerra/mixersalign.C:436
 #: cinelerra/plugindialog.C:287 cinelerra/plugindialog.C:360
 #: cinelerra/plugindialog.C:473 cinelerra/pluginfclient.C:218
 #: cinelerra/pluginfclient.C:570 cinelerra/pluginfclient.C:601
 #: cinelerra/pluginlv2gui.C:98 cinelerra/pluginlv2gui.C:225
 #: cinelerra/mixersalign.C:428 cinelerra/mixersalign.C:436
 #: cinelerra/plugindialog.C:287 cinelerra/plugindialog.C:360
 #: cinelerra/plugindialog.C:473 cinelerra/pluginfclient.C:218
 #: cinelerra/pluginfclient.C:570 cinelerra/pluginfclient.C:601
 #: cinelerra/pluginlv2gui.C:98 cinelerra/pluginlv2gui.C:225
-#: cinelerra/preferencesthread.C:641 cinelerra/preferencesthread.C:643
-#: cinelerra/setformat.C:805
+#: cinelerra/preferencesthread.C:644 cinelerra/preferencesthread.C:646
+#: cinelerra/setformat.C:800
 msgid "Apply"
 msgstr "Aplicar"
 
 msgid "Apply"
 msgstr "Aplicar"
 
@@ -1663,7 +1736,7 @@ msgstr "Nombre de carpeta:"
 
 #: cinelerra/binfolder.C:1692
 msgid "media bin"
 
 #: cinelerra/binfolder.C:1692
 msgid "media bin"
-msgstr "medios de comunicación"
+msgstr "contenedor de medios"
 
 #: cinelerra/binfolder.C:1692
 msgid "clip bin"
 
 #: cinelerra/binfolder.C:1692
 msgid "clip bin"
@@ -1695,7 +1768,7 @@ msgstr "BRender::set_video_map %jd: intento de ajustarlo fuera del mapa %jd.\n"
 msgid "Look for file"
 msgstr "Busca el archivo"
 
 msgid "Look for file"
 msgstr "Busca el archivo"
 
-#: cinelerra/canvas.C:921
+#: cinelerra/canvas.C:923
 msgid "Windowed"
 msgstr "Ventana"
 
 msgid "Windowed"
 msgstr "Ventana"
 
@@ -1719,7 +1792,7 @@ msgstr "Zoom 50%"
 msgid "Zoom 75%"
 msgstr "Zoom 75%"
 
 msgid "Zoom 75%"
 msgstr "Zoom 75%"
 
-#: cinelerra/canvas.C:972 cinelerra/recordmonitor.C:880
+#: cinelerra/canvas.C:972 cinelerra/recordmonitor.C:886
 msgid "Zoom 100%"
 msgstr "Zoom 100%"
 
 msgid "Zoom 100%"
 msgstr "Zoom 100%"
 
@@ -1779,15 +1852,15 @@ msgstr "Mayús-F12"
 msgid "Reset translation"
 msgstr "Restablecer la traducción"
 
 msgid "Reset translation"
 msgstr "Restablecer la traducción"
 
-#: cinelerra/canvas.C:1106 cinelerra/plugintoggles.C:76
+#: cinelerra/canvas.C:1105 cinelerra/plugintoggles.C:76
 msgid "Show controls"
 msgstr "Mostrar controles"
 
 msgid "Show controls"
 msgstr "Mostrar controles"
 
-#: cinelerra/canvas.C:1108
+#: cinelerra/canvas.C:1105
 msgid "Hide controls"
 msgstr "Ocultar controles"
 
 msgid "Hide controls"
 msgstr "Ocultar controles"
 
-#: cinelerra/canvas.C:1139
+#: cinelerra/canvas.C:1122
 msgid "Close source"
 msgstr "Cerrar origen"
 
 msgid "Close source"
 msgstr "Cerrar origen"
 
@@ -1910,6 +1983,8 @@ msgid "Norm:"
 msgstr "Norma:"
 
 #: cinelerra/channeledit.C:648 cinelerra/channeledit.C:1031
 msgstr "Norma:"
 
 #: cinelerra/channeledit.C:648 cinelerra/channeledit.C:1031
+#: plugins/compressor/compressor.C:440
+#: plugins/compressormulti/comprmultigui.C:152
 msgid "Input:"
 msgstr "Entrar:"
 
 msgid "Input:"
 msgstr "Entrar:"
 
@@ -2026,7 +2101,7 @@ msgstr "buscar títulos de eventos / info"
 #: cinelerra/channelinfo.C:1100
 #, c-format
 msgid "bad scan time: %s\n"
 #: cinelerra/channelinfo.C:1100
 #, c-format
 msgid "bad scan time: %s\n"
-msgstr "Mal tiempo de escaneado: %s\n"
+msgstr "tiempo erroneo de escaneado: %s\n"
 
 #: cinelerra/channelinfo.C:1107
 #, c-format
 
 #: cinelerra/channelinfo.C:1107
 #, c-format
@@ -2119,12 +2194,12 @@ msgid "Delete all clips."
 msgstr "Borrar todos los clips."
 
 #: cinelerra/channelinfo.C:1932 cinelerra/recordbatches.C:472
 msgstr "Borrar todos los clips."
 
 #: cinelerra/channelinfo.C:1932 cinelerra/recordbatches.C:472
-#: cinelerra/recordgui.C:922
+#: cinelerra/recordgui.C:965
 msgid "Create new clip."
 msgstr "Crear nuevo clip."
 
 #: cinelerra/channelinfo.C:1945 cinelerra/recordbatches.C:490
 msgid "Create new clip."
 msgstr "Crear nuevo clip."
 
 #: cinelerra/channelinfo.C:1945 cinelerra/recordbatches.C:490
-#: cinelerra/recordgui.C:935
+#: cinelerra/recordgui.C:978
 msgid "Delete clip."
 msgstr "Eliminar clip."
 
 msgid "Delete clip."
 msgstr "Eliminar clip."
 
@@ -2152,89 +2227,75 @@ msgstr ": La información del clip"
 msgid "Comments:"
 msgstr "Comentarios:"
 
 msgid "Comments:"
 msgstr "Comentarios:"
 
-#: cinelerra/clippopup.C:356
+#: cinelerra/clippopup.C:362
 msgid "Paste Clip"
 msgstr "Pegar clip"
 
 msgid "Paste Clip"
 msgstr "Pegar clip"
 
-#: cinelerra/clippopup.C:378
+#: cinelerra/clippopup.C:384
 msgid "paste clip: "
 msgstr "pegar clip: "
 
 msgid "paste clip: "
 msgstr "pegar clip: "
 
-#: cinelerra/clippopup.C:422
-msgid "Nest"
-msgstr "Anidar"
+#: cinelerra/clippopup.C:431
+msgid "Nest to Media"
+msgstr "Anidar en Medios"
 
 
-#: cinelerra/clippopup.C:445
-#, c-format
-msgid "Nested_%02d%02d%02d-%02d%02d%02d"
-msgstr "Anidado_%02d%02d%02d-%02d%02d%02d"
-
-#: cinelerra/clippopup.C:458
-#, c-format
-msgid "Nested: %s"
-msgstr "Anidado: %s"
-
-#: cinelerra/clippopup.C:478
-msgid "UnNest"
-msgstr "Desanidado"
-
-#: cinelerra/colorpicker.C:77
+#: cinelerra/colorpicker.C:74
 msgid ": "
 msgstr ": "
 
 msgid ": "
 msgstr ": "
 
-#: cinelerra/colorpicker.C:78
+#: cinelerra/colorpicker.C:75
 msgid "Color Picker"
 msgstr "Selector de color"
 
 msgid "Color Picker"
 msgstr "Selector de color"
 
-#: cinelerra/colorpicker.C:179
+#: cinelerra/colorpicker.C:229
 msgid "colorpicker#H:"
 msgstr "H:"
 
 msgid "colorpicker#H:"
 msgstr "H:"
 
-#: cinelerra/colorpicker.C:180
+#: cinelerra/colorpicker.C:230
 msgid "colorpicker#S:"
 msgstr "S:"
 
 msgid "colorpicker#S:"
 msgstr "S:"
 
-#: cinelerra/colorpicker.C:181
+#: cinelerra/colorpicker.C:231
 msgid "colorpicker_value#V:"
 msgstr "V:"
 
 msgid "colorpicker_value#V:"
 msgstr "V:"
 
-#: cinelerra/colorpicker.C:182
+#: cinelerra/colorpicker.C:232
 msgid "colorpicker#R:"
 msgstr "R:"
 
 msgid "colorpicker#R:"
 msgstr "R:"
 
-#: cinelerra/colorpicker.C:183
+#: cinelerra/colorpicker.C:233
 msgid "colorpicker#G:"
 msgstr "G:"
 
 msgid "colorpicker#G:"
 msgstr "G:"
 
-#: cinelerra/colorpicker.C:184
+#: cinelerra/colorpicker.C:234
 msgid "colorpicker#B:"
 msgstr "B:"
 
 msgid "colorpicker#B:"
 msgstr "B:"
 
-#: cinelerra/colorpicker.C:185
+#: cinelerra/colorpicker.C:235
 msgid "colorpicker#Y:"
 msgstr "Y:"
 
 msgid "colorpicker#Y:"
 msgstr "Y:"
 
-#: cinelerra/colorpicker.C:186
+#: cinelerra/colorpicker.C:236
 msgid "colorpicker#U:"
 msgstr "U:"
 
 msgid "colorpicker#U:"
 msgstr "U:"
 
-#: cinelerra/colorpicker.C:187
+#: cinelerra/colorpicker.C:237
 msgid "colorpicker_Cr#V:"
 msgstr "V:"
 
 msgid "colorpicker_Cr#V:"
 msgstr "V:"
 
-#: cinelerra/colorpicker.C:189
+#: cinelerra/colorpicker.C:239
 msgid "colorpicker#A:"
 msgstr "A:"
 
 msgid "colorpicker#A:"
 msgstr "A:"
 
-#: cinelerra/colorpicker.C:205
+#: cinelerra/colorpicker.C:255
 msgid "Hue"
 msgstr "Hue"
 
 msgid "Hue"
 msgstr "Hue"
 
-#: cinelerra/colorpicker.C:207
+#: cinelerra/colorpicker.C:257
 msgid "Saturation"
 msgstr "Saturación"
 
 msgid "Saturation"
 msgstr "Saturación"
 
-#: cinelerra/colorpicker.C:211 plugins/colorbalance/colorbalancewindow.C:59
+#: cinelerra/colorpicker.C:261 plugins/colorbalance/colorbalancewindow.C:59
 #: plugins/denoisevideo/denoisevideo.C:277 plugins/downsample/downsample.C:278
 #: plugins/histogram/histogramwindow.C:69
 #: plugins/histogram_bezier/bistogramwindow.C:71
 #: plugins/denoisevideo/denoisevideo.C:277 plugins/downsample/downsample.C:278
 #: plugins/histogram/histogramwindow.C:69
 #: plugins/histogram_bezier/bistogramwindow.C:71
@@ -2242,9 +2303,9 @@ msgstr "Saturación"
 #: plugins/swapchannels/swapchannels.C:449
 #: plugins/swapchannels/swapchannels.C:474 plugins/zoomblur/zoomblur.C:173
 msgid "Red"
 #: plugins/swapchannels/swapchannels.C:449
 #: plugins/swapchannels/swapchannels.C:474 plugins/zoomblur/zoomblur.C:173
 msgid "Red"
-msgstr "Rojo"
+msgstr "R-Rojo"
 
 
-#: cinelerra/colorpicker.C:213 plugins/colorbalance/colorbalancewindow.C:65
+#: cinelerra/colorpicker.C:263 plugins/colorbalance/colorbalancewindow.C:65
 #: plugins/denoisevideo/denoisevideo.C:279 plugins/downsample/downsample.C:284
 #: plugins/histogram/histogramwindow.C:75
 #: plugins/histogram_bezier/bistogramwindow.C:74
 #: plugins/denoisevideo/denoisevideo.C:279 plugins/downsample/downsample.C:284
 #: plugins/histogram/histogramwindow.C:75
 #: plugins/histogram_bezier/bistogramwindow.C:74
@@ -2252,9 +2313,9 @@ msgstr "Rojo"
 #: plugins/swapchannels/swapchannels.C:452
 #: plugins/swapchannels/swapchannels.C:475 plugins/zoomblur/zoomblur.C:175
 msgid "Green"
 #: plugins/swapchannels/swapchannels.C:452
 #: plugins/swapchannels/swapchannels.C:475 plugins/zoomblur/zoomblur.C:175
 msgid "Green"
-msgstr "Verde"
+msgstr "G-Verde"
 
 
-#: cinelerra/colorpicker.C:215 plugins/colorbalance/colorbalancewindow.C:71
+#: cinelerra/colorpicker.C:265 plugins/colorbalance/colorbalancewindow.C:71
 #: plugins/denoisevideo/denoisevideo.C:281 plugins/downsample/downsample.C:290
 #: plugins/histogram/histogramwindow.C:81
 #: plugins/histogram_bezier/bistogramwindow.C:77
 #: plugins/denoisevideo/denoisevideo.C:281 plugins/downsample/downsample.C:290
 #: plugins/histogram/histogramwindow.C:81
 #: plugins/histogram_bezier/bistogramwindow.C:77
@@ -2263,37 +2324,37 @@ msgstr "Verde"
 #: plugins/swapchannels/swapchannels.C:476 plugins/theme_blue/bluetheme.C:63
 #: plugins/zoomblur/zoomblur.C:177
 msgid "Blue"
 #: plugins/swapchannels/swapchannels.C:476 plugins/theme_blue/bluetheme.C:63
 #: plugins/zoomblur/zoomblur.C:177
 msgid "Blue"
-msgstr "Azul"
+msgstr "B-Azul"
 
 
-#: cinelerra/colorpicker.C:217
+#: cinelerra/colorpicker.C:267
 msgid "Luminance"
 msgstr "Luminancia"
 
 msgid "Luminance"
 msgstr "Luminancia"
 
-#: cinelerra/colorpicker.C:219
+#: cinelerra/colorpicker.C:269
 msgid "Blue Luminance Difference"
 msgstr "Diferencia de luminancia Azul"
 
 msgid "Blue Luminance Difference"
 msgstr "Diferencia de luminancia Azul"
 
-#: cinelerra/colorpicker.C:221
+#: cinelerra/colorpicker.C:271
 msgid "Red Luminance Difference"
 msgid "Red Luminance Difference"
-msgstr "Diferencia de luminancia Rojo"
+msgstr "Diferencia de luminancia Roja"
 
 
-#: cinelerra/colorpicker.C:224 plugins/crikey/crikeywindow.C:96
-#: plugins/denoisevideo/denoisevideo.C:283 plugins/downsample/downsample.C:296
-#: plugins/linearblur/linearblur.C:184 plugins/radialblur/radialblur.C:181
-#: plugins/swapchannels/swapchannels.C:458
+#: cinelerra/colorpicker.C:274 plugins/alpha/alpha.C:117
+#: plugins/crikey/crikeywindow.C:96 plugins/denoisevideo/denoisevideo.C:283
+#: plugins/downsample/downsample.C:296 plugins/linearblur/linearblur.C:184
+#: plugins/radialblur/radialblur.C:181 plugins/swapchannels/swapchannels.C:458
 #: plugins/swapchannels/swapchannels.C:477 plugins/zoomblur/zoomblur.C:179
 msgid "Alpha"
 #: plugins/swapchannels/swapchannels.C:477 plugins/zoomblur/zoomblur.C:179
 msgid "Alpha"
-msgstr "Alpha"
+msgstr "Alfa"
 
 
-#: cinelerra/colorpicker.C:1030
+#: cinelerra/colorpicker.C:1125
 msgid "hex rgb color"
 msgstr "color RGB hexadecimal"
 
 msgid "hex rgb color"
 msgstr "color RGB hexadecimal"
 
-#: cinelerra/colorpicker.C:1078
+#: cinelerra/colorpicker.C:1173
 msgid "grab from anywhere picker"
 msgstr "selector agarrar desde cualquier lugar"
 
 msgid "grab from anywhere picker"
 msgstr "selector agarrar desde cualquier lugar"
 
-#: cinelerra/colorpicker.C:1100
+#: cinelerra/colorpicker.C:1195
 msgid "color history"
 msgstr "historico de color"
 
 msgid "color history"
 msgstr "historico de color"
 
@@ -2341,6 +2402,23 @@ msgstr "Mi"
 msgid "cut %f/%f = %d\n"
 msgstr "cortar %f/%f = %d\n"
 
 msgid "cut %f/%f = %d\n"
 msgstr "cortar %f/%f = %d\n"
 
+#: cinelerra/compressortools.C:523 cinelerra/compressortools.C:524
+#: cinelerra/compressortools.C:525
+msgid "Input"
+msgstr "Entrar"
+
+#: cinelerra/compressortools.C:996
+msgid "Copy graph"
+msgstr "Copiar gráfico"
+
+#: cinelerra/compressortools.C:1019
+msgid "Paste graph"
+msgstr "Pegar gráfico"
+
+#: cinelerra/compressortools.C:1062
+msgid "Clear graph"
+msgstr "Eliminar gráfico"
+
 #: cinelerra/compresspopup.C:38
 msgid "DV"
 msgstr "DV"
 #: cinelerra/compresspopup.C:38
 msgid "DV"
 msgstr "DV"
@@ -2349,7 +2427,7 @@ msgstr "DV"
 msgid "MJPA"
 msgstr "MJPA"
 
 msgid "MJPA"
 msgstr "MJPA"
 
-#: cinelerra/compresspopup.C:41 cinelerra/file.inc:115
+#: cinelerra/compresspopup.C:41 cinelerra/file.inc:116
 msgid "PNG"
 msgstr "PNG"
 
 msgid "PNG"
 msgstr "PNG"
 
@@ -2408,47 +2486,127 @@ msgstr ": Archivo existe"
 msgid "The following files exist.  Overwrite them?"
 msgstr "Existen los siguientes archivos. ¿Sobreescribirlos?"
 
 msgid "The following files exist.  Overwrite them?"
 msgstr "Existen los siguientes archivos. ¿Sobreescribirlos?"
 
-#: cinelerra/cpanel.C:152
+#: cinelerra/convert.C:208
+msgid "Transcode clip"
+msgstr "Transcodificar clip"
+
+#: cinelerra/convert.C:290
+#, c-format
+msgid ""
+"transcode target file exists but is incorrect format:\n"
+"%s\n"
+"remove file from disk before transcode to new format.\n"
+msgstr ""
+"el archivo de destino de transcodificación existe pero tiene un formato incorrecto:\n"
+"%s\n"
+"eliminar el archivo del disco antes de transcodificar a un nuevo formato.\n"
+
+#: cinelerra/convert.C:377
+#, c-format
+msgid "convert: failed=%d canceled=%d\n"
+msgstr "convertir: fallido=%d cancelado)%d\n"
+
+#: cinelerra/convert.C:382
+#, c-format
+msgid "TranscodeRender::run: done in %s\n"
+msgstr "TranscodificarRender::ejecuta: hecho en %s\n"
+
+#: cinelerra/convert.C:384
+msgid "transcode cancelled"
+msgstr "transcodificación cancelada"
+
+#: cinelerra/convert.C:386
+msgid "transcode failed"
+msgstr "falló la transcodificación"
+
+#: cinelerra/convert.C:388
+#, c-format
+msgid "transcode %d files, render time %s"
+msgstr "transcodificación %d archivos, tiempo de render %s"
+
+#: cinelerra/convert.C:397
+msgid "Error making transcode."
+msgstr "Error al hacer la transcodificación."
+
+#: cinelerra/convert.C:425
+msgid "Transcode files..."
+msgstr "Transcodificando archivos..."
+
+#: cinelerra/convert.C:535
+msgid ": Transcode settings"
+msgstr ": Configuración de transcodificación"
+
+#: cinelerra/convert.C:562
+msgid "Render untagged assets and replace in project"
+msgstr "Renderizar activos sin etiquetar y reemplazar en el proyecto"
+
+#: cinelerra/convert.C:565 cinelerra/convert.C:573
+msgid "Tag suffix:"
+msgstr "Sufijo de etiqueta:"
+
+#: cinelerra/convert.C:587 cinelerra/proxy.C:457 cinelerra/render.C:1062
+msgid "Beep on done volume"
+msgstr ""
+"Volumen del pitido\n"
+"al terminar"
+
+#: cinelerra/convert.C:628
+msgid "Transcode..."
+msgstr "Transcodificar..."
+
+#: cinelerra/convert.C:628
+msgid "Alt-e"
+msgstr "Alt-e"
+
+#: cinelerra/convert.C:711
+msgid "Remove originals from project"
+msgstr "Eliminar originales del proyecto"
+
+#: cinelerra/convert.C:727
+msgid "Into Nested Proxy directory"
+msgstr "Dentro de la carpeta del Proxy Anidado"
+
+#: cinelerra/cpanel.C:153
 msgid "Protect video from changes (F1)"
 msgstr "Proteger vídeo de cambios (F1)"
 
 msgid "Protect video from changes (F1)"
 msgstr "Proteger vídeo de cambios (F1)"
 
-#: cinelerra/cpanel.C:176
+#: cinelerra/cpanel.C:177
 msgid "Edit mask (F3)"
 msgstr "Editar máscara (F3)"
 
 msgid "Edit mask (F3)"
 msgstr "Editar máscara (F3)"
 
-#: cinelerra/cpanel.C:198
+#: cinelerra/cpanel.C:199
 msgid "Ruler (F4)"
 msgstr "Regla (F4)"
 
 msgid "Ruler (F4)"
 msgstr "Regla (F4)"
 
-#: cinelerra/cpanel.C:220
+#: cinelerra/cpanel.C:221
 msgid "Zoom view (F2)"
 msgstr "Vista Zoom (F2)"
 
 msgid "Zoom view (F2)"
 msgstr "Vista Zoom (F2)"
 
-#: cinelerra/cpanel.C:240
+#: cinelerra/cpanel.C:241
 msgid "Adjust camera automation (F5)"
 msgstr "Ajustar automatización de cámara (F5)"
 
 msgid "Adjust camera automation (F5)"
 msgstr "Ajustar automatización de cámara (F5)"
 
-#: cinelerra/cpanel.C:260
+#: cinelerra/cpanel.C:261
 msgid "Adjust projector automation (F6)"
 msgstr "Ajustar automatización proyector (F6)"
 
 msgid "Adjust projector automation (F6)"
 msgstr "Ajustar automatización proyector (F6)"
 
-#: cinelerra/cpanel.C:280
+#: cinelerra/cpanel.C:281
 msgid "Crop a layer or output (F7)"
 msgstr "Recortar una capa o la salida (F7)"
 
 msgid "Crop a layer or output (F7)"
 msgstr "Recortar una capa o la salida (F7)"
 
-#: cinelerra/cpanel.C:304
+#: cinelerra/cpanel.C:305
 msgid "Get color (F8)"
 msgstr "Obtener color (F8)"
 
 msgid "Get color (F8)"
 msgstr "Obtener color (F8)"
 
-#: cinelerra/cpanel.C:328
+#: cinelerra/cpanel.C:329
 msgid "Show tool info (F9)"
 msgstr "Mostrar información de herramientas (F9)"
 
 msgid "Show tool info (F9)"
 msgstr "Mostrar información de herramientas (F9)"
 
-#: cinelerra/cpanel.C:359
+#: cinelerra/cpanel.C:360
 msgid "Show safe regions (F10)"
 msgstr "Mostrar zonas seguras (F10)"
 
 msgid "Show safe regions (F10)"
 msgstr "Mostrar zonas seguras (F10)"
 
-#: cinelerra/cpanel.C:376 plugins/perspective/perspective.C:203
+#: cinelerra/cpanel.C:377 plugins/perspective/perspective.C:203
 #: plugins/zoom/zoom.C:147
 msgid "Zoom"
 msgstr "Enfocar"
 #: plugins/zoom/zoom.C:147
 msgid "Zoom"
 msgstr "Enfocar"
@@ -2465,44 +2623,44 @@ msgstr ": Recortar"
 msgid "Select a region to crop in the video output window"
 msgstr "Seleccionar una región para recortar en la ventana de salida de vídeo"
 
 msgid "Select a region to crop in the video output window"
 msgstr "Seleccionar una región para recortar en la ventana de salida de vídeo"
 
-#: cinelerra/cwindowgui.C:79
+#: cinelerra/cwindowgui.C:80
 msgid ": Compositor"
 msgstr ": Compositor"
 
 msgid ": Compositor"
 msgstr ": Compositor"
 
-#: cinelerra/cwindowgui.C:668 cinelerra/cwindowgui.C:701
+#: cinelerra/cwindowgui.C:666 cinelerra/cwindowgui.C:699
 msgid "insert assets"
 msgstr "insertar clips"
 
 msgid "insert assets"
 msgstr "insertar clips"
 
-#: cinelerra/cwindowgui.C:821 cinelerra/mbuttons.C:243
+#: cinelerra/cwindowgui.C:819 cinelerra/mbuttons.C:243
 msgid "main window: "
 msgstr "ventana principal: "
 
 msgid "main window: "
 msgstr "ventana principal: "
 
-#: cinelerra/cwindowgui.C:1770 cinelerra/cwindowgui.C:3334
+#: cinelerra/cwindowgui.C:1781 cinelerra/cwindowgui.C:3322
 msgid "mask rotate"
 msgstr "rotación de máscara"
 
 msgid "mask rotate"
 msgstr "rotación de máscara"
 
-#: cinelerra/cwindowgui.C:1774 cinelerra/cwindowgui.C:3338
+#: cinelerra/cwindowgui.C:1785 cinelerra/cwindowgui.C:3326
 msgid "mask scale"
 msgstr "escalar máscara"
 
 msgid "mask scale"
 msgstr "escalar máscara"
 
-#: cinelerra/cwindowgui.C:1782
+#: cinelerra/cwindowgui.C:1793
 msgid "mask translate"
 msgstr "máscara convertir"
 
 msgid "mask translate"
 msgstr "máscara convertir"
 
-#: cinelerra/cwindowgui.C:1789
+#: cinelerra/cwindowgui.C:1800
 msgid "mask adjust"
 msgstr "ajuste de máscara"
 
 msgid "mask adjust"
 msgstr "ajuste de máscara"
 
-#: cinelerra/cwindowgui.C:1802 cinelerra/cwindowtool.C:2943
+#: cinelerra/cwindowgui.C:1813 cinelerra/cwindowtool.C:2943
 #: cinelerra/cwindowtool.C:2970
 msgid "mask point"
 msgstr "punto de máscara"
 
 #: cinelerra/cwindowtool.C:2970
 msgid "mask point"
 msgstr "punto de máscara"
 
-#: cinelerra/cwindowgui.C:2298 cinelerra/cwindowgui.C:2436
+#: cinelerra/cwindowgui.C:2309 cinelerra/cwindowgui.C:2424
 msgid "Eyedrop"
 msgstr "Eyedrop"
 
 msgid "Eyedrop"
 msgstr "Eyedrop"
 
-#: cinelerra/cwindowgui.C:3059 cinelerra/cwindowgui.C:3317
+#: cinelerra/cwindowgui.C:3047 cinelerra/cwindowgui.C:3305
 #: cinelerra/cwindowtool.C:883 cinelerra/cwindowtool.C:931
 #: cinelerra/cwindowtool.C:994 cinelerra/cwindowtool.C:998
 #: cinelerra/cwindowtool.C:1025 cinelerra/cwindowtool.C:1029
 #: cinelerra/cwindowtool.C:883 cinelerra/cwindowtool.C:931
 #: cinelerra/cwindowtool.C:994 cinelerra/cwindowtool.C:998
 #: cinelerra/cwindowtool.C:1025 cinelerra/cwindowtool.C:1029
@@ -2513,7 +2671,7 @@ msgstr "Eyedrop"
 msgid "camera"
 msgstr "cámara"
 
 msgid "camera"
 msgstr "cámara"
 
-#: cinelerra/cwindowgui.C:3061 cinelerra/cwindowgui.C:3321
+#: cinelerra/cwindowgui.C:3049 cinelerra/cwindowgui.C:3309
 #: cinelerra/cwindowtool.C:1294 cinelerra/cwindowtool.C:1340
 #: cinelerra/cwindowtool.C:1392 cinelerra/cwindowtool.C:1397
 #: cinelerra/cwindowtool.C:1421 cinelerra/cwindowtool.C:1425
 #: cinelerra/cwindowtool.C:1294 cinelerra/cwindowtool.C:1340
 #: cinelerra/cwindowtool.C:1392 cinelerra/cwindowtool.C:1397
 #: cinelerra/cwindowtool.C:1421 cinelerra/cwindowtool.C:1425
@@ -2524,11 +2682,11 @@ msgstr "cámara"
 msgid "projector"
 msgstr "proyector"
 
 msgid "projector"
 msgstr "proyector"
 
-#: cinelerra/cwindowgui.C:3330
+#: cinelerra/cwindowgui.C:3318
 msgid "mask"
 msgstr "máscara"
 
 msgid "mask"
 msgstr "máscara"
 
-#: cinelerra/cwindowgui.h:55 cinelerra/scale.C:363 cinelerra/setformat.C:771
+#: cinelerra/cwindowgui.h:55 cinelerra/scale.C:363 cinelerra/setformat.C:766
 msgid "Auto"
 msgstr "Automático"
 
 msgid "Auto"
 msgstr "Automático"
 
@@ -2632,7 +2790,7 @@ msgstr "Justificar abajo"
 
 #: cinelerra/cwindowtool.C:1186
 msgid "Add Keyframe: Shift-F11"
 
 #: cinelerra/cwindowtool.C:1186
 msgid "Add Keyframe: Shift-F11"
-msgstr "Agregar fotograma clave: Shift-F11"
+msgstr "Agregar fotograma clave: Mayús-F11"
 
 #: cinelerra/cwindowtool.C:1200
 msgid "Reset Camera: F11"
 
 #: cinelerra/cwindowtool.C:1200
 msgid "Reset Camera: F11"
@@ -2644,7 +2802,7 @@ msgstr ": Proyector"
 
 #: cinelerra/cwindowtool.C:1558
 msgid "Add Keyframe: Shift-F12"
 
 #: cinelerra/cwindowtool.C:1558
 msgid "Add Keyframe: Shift-F12"
-msgstr "Agregar fotograma clave: Shift-F12"
+msgstr "Agregar fotograma clave: Mayús-F12"
 
 #: cinelerra/cwindowtool.C:1572
 msgid "Reset Projector: F12"
 
 #: cinelerra/cwindowtool.C:1572
 msgid "Reset Projector: F12"
@@ -2664,7 +2822,7 @@ msgstr "habilitar máscara"
 
 #: cinelerra/cwindowtool.C:1881 cinelerra/cwindowtool.C:1899
 msgid "Solo"
 
 #: cinelerra/cwindowtool.C:1881 cinelerra/cwindowtool.C:1899
 msgid "Solo"
-msgstr "en solitario"
+msgstr "Solo"
 
 #: cinelerra/cwindowtool.C:1885
 msgid "Solo video track"
 
 #: cinelerra/cwindowtool.C:1885
 msgid "Solo video track"
@@ -2694,11 +2852,11 @@ msgstr "Foco"
 msgid "Center for rotate/scale"
 msgstr "Centrar para rotar/escalar"
 
 msgid "Center for rotate/scale"
 msgstr "Centrar para rotar/escalar"
 
-#: cinelerra/cwindowtool.C:2119
+#: cinelerra/cwindowtool.C:2119 plugins/sketcher/sketcherwindow.C:1400
 msgid "Help"
 msgstr "Ayuda"
 
 msgid "Help"
 msgstr "Ayuda"
 
-#: cinelerra/cwindowtool.C:2123
+#: cinelerra/cwindowtool.C:2123 plugins/sketcher/sketcherwindow.C:1404
 msgid "Show help text"
 msgstr "Mostrar texto de ayuda"
 
 msgid "Show help text"
 msgstr "Mostrar texto de ayuda"